當第三方平台創建成功並最終開發測試完畢,提交全網發佈申請時,微信服務器會通過自動化測試的方式,檢測服務的基礎邏輯是否可用,在確保基礎可用的情況下,才會允許公眾號第三方平台提交全網發佈。
微信後台會自動將下述公眾號配置為第三方平台的一個額外的測試公眾號,並通過該賬號,執行如下測試步驟。第三方平台需要根據各步驟描述的自動化測試規則實現相關邏輯,才能通過接入檢測,達到全網發佈的前提條件。
檢測點1:模擬粉絲觸發專用測試公眾號的事件,並推送事件消息到專用測試公眾號,第三方平台開發者需要提取推送XML信息中的event值,並在5s內立即返回按照下述要求組裝的文本消息給粉絲。詳細步驟如下。
1)微信推送給第三方平台:事件XML內容。
2)服務方開發者在5s內回應文本消息並最終送達到粉絲:文本消息的XML中,Content字段的內容必須組裝為event+「from_callback」。假定event為LOCATION,則Content為LOCATIONfrom_callback。
上述檢測實現的代碼如下。
1 // 接收事件消息 2 private function receiveEvent($object) 3 { 4 $content = ""; 5 switch ($object->Event) 6 { 7 case "subscribe": 8 $content = "歡迎關注方倍工作室 "; 9 break; 10 case "CLICK": 11 switch ($object->EventKey) 12 { 13 default: 14 $content = "點擊菜單:".$object->EventKey; 15 break; 16 } 17 break; 18 case "LOCATION": 19 $content = $object->Event."from_callback"; 20 break; 21 default: 22 $content = "receive a new event: ".$object->Event; 23 break; 24 } 25 26 if(is_array($content)){ 27 $result = $this->transmitNews($object, $content); 28 }else{ 29 $result = $this->transmitText($object, $content); 30 } 31 return $result; 32 }
檢測點2:模擬粉絲發送文本消息給專用測試公眾號,第三方平台需根據文本消息的內容進行相應的響應,其步驟為如下。
1)微信推送給第三方平台:文本消息,其中Content字段的內容固定為TESTCOMPONENT_MSG_TYPE_TEXT。
2)第三方平台立刻回應文本消息並最終觸達粉絲:Content必須固定為TESTCOMPONENT_MSG_TYPE_TEXT_callback。
1 // 接收文本消息 2 private function receiveText($object) 3 { 4 $keyword = trim($object->Content); 5 if (strstr($keyword, "TESTCOMPONENT_MSG_TYPE_TEXT")){ 6 $content = $keyword."_callback"; 7 } 8 9 if(is_array($content)){ 10 $result = $this->transmitNews($object, $content); 11 }else{ 12 $result = $this->transmitText($object, $content); 13 } 14 return $result; 15 }
檢測點3:模擬粉絲發送文本消息給專用測試公眾號,第三方平台需在5s內返回空串,表明暫時不回復,然後立即使用客服消息接口發送消息回復粉絲,其步驟如下。
1)微信推送給第三方平台:文本消息,其中Content字段的內容固定為QUERY_AUTH_CODE:$query_auth_code$。query_auth_code會在專用測試公眾號自動授權給第三方平台時,由微信後台推送給開發者。
2)第三方平台拿到$query_auth_code$的值後,通過接口文檔頁中的「使用授權碼換取公眾號的授權信息」API,將$query_auth_code$的值賦值給API所需的參數authorization_code。然後調用發送客服消息API回覆文本消息給粉絲,其中文本消息的Content字段設為$query_auth_code$_from_api。其中,$query_auth_code$需要替換成推送過來的query_auth_code。
1 // 接收文本消息 2 private function receiveText($object) 3 { 4 $keyword = trim($object->Content); 5 $content = ""; 6 if(strstr($keyword, "QUERY_AUTH_CODE")){ 7 $authorization_code = str_replace("QUERY_AUTH_CODE:","",$keyword); 8 require_once('wxthird.class.php'); 9 $weixin = new class_wxthird; 10 $authorization = $weixin->query_authorization($authorization_code); 11 $openid = $_GET['openid']; 12 $authorizer_access_token = $authorization["authorization_info"]["authorizer_ access_token"]; 13 $result = $weixin->send_custom_message($openid, "text", $authorization_ code."_from_api", $authorizer_access_token); 14 } 15 16 if(is_array($content)){ 17 $result = $this->transmitNews($object, $content); 18 }else{ 19 $result = $this->transmitText($object, $content); 20 } 21 return $result; 22 }
檢測點4:模擬推送component_verify_ticket給開發者,開發者需按要求回復(接收到後必須直接返回字符串success)。
1 $signature = $_GET['signature']; 2 $timestamp = $_GET['timestamp']; 3 $nonce = $_GET['nonce']; 4 $encrypt_type = $_GET['encrypt_type']; 5 $msg_signature = $_GET['msg_signature']; 6 $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 7 8 // 解密 9 $pc = new WXBizMsgCrypt(Token, EncodingAESKey, AppID); 10 $decryptMsg = ""; // 解密後的明文 11 $errCode = $pc->DecryptMsg($msg_signature, $timestamp, $nonce, $postStr, $decryptMsg); 12 $postStr = $decryptMsg; 13 $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); 14 $INFO_TYPE = trim($postObj->InfoType); 15 16 // 消息類型分離 17 switch ($INFO_TYPE) 18 { 19 case "component_verify_ticket": 20 $component_verify_ticket = $postObj->ComponentVerifyTicket; 21 file_put_contents('component_verify_ticket.json', '{"component_verify_ticket": "'. $postObj->ComponentVerifyTicket.'", "component_expires_time": '.time.'}'); 22 $result = "success"; 23 break; 24 default: 25 $result = "unknown msg type: ".$INFO_TYPE; 26 break; 27 } 28 echo $result;
全網發佈接入檢測成功後,效果如圖22-10所示。
圖22-10 全網發佈檢測結果