【标题】微信-推送公众号扫码关注信息(附源码)

【前言】

最近在做一个需求,也是公众号常用的功能-《扫码点餐》。

在店铺桌子贴一张固定二维码,用户扫码后进入公众号窗口①,推送模板消息(点餐消息)给用户②。

① 用户已关注公众号,则到关注页面;已关注则直接进入公众号窗口。

② 使用openId和模板消息id推送信息给用户。

这样可以收集用户的openId,绑定店铺,后期也能推送其他模板消息、帮助用户和店铺静默开通会员卡等操作。

【概览】


一、实现步骤

1、生成带参数的二维码

2、服务器接入指南

3、接收事件推送

4、与3同

【概览】


二、部分代码:

1、qrauth_wx.jsp(显示二维码)

<noscript><h3 class="tips">您的浏览器不支持JavaScript,请更改浏览器参数!</h3>
</noscript>
<%String key = "key_" + System.currentTimeMillis();String url = QRauthAction.getQRCodeByCache(storeName);session.setAttribute("xxx_eqcode_url_" + key, url);
%>
<div class="mydiv" id="opacity"></div>
<div style="margin: auto; width: 100%; padding: 0px;" id="ecode_div"><img alt="二维码" src="<%=serviceUrl%>/qrauth_wx_img.jsp?key=<%=key%>&width=<%=width%>&height=<%=height%>" title="扫码关注" style="max-width: 600px; max-height: 600px;" id="qrCode" />
</div>

2、获取access_token:

/*** TODO 请求微信获取token* * @param appId* @return*/
protected static String getAccess_token(String appId, String secret) {String rs = null;try {String mainUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + secret;rs = NetUtils.getHtmlSource(mainUrl, 5000);JSONObject json = new JSONObject(rs);return json.getString("access_token");} catch (Exception e) {LogUtils.error(rs, e);return "";}
}

3、生成二维码:

/*** 创建二维码* * @param access_token* @param qrCodeType* @return*/
public static String createQRCode(String access_token, String parames, String qrCodeType) {try {Json json = new Json();JSONObject jsonObject = new JSONObject();JSONObject jsonObject1 = new JSONObject();if (StringUtils.isNotBlank(qrCodeType) && "1".equals(qrCodeType)) {// 生成永久二维码jsonObject1.put("scene_str", parames);jsonObject.put("scene", jsonObject1);json.add("action_name", "QR_LIMIT_STR_SCENE");json.add("action_info", jsonObject);} else {jsonObject1.put("scene_str", parames);jsonObject.put("scene", jsonObject1);json.add("expire_seconds", String.valueOf(1000 * 60 * 60 * 24)); // 有效期:秒json.add("action_name", "QR_STR_SCENE");json.add("action_info", jsonObject);}String createRS = WeiXinNetUtil.postJsonDataToServer(WeiXinUrl.QRCODE_CREATE + "?access_token=" + access_token, json.toString());LogUtils.debug(createRS);JSONObject creJson = new JSONObject(createRS);if (!creJson.has("url")) {return null;}return creJson.getString("url");} catch (Exception e) {e.printStackTrace();return null;}
}

4、接收推送消息:

if ("event".equalsIgnoreCase(msgType)) {String event = map.containsKey("Event") ? map.get("Event") : null;if (event != null) {String eventKey = map.containsKey("EventKey") ? map.get("EventKey") : null;// 关注/取消关注事件:if ("subscribe".equalsIgnoreCase(event)) {if (StringUtils.isNotBlank(eventKey)) {eventKey = eventKey.replaceAll("qrscene_", "");Update update = new Update("Account");update.setKey("storeName", eventKey);update.setValue("openid", openId);update.execute(true);}new WeiXinMethod().message_custom_send(openId, "感谢你的关注,我与你同在!!!");SendMessageDing sendMessageDing = new SendMessageDing();sendMessageDing.setTitle("用户关注公众号");sendMessageDing.setLogType("微信");sendMessageDing.setLogInfo("用户{" + openId + "}关注了公众号,绑定了{" + eventKey + "}账号");sendMessageDing.sendAsyn();}if ("unsubscribe".equalsIgnoreCase(event)) {String storeName = DBUtils.getString("select storeName from Account where openId=? limit 1 ", new String[] { openId });SendMessageDing sendMessageDing = new SendMessageDing();sendMessageDing.setTitle("取消关注公众号");sendMessageDing.setLogType("微信");sendMessageDing.setLogInfo("用户{" + openId + "}取消关注公众号,为{" + storeName + "}账号;");sendMessageDing.sendAsyn();DBUtils.execute("update Account set openId=null where openId=? ", new String[] { openId });}if ("scan".equalsIgnoreCase(event)) {if (StringUtils.isNotBlank(eventKey)) {eventKey = eventKey.replaceAll("qrscene_", "");Update update = new Update("SYCM_Account");update.setKey("storeName", eventKey);update.setValue("openid", openId);update.execute(true);}SendMessageDing sendMessageDing = new SendMessageDing();sendMessageDing.setTitle("用户重新扫码进公众号");sendMessageDing.setLogType("微信");sendMessageDing.setLogInfo("用户{" + openId + "}已关注公众号,为{" + eventKey + "}账号!");sendMessageDing.sendAsyn();}if ("click".equalsIgnoreCase(event)) {// @-菜单点击,菜单id匹配:if ("NIUCM_V1001_DOWN".equalsIgnoreCase(eventKey)) {String msg = "地址:https://www.baidu.com/";out.println(WeiXinMethod.getSendPlainMsgXml(openId, toUserId, msg));}}}
}

5、推送模板消息给用户:

/*** TODO 模板推送* * @param map* */
public static boolean queueReminderPush(Map<String, Object> map) {String openId = map.get("openId").toString();if (openId == null)return false;String title = map.get("title") == null ? "" : map.get("title").toString();String keyword1 = map.get("keyword1") == null ? "" : map.get("keyword1").toString();String keyword2 = map.get("keyword2") == null ? "" : map.get("keyword2").toString();String detailUrl = map.get("detailUrl") == null ? "" : map.get("detailUrl").toString();String remark = map.get("remark") == null ? "" : map.get("remark").toString();try {String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + AccessTokenUtil.getTokenByDB();Json json = new Json();Json data = new Json();json.add("template_id", WX_APP_TEMPLATE_ID);json.add("url", detailUrl);json.add("topcolor", "#000000");json.add("touser", openId);data.put("first", newWeixinJson(title));data.put("keyword1", newWeixinJson(keyword1));// 商家名称data.put("keyword2", newWeixinJson(keyword2));// 评测结果data.put("remark", newWeixinJson(remark, "#993366"));json.put("data", data);String strRes = NetUtils.getHtmlSourcePost(url, json.toString());LogUtils.debug(strRes);JSONObject obj = new JSONObject(strRes);if (obj.has("errcode") && !"0".equalsIgnoreCase(obj.getString("errcode"))) {return false;}return true;} catch (Exception e) {return false;}
}

三、附件-代码:

代码地址:https://download.csdn.net/download/qq_26599807/12107121 密码:lcl20200116

如遇代码不能用,麻烦给作者留言,百忙之中尽量给以回复。

Ⅰ、可能原因:

1、尚未更新地址(最后编辑:2020-01-19 14:13:11)

2、资源未审核通过,一个小时后重试

3、资源被和谐了

4、not other...

Ⅱ、代码说明:

1、SendMessageDing类为推送服务消息日志类,可忽略。

2、QRImageUtils和qrauth_wx_img.jsp是二维码java生成方式,可自行度娘。

3、类似DBUtils和Update的是数据库操作封装类,可使用自己项目传统方式。

4、CacheUtils缓存、StringUtils字符串判断及转型。

作者附言:如果本文章帮到了您,劳烦动动贵手点个赞,关注一下,谢谢^_^

【微信】公众号扫码点餐功能(附源码)相关推荐

  1. Java微信公众号发送消息-保姆级教程附源码

    目录 1. 概念说明: 2. 开发准备: 3. 测试demo(更改配置信息即可使用) 3.1. 服务器配置 3.1.1.配置填写说明 3.1.2.校验服务器有效性: 3.1.3.URL后端接口代码和校 ...

  2. 微信公众号对接PHP电影网站,wxapi 微信公众号平台与电影类网站对接源码 wxapi 联合开发网 - pudn.com...

    wxapi 所属分类:微信小程序 开发工具:Java 文件大小:3KB 下载次数:0 上传日期:2019-02-16 23:41:01 上 传 者:lziccard 说明:  微信公众号平台与电影类网 ...

  3. 自己做的微信小程序、微信公众号、H5版日历签到积分源码包

    微信小程序版 自己写的微信小程序日历签到模块;只需修改接口地址和对应返回参数就能动态生成整个模块: 小程序版源码包 微信公众号.H5版 背景图点击签到: 本日已签到.未签到文字提示: 已签到积分文字提 ...

  4. uni-app - 最详细 H5 网页接入微信支付功能,提供从详细的示例代码与注释(移动端网页实现微信支付能力,微信公众号前端支付 JSAPI / JS-SDK 详细示例源码)官方最新超级详细教程

    前言 关于 uni-app 项目中接入微信支付的文章鱼龙混杂,各种 JSAPI / JS-SDK 乱代码.过时.没注释.不讲流程原理,非常难用. 本文实现了 uni-app H5 移动端网页项目,实现 ...

  5. Koa2实现电影微信公众号前后端开发学习视频及源码

    链接:https://pan.baidu.com/s/17jWIYDcBIXvrIKLEPhfGkA  提取码:nj3d

  6. 【原创纯手打】如何使用Vue写微信朋友圈中的留言回复功能(附源码)

    简单的留言板懂的都懂,问题是如何添加留言功能 当我们添加写的内容存储到数组,然后将其遍历出来,在外部渲染时,再次遍历item.children,然后对其添加新的页面渲染 绑定回复键,在store.js ...

  7. 手把手教程用Java实现微信公众号扫码登录功能

    文章目录 前言 一.环境准备 二.使用步骤 1. 使用微信工具包 2. 创建数据表 3. 登录页面代码逻辑 4. 验证微信公众号登录 总结 前言 微信现今是我们必不可少的社交工具了,围绕微信这个生态实 ...

  8. 微信公众号扫码授权登录思路

    引言 上学期研究了一下微信登录相关内容,也写了两三篇笔记,但是最后实际登录流程没有写,主要因为感觉功能完成有所欠缺,一直也没有好的思路:这两天我又看了看官方文档,重新构思了一下微信公众号登录相关的内容 ...

  9. 实现支持多公众号的微信公众号扫码登录服务

    实现支持多公众号的微信公众号扫码登录服务 最近,在公司的通行证项目开发过程中,需求方提出了支持微信公众号扫码登录,并且可以支持多公众号接入的需求.研究了一下微信公众号的开发文档,实现微信公众号扫码登录 ...

  10. php公众号客服消息图文,微信公众号发送客服消息功能怎么实现?

    1.微号帮平台:免费注册试用7天 根据页面上的提示完成新用户注册操作,>>立即注册 注册成功后,使用用户名.密码登录平台,>>立即登录 3.登录成功后,进入管理中心,选择添加公 ...

最新文章

  1. linux centos rc.local 自启动无效 解决方法
  2. 『ACM--数据结构--字典树』信息竞赛进阶指南--Tire树
  3. Angular - - angular.element
  4. Redis RDB与AOF持久化详解
  5. 1269: [AHOI2006]文本编辑器editor
  6. (2)数据结构-线性表顺序存储
  7. php检查某个网站,用php开发一个检测某网站是否在正常运行的小模块
  8. js document 触发按键事件
  9. 零基础如何入门MATLAB(适用于所有编程语言)?(建议收藏)
  10. educator计算机技术基础答案,计算机教育技术基础,technical basis of computer education,音标,读音,翻译,英文例句,英语词典...
  11. 如何将mac中文输入法(搜狗等)设置成默认输入法
  12. oracle查询时间段差,关于oracle数据库中进行查询的时候出现效率特别差的一种情况...
  13. ARM裸机开发篇1:Cortex-A7开发环境搭建
  14. 七个不良习惯导致攻击者轻松入侵数据库
  15. 阿里2017实习一面二面
  16. mysql计算结果取整_Sql 获取向上取整、向下取整、四舍五入取整的实例(转)
  17. 【云计算】私有云在VMware下虚拟机的创建与配置(图文教程)
  18. 2021年氯化工艺考试及氯化工艺考试内容
  19. 程序员间 日常商业互捧。。
  20. 电机控制知识总结笔记

热门文章

  1. Ubuntu关机(shut down)(power off)后不断电的问题
  2. 43种名车标志及来历
  3. 高通Android Q(android10)设置默认锁屏壁纸
  4. 陀螺仪、加速计、磁力计
  5. 皮尔逊相关系数的计算过程
  6. 北京大学公开课《数据结构与算法Python版》
  7. 计算机辅助翻译公开课,清华大学发布八门网络公开课
  8. 小觅深度相机标准版 ROS使用
  9. 广州搬砖第三年,从一枚小菜鸡到架构师
  10. 安装WIN8提示Error Code:0x0000005D的解决办法