微信第三方全网发布接入检测(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;
        }


    }

  

 

posted @ 2018-01-20 20:46  wcu1117  阅读(1872)  评论(0编辑  收藏  举报