摘要:配置首先登錄微信公眾平臺,在開發(fā)基本配置中填寫服務(wù)器配置接收處理微信消息的地址保存好你的配置,在加解密時需要使用。若確認(rèn)此次請求來自微信服務(wù)器,請原樣返回參數(shù)內(nèi)容,則接入生效,成為開發(fā)者成功,否則接入失敗。
配置
首先登錄微信公眾平臺 https://mp.weixin.qq.com,在開發(fā)->基本配置中填寫服務(wù)器配置(接收處理微信消息的地址)
保存好你的配置,在加解密時需要使用。
開發(fā)者提交信息后,微信服務(wù)器將發(fā)送GET請求到填寫的服務(wù)器地址URL上,GET請求攜帶參數(shù)如下表所示:
參數(shù) | 描述 |
---|---|
signature | 微信加密簽名,signature結(jié)合了開發(fā)者填寫的token參數(shù)和請求中的timestamp參數(shù)、nonce參數(shù)。 |
timestamp | 時間戳 |
nonce | 隨機(jī)數(shù) |
echostr | 隨機(jī)字符串 |
開發(fā)者通過檢驗 signature 對請求進(jìn)行校驗(下面有校驗方式)。若確認(rèn)此次GET請求來自微信服務(wù)器,請原樣返回 echostr 參數(shù)內(nèi)容,則接入生效,成為開發(fā)者成功,否則接入失敗。
加密/校驗流程如下:
將 token、timestamp、nonce 三個參數(shù)進(jìn)行字典序排序
將三個參數(shù)字符串拼接成一個字符串進(jìn)行 sha1 加密
開發(fā)者獲得加密后的字符串可與 signature 對比,標(biāo)識該請求來源于微信
public function validate() { $echoStr = Input::get("echostr"); if (!empty($echoStr)) { $signature = Input::get("signature"); $timestamp = Input::get("timestamp"); $nonce = Input::get("nonce"); $tmpArr = [ "你配置的Token", $timestamp, $nonce ]; sort($tmpArr); $tmpStr = implode("", $tmpArr); $tmpStr = sha1($tmpStr); if ($tmpStr == $signature) { echo $echoStr; exit; } } }
PHP示例代碼下載:下載
消息加解密微信官方文檔:加密解密技術(shù)方案
首先獲取微信發(fā)送的XML數(shù)據(jù):
$xmlString = file_get_contents("php://input");
使用下載的示例代碼解密消息:
//提供提取消息格式中的密文 XmlParse類在xmlparse.php里 $secretData = (new XmlParse())->extract($xmlString); //對密文進(jìn)行解密 Prpcrypt類在pkcs7Encoder.php里 $result = (new PrpCrypt("你配置的EncodingAESKey"))->decrypt($secretData[1]);
之后就根據(jù)具體業(yè)務(wù)來實現(xiàn)了:
$xmlFormatData = simplexml_load_string($result[1], "SimpleXMLElement", LIBXML_NOCDATA); $event = (string)$xmlFormatData->Event; $eventKey = isset($xmlFormatData->EventKey) ? (string)$xmlFormatData->EventKey : ""; $openId = (string)$xmlFormatData->FromUserName; $toUserName = (string)$xmlFormatData->ToUserName; //事件處理 if ($event === "VIEW" || $event == "CLICK") { //自定義菜單事件 } if (!$eventKey && $event == "subscribe") { //掃描公眾號二維碼關(guān)注事件 } if ($eventKey && $event == "subscribe") { //掃描二維碼關(guān)注事件 } if ($eventKey && $event == "SCAN") { //掃描生成的二維碼 } if ($event == "unsubscribe") { //取消關(guān)注事件 } if ($event === "card_pass_check" || $event === "card_not_pass_check") { //卡券審核通過或?qū)徍宋赐ㄟ^事件 } if ($event === "user_get_card") { //卡券領(lǐng)取事件 } if ($event === "user_consume_card") { //卡券核銷事件 } //其他事件不處理 return false;
需要發(fā)送加密消息時:
$wxBizMsg = new WxBizMsgCrypt("你配置的Token", "你配置的EncodingAESKey", "你公眾號的APPID"); //加密后的消息,傳引用 $encryptMsg = ""; //未加密的消息為XML格式的字符串 echo $wxBizMsg->encryptMsg("未加密的消息", time(), str_random(16), $encryptMsg);
假如服務(wù)器無法保證在五秒內(nèi)處理并回復(fù),必須做出下述回復(fù),這樣微信服務(wù)器才不會對此作任何處理,并且不會發(fā)起重試(這種情況下,可以使用客服消息接口進(jìn)行異步回復(fù)),否則,將出現(xiàn)嚴(yán)重的錯誤提示。
詳見下面說明:
直接回復(fù)success(推薦方式)
直接回復(fù)空串(指字節(jié)長度為0的空字符串,而不是XML結(jié)構(gòu)體中content字段的內(nèi)容為空)
一旦遇到以下情況,微信都會在公眾號會話中,向用戶下發(fā)系統(tǒng)提示“該公眾號暫時無法提供服務(wù),請稍后再試”:
開發(fā)者在5秒內(nèi)未回復(fù)任何內(nèi)容
開發(fā)者回復(fù)了異常數(shù)據(jù),比如JSON數(shù)據(jù)等
具體的各種XML格式見:被動回復(fù)用戶消息
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/28745.html
摘要:消息推送也是微信公眾號開發(fā)更為有趣的功能,涉及到文本消息圖片消息語音消息視頻消息音樂消息以及圖文消息。在文件中創(chuàng)建文件用于消息的管理。 一、寫在前面的話 ??當(dāng)用戶發(fā)送消息給公眾號時(或某些特定的用戶操作引發(fā)的事件推送時),會產(chǎn)生一個POST請求,開發(fā)者可以在響應(yīng)包(Get)中返回特定XML結(jié)構(gòu),來對該消息進(jìn)行響應(yīng)。 ??消息推送也是微信公眾號開發(fā)更為有趣的功能,涉及到文本消息、圖片消...
摘要:此教程將帶領(lǐng)大家體驗這個新功能,實現(xiàn)一個微信消息推送類型的觸發(fā)器。進(jìn)入公眾號后臺點擊開發(fā)基本配置服務(wù)器配置,同步配置成知曉云消息推送的相關(guān)配置,完成配置后,微信消息推送類型的觸發(fā)器方可使用。 知曉云新推出「消息推送」功能,該功能通過「消息推送」類型的觸發(fā)器接收微信推送過來的消息,開發(fā)者可以對此消息實行相關(guān)操作。 此教程將帶領(lǐng)大家體驗這個新功能,實現(xiàn)一個「微信消息推送」類型的觸發(fā)器。 該...
閱讀 2038·2021-10-08 10:05
閱讀 1882·2021-09-22 15:31
閱讀 3003·2021-09-22 15:13
閱讀 3478·2021-09-09 09:34
閱讀 2072·2021-09-03 10:46
閱讀 3113·2019-08-30 15:56
閱讀 1697·2019-08-30 15:53
閱讀 2351·2019-08-30 15:44