目前有2种类型的二维码,微信会往这个URL上发送

最近做微信PC端网页微信相关功能的开发,从一个新手的角度来说,微信公众号的文档还是不好理解的,网上找的帖子大都也都基本上是复制微信公众平台上给的文档,开发微信带参数二维码过程中还是遇到不少坑的,在此把我的开发过程比较详细的记录下,希望对大家有所帮助。

微信带参二维码场景

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

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

  2013年6月份开始,就陆陆续续的研究了一下微信公众账号的使用,整理了一篇《关于微信公众平台的调研说明》的文档。文档从微信公众账号的注册、设置,到微信公众账号平台管理的各个部分,都进行了介绍(微信升级之后,现在微信公众账号平台的界面可能和文档中有所不同,但基本上通过这个文档,也知道怎么去使用)。2013年11月份,对微信公众账号进行认证,另外得到了9个开放的接口,现将9个接口应用过程进行小结一下,文档中的内容大部分来自于官方资料,另外加上了一些我个人应用过程中的一些理解,如有不正确的地方,欢迎大家指出。  

我本次开发使用的是认证服务号。

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

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

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

1.语音识别
  用户给您的微信公众账号发送语音消息,微信服务器会先对语音消息进行识别,然后将识别出的文本内容和语音发送给您的微信公众账号的后台服务器。
  发送方不带语音识别功能的XML如下所示:

1 接入首先进入微信公众号 -> 基本配置下面是基本配置的页面,在URL中填写服务器地址,这个地址就是接受微信推送事件的一个接口,我是使用thinkPHP框架开发的程序,在其中一个Module的Action目录下新建一个类,比如叫: WechatAction.class.php ,在该Action中新建一个public方法,比如叫: URLRedirect() ,那么在这个URL中填写的就是 ,然后填写Token,Token随意填,EncodingAESKey要不要都行,然后点击确认,微信会往这个URL上发送一个get请求,里面包含很多参数,其中大部分都是让我们自己核对这次访问是不是微信服务器请求的,我自己没有验证,他的要求是如果我们核对成功,即原样返回get请求中的一个参数echostr,这里的返回不是return,也不是ajaxReturn,而使用echo,如果用thinkPHP开发的话,直接使用 echo I; 即可。然后接口即验证成功了。

生成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;
    }
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<Format><![CDATA[Format]]></Format>
<MsgId>1234567890123456</MsgId>
</xml>

2 带参数二维码的作用微信的带参数二维码有两种,一种是临时二维码,一种是永久二维码,但是永久二维码的生成是有个数限制的,我这次要实现的功能是用户未登录的情况下在网站上使用产品,比如获得某商品的详细报价,但是又不想注册,然而又想保存这个报价单,这个时候网页可以生成一张二维码,用户只要用微信扫一扫这个二维码,官方公众号就会给这个用户发送一天图文消息,图文消息点开后就是用户刚刚获得的报价单,而且可以随时点击查看并且分享给朋友进行比价。所以临时二维码即可正常使用。上面是我是怎么使用的,下面介绍一下整个交互的流程

创建临时二维码

每次创建二维码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();
        }

}

  发送方带语音识别功能的XML如下所示:

当用户扫描这个二维码,如果用户关注了公众号,用户会直接进入与公众号的会话页面,微信服务器会给我们在上一步设置的服务器URL中推送一条消息,其中可以携带一个我们自定义的参数。如果用户未关注公众号,则用户首先会跳转到公众号关注页面,用户点击关注后,会直接进入公众号的会话页面,微信服务器这时也会给我们设置的URL推送一个事件消息,携带我们自定义参数,我们可以根据这个参数和事件类型做控制下一步动作。

创建永久二维码

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();
        }

}
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<Format><![CDATA[Format]]></Format>
<Recognition><![CDATA[腾讯微信团队]]></Recognition>
<MsgId>1234567890123456</MsgId>
</xml>

3 具体开发过程

通过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
浏览器直接访问即可:

美高梅棋牌官网 1

Paste_Image.png

  从上面可以看出,微信服务器在推送的语音消息XML数据包中,增加了一个Recongnition字段,该字段的内容是语音识别出的文本内容。
  【参数说明】:   

3.1 获取access_token这个access_token是我们程序调用微信接口的凭证,目前的有效期是7200秒,所以我们需要定时更新access_token。获得方法:方法 : GETurl : 其中的参数APPID和APPSECRET是我们公众号的APPID和APPSECRET,在微信公众号 -> 基本配置中可以查到,调用成功会返回如下JSON数据:{"access_token":"ACCESS_TOKEN","expires_in":7200}

公众号事件推送

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

参数

描述

ToUserName

开发者微信号(也就是你的微信公众号)

FromUserName

发送方帐号(一个OpenID,用户的账号)

CreateTime

消息创建时间 (整型)

MsgType

语音为voice

MediaID

语音消息媒体id,可以调用多媒体文件下载接口拉取该媒体

Format

语音格式:amr

Recognition

语音识别结果,UTF8编码

MsgID

消息id,64位整型

其中access_token就是调用接口凭证,expire_in是token有效时间。我本人是把access_token存在数据库中,同时保存过期时间,然后封装公用函数 getWechatAccessToken() ,每次先检查access_token是否过期,如果过期则重新获取,否则直接使用数据库保存的access_token即可,我忘了在哪儿看加过,这个access_token每天的获取次数应该是有限制的。下面是 getWechatAccessToken() 的具体实现:

事件推送

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

  【注】:语音识别功能可以在我的服务页面的高级接口栏目,通过开关来控制开启和关闭。如下图所示:
美高梅棋牌官网 2
2.客服接口
  当用户主动发消息给您的微信公众号的时候(包括发送信息、点击自定义菜单、关注等),微信服务器将会把消息数据推送给开发者,开发者在一段时间内(目前为24小时)可以调用客服消息接口,通过POST一个JSON数据包来发送消息(现支持文本、图片、图文、语音、视频、音乐)给普通用户,在24小时内不限制发送次数。此接口主要用于客服等有人工消息处理环节的功能,方便开发者为用户提供更加优质的服务。
  与之相对应的是非认证账号的“发送被动响应消息”接口,“发送被动响应消息”接口有一个缺陷就是:微信服务器在五秒内收不到响应会断掉连接。也就是说,微信服务器只保持5秒的连接,如果五秒没有回复消息,那么发起该会话请求的用户就会收不到回复了。
3.OAuth2.0网页授权
  如果用户在微信中(Web微信除外)访问公众号的第三方网页,公众号开发者可以通过此接口获取当前用户基本信息(包括昵称、性别、城市、国家)。利用用户信息,可以实现体验优化、用户来源统计、帐号绑定、用户身份鉴权等功能。【注意】:“获取用户基本信息接口(后续介绍)是在用户和公众号产生消息交互时,才能根据用户OpenID获取用户基本信息,而网页授权的方式获取用户基本信息,则无需消息交互,只是用户进入到公众号的网页,就可弹出请求用户授权的界面,用户授权后,就可获得其基本信息(此过程甚至不需要用户已经关注公众号。)”
  【注意】:在微信公众号请求用户网页授权之前,开发者需要先到公众平台网站的我的服务页中配置授权回调域名。请注意,这里填写的域名不要加
美高梅棋牌官网 3
  具体而言,网页授权流程分为四步:
  第一步:用户同意授权,获取code。参考链接形式: (注意:appid应该输入您的微信公众账号的appid,该链接不可以在浏览器中打开。实际使用的时候,需要把redirect_uri修改为您要跳转的地址,目前我写的是
美高梅棋牌官网 4
  单击取消或允许按钮,都会进入到上面设置的回调页面。如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数redirect_uri?state=STATE
  【code说明 】:
  code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
  【参数说明】:

//获取access_tokenfunction getWechatAccessToken(){ $wechatInfo = M->select(); $wechatInfo = array_reduce($wechatInfo, create_function('$result, $v', '$result[$v["conf_name"]] = $v;return $result;')); $expireTime = $wechatInfo['PUBLIC_WECHAT_ACCESSTOKEN_EXPIRES']['conf_value']; //前面不用管,是我数据库相应设置 if { //access_token未过期 return $wechatInfo['PUBLIC_WECHAT_ACCESSTOKEN']['conf_value']; }else{ //access_token过期,重新获取 $baseUrl = C('WECHAT_PUBLIC_GET_ACCESS_TOKEN'); $url = str_replace("##APPSECRET##", $wechatInfo['PUBLIC_WECHAT_APPSECRET']['conf_value'], str_replace("##APPID##", $wechatInfo['PUBLIC_WECHAT_APPID']['conf_value'], $baseUrl)); $result = file_get_contents; $result = json_decode; if (array_key_exists){ //失败重试一次 return false; }else{ M->where(array('conf_name' => 'PUBLIC_WECHAT_ACCESSTOKEN'))->save(array('conf_value' => $result['access_token'])); M->where(array('conf_name' => 'PUBLIC_WECHAT_ACCESSTOKEN_EXPIRES'))->save(array('conf_value' => time()+$result['expires_in']-200)); return $result['access_token']; } }}
服务器地址配置

美高梅棋牌官网 5

Paste_Image.png

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

美高梅棋牌官网 6

Paste_Image.png

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

参数

是否必须

说明

appid

公众号的唯一标识

redirect_uri

授权后重定向的回调链接地址

response_type

返回类型,请填写code

scope

应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)

state

重定向后会带上state参数,开发者可以填写任意参数值

#wechat_redirect

直接在微信打开链接,可以不填此参数。做页面302重定向时候,必须带此参数

C('WECHAT_PUBLIC_GET_ACCESS_TOKEN') =

【关注/取消关注】事件

用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的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(取消订阅)

  第二步:通过code换取网页授权access_token。获取code后,请求以下链接获取access_token:
  【注意】:这里通过code换取的网页授权access_token,与基础支持中的access_token不同。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。
  【参数说明】:

封装好这个之后,我们每次就可以安心的使用了。

扫描带参数二维码事件
  • 用户未关注时,进行关注后的事件推送
    推送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>
<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,可用来换取二维码图片

参数

是否必须

说明

appid

公众号的唯一标识

secret

公众号的appsecret

code

填写第一步获取的code参数

grant_type

填写为authorization_code

.2 创建临时二维码

  【返回说明】:
  正确时返回的JSON数据包如下:

3.2.1 获取ticket3

 

请求方式: POST接口: {"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}} 接口URL中的TOKEN即我们在3.1中获取的access_token,post数据中expire_seconds是二维码的有效时间,最多为30天,action_name临时二维码的话固定就是QR_SCENE,scene_id即我们自定义参数,是个32位非0整数,我在应用中把它设为订单的ID,微信服务器推送事件的时候会把这个值返回给我们设置的接口中,然后我会根据这个值去拿相应的订单数据展示在网页上,这是后话。

{
   "access_token":"ACCESS_TOKEN",
   "expires_in":7200,
   "refresh_token":"REFRESH_TOKEN",
   "openid":"OPENID",
   "scope":"SCOPE"
}

下面是封装的生成临时二维码的方法:

 

//创建临时二维码function getTemporaryQrcode{ $accessToken = getWechatAccessToken(); $url = str_replace("##TOKEN##", $accessToken, C('WECHAT_PUBLIC_GET_TEMPORARY_TICKET')); $qrcode = '{"expire_seconds": 1800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": '.$orderId.'}}}'; $result = api_notice_increment; $result = json_decode; return urldecode;}

  【参数说明】:

其中的方法 api_notice_increment() 是我封装的一个POST方法函数,我试过很多POST的方法,可能由于微信接口对POST方法和参数的限制比较严格,这个浪费了好久时间,最后在网上找到了一个可以使用的封装好的POST方法,建议大家先自己试试,如果微信返回错误吗,就用这个吧,起码我测试微信这个接口的时候用postman测试返回的都是错误,而且一定要用JSON字符串,一定要是非常严格的JSON字符串。下面是这个方法:

参数

描述

access_token

网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同

expires_in

access_token接口调用凭证超时时间,单位(秒)

refresh_token

用户刷新access_token

openid

用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID

scope

用户授权的作用域,使用逗号(,)分隔

function api_notice_increment{ $ch = curl_init(); $header = "Accept-Charset: utf-8"; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $tmpInfo = curl_exec; if  { curl_close; return $ch; }else{ curl_close; return $tmpInfo; }}

  错误时微信会返回JSON数据包如下(示例为Code无效错误):

getTemporaryQrcode()

{"errcode":40029,"errmsg":"invalid code"}

中有一个在配置文件中的参数给大家看下,其实就是微信接口链接:C('WECHAT_PUBLIC_GET_TEMPORARY_TICKET')

这个接口的返回值是:{"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm3sUw==","expire_seconds":60,"url":"http://weixin.qq.com/q/kZgfwMTm72WWPkovabbI"}

其中ticket是让我们用来进行下一步调用的凭证,expire_seconds是二维码的有效期,url是我们生成的二维码扫描后打开的链接。所以如果我们自己实现了生成二维码的方法,就不用再进行下一步调用,我本人即在这一步就停止了,直接返回url的值,然后利用这个url的值生成二维码存在本地即可。PHP生成二维码可以使用phpqrcode,挺好用的。下一步也大致提一下:

3.2.2 获取二维码地址请求方式: GET接口: 这个接口的返回值是一张图片,可以直接展示或者下载,我们有具体使用过,所以也不知道应该怎么展示。

3.3 用户扫描二维码之后发生的事情3.3.1 扫描后发生了什么上面提到了,用户扫描我们生成的临时二维码,如果用户未关注公众号,则首先会跳转到公众号的关注页面,点击关注后,会进入公众号的会话页面,同时会给我们设置的接口推送一个事件。如果用户已经关注了,用户微信会直接跳转到公众号会话页面,然后微信服务器会给我们设置的接口推送一个事件。

用户关注与否微信服务器给我们推送的事件是差不多的,只是新关注用户推送的事件中scene_id前面会加一个前缀。下面是微信公众平台文档的说明:

用户未关注时,进行关注后的事件推送

 //开发者微信号 //发送者账号123456789 //消息创建时间 //消息类型 event //事件类型 //事件KEY值,qrscene_为前缀,后面为二维码参数值 //二维码ticke值,可以用来换取二维码图片 

用户已关注时的事件推送

 //开发者微信号 //发送者账号123456789 //消息创建时间 //消息类型event //事件类型 event //事件key值,是一个32位无符号整数,即创建二维码时的二维码scene_id //二维码的ticke,可以用来换取二维码图片

3.3.2 我们要做些什么

我们需要在自己填写的URL接口中接收这个事件,然后拿到我们需要的东西做我们想干的事儿。因为我要实现的功能比较简单,只需要拿到scene_id即可,因为这是我要展示给用户看的订单数据。下面是我写的接收和处理部分,比较简单,主要看一下应该怎么接收微信推送的事件:

public function urlRedirect(){ $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = $postObj->FromUserName; $EventKey = trim$postObj->EventKey); $keyArray = explode; if  == 1){ //已关注者扫描 $this->sendMessage($fromUsername, $EventKey); }else{ //未关注者关注后推送事件 $this->sendMessage($fromUsername, $keyArray[1]); } }

我没有使用其他参数,只是根据不同的推送事件拿到我想要的订单ID,然后这时候其实相当于你在这里用公众号的客服在跟扫码的这个用户对话,上段代码中调用的sendMessage()是使用客户账号给扫码用户发送一个图文消息,因为我在拿scen_id的同时也拿到了用户的openid,可以利用这个给用户发送消息。

下面是sendMessage()方法:

//给用户发送图文消息,点击跳转到报价页面 public function sendMessage{ $url = str_replace('##TOKEN##', getWechatAccessToken(), C('WECHAT_SEND_MESSAGE')); $redirectUrl = str_replace("##ORDERID##", $orderId, str_replace("##OPENID##", $openid, C('WECHAT_REDIRECT_URL_PRE'))); $orderInfo = M->where(array('orderid' => $orderId))->field(array('totalMoney', 'savedMoney', 'roomarea'))->find(); $description = str_replace("##ROOMAREA##", intval($orderInfo['roomarea'] * 1.25), C('WECHAT_MESSAGE_BRIEF')); $description = str_replace("##TOTALBUDGET##", $orderInfo['totalMoney'], $description); $description = str_replace("##MARKETBUDGET##", $orderInfo['totalMoney']+$orderInfo['savedMoney'], $description); $description = str_replace("##SAVEMONEY##", $orderInfo['savedMoney'], $description); $dataStr = '{"touser":"' . $openid . '","msgtype":"news","news":{"articles":[{"title":"' . C('WECHAT_MESSAGE_TITLE') . '","description":"' . $description . '","url":"' . $redirectUrl . '","picurl":"' . C('WECHAT_MESSAGE_PICURL') . '""}]}}'; api_notice_increment; }

其中 C('WECHAT_SEND_MESSAGE') = '' 至于下面的一大段str_replace,就是在组给用户发送的文字而已,需要注意$dataStr的格式,这里面要求JSON字符串比较严格,必须所有的字符串都用双引号括起来。微信接口对POST参数的限制真心严格。

下面是微信公众平台开发者文档中要求发送图文消息的POST data格式:

{ "touser":"OPENID", "msgtype":"news", "news":{ "articles": [ { "title":"Happy Day", "description":"Is Really A Happy Day", "url":"URL", "picurl":"PIC_URL" }, { "title":"Happy Day", "description":"Is Really A Happy Day", "url":"URL", "picurl":"PIC_URL" } ] }}

其中url是用户点击这个消息之后打开的地址,这个时候我就组了一个自己网站的地址,是一个get请求地址,里面携带参数是用户的openid和订单id,这样用户点击开图文消息就可以看到自己刚才下单的内容了,因为需要在网页上展示用户的微信头像和昵称,所以我把openid也放到参数里,在页面加载前先拿到用户的个人信息和订单数据,再展示网页。这样流程:用户未登录下单 -> 生成微信二维码 -> 用户扫码关注公众号 -> 查看订单详细信息 就完成了。而且因为这个图文消息打开后的链接携带的参数是这个用户的额openid和其下单的订单ID,不管分享到哪儿,用什么浏览器打开都是可以访问的,且展示的也是这个用户的头像和昵称信息,这也是我要实现的一个效果。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  第三步:刷新access_token(如果需要)。由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token拥有较长的有效期(7天、30天、60天、90天),当refresh_token失效的后,需要用户重新授权。
  获取第二步的refresh_token后,请求以下链接获取access_token:


  【参数说明】:

参数

是否必须

说明

appid

公众号的唯一标识

grant_type

填写为refresh_token

refresh_token

填写通过access_token获取到的refresh_token参数

  【返回说明】:
  正确时返回的JSON数据包如下:

{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}

  【参数说明】:

参数

描述

access_token

网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同

expires_in

access_token接口调用凭证超时时间,单位(秒)

refresh_token

用户刷新access_token

openid

用户唯一标识

scope

用户授权的作用域,使用逗号(,)分隔

  错误时微信会返回JSON数据包如下(示例为Code无效错误):

{"errcode":40029,"errmsg":"invalid code"}

  第四步:拉取用户信息(需scope为 snsapi_userinfo)。如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。
  【请求方法】:
  http:GET(请使用https协议)
  
  【参数说明】:

参数

描述

access_token

网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同

openid

用户的唯一标识

  【返回说明】:
  正确时返回的JSON数据包如下:

{
"openid":" OPENID",
" nickname": NICKNAME,
"sex":"1",
"province":"PROVINCE"
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46", 
"privilege":[
"PRIVILEGE1"
"PRIVILEGE2"
]
}

  【参数说明】:

参数

描述

openid

用户的唯一标识

nickname

用户昵称

sex

用户的性别,值为1时是男性,值为2时是女性,值为0时是未知

province

用户个人资料填写的省份

city

普通用户个人资料填写的城市

country

国家,如中国为CN

headimgurl

用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空

privilege

用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)

  错误时微信会返回JSON数据包如下(示例为openid无效):

{"errcode":40003,"errmsg":" invalid openid "}

4. 生成带参数二维码
  使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送(说的简单点,意思就是可以通过这个接口,产生一个二维码,然后用户可以通过扫描这个二维码,进入到公众账号信息页面(未关注公众账号的用户)或公众账号的会话页面(关注了公众账号的用户))。
  目前有2种类型的二维码,分别是临时二维码和永久二维码,前者有过期时间,最大为1800秒,但能够生成较多数量,后者无过期时间,数量较少(目前参数只支持1--1000)。两种二维码分别适用于帐号绑定、用户来源统计等场景。
  用户扫描带场景值二维码时,可能推送以下两种事件:

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

  获取带参数的二维码的过程包括两步,首先创建二维码ticket,然后凭借ticket到指定URL换取二维码。
  第一步:创建二维码ticket。
  【请求说明】:

  http请求方式: POST
  URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
  POST数据格式:json
  POST数据例子:{"expire_seconds": 1800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}

  【参数说明】:

参数

说明

expire_seconds

该二维码有效时间,以秒为单位。 最大不超过1800。

action_name

二维码类型,QR_SCENE为临时,QR_LIMIT_SCENE为永久

action_info

二维码详细信息

scene_id

场景值ID,临时二维码时为32位整型,永久二维码时最大值为1000

  【返回说明】:
  正确的Json返回结果:

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

  【参数说明】:

本文由美高梅游戏网站登录发布于美高梅棋牌游戏,转载请注明出处:目前有2种类型的二维码,微信会往这个URL上发送

您可能还会对下面的文章感兴趣: