上QQ阅读APP看书,第一时间看更新
4.1 接入开发者模式
在第3章中,我们已经配置好了公众号的接口信息,需要提供URL和Token。其中,URL是用来接收微信服务器数据的接口URL,是我们应用的对外接口,现在只支持80端口,这也是HTTP协议默认的端口。Token则是任意填写的字符串,必须是英文字母或数字,长度为3~32个字符。URL很好理解,那么Token有什么作用呢?Token相当于我们提供给微信服务器的信物,通过验证来访请求携带的信物是否正确就能判断是否是真的微信服务器。
在提交URL和Token信息后,微信服务器将发送GET请求到填写的URL上,GET请求携带4个参数,如表4-1所示。
表4-1 GET请求的4个参数
signature的加密流程比较简单:
(1)将token、tmestamp、nonce三个参数进行字典序排序。至于字典序是什么,大家可以搜索一下,因为PHP的排序函数默认就是采用字典序,这里就不展开介绍了。
(2)将排好序的3个参数字符串拼接成一个字符串,并进行sha1加密,这个加密的结果就是微信服务器发给我们的数字签名。
下面实现如何验证URL来源是否可靠。
$_GET是PHP的全局数组变量,存储了GET请求携带的变量名称和值,通过该变量我们能够获取微信服务器发来请求中携带的signature、timestamp、nonce和echostr值。
/** *验证url来源是否正确 * @return boolean */ private function checkSignature() { //获取参数值 $signature = $_GET['signature']; $timestamp = $_GET['timestamp']; $nonce = $_GET['nonce'];
//按照字典序排序将3个参数排序 $params = array($this->_token, $timestamp, $nonce); sort($params, SORT_STRING);
//先将数组拼接成字符串再sha1加密 $sig = sha1(implode($params));
//判断获得的签名是否与本地计算的相同 return $sig == $signature; }
//检查签名,如果正确,就将微信服务器请求中的echostr字段原样返回 private function sourceCheck() { if ($this->checkSignature()) { $echostr = $_GET['echostr']; echo $echostr; }else{ throw new Exception('签名不正确'); } exit(0); }
验证URL有效性成功后接入生效,成为开发者,此后用户每次向公众号发送消息,或者产生自定义菜单单击事件时,响应URL都将得到推送。