当前位置:   article > 正文

微信小程序消息推送_微信小程序推送消息给用户

微信小程序推送消息给用户


简介

微信小程序发送消息推送到用户微信上

基础流程

  1.  用户登录 :获取微信提供的openid
  2.  开发者去微信公众平台申请模板:获得模板id
  3. 授权消息推送:在小程序中调用wx.requestSubscribeMessage方法
  4. 成功后将数据保存到后台 消息推送表
  5. 在需要发送消息推送时:查询 消息推送表 如果有,使用 消息推送表 的数据调用接口subscribeMessage.send

细节流程

1.1用户微信登录(缓存opid)
1.2用户普通登录(无opid)


2 消息推送申请
2.1用户授权
2.1.1无opid(弹框要求 微信登录(类似第一步)
2.1.2有opid(继续
2.2获得了授权的模板id和opid
3传输到后台,后台存储到消息推送表,参数:模板id,opid,用户名称,身份证。默认参数:是否发送为N,创建时间,主键 ,发送时间为空
4后台定时器,查询到要发送的用户时,查询消息推送表,修改发送状态为Y,更新发送时间,然后发送微信小程序消息推送

代码

1用户微信小程序登录

  1. wx.login({
  2. success: res => {
  3. console.log(res);
  4. // 发送 res.code 到后台换取 openId, sessionKey, unionId
  5. request.post('后台用小程序id和密钥获取Openid的接口.do', {
  6. code: res.code
  7. }).then((res) => {
  8. console.log(res);
  9. let result = JSON.parse(res.result);
  10. wx.setStorageSync('openid',result.openid)//缓存openid
  11. that.setData({
  12. sessionKey: result.session_key
  13. })
  14. });
  15. }
  16. })

2 小程序消息推送授权

  1. let templateId = '模板id';
  2. wx.requestSubscribeMessage({
  3. tmplIds: [templateId],
  4. success (res) {
  5. console.log(res);
  6. if(res.模板id =='reject'){//被拒绝
  7. }else{//同意
  8. //获取缓存的openid,可能是之前用户登录时存放的
  9. let opid = wx.getStorageSync('openid');
  10. //如果有OPID,直接发送
  11. if(opid){
  12. //执行保存到后台的操作
  13. that.saveSubMssage(opid,templateId);
  14. }else{
  15. wx.showToast({
  16. title: '需要关联微信账号',
  17. icon: 'success',
  18. duration: 2000
  19. })
  20. //和登录授权一样
  21. wx.login({
  22. success: res => {
  23. console.log(res);
  24. // 发送 res.code 到后台换取 openId, sessionKey, unionId
  25. request.post('后台换取用户id的接口', {
  26. code: res.code
  27. }).then((res) => {
  28. //得到openid
  29. let result = JSON.parse(res.result);
  30. wx.setStorageSync('openid',result.openid)
  31. opid=res.openid;
  32. //执行保存到后台的操作
  33. that.saveSubMssage(opid,templateId);
  34. });
  35. }
  36. })
  37. }
  38. }
  39. },
  40. error(res){
  41. console.log(res);
  42. wx.showToast({
  43. title: '授权出现错误',
  44. icon: 'none',
  45. duration: 2000
  46. })
  47. }
  48. })
  1. saveSubMssage(openid,tmplIds){
  2. let that = this;
  3. request.Post('后台保存用户同意消息推送的接口.do', {
  4. openId: openid,//用户openid
  5. templateId: tmplIds,//模板id
  6. userName: encodeURI(that.data.userName),//中文乱码处理
  7. idCard: that.data.idCard//身份证
  8. }).then((res) => {
  9. console.log(res);
  10. wx.showToast({
  11. title: '授权成功',
  12. icon: 'success',
  13. duration: 2000
  14. })
  15. //退出页面
  16. setTimeout(function() {
  17. wx.navigateBack({ changed: true });
  18. }, 2000);
  19. });

3 后台保存用户同意消息推送的接口

  1. @RequestMapping(value="/SaveMessageAuthority.do" ,produces = "application/json;charset=UTF-8")
  2. @ResponseBody
  3. public String SaveMessageAuthority(String openId,String templateId,String userName ,String idCard) throws Exception {
  4. try {
  5. WeChatMessageAuthorityPO weChatMessageAuthority = new WeChatMessageAuthorityPO();
  6. weChatMessageAuthority.setOpenId(openId);
  7. weChatMessageAuthority.setTemplateId(templateId);
  8. weChatMessageAuthority.setIdCard(idCard);
  9. // String temp = request.getParameter("studentName");
  10. if(StringUtils.isNotEmpty(userName)){
  11. userName = java.net.URLDecoder.decode(userName,"UTF-8");
  12. weChatMessageAuthority.setUserName(userName);
  13. }
  14. weChatMessageAuthority.setCreateDate(new Date());
  15. weChatMessageAuthority.setIsSend(BaseStaticParameter.NO);
  16. iWxMassageAuthorityService.saveOrUpdate(weChatMessageAuthority);
  17. }catch (Exception e){
  18. e.printStackTrace();
  19. return "false";
  20. }
  21. return "true";
  22. }

4 后台发送推送信息

  1. public static boolean sendNearRemindMessage(String openId,String serveName,String windowName,String lineNumber,String waitNumber,String msg) throws Exception {
  2. WxMaSubscribeMessage subscribeMessage = new WxMaSubscribeMessage();
  3. //跳转小程序页面路径
  4. subscribeMessage.setPage("pages/index/index");
  5. //模板消息id
  6. subscribeMessage.setTemplateId(WxMaConfiguration.templateId);
  7. //给谁推送 用户的openid (可以调用根据code换openid接口)
  8. subscribeMessage.setToUser(openId);
  9. //==========================================创建一个参数集合========================================================
  10. ArrayList<WxMaSubscribeData> wxMaSubscribeData = new ArrayList<>();
  11. // 订阅消息参数值内容限制说明
  12. // ---摘自微信小程序官方:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
  13. // 参数类别 参数说明 参数值限制 说明
  14. // thing.DATA 事物 20个以内字符 可汉字、数字、字母或符号组合
  15. // number.DATA 数字 32位以内数字 只能数字,可带小数
  16. // letter.DATA 字母 32位以内字母 只能字母
  17. // symbol.DATA 符号 5位以内符号 只能符号
  18. // character_string.DATA 字符串 32位以内数字、字母或符号 可数字、字母或符号组合
  19. // time.DATA 时间 24小时制时间格式(支持+年月日) 例如:15:01,或:2019年10月1日 15:01
  20. // date.DATA 日期 年月日格式(支持+24小时制时间) 例如:2019年10月1日,或:2019年10月1日 15:01
  21. // amount.DATA 金额 1个币种符号+10位以内纯数字,可带小数,结尾可带“元” 可带小数
  22. // phone_number.DATA 电话 17位以内,数字、符号 电话号码,例:+86-0766-66888866
  23. // car_number.DATA 车牌 8位以内,第一位与最后一位可为汉字,其余为字母或数字 车牌号码:粤A8Z888挂
  24. // name.DATA 姓名 10个以内纯汉字或20个以内纯字母或符号 中文名10个汉字内;纯英文名20个字母内;中文和字母混合按中文名算,10个字内
  25. // phrase.DATA 汉字 5个以内汉字 5个以内纯汉字,例如:配送中
  26. WxMaSubscribeData wxMaSubscribeData1 = new WxMaSubscribeData();
  27. wxMaSubscribeData1.setName("thing1");
  28. wxMaSubscribeData1.setValue(serveName);
  29. wxMaSubscribeData.add(wxMaSubscribeData1);
  30. WxMaSubscribeData wxMaSubscribeData2 = new WxMaSubscribeData();
  31. wxMaSubscribeData2.setName("thing6");
  32. wxMaSubscribeData2.setValue(windowName);
  33. wxMaSubscribeData.add(wxMaSubscribeData2);
  34. WxMaSubscribeData wxMaSubscribeData3 = new WxMaSubscribeData();
  35. wxMaSubscribeData3.setName("character_string2");
  36. wxMaSubscribeData3.setValue(lineNumber);
  37. wxMaSubscribeData.add(wxMaSubscribeData3);
  38. WxMaSubscribeData wxMaSubscribeData4 = new WxMaSubscribeData();
  39. wxMaSubscribeData4.setName("number3");
  40. wxMaSubscribeData4.setValue(waitNumber);
  41. wxMaSubscribeData.add(wxMaSubscribeData4);
  42. WxMaSubscribeData wxMaSubscribeData5 = new WxMaSubscribeData();
  43. wxMaSubscribeData5.setName("thing5");
  44. wxMaSubscribeData5.setValue(msg);//"快到您了,请关注窗口和叫号情况"
  45. wxMaSubscribeData.add(wxMaSubscribeData5);
  46. //把集合给大的data
  47. subscribeMessage.setData(wxMaSubscribeData);
  48. //=========================================封装参数集合完毕========================================================
  49. try {
  50. System.out.println(JsonUtil.toJSONString(subscribeMessage));
  51. //获取微信小程序配置:
  52. final WxMaService wxService = WxMaConfiguration.getMaService(WxMaConfiguration.appid);
  53. //进行推送
  54. wxService.getMsgService().sendSubscribeMsg(subscribeMessage);
  55. return true;
  56. } catch (Exception e) {
  57. e.printStackTrace();
  58. System.out.println(e.toString());
  59. }
  60. return false;
  61. }

5 微信maven(微信调用方式可选)

  1. <dependency>
  2. <groupId>com.github.binarywang</groupId>
  3. <artifactId>weixin-java-miniapp</artifactId>
  4. <version>3.6.0</version>
  5. </dependency>

6 WxMaConfiguration

  1. import cn.binarywang.wx.miniapp.api.WxMaService;
  2. import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
  3. import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
  4. import cn.binarywang.wx.miniapp.bean.WxMaMessage;
  5. import cn.binarywang.wx.miniapp.bean.WxMaTemplateData;
  6. import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage;
  7. import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
  8. import cn.binarywang.wx.miniapp.message.WxMaMessageHandler;
  9. import cn.binarywang.wx.miniapp.message.WxMaMessageRouter;
  10. import cn.binarywang.wx.miniapp.message.WxMaXmlOutMessage;
  11. import com.google.common.collect.Lists;
  12. import com.google.common.collect.Maps;
  13. import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
  14. import me.chanjar.weixin.common.error.WxErrorException;
  15. import me.chanjar.weixin.common.session.WxSessionManager;
  16. import org.springframework.context.annotation.Configuration;
  17. import javax.annotation.PostConstruct;
  18. import java.io.File;
  19. import java.util.Map;
  20. /**
  21. * create by zhaojiong
  22. * 22-8-16
  23. */
  24. @Configuration
  25. public class WxMaConfiguration {
  26. //叫号
  27. public final static String jh_templateId = "
  28. 消息模板id";
  29. //排队
  30. public final static String pd_templateId = "消息模板id";
  31. public final static String appid = "按情况填写";
  32. public final static String secret = "按情况填写";
  33. public final static String token = "按情况填写";
  34. public final static String aesKey = "按情况填写";
  35. public final static String msgDataFormat = "JSON";
  36. //
  37. private static Map<String, WxMaMessageRouter> routers = Maps.newHashMap();
  38. private static Map<String, WxMaService> maServices = Maps.newHashMap();
  39. //
  40. //
  41. public static WxMaService getMaService(String appid) {
  42. WxMaService wxService = maServices.get(appid);
  43. if (wxService == null) {
  44. throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid));
  45. }
  46. return wxService;
  47. }
  48. //
  49. public static WxMaMessageRouter getRouter(String appid) {
  50. return routers.get(appid);
  51. }
  52. //
  53. //
  54. @PostConstruct
  55. public void init() {
  56. WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
  57. config.setAppid(appid);
  58. config.setSecret(secret);
  59. config.setToken(token);
  60. config.setAesKey(aesKey);
  61. config.setMsgDataFormat(msgDataFormat);
  62. WxMaService service = new WxMaServiceImpl();
  63. service.setWxMaConfig(config);
  64. routers.put(appid, this.newRouter(service));
  65. maServices.put(appid, service);
  66. }
  67. //
  68. private WxMaMessageRouter newRouter(WxMaService service) {
  69. final WxMaMessageRouter router = new WxMaMessageRouter(service);
  70. router
  71. .rule().handler(logHandler).next()
  72. .rule().async(false).content("模板").handler(templateMsgHandler).end()
  73. .rule().async(false).content("文本").handler(textHandler).end()
  74. .rule().async(false).content("图片").handler(picHandler).end()
  75. .rule().async(false).content("二维码").handler(qrcodeHandler).end();
  76. return router;
  77. }
  78. private final WxMaMessageHandler templateMsgHandler = new WxMaMessageHandler() {
  79. @Override
  80. public WxMaXmlOutMessage handle(WxMaMessage wxMessage, Map<String, Object> context, WxMaService service, WxSessionManager sessionManager) throws WxErrorException {
  81. service.getMsgService().sendTemplateMsg(WxMaTemplateMessage.builder()
  82. .templateId("此处更换为自己的模板id")
  83. .formId("自己替换可用的formid")
  84. .data(Lists.newArrayList(
  85. new WxMaTemplateData("keyword1", "339208499", "#173177")))
  86. .toUser(wxMessage.getFromUser())
  87. .build());
  88. return null;
  89. }
  90. };
  91. private final WxMaMessageHandler logHandler = new WxMaMessageHandler() {
  92. @Override
  93. public WxMaXmlOutMessage handle(WxMaMessage wxMessage, Map<String, Object> context, WxMaService service, WxSessionManager sessionManager) throws WxErrorException {
  94. System.out.println("收到消息:" + wxMessage.toString());
  95. service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("收到信息为:" + wxMessage.toJson())
  96. .toUser(wxMessage.getFromUser()).build());
  97. return null;
  98. }
  99. };
  100. private final WxMaMessageHandler textHandler = new WxMaMessageHandler() {
  101. @Override
  102. public WxMaXmlOutMessage handle(WxMaMessage wxMessage, Map<String, Object> context, WxMaService service, WxSessionManager sessionManager) throws WxErrorException {
  103. service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("回复文本消息")
  104. .toUser(wxMessage.getFromUser()).build());
  105. return null;
  106. }
  107. };
  108. private final WxMaMessageHandler picHandler = new WxMaMessageHandler() {
  109. @Override
  110. public WxMaXmlOutMessage handle(WxMaMessage wxMessage, Map<String, Object> context, WxMaService service, WxSessionManager sessionManager) throws WxErrorException {
  111. try {
  112. WxMediaUploadResult uploadResult = service.getMediaService()
  113. .uploadMedia("image", "png",
  114. ClassLoader.getSystemResourceAsStream("tmp.png"));
  115. service.getMsgService().sendKefuMsg(
  116. WxMaKefuMessage
  117. .newImageBuilder()
  118. .mediaId(uploadResult.getMediaId())
  119. .toUser(wxMessage.getFromUser())
  120. .build());
  121. } catch (WxErrorException e) {
  122. e.printStackTrace();
  123. }
  124. return null;
  125. }
  126. };
  127. private final WxMaMessageHandler qrcodeHandler = new WxMaMessageHandler() {
  128. @Override
  129. public WxMaXmlOutMessage handle(WxMaMessage wxMessage, Map<String, Object> context, WxMaService service, WxSessionManager sessionManager) throws WxErrorException {
  130. try {
  131. final File file = service.getQrcodeService().createQrcode("123", 430);
  132. WxMediaUploadResult uploadResult = service.getMediaService().uploadMedia("image", file);
  133. service.getMsgService().sendKefuMsg(
  134. WxMaKefuMessage
  135. .newImageBuilder()
  136. .mediaId(uploadResult.getMediaId())
  137. .toUser(wxMessage.getFromUser())
  138. .build());
  139. } catch (WxErrorException e) {
  140. e.printStackTrace();
  141. }
  142. return null;
  143. }
  144. };
  145. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/849486
推荐阅读
相关标签
  

闽ICP备14008679号