Yii2接入微信公众平台测试号
微信公众平台的一些高级的接口需要认证服务号才有权限调用,为方便开发者熟悉开发流程和接口,微信官方提供一个测试号,测试号能体验一些高级的接口。
对接公众号前,需要准备一个可公网访问的域名和服务器或者用花生壳映射本地项目:花生壳内网穿透本地Web服务(PHP项目)
一、申请公众平台的测试号
申请地址,扫码登录即可:
http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
登录成功后,可以看到测试号分配的appID和appsecret
页面往下拉,可以查看可以调用的测试接口权限
申请到测试号,下面就可以正式对接了,也就是公众平台需要验证开发者的服务器地址。
二、验证开发者服务器
接入公众平台,我们只需关注“接口配置信息”这一栏
很明显这里需要需要我们填写服务器的验证地址URL和Token,URL指的是微信服务器会向填写的URL发送Get请求,这个请求会带上一些签名等参数,当我们填写的URL地址拿到这些Get请求的参数时需要校验签名,Token其实就是对接的暗号。
编写代码,验证微信服务器发过来的请求
我单独起了个wechat的模块,具体路径:
\app\modules\wechat\controllers\WechatController::actionToken()
签名算法说明:
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下:
signature:微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数
timestamp:时间戳
nonce:随机数
echostr:随机字符串
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
具体说明可阅读官方文档:
https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html
验证代码:
private $token = '7ty34ndReQ';
public function actionToken()
{
// $this->request是我封装了一层,可以用原生Yii::$app->request->get()替代
$signature = $this->request->get('signature');
$timestamp = $this->request->get('timestamp');
$nonce = $this->request->get('nonce');
$token = $this->token;// token需要跟公众平台的token保持一致
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if ($tmpStr == $signature) {
$echostr = $this->request->get('echostr');
echo $echostr;
}
}
点击“接口配置信息”后面的修改,填写我们项目验证Token和URL
填好点击提交,如果验证成功,会显示绿色的“配置成功”提示
对接成功即可调用微信公众平台的其他接口,不过这只是验证服务器,调用接口还需要获取access_token,具体阅读微信官方文档。