美文网首页
微信带参二维码

微信带参二维码

作者: wangxiaoda | 来源:发表于2017-03-13 14:34 被阅读3274次

微信带参二维码场景

为了满足用户渠道推广分析的需要,公众平台提供了生成带参数二维码的接口。使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送。

目前有2种类型的二维码,分别是临时二维码和永久二维码,前者有过期时间,最大为1800秒,但能够生成较多数量,后者无过期时间,数量较少(目前参数只支持1--100000)。两种二维码分别适用于帐号绑定、用户来源统计等场景。

用户扫描带场景值二维码时,可能推送以下两种事件:

  • 如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。
  • 如果用户已经关注公众号,在用户扫描后会自动进入会话,微信也会将带场景值扫描事件推送给开发者。

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

生成access_token

生成token的URL

private final static String tokenServiceUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential";

GET请求获取token

/**
     * 获取token
     * @return
     */
    public String getToken(){

        String tokenresult = null;
        String token = null;
        StringBuffer token_url = new StringBuffer();

        token_url.append(tokenServiceUrl+"&appid=").append(WeixinConfig.GZH_APPID).append("&secret=").append(WeixinConfig.GZH_KEY_SECRET);

        HttpMethod tokenmethod = new GetMethod(token_url.toString());

        try {
            tokenresult = HttpClientUtil.httpRequest(tokenmethod);
            TokenVo tokenVo = JSON.parseObject(tokenresult, TokenVo.class);
            token = tokenVo.getAccess_token();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return token;
    }

创建临时二维码

每次创建二维码ticket需要提供一个开发者自行设定的参数(scene_id),分别介绍临时二维码和永久二维码的创建二维码ticket过程。
临时二维码请求说明

http请求URL
https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN

POST数据格式

{
     "expire_seconds": 1800,
     "action_name": "QR_SCENE",
     "action_info": {
         "scene": {
             "scene_id": 100000
         }
     }
}

返回格式

{
    "ticket": "gQFK8DoAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL3kweXE0T3JscWY3UTltc3ZPMklvAAIEG9jUUgMECAcAAA==",
    "expire_seconds": 1800
}

代码实现

private static final String WEIXIN_POST_URL = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=";

// 创建临时二维码
public void createTempQR(){

        PostMethod post = new PostMethod(WEIXIN_POST_URL + getToken());

        String xml = "{\"expire_seconds\": 604800, \"action_name\": \"QR_SCENE\", \"action_info\": {\"scene\": {\"scene_id\": 123}}}";
        post.setRequestBody(xml);
        try {
            String res = HttpClientUtil.httpRequest(post);

            System.out.println(res);

        } catch (IOException e) {
            e.printStackTrace();
        }

}

创建永久二维码

http请求URL
https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN

POST数据格式

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

返回格式

{
    "ticket": "gQHi8DoAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL0UweTNxNi1sdlA3RklyRnNKbUFvAAIELdnUUgMEAAAAAA=="
}

代码实现

private static final String WEIXIN_POST_URL = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=";

// 创建永久二维码
public void createLongQR(){

        PostMethod post = new PostMethod(WEIXIN_POST_URL + getToken());

        String xml = "{\"action_name\": \"QR_LIMIT_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": \"123\"}}}";
        post.setRequestBody(xml);
        try {
            String res = HttpClientUtil.httpRequest(post);

            System.out.println(res);

        } catch (IOException e) {
            e.printStackTrace();
        }

}

通过ticket换取二维码

GET请求URL
https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TKCKET

TICKET必需UrlEncode

代码实现

private final static String GET_QR_CODE = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=";

// 通过ticket获取二维码
public void getQRByTicket(String ticket){

        GetMethod get = new GetMethod(GET_QR_CODE + URLEncoder.encode(ticket) );
        get.setRequestHeader("content_type","image/jpg");
        get.setRequestHeader("http_code","200");
        get.setRequestHeader("header_size","162");
        get.setRequestHeader("request_size","181");
        get.setRequestHeader("filetime","-1");
        get.setRequestHeader("ssl_verify_result","20");
        get.setRequestHeader("redirect_count","0");
        get.setRequestHeader("total_time","0.509");
        try {
            String res = HttpClientUtil.httpRequest(get);

            System.out.println(res);

        } catch (IOException e) {
            e.printStackTrace();
        }

}

得到ticket后,显示二维码URL+ticket:
https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=
e.g.:
https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQFv8TwAAAAAA...oAAgSOnMFYAwSAOgkA
浏览器直接访问即可:

Paste_Image.png

公众号事件推送

事件推送到哪里?
1、事件推送将会推送给公众号在公众平台官网开发者中心设置的服务地址中
2、如果公众号已将帐号管理权限集(因为该接口权限从属于帐号管理权限集)授权给第三方平台,那么将由第三方平台代公众号接收事件推送,具体是推送到第三方平台的公众号消息与事件接收URL

事件推送

用户打开商品主页,用户从商品主页关注或进入公众号等情况下均会触发事件推送。该事件将推送至商户填写的URL(登录微信公众平台=>开发者中心设置)。 开发者可通过事件推送完成数据统计、用户身份识别等操作,实现更加精准的运营。

服务器地址配置
Paste_Image.png

最新微信公众号文档位置:
菜单-->开发-->基本配置

Paste_Image.png

服务器地址配置启用就好了。

【关注/取消关注】事件

用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL。方便开发者给用户下发欢迎消息或者做帐号的解绑。

微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。
关于重试的消息排重,推荐使用FromUserName + CreateTime 排重。
假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。
推送XML数据包示例:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
</xml>

参数说明:
ToUserName 开发者微信号
FromUserName 发送方帐号(一个OpenID)
CreateTime 消息创建时间 (整型)
MsgType 消息类型,event
Event 事件类型,subscribe(订阅)、unsubscribe(取消订阅)

扫描带参数二维码事件
  • 用户未关注时,进行关注后的事件推送
    推送XML数据包示例:
<xml><ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
<EventKey><![CDATA[qrscene_123123]]></EventKey>
<Ticket><![CDATA[TICKET]]></Ticket>
</xml>

参数说明:
ToUserName 开发者微信号
FromUserName 发送方帐号(一个OpenID)
CreateTime 消息创建时间 (整型)
MsgType 消息类型,event
Event 事件类型,subscribe
EventKey 事件KEY值,qrscene_为前缀,后面为二维码的参数值
Ticket 二维码的ticket,可用来换取二维码图片

  • 用户已关注时的事件推送
    推送XML数据包示例:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[SCAN]]></Event>
<EventKey><![CDATA[SCENE_VALUE]]></EventKey>
<Ticket><![CDATA[TICKET]]></Ticket>
</xml>

参数说明:
ToUserName 开发者微信号
FromUserName 发送方帐号(一个OpenID)
CreateTime 消息创建时间 (整型)
MsgType 消息类型,event
Event 事件类型,SCAN
EventKey 事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id
Ticket 二维码的ticket,可用来换取二维码图片

相关文章

网友评论

      本文标题:微信带参二维码

      本文链接:https://www.haomeiwen.com/subject/hnxngttx.html