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

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 {
    // 获取ticket
    private 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}";

    @Override
    public 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;
    }

    @Override
    public 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 结果

©️2020 CSDN 皮肤主题: 鲸 设计师:meimeiellie 返回首页