前天申请了个微信订阅号,准备试试php开发微商场。
今天中午去bae搞了个服务器,然后就开始验证token,到晚上才弄完。别人的服务器用着就是麻烦,更新一下代码就要push到git上,对接口不熟悉真的是太浪费时间了。下面是终于测试成功的token验证代码。
1 class Main 2 { 3 private $sign; //微信加密签名 4 private $time; //时间戳 5 private $nonce; //随机数 6 private $echostr; //随机字符串 7 private $token; //token 8 9 public function __construct($_sign, $_time, $_nonce, $_str) 10 { 11 $this->sign = $_sign; 12 $this->time = $_time; 13 $this->nonce = $_nonce; 14 $this->echostr = $_str; 15 $this->token = ‘7542110‘; 16 } 17 18 public function valid() 19 { 20 if ($this->checkSignature()) { 21 echo $this->echostr; 22 exit; 23 } else { 24 return false; 25 } 26 } 27 28 private function checkSignature() 29 { 30 $dataArr = array($this->token, $this->time, $this->nonce); 31 sort($dataArr, SORT_STRING); 32 $tmpArr = sha1(implode(‘‘, $dataArr)); 33 34 if ($tmpArr == $this->sign) { 35 return true; 36 } else { 37 return false; 38 } 39 } 40 }
短短几十行代码摸索了几个小时,就因为官方给的文档没看仔细。顺便贴上我漏看的几条。
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
|