微信第三方全网发布接入检测(PHP)

时间:2023-03-09 09:51:27
微信第三方全网发布接入检测(PHP)

官方文档  https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318292&token=&lang=zh_CN

function getTicket(){
$data = input('param.');
trace($data,'data');
$msg_sign = input('msg_signature');
$timeStamp = input('timestamp');
$nonce = input('nonce'); $encryptMsg = file_get_contents ( 'php://input' );
trace($encryptMsg,'getTicket'); //因为数据格式,先加密再解密 $pc = new WXBizMsgCrypt($this->token, $this->encodingAesKey, $this->appid); $xml_tree = new \DOMDocument();
$xml_tree->loadXML($encryptMsg);
$array_e = $xml_tree->getElementsByTagName('Encrypt');
$encrypt = $array_e->item(0)->nodeValue; echo 'success'; $format = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%s]]></Encrypt></xml>";
$from_xml = sprintf($format, $encrypt);
// 第三方收到公众号平台发送的消息
$msg = '';
$errCode = $pc->decryptMsg($msg_sign, $timeStamp, $nonce, $from_xml, $msg);
trace($msg,"msg: " );
if ($errCode == 0) {
//print("解密后: " . $msg . "\n");
$xml = new \DOMDocument();
$xml->loadXML($msg);
$array_e = $xml->getElementsByTagName('ComponentVerifyTicket');
//保存下来
$this->component_verify_ticket = $array_e->item(0)->nodeValue; //获取保存accessToken
$this->component_access_token = $this->component->getComponentToken($this->component_verify_ticket); } else {
print($errCode . "\n");
} } //全网发布响应
function callback(){
$appid = input('appid');
$msg_sign = input('msg_signature');
$timeStamp = input('timestamp');
$nonce = input('nonce'); $encryptMsg = file_get_contents ( 'php://input' ); trace($encryptMsg,'php://inpu'); //解密
$pc = new WXBizMsgCrypt($this->token, $this->encodingAesKey, $this->appid);
$msg = '';
$errCode = $pc->decryptMsg($msg_sign, $timeStamp, $nonce, $encryptMsg, $msg); trace($msg,"3解密后: " );
$response = json_decode(json_encode(simplexml_load_string($msg, 'SimpleXMLElement', LIBXML_NOCDATA)), true); //生成返回公众号的消息
$res_msg = $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>"; //判断事件 //2模拟粉丝发送文本消息给专用测试公众号 if ($response['MsgType']=="text") {
$needle ='QUERY_AUTH_CODE:';
$tmparray = explode($needle,$response['Content']);
if(count($tmparray)>1){
trace($response,"解密后: " );
//3、模拟粉丝发送文本消息给专用测试公众号,第三方平台方需在5秒内返回空串
//表明暂时不回复,然后再立即使用客服消息接口发送消息回复粉丝
$contentx = str_replace ($needle,'',$response['Content']);//将$query_auth_code$的值赋值给API所需的参数authorization_code
$this->authorization_code = $contentx;//authorization_code
trace($contentx,'authorization_code'); //使用授权码换取公众号或小程序的接口调用凭据和授权信息
$postdata = array(
"component_appid"=>$this->appid,
"authorization_code"=>$this->authorization_code,
); $this->component_access_token = $this->component->getAccessToken(); trace($this->component_access_token,'access_token'); $component_return = send_post($this->authorizer_access_token_url.$this->component_access_token,$postdata); $component_return = json_decode($component_return,true);
trace($component_return,'$component_return');
$this->authorizer_access_token = $test_token = $component_return['authorization_info']['authorizer_access_token'];
$content_re = $contentx."_from_api";
echo ''; //調用客服接口 $data = array(
"touser"=>$response['FromUserName'],
"msgtype"=>"text",
"text" => array(
"content" =>$content_re
)
);
$url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$test_token;
$ret = send_post($url, $data);
trace($ret,'客服消息'); } else{
//2、模拟粉丝发送文本消息给专用测试公众号
$contentx = "TESTCOMPONENT_MSG_TYPE_TEXT_callback"; trace($response,"2模拟粉丝发送文本消息给专用测试公众号: " );
$responseText = sprintf( $textTpl, $response[ 'FromUserName' ], $response[ 'ToUserName' ], $response[ 'CreateTime' ], $contentx );
// echo $responseText;
$echo_msg='';
$errCode = $pc->encryptMsg($responseText, $timeStamp, $nonce, $echo_msg);
trace($responseText,"2222转数组: " );
echo $echo_msg;
}
} //1、模拟粉丝触发专用测试公众号的事件 if ($response['MsgType'] == 'event'){
$content = $response['Event']."from_callback"; trace($response,"111转数组: " );
$responseText = sprintf( $textTpl, $response[ 'FromUserName' ], $response[ 'ToUserName' ], $response[ 'CreateTime' ], $content );
trace($responseText,"111: " );
// echo $responseText;
$errCode = $pc->encryptMsg($responseText, $timeStamp, $nonce, $echo_msg); echo $echo_msg;
} }