【微信】公众号扫码点餐功能(附源码)
【标题】微信-推送公众号扫码关注信息(附源码)
【前言】
最近在做一个需求,也是公众号常用的功能-《扫码点餐》。
在店铺桌子贴一张固定二维码,用户扫码后进入公众号窗口①,推送模板消息(点餐消息)给用户②。
① 用户已关注公众号,则到关注页面;已关注则直接进入公众号窗口。
② 使用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字符串判断及转型。
作者附言:如果本文章帮到了您,劳烦动动贵手点个赞,关注一下,谢谢^_^
【微信】公众号扫码点餐功能(附源码)相关推荐
- Java微信公众号发送消息-保姆级教程附源码
目录 1. 概念说明: 2. 开发准备: 3. 测试demo(更改配置信息即可使用) 3.1. 服务器配置 3.1.1.配置填写说明 3.1.2.校验服务器有效性: 3.1.3.URL后端接口代码和校 ...
- 微信公众号对接PHP电影网站,wxapi 微信公众号平台与电影类网站对接源码
wxapi 联合开发网 - pudn.com...
wxapi 所属分类:微信小程序 开发工具:Java 文件大小:3KB 下载次数:0 上传日期:2019-02-16 23:41:01 上 传 者:lziccard 说明: 微信公众号平台与电影类网 ...
- 自己做的微信小程序、微信公众号、H5版日历签到积分源码包
微信小程序版 自己写的微信小程序日历签到模块;只需修改接口地址和对应返回参数就能动态生成整个模块: 小程序版源码包 微信公众号.H5版 背景图点击签到: 本日已签到.未签到文字提示: 已签到积分文字提 ...
- uni-app - 最详细 H5 网页接入微信支付功能,提供从详细的示例代码与注释(移动端网页实现微信支付能力,微信公众号前端支付 JSAPI / JS-SDK 详细示例源码)官方最新超级详细教程
前言 关于 uni-app 项目中接入微信支付的文章鱼龙混杂,各种 JSAPI / JS-SDK 乱代码.过时.没注释.不讲流程原理,非常难用. 本文实现了 uni-app H5 移动端网页项目,实现 ...
- Koa2实现电影微信公众号前后端开发学习视频及源码
链接:https://pan.baidu.com/s/17jWIYDcBIXvrIKLEPhfGkA 提取码:nj3d
- 【原创纯手打】如何使用Vue写微信朋友圈中的留言回复功能(附源码)
简单的留言板懂的都懂,问题是如何添加留言功能 当我们添加写的内容存储到数组,然后将其遍历出来,在外部渲染时,再次遍历item.children,然后对其添加新的页面渲染 绑定回复键,在store.js ...
- 手把手教程用Java实现微信公众号扫码登录功能
文章目录 前言 一.环境准备 二.使用步骤 1. 使用微信工具包 2. 创建数据表 3. 登录页面代码逻辑 4. 验证微信公众号登录 总结 前言 微信现今是我们必不可少的社交工具了,围绕微信这个生态实 ...
- 微信公众号扫码授权登录思路
引言 上学期研究了一下微信登录相关内容,也写了两三篇笔记,但是最后实际登录流程没有写,主要因为感觉功能完成有所欠缺,一直也没有好的思路:这两天我又看了看官方文档,重新构思了一下微信公众号登录相关的内容 ...
- 实现支持多公众号的微信公众号扫码登录服务
实现支持多公众号的微信公众号扫码登录服务 最近,在公司的通行证项目开发过程中,需求方提出了支持微信公众号扫码登录,并且可以支持多公众号接入的需求.研究了一下微信公众号的开发文档,实现微信公众号扫码登录 ...
- php公众号客服消息图文,微信公众号发送客服消息功能怎么实现?
1.微号帮平台:免费注册试用7天 根据页面上的提示完成新用户注册操作,>>立即注册 注册成功后,使用用户名.密码登录平台,>>立即登录 3.登录成功后,进入管理中心,选择添加公 ...
最新文章
- linux centos rc.local 自启动无效 解决方法
- 『ACM--数据结构--字典树』信息竞赛进阶指南--Tire树
- Angular - - angular.element
- Redis RDB与AOF持久化详解
- 1269: [AHOI2006]文本编辑器editor
- (2)数据结构-线性表顺序存储
- php检查某个网站,用php开发一个检测某网站是否在正常运行的小模块
- js document 触发按键事件
- 零基础如何入门MATLAB(适用于所有编程语言)?(建议收藏)
- educator计算机技术基础答案,计算机教育技术基础,technical basis of computer education,音标,读音,翻译,英文例句,英语词典...
- 如何将mac中文输入法(搜狗等)设置成默认输入法
- oracle查询时间段差,关于oracle数据库中进行查询的时候出现效率特别差的一种情况...
- ARM裸机开发篇1:Cortex-A7开发环境搭建
- 七个不良习惯导致攻击者轻松入侵数据库
- 阿里2017实习一面二面
- mysql计算结果取整_Sql 获取向上取整、向下取整、四舍五入取整的实例(转)
- 【云计算】私有云在VMware下虚拟机的创建与配置(图文教程)
- 2021年氯化工艺考试及氯化工艺考试内容
- 程序员间 日常商业互捧。。
- 电机控制知识总结笔记