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 结果