Yii2接入微信公眾平臺(tái)測(cè)試號(hào)
????微信公眾平臺(tái)的一些高級(jí)的接口需要認(rèn)證服務(wù)號(hào)才有權(quán)限調(diào)用,為方便開發(fā)者熟悉開發(fā)流程和接口,微信官方提供一個(gè)測(cè)試號(hào),測(cè)試號(hào)能體驗(yàn)一些高級(jí)的接口。
????對(duì)接公眾號(hào)前,需要準(zhǔn)備一個(gè)可公網(wǎng)訪問的域名和服務(wù)器或者用花生殼映射本地項(xiàng)目:花生殼內(nèi)網(wǎng)穿透本地Web服務(wù)(PHP項(xiàng)目)
一、申請(qǐng)公眾平臺(tái)的測(cè)試號(hào)
申請(qǐng)地址,掃碼登錄即可:
http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

登錄成功后,可以看到測(cè)試號(hào)分配的appID和appsecret

頁面往下拉,可以查看可以調(diào)用的測(cè)試接口權(quán)限

申請(qǐng)到測(cè)試號(hào),下面就可以正式對(duì)接了,也就是公眾平臺(tái)需要驗(yàn)證開發(fā)者的服務(wù)器地址。
二、驗(yàn)證開發(fā)者服務(wù)器
接入公眾平臺(tái),我們只需關(guān)注“接口配置信息”這一欄

很明顯這里需要需要我們填寫服務(wù)器的驗(yàn)證地址URL和Token,URL指的是微信服務(wù)器會(huì)向填寫的URL發(fā)送Get請(qǐng)求,這個(gè)請(qǐng)求會(huì)帶上一些簽名等參數(shù),當(dāng)我們填寫的URL地址拿到這些Get請(qǐng)求的參數(shù)時(shí)需要校驗(yàn)簽名,Token其實(shí)就是對(duì)接的暗號(hào)。
編寫代碼,驗(yàn)證微信服務(wù)器發(fā)過來的請(qǐng)求
我單獨(dú)起了個(gè)wechat的模塊,具體路徑:
\app\modules\wechat\controllers\WechatController::actionToken()
簽名算法說明:
開發(fā)者提交信息后,微信服務(wù)器將發(fā)送GET請(qǐng)求到填寫的服務(wù)器地址URL上,GET請(qǐng)求攜帶參數(shù)如下:
signature:微信加密簽名,signature結(jié)合了開發(fā)者填寫的token參數(shù)和請(qǐng)求中的timestamp參數(shù)、nonce參數(shù)
timestamp:時(shí)間戳
nonce:隨機(jī)數(shù)
echostr:隨機(jī)字符串
開發(fā)者通過檢驗(yàn)signature對(duì)請(qǐng)求進(jìn)行校驗(yàn)(下面有校驗(yàn)方式)。若確認(rèn)此次GET請(qǐng)求來自微信服務(wù)器,請(qǐng)?jiān)瓨臃祷豦chostr參數(shù)內(nèi)容,則接入生效,成為開發(fā)者成功,否則接入失敗。加密/校驗(yàn)流程如下:
1)將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序
2)將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密?
3)開發(fā)者獲得加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來源于微信
具體說明可閱讀官方文檔:
https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html
驗(yàn)證代碼:
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需要跟公眾平臺(tái)的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;
}
}
點(diǎn)擊“接口配置信息”后面的修改,填寫我們項(xiàng)目驗(yàn)證Token和URL

填好點(diǎn)擊提交,如果驗(yàn)證成功,會(huì)顯示綠色的“配置成功”提示

對(duì)接成功即可調(diào)用微信公眾平臺(tái)的其他接口,不過這只是驗(yàn)證服務(wù)器,調(diào)用接口還需要獲取access_token,具體閱讀微信官方文檔。
