1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > wechat-0050 微信公众号 带参数的二维码获取与扫码事件推送

wechat-0050 微信公众号 带参数的二维码获取与扫码事件推送

时间:2022-05-31 07:30:21

相关推荐

wechat-0050 微信公众号 带参数的二维码获取与扫码事件推送

demo:/wenrongyao/wechat-demo

摘要:这篇帖子讲述如何获取带参数的二维码,以及扫码带参数的二维码后的事件接收。

微信开发者文档:https://mp./wiki?t=resource/res_main&id=mp1443433542

1、二维码类型

临时二维码,是有过期时间的,最长可以设置为在二维码生成后的30天(即2592000秒)后过期,但能够生成较多数量。临时二维码主要用于帐号绑定等不要求二维码永久保存的业务场景

永久二维码,是无过期时间的,但数量较少(目前为最多10万个)。永久二维码主要用于适用于帐号绑定、用户来源统计等场景。

2、带参数的二维码用处之一:可用于第三方登录

资源贴:扫码绑定/wrongyao/article/details/83963150

扫码登录/wrongyao/article/details/83963844

3、 获取带参数的二维码的过程包括两步,首先创建二维码ticket,然后凭借ticket到指定URL换取二维码。

3.1 获取ticket:先得到accessToken,拼凑参数(json数据,不同类型的二维码数据格式不同),调用微信接口获取ticket

3.1.1 access_token 项目统一管理,自动获取 参考:/wrongyao/article/details/80276888

3.1.2 json请求数据拼凑

临时二维码json数据

{"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}

或(两者的区别在于场景值的表示方法不同,上面是数字,下面是字符串)

{"expire_seconds": 604800, "action_name": "QR_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}

永久二维码json数据(和临时的区别在于没有时间限制)

{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}}

或(同上)

{"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}

注意格式一定要确保正确,否则可能会造成可以获取二维码,但在扫码事件中无法获取场景值。

3.1.3 调用微信接口获取ticket

public class QrCodeServiceImpl implements IQrCodeService {// 获取ticketprivate static final String GET_QRCODE_URL = "https://api./cgi-bin/qrcode/create?access_token={TOKEN}";// 换取二维码private static final String QR_CODE_URL = "https://mp./cgi-bin/showqrcode?ticket={TICKET}";@Overridepublic String getTempQrcode() {QrCodeParam qrCodeParam = new QrCodeParam();QrCodeParam.ActionInfo actionInfo = qrCodeParam.new ActionInfo();QrCodeParam.ActionInfo.Scene scene = actionInfo.new Scene();//设置场景值scene.setSceneStr("temp_qrcode_test");actionInfo.setScene(scene);qrCodeParam.setActionInfo(actionInfo);qrCodeParam.setActionName("QR_STR_SCENE");qrCodeParam.setExpireSeconds(604800);String param = GsonUtil.toJson(qrCodeParam);String qrCodeUrl = QR_CODE_URL.replace("{TICKET}", getTicket(param));System.out.println(qrCodeUrl);return qrCodeUrl;}@Overridepublic String getPermanentQrCode() {QrCodeParam qrCodeParam = new QrCodeParam();QrCodeParam.ActionInfo actionInfo = qrCodeParam.new ActionInfo();QrCodeParam.ActionInfo.Scene scene = actionInfo.new Scene();//设置场景值scene.setSceneStr("permanent_qrcode_test");actionInfo.setScene(scene);qrCodeParam.setActionInfo(actionInfo);qrCodeParam.setActionName("QR_LIMIT_STR_SCENE");String param = GsonUtil.toJson(qrCodeParam);String qrCodeUrl = QR_CODE_URL.replace("{TICKET}", getTicket(param));System.out.println(qrCodeUrl);return qrCodeUrl;}/*** 获取ticket** @param param* @return*/private String getTicket(String param) {String url = GET_QRCODE_URL.replace("{TOKEN}", Constant.ACCESS_TOKEN);String jsonStr = HttpRequest.post(url, param, null, Constant.ContentType.APPLICATION_JSON, false);Map<String, Object> map = GsonUtil.fromJson(jsonStr, Map.class);return map.get("ticket").toString();}}

这边的请求数据param的生成是采用gson生成的,实体类的封装可以下载demo查看,这边就不贴了。

3.1.4 返回信息

4、用ticket获取二维码

接口:https://mp./cgi-bin/showqrcode?ticket=TICKET

ticket替换成自己获取的ticket(上为临时,下为永久)

5、扫码推送事件

事件推送参看:/wrongyao/article/details/86496549

5.1 用户已关注微信公众号扫码推送信息如下

打印推送信息:

临时二维码

key:Ticket-value:gQFJ8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAySFQ2RmdSSlJmM2sxaUxUOE5zY1AAAgQv-T5cAwSAOgkAkey:CreateTime-value:1547633478key:EventKey-value:temp_qrcode_testkey:Event-value:SCANkey:ToUserName-value:gh_b348cb411e6ckey:FromUserName-value:oLXXD1ElSeoNELQP1EhUkvlRF9SMkey:MsgType-value:event

永久二维码

key:Ticket-value:gQG08DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyc1FUVWdBSlJmM2sxMDAwME0wN2YAAgQd-j5cAwQAAAAAkey:CreateTime-value:1547633517key:EventKey-value:permanent_qrcode_testkey:Event-value:SCANkey:ToUserName-value:gh_b348cb411e6ckey:FromUserName-value:oLXXD1ElSeoNELQP1EhUkvlRF9SMkey:MsgType-value:event

5.2 事件处理

简单处理,扫临时二维码就回复临时二维码,扫永久二维码就回复永久二维码

else if (event.equals(Constant.Event.SCAN)) { // 扫码事件String eventKey = map.get("EventKey");if (eventKey.equals("temp_qrcode_test")) { //临时二维码result = msgService.returnText(map, "扫描临时二维码");} else if (eventKey.equals("permanent_qrcode_test")) {result = msgService.returnText(map, "扫描永久二维码");}}

5.3 结果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。