当第三方平台创建成功并最终开发测试完毕,提交全网发布申请时,微信服务器会通过自动化测试的方式,检测服务的基础逻辑是否可用,在确保基础可用的情况下,才会允许公众号第三方平台提交全网发布。
微信后台会自动将下述公众号配置为第三方平台的一个额外的测试公众号,并通过该账号,执行如下测试步骤。第三方平台需要根据各步骤描述的自动化测试规则实现相关逻辑,才能通过接入检测,达到全网发布的前提条件。
检测点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 全网发布检测结果