这几天给一个公众号做相关的系统开发,之前一直不愿意接触微信开发的东西,刚好趁着这个熟悉了一下微信公众号的相关开发工作。

主要认证的服务号,涉及用户网页授权、微信小店、客服、卡券等功能。

记录一下相关的内容。

接口测试号

一开始在没有正式使用服务号开发前先用接口测试号熟悉了一下相关的接口,然后才接相关的公众号开发的。

还是建议如果真的是直接开发,还是直接接公众号比较好,因为小店、卡券、客服等内容测试号还是没有的。

接口测试号对于学习消息接口、网页授权、菜单等还是很不错的。

一、接口测试号的申请

接口测试号地址:http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index

进入后会拿到appID和appsecret

postbird

我们要做的是进行接口的配置信息的修改以及JS接口的安全域名。

二、修改接口配置信息

所谓的接入就是微信根据你填写的TOKEN,发送一个请求到你的URl上,验证你的url是否是正确的,当然需要我们返回正确的值。

具体的可以查看这里:http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html

1、首先是填写正确的地址

后面需要带上appID的参数。

比如我的url的地址是:http://www.ptbird.cn/weixin/develop/message.php?appid=wxxxxxxxxxx

- 意思为我有一个message.php文件在上面的路径下,后面我会在上面写代码。

- 这个message.php很重要,因为后面开发消息接口的时候,微信都会把关注者的消息发送到这个url上.

- 在message.php上进行消息的接收和返回,因此,这是我们和微信进行消息交互的url。

2、TOKEN的验证规则

上面的图可以看到,接入的时候除了URL还需要一个TOKEN,这个TOKEN就是类似微信和我们之间的通信秘钥串的东西。

因此TOKEN是需要在服务端全局定义的,很多地方都会用到。

微信如何验证我们填入的URL呢?

加密验证的流程如下:

微信会给我们message.php发送一个GET请求,GET中有四个参数,分别是【 signature、timestamp、nonce、echostr 】。

我们通过检验signature对请求进行校验。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。

检验signature流程如下(微信文档给出的):

  1. 将token、timestamp、nonce三个参数进行字典序排序(ASCII)
  2. 将三个参数字符串拼接成一个字符串进行sha1加密
  3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
  4. 检验成功 原样返回 echostr

3、PHP代码验证TOKEN

在message.php中写代码,因为我们只需要验证一次,而后面消息的接收和发送却是一直需要的,因此写成函数或者是在别的地方封装比较好。

校验signature的函数:

主要注意的问题:

  1. 最后返回$echoStr 直接输出就可以了。
  2. TOKEN是define('TOKEN',"postbird");全局配置的
//checkSignature();//这个函数运行一次配置成功就可以了
/**
 *验证token的函数
 */
function checkSignature(){
    //获取服务器的get请求的4个参数
    $signature=$_GET['signature'];
    $timeStamp=$_GET['timestamp'];
    $nonce=$_GET['nonce'];
    $echoStr=$_GET['echostr'];
    //定义一个数组 存储三个参数
    $tmpArr=array($nonce,$timeStamp,TOKEN);
    //数组的排序[进行字符串的排序]
    sort($tmpArr, SORT_STRING);
    //合并数组并加密成一个字符串
    $tmpStr = implode( $tmpArr );
    $tmpStr = sha1( $tmpStr );
    //比较与signature是否一样,一样则返回echoStr
    if( $tmpStr == $signature ){
        echo $echoStr;
        return true;
    }else{
        return false;
    }
}

在message.php上启用checkSignature()函数然后对这个URL进行验证即可。

4、问题

出现的问题比较大的可能是:

  1. url填写的和真实的message.php的访问地址符合。
  2. 没有启用signaure函数(这个函数启用一次验证成功之后就没用了,除非再次验证)