最新要闻
- 星城控股20亿元私募债券获上交所受理
- 张颂文败给了新海诚?同上映11天:两部新片口碑相仿 票房差距5亿
- 世界速递!成都一公寓按排量收停车费每月最低1200元 官方回应:可自行定价
- 北野武悼念坂本龙一:朋友们都不在了 只剩下我一个人
- 环球新动态:无任何定语!真我GT Neo5 SE预售销量破纪录:1999元真香
- 世界微头条丨《小美人鱼》新镜头截图:爱丽儿抚摸王子脸 王子尬笑
- 极氪001车主吐槽:语音助手突然出现故障,无法语音识别指令
- 焦点快报!任天堂或将进军手游!宣布与DeNA合作创立新公司
- 世界通讯!终于不用忍受熊孩子了!复兴号智能动车上线“静音车厢”
- 世界微资讯!真不是电影特效!武汉大暴雨白天秒变黑夜:雷电大风齐上阵
- 当前动态:3月新势力销量排名:理想断崖领先 第二名只卖一款车
- 身残技坚 国外一《守望先锋2》眼睛残疾玩家达到大师段位
- 【焦点热闻】《秋叶原物语2导演剪辑版》Switch中文版开启预购 4月20日发售
- 当前热门:7个摄像头走天下!大疆千元级智驾方案炸场:马斯克看了都得服
- 【环球热闻】2022胡润品牌榜发布:贵州茅台第一 阿里巴巴赢麻了
- 1999元潮玩电竞旗舰!真我GT Neo5 SE图赏
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
微信小程序订阅消息开发指南(java)
微信小程序订阅消息开发指南(java)
第一步 准备阶段
1、你得有一个小程序,并且认证了,个人的也行
(资料图)
2、开通订阅消息
小程序后台
->功能
->订阅消息
3、公共模板库选择一个模板
选择的时候,选择你需要的字段,因为字段有限制
4、我的模板点击详情
详情内容,模板 id 都是需要提供个服务端开发人员的
第二步 编码阶段
小程序端
小程序消息订阅,需要用户确认
1、首先小程序授权登陆获取 code
官网示例:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html
wx.login({ success (res) { if (res.code) { //发起网络请求 wx.request({ url: "https://example.com/onLogin", data: { code: res.code } }) } else { console.log("登录失败!" + res.errMsg) } }})// 结果 {errMsg: "login:ok", code: "0a3kK4Ga10Gk3F0oBAHa1mGyRl3kK4Gd"}
uni-App 示例:https://uniapp.dcloud.net.cn/api/plugins/login.html#login
uni.login({ provider: "weixin", //使用微信登录 success: function (loginRes) { console.log(loginRes) }});// 结果 {errMsg: "login:ok", code: "0a3kK4Ga10Gk3F0oBAHa1mGyRl3kK4Gd"}
2、将 code
传给服务端 获取用户唯一标识 openId
3、通过代码起小程序消息订阅界面、用户点击确定ok,小程序工作结束
官方示例:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/subscribe-message/wx.requestSubscribeMessage.html
tmplIds
填写模板 id 即可,最多三个
wx.requestSubscribeMessage({ tmplIds: [""], success (res) { console.log(res) }})
4、注意事项:
避免重复拉起用户订阅通知,可以通过微信提供的
getSetting
判断用户是否订阅了,如果没有就拉起。注意下面是用
uniapp
写的,方法前缀是uni
如果你小程序代码记得修改wx
以及提示组件到此小程序工作结束
getSetting() { uni.getSetting({ withSubscriptions: true, // 获取用户订阅状态 success(res) { // false 表示用户未订阅改消息 if (!res.subscriptionsSetting.mainSwitch) { this.subscribeMessage(); } else { uni.showToast({ title: "已订阅", icon: "none" }) } } })},subscribeMessage() { uni.requestSubscribeMessage({ tmplIds: ["模板id"], success(res) { if (res.errMsg === "requestSubscribeMessage:ok") { uni.showToast({ title: "订阅成功", icon: "none" }) } } })}
服务端
微信小程序的
appid
和secret
小程序后台
->开发
->开发管理
->开发设置
->开发者 ID
注意事项:
http
请求这里使用 apache 的工具类,你也可以使用别的- 微信消息模板字段
thing
字段有长度限制20,超过会失败 - 以下演示代码,生产环境还需进行优化
1、通过 code 获取用户 open id 官网文档
public String getOpenId(String code) throws IOException { CloseableHttpClient httpClient = HttpClientBuilder.create().build(); Map params = new HashMap<>(); params.put("appid", Constants.APPLET_APP_ID); params.put("secret", Constants.APPLET_SECRET); params.put("js_code", code); params.put("grant_type", "authorization_code"); String url = handleParams("https://api.weixin.qq.com/sns/jscode2session", params); HttpGet httpGet = new HttpGet(url); CloseableHttpResponse response = httpClient.execute(httpGet); HttpEntity entity = response.getEntity(); // 响应结果 return EntityUtils.toString(entity, CharSetType.UTF8.getType());}public static void main(String[] args) throws IOException { HttpUtils httpUtils = new HttpUtils(); String token = httpUtils.getToken(); System.out.println(token);}
响应结果:
{"access_token":"67_u22CQaWq22222222Q4griDE6kiT5hwg7jVxedn8J9te17Az1oWGGxPgB22222229Y4Wm6h_Yzci7-FSDjeH8YG6DsCOYrQXJCWsPXhT6nWbKIWCXfABACID","expires_in":7200}
2、通过 appid
和 secret
获取 token 超时 7200 秒 可 redis 缓存 官方文档
public String getToken() throws IOException { CloseableHttpClient httpClient = HttpClientBuilder.create().build(); Map params = new HashMap<>(); params.put("appid", Constants.APPLET_APP_ID); params.put("secret", Constants.APPLET_SECRET); params.put("grant_type", "client_credential"); String url = handleParams("https://api.weixin.qq.com/cgi-bin/token", params); HttpGet httpGet = new HttpGet(url); CloseableHttpResponse response = httpClient.execute(httpGet); HttpEntity entity = response.getEntity(); // 响应结果 return EntityUtils.toString(entity, CharSetType.UTF8.getType());}
3、指定用户推送消息结束 官方文档
public String pushMsg(String token) throws IOException { CloseableHttpClient httpClient = HttpClientBuilder.create().build(); Map params = new HashMap<>(); // 处理微信推送数据结构 JSONObject mapData = new JSONObject(); Map map1 = new HashMap<>(); map1.put("value", "任务名称"); mapData.put("thing2", map1); Map map2 = new HashMap<>(); map2.put("value", "2022-04-03 10:00:00"); mapData.put("time3", map2); Map map3 = new HashMap<>(); map3.put("value", "描述信息"); mapData.put("thing4", map3); Map map4 = new HashMap<>(); map4.put("value", "备注信息"); mapData.put("thing10", map4); Map map5 = new HashMap<>(); map5.put("value", "任务来源"); mapData.put("thing11", map5); params.put("template_id", "templateId");// 模板 id params.put("touser", "openId"); // open id params.put("data", mapData); // 数据 params.put("page", "page"); // 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转 params.put("miniprogram_state", "trial"); //developer为开发版;trial为体验版;formal为正式版;默认为正式版 params.put("lang", "zh_CN"); // HttpPost httpPost = new HttpPost("https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + token); httpPost.addHeader("ContentTyp", "application/json"); // 参数转 JSON 格式 String json = objToStr(params); StringEntity stringEntity = new StringEntity(json, CharSetType.UTF8.getType()); stringEntity.setContentEncoding(CharSetType.UTF8.getType()); httpPost.setEntity(stringEntity); CloseableHttpResponse response = httpClient.execute(httpPost); HttpEntity entity = response.getEntity(); // 响应结果 return EntityUtils.toString(entity, CharSetType.UTF8.getType()); }
4、完整代码
import com.alibaba.fastjson.JSONObject;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;import com.github.chenlijia1111.utils.core.enums.CharSetType;import org.apache.http.HttpEntity;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClientBuilder;import org.apache.http.util.EntityUtils;import org.jeecg.modules.video.utitls.Constants;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.util.HashMap;import java.util.Map;import java.util.Objects;import java.util.Set;import java.util.stream.Collectors;/** * @description: * @author: Mr.Fang * @create: 2023-04-03 17:06 **/public class HttpUtils { /** * description: 获取token,返回结果为 JSON 自行转 map * create by: Mr.Fang * * @return: java.lang.String * @date: 2023/4/3 17:46 */ public String getToken() throws IOException { CloseableHttpClient httpClient = HttpClientBuilder.create().build(); Map params = new HashMap<>(); params.put("appid", Constants.APPLET_APP_ID); params.put("secret", Constants.APPLET_SECRET); params.put("grant_type", "client_credential"); String url = handleParams("https://api.weixin.qq.com/cgi-bin/token", params); HttpGet httpGet = new HttpGet(url); CloseableHttpResponse response = httpClient.execute(httpGet); HttpEntity entity = response.getEntity(); // 响应结果 return EntityUtils.toString(entity, CharSetType.UTF8.getType()); } /** * description: 获取 open id,返回结果为 JSON 自行转 map * create by: Mr.Fang * * @param: [code] * @return: java.lang.String * @date: 2023/4/3 17:46 */ public String getOpenId(String code) throws IOException { CloseableHttpClient httpClient = HttpClientBuilder.create().build(); Map params = new HashMap<>(); params.put("appid", Constants.APPLET_APP_ID); params.put("secret", Constants.APPLET_SECRET); params.put("js_code", code); params.put("grant_type", "authorization_code"); String url = handleParams("https://api.weixin.qq.com/sns/jscode2session", params); HttpGet httpGet = new HttpGet(url); CloseableHttpResponse response = httpClient.execute(httpGet); HttpEntity entity = response.getEntity(); // 响应结果 return EntityUtils.toString(entity, CharSetType.UTF8.getType()); } /** * description: 消息推送 返回结果为 JSON 自行转 map;token 调用 getToken获取 * create by: Mr.Fang * * @param: [token] * @return: java.lang.String * @date: 2023/4/3 17:46 */ public String pushMsg(String token) throws IOException { CloseableHttpClient httpClient = HttpClientBuilder.create().build(); Map params = new HashMap<>(); // 处理微信推送数据结构 JSONObject mapData = new JSONObject(); Map map1 = new HashMap<>(); map1.put("value", "任务名称"); mapData.put("thing2", map1); Map map2 = new HashMap<>(); map2.put("value", "2023-04-03 12:00:00"); mapData.put("time3", map2); Map map3 = new HashMap<>(); map3.put("value", "描述信息"); mapData.put("thing4", map3); Map map4 = new HashMap<>(); map4.put("value", "备注系信息"); mapData.put("thing10", map4); Map map5 = new HashMap<>(); map5.put("value", "抖音"); mapData.put("thing11", map5); params.put("template_id", "templateId");// 模板 id params.put("touser", "openId"); // open id params.put("data", mapData); // 数据 params.put("page", "page"); // 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转 params.put("miniprogram_state", "trial"); //developer为开发版;trial为体验版;formal为正式版;默认为正式版 params.put("lang", "zh_CN"); // HttpPost httpPost = new HttpPost("https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + token); httpPost.addHeader("ContentTyp", "application/json"); // 参数转 JSON 格式 String json = objToStr(params); StringEntity stringEntity = new StringEntity(json, CharSetType.UTF8.getType()); stringEntity.setContentEncoding(CharSetType.UTF8.getType()); httpPost.setEntity(stringEntity); CloseableHttpResponse response = httpClient.execute(httpPost); HttpEntity entity = response.getEntity(); // 响应结果 return EntityUtils.toString(entity, CharSetType.UTF8.getType()); } /** * description: 对象转 字符串 * create by: Mr.Fang * * @param: [obj] * @return: java.lang.String * @date: 2023/4/3 17:45 */ public static String objToStr(Object obj) { ObjectMapper objectMapper = new ObjectMapper(); if (Objects.nonNull(obj)) { try { String jsonStr = objectMapper.writeValueAsString(obj); return jsonStr; } catch (JsonProcessingException var2) { var2.printStackTrace(); } } return null; } /** * description: map 转 URL 地址拼接 * create by: Mr.Fang * * @param: [url, params] * @return: java.lang.String * @date: 2023/4/3 17:45 */ public String handleParams(String url, Map params) { if (params.size() != 0) { Set> entries = params.entrySet(); String paramsString = entries.stream().map((e) -> { try { StringBuilder sb = new StringBuilder(); sb.append(URLEncoder.encode(e.getKey(), CharSetType.UTF8.getType())); sb.append("="); if (Objects.nonNull(e.getValue())) { sb.append(URLEncoder.encode(e.getValue().toString(), CharSetType.UTF8.getType())); } return sb.toString(); } catch (UnsupportedEncodingException var2) { var2.printStackTrace(); return null; } }).collect(Collectors.joining("&")); return url + "?" + paramsString; } return url; }}
关键词:
环球快看点丨记录--Canvas实现打飞字游戏
微信小程序订阅消息开发指南(java)
环球动态:Midjourney? 文心一格? 一张思维导图带你了解图片生成AI
张同乐-从零开始,打造高效可靠的Locust性能测试
星城控股20亿元私募债券获上交所受理
张颂文败给了新海诚?同上映11天:两部新片口碑相仿 票房差距5亿
世界速递!成都一公寓按排量收停车费每月最低1200元 官方回应:可自行定价
北野武悼念坂本龙一:朋友们都不在了 只剩下我一个人
环球新动态:无任何定语!真我GT Neo5 SE预售销量破纪录:1999元真香
世界微头条丨《小美人鱼》新镜头截图:爱丽儿抚摸王子脸 王子尬笑
极氪001车主吐槽:语音助手突然出现故障,无法语音识别指令
Flask框架cbv的写法、请求与响应、请求扩展、session源码分析、闪现
HEU KMS Activator 30.2.0全能系统数字许可激活工具 (全新激活版)
DecisionTreeClassifier&DecisionTreeClassRegression
GPT-4 还没玩透,GPT-5已遭众人围剿
Python常见面试题015.请实现一个如下功能的函数
焦点快报!任天堂或将进军手游!宣布与DeNA合作创立新公司
世界通讯!终于不用忍受熊孩子了!复兴号智能动车上线“静音车厢”
世界微资讯!真不是电影特效!武汉大暴雨白天秒变黑夜:雷电大风齐上阵
当前动态:3月新势力销量排名:理想断崖领先 第二名只卖一款车
身残技坚 国外一《守望先锋2》眼睛残疾玩家达到大师段位
【焦点热闻】《秋叶原物语2导演剪辑版》Switch中文版开启预购 4月20日发售
全球即时:统一观测丨使用 Prometheus 监控 Nginx Ingress 网关最佳实践
世界观热点:第06章 索引的数据结构
阿里云EMAS移动测试最佳实践|马来西亚第一大电子钱包通过EMAS测试提效6倍
提供一个SpringCloud Gateway获取body参数的方法
每日机构分析:4月3日
当前热门:7个摄像头走天下!大疆千元级智驾方案炸场:马斯克看了都得服
【环球热闻】2022胡润品牌榜发布:贵州茅台第一 阿里巴巴赢麻了
1999元潮玩电竞旗舰!真我GT Neo5 SE图赏
vivo X Flip真机亮相:超大外屏、紫色菱格纹吸睛
环球消息!日本8336米深海发现怪鱼:上岸就融化成“果冻状”
天天要闻:张艺兴受邀参加2023「钟表与奇迹」日内瓦高级钟表展
介绍一下requestAnimationFrame和requestIdleCallback
以 100GB SSB 性能测试为例,通过 ByteHouse 云数仓开启你的数据分析之路
验证码案例|深圳人才网信息安全
智能云呼叫中心系统的功能
云南怒江:“四聚焦”推动招商引资工作再上新台阶
天天快资讯:很良心?RTX 4070非公版亮相零售商店 这价格买不买
【全球新视野】A股公司已有51位“90后”董事长 网友:这就叫年少有为?
全球热讯:特斯拉地库“起飞” 破墙连撞6车
锐龙 9 7945HX加持!华硕ROG魔霸7 Plus超能版图赏
当前快讯:形似小鹏P7 网传小米汽车曝光?实为大运旗下、曾“溜”出展台
今日快讯:Neovim,要尝一口不?
每日关注!利用高德地图 API 显示地图信息
呼和浩特:春雨贵如油!气象部门开展人工增雨作业 助力蓄水增墒
世界看点:一个时代结束!小灵通退出日本市场 中国运营商早已抛弃
世界新消息丨ChatGPT大封号、亚洲成重灾区!网友自救喊话:不要登录、不要登录
【报资讯】业主投诉邻居每天5点剁馅:万没想到结果是只啄木鸟
北京银行短贷宝多久时间到账?北京银行短贷宝怎么申请?
朱拉隆功大学相当于国内什么大学?朱拉隆功大学留学条件
泰版流星花园花泽类的扮演者是谁?泰版流星花园演员表
郑秀妍和郑秀晶的关系是什么?郑秀妍个人简介资料
多宁生物拟香港IPO上市,招股书显示2022年净利降86%
杨迪达人秀是哪一届?杨迪在达人秀里表演的是什么节目?
环球最新:从C#中的数组中删除指定元素的几种方法,超简单
【天天新要闻】经验不足口气不小!韩国企业自研首枚商用火箭:要追上SpaceX
今日快看!摩托车、电动自行车头盔新国标正式发布:三大特点
环球热讯:每天扫码60亿次!条形码迎来50岁生日:首用于口香糖
今日热门!服务业开始了?麦当劳暂时关闭美国办公室:将通知裁员事宜
国乒官宣世乒赛参赛名单!林高远压线入围男单,林诗栋蒯曼打混双
广汉鲜花礼品
当前短讯!使用篇丨链路追踪(Tracing)其实很简单:请求轨迹回溯与多维链路筛选
天天快看:mysql/mariadb配置详解
世界报道:“5步”做好研发效能度量,打造DevOps研发管理闭环
2022年全国因公牺牲民警308名 辅警179名
世界观热点:小牛自游家汽车真要“黄了”?官方APP已停止服务
独家!RTX 4070国行价格确定:比预期贵那么一点点
每日看点!《铃芽之旅》连续10天票房日冠:观影人次第一
世界微速讯:亏电油耗5.55升 新款魏牌摩卡DHT-PHEV官图曝光:改头又换面
速递!热气球空中起火:画面骇人!致墨西哥两游客身亡
【时快讯】南阳市西峡县:寻访老君印迹 畅游紫荆花海
当前速读:大众将停产燃油版高尔夫车型,但将保留该名称用于未来的电动车型
天天观天下!云原生(一):云原生是什么
世界滚动:React Native 开发环境搭建
今日最新!易基因-单细胞甲基化测序&单细胞转录组测序
环球速看:山东:聚焦这些重点领域做好恶劣天气防范应对
真我11系列配置出炉:首发联发科新平台 顶配16GB+1TB
大容量还防水!宏碁15.6寸电脑双肩包大促:券后69元(省130元)
环球即时看!贵州遵义遇暴雨冰雹 街上冰雹流成河:帐篷都被吹飞
全球播报:新能源汽车安全吗?中科院院士:2021年起火3千辆 起火率约为万分之一
B站上线综艺《原梦冒险团》:一加Ace 2抢镜 性能标杆
祝贺!白城医学高等专科学校运动员荣获这个项目金牌
比亚迪高端MPV腾势D9 3月销量10398辆:35万以上新能源豪华MPV第一
暴雨预警来了:逾10省区市将现大到暴雨!今年来范围最广最强雨雪上线
环球实时:降价威力巨大!特斯拉一季度交付量暴涨36%
世界新消息丨10-15万中美德日韩轿车大横评 论省油:比亚迪秦PLUS DM-i真大哥
花木小志
当前热点-读SQL进阶教程笔记06_外连接
全球今头条!简单实用出入库管理系统开源 实用进销存管理系统 快销品管理平台 电商进出库管理系统 开源下载
快报:求求你别乱脱敏了!MyBatis 插件 + 注解轻松实现数据脱敏,So easy~!
博客园添加打赏按钮
Pytorch 备忘清单_开发速查表分享
中金普洛斯REIT第一次扩募并新购入基础设施项目正式获批
吸收外资扩量更要提质
年内19只债基降低管理费 一级债基成主力
环球热点!当市场恐慌时,美联储会采取行动吗?
陕西省19个农产品区域公用品牌亮相第22届绿色食品博览会
环球微头条丨你为啥不升级Win11?数据:Win11份额历史新高 用过都说好?
每日热点:想薅羊毛?本轮汽车降价你需要知道事:10万以下车别想 理想蔚来等不跟定位豪华