demo:https://github.com/wenrongyao/wechat-demo

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

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

1、二维码类型

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

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

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

资源贴:扫码绑定https://blog.csdn.net/wrongyao/article/details/83963150

扫码登录https://blog.csdn.net/wrongyao/article/details/83963844

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

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

3.1.1 access_token  项目统一管理,自动获取 参考:https://blog.csdn.net/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.weixin.qq.com/cgi-bin/qrcode/create?access_token={TOKEN}";// 换取二维码private static final String QR_CODE_URL = "https://mp.weixin.qq.com/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.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET

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

5、扫码推送事件

事件推送参看:https://blog.csdn.net/wrongyao/article/details/86496549

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

打印推送信息:

临时二维码

key:Ticket-value:gQFJ8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAySFQ2RmdSSlJmM2sxaUxUOE5zY1AAAgQv-T5cAwSAOgkA
key:CreateTime-value:1547633478
key:EventKey-value:temp_qrcode_test
key:Event-value:SCAN
key:ToUserName-value:gh_b348cb411e6c
key:FromUserName-value:oLXXD1ElSeoNELQP1EhUkvlRF9SM
key:MsgType-value:event

永久二维码

key:Ticket-value:gQG08DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyc1FUVWdBSlJmM2sxMDAwME0wN2YAAgQd-j5cAwQAAAAA
key:CreateTime-value:1547633517
key:EventKey-value:permanent_qrcode_test
key:Event-value:SCAN
key:ToUserName-value:gh_b348cb411e6c
key:FromUserName-value:oLXXD1ElSeoNELQP1EhUkvlRF9SM
key: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 结果

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

  1. 微信小程序生成带参数的二维码

    微信小程序生成带参数的二维码 //写一个图片来写路径,好让二维码显示出来 <image style="width:500rpx;height:500rpx;" src=&qu ...

  2. 微信小程序生成带参数的二维码以及小程序码

    微信小程序生成带参数的二维码 官方共给了三个接口调用,大家可以根据自己的实际情况来使用,我这里使用的是接口B和接口C. 官方文档地址 业务需求: 扫描二维码进入指定商品页面,需要的参数为商品id(go ...

  3. PHP7.0微信公众平台开发4: 实例一:接收普通消息和接收事件推送

    PHP7.0微信公众平台开发4: 实例一:接收普通消息和接收事件推送 1. API接口的声明 2. PHP脚本代码 3. 运行结果 由于消息类型有多钟,本文中,"接收普通消息"我以 ...

  4. 微信公众号带参数二维码的几个使用场景

    微信公众号官方开放了 "带参数二维码" 的功能,根据官网文档的描述,有如下的特点: 为了满足用户渠道推广分析和用户帐号绑定等场景的需要,公众平台提供了生成带参数二维码的接口. 通过 ...

  5. 微信开发生成带参数的二维码的讲解

    在微信公众号平台开发者那里,在"账号管理"那里,有一项功能是"生成带参数的二维码",通过这儿生成的二维码,只要通过微信扫一扫之后,会把事件自动推送到微信公众号上 ...

  6. 渠道码是什么意思?微信公众号怎么设置渠道二维码?

    渠道码是一种带参数的二维码,可以自动统计到渠道引流效果,可以对公众号的粉丝来源渠道进行统计. 渠道码的作用一般包括自定义回复.粉丝标签自定义管理.粉丝来源数据自动统计. 我们在公众号推广时可以使用渠道 ...

  7. laravel生成微信公众号带参数二维码并响应扫描带参数二维码

    微信公众号后台ip白名单.网页接口域名之类的配置就不多说了,这里主要配置的是开发->基本配置->服务器配置(注:一旦启用改配置,公众号自动回复就会失效): 1.服务器地址(URL):这里要 ...

  8. 微信公众号开发,扫描二维码事件推送丢失参数问题

    需求场景: 每个用户都有自己的推广二维码,分享自己推广二维码,别人扫码后跳转关注公众号,关注后绑定推荐关系. 用到技术点: 1.生成带参数二维码 2.接收事件推送,这里主要是关注和扫带参数二维码两个事 ...

  9. 微信公众号开发-----实现模板、图文、文本、音乐、图片推送

    本篇文章实现模板.图文.文本.音乐.图片推送,前提是已经搭建了微信开发环境.读完本文后,实现的主要效果如下 在测试账号中配置模板 登录测试公众号/正式公众号(认证后的服务号),测试公众号:模板消息接口 ...

  10. 微信渠道二维码怎么做?微信公众号怎么做渠道二维码?

    因为公众平台没有生成渠道二维码功能,如果想要实现公众号的渠道二维码,可以用第三方平台微号帮提供的渠道二维码生成在线功能实现,渠道二维码主要用于统计各个渠道来源的粉丝,为公众号实现精准化推广,为公众号节 ...

最新文章

  1. golang 值得注意的地方(2则)
  2. python写excel文件出错_【求教】xlutils修改中文Excel文件出错
  3. 建立在线社区:Numenta
  4. 计算机云客户端技术指标,云服务器技术指标
  5. 类的构造函数和析构函数、默认构造函数
  6. pytorch迁移学习--模型建立的代码实现
  7. 持续数据保护(CDP):Near-CDP vs. real-CDP
  8. 好用的 edge 插件有哪些?
  9. java象棋人机_Java版中国象棋人机对战源代码,作者将AI算法用得淋漓尽致JAVA游戏源码下载...
  10. Android C++ OpenGL教程课程总结
  11. 使用Composer部署laravel框架
  12. TortoiseGit解决冲突
  13. # responses[name] = response
  14. deepin系统怎么分区?deepin系统分区方法介绍
  15. 不能打开到主机的连接,在端口1521:连接失败的解决方法
  16. 人脸识别小区门禁系统_小区人脸识别门禁系统安全吗?
  17. 通过边界代理一路打到三层内网+后渗透通用手法
  18. 设置窗口颜色保护眼睛(win7/xp)
  19. java设计一个bank类实现银行_java定义一个类实现银行账户的概念。
  20. mcp2515 linux 设备树,mcp2515驱动的实现

热门文章

  1. Centos7 Certbot 常用命令相关总结
  2. 细说MATLAB中的MAX函数 (翻译Help文档而来)
  3. H分公司局域网络部署
  4. 基于RT_Thread连接中国移动onenet平台的RGB三色灯项目
  5. 【遇见Doris】寒冷冬日的一次温暖相聚 · Doris开发者沙龙
  6. yum到底是干什么的?
  7. 一次神坑:Qt的QFile新建文件
  8. 剑指offter笔记
  9. 【论文简述及翻译】FlowNet: Learning Optical Flow with Convolutional Networks(ICCV 2015)
  10. 《信息安全技术关键信息基础设施安全保护要求》获批准通过