微信第三方平台开发详解——PHP版

2017-11-04 09:10:00 5385 1 编辑:深正互联 来源:互联网

申请第三方平台,这个很简单直接按照提示填写,下面的授权事件接收URL中获取的component_verify_ticket是会过期的,所以不要只获取一次,缓存起来每10分钟会发送一次,每1小时会更新一次。


01.png

附上我的获取component_verify_ticket的代码:我是缓存和数据库都保存了

微信有提供wxBizMsgCrypt.php加解密核心代码

/**

     * 授权事件接收URL

     * @access public

     *

     */

    public function sysMessage()

    {

        $wxComponentTicketModel = new \app\diuber\model\WxComponentTicket();

        

        $encodingAesKey = $this->encodingAesKey;

        $token = $this->token;

        $appId = $this->appId;

        $timeStamp  = empty($_GET['timestamp'])     ? ""    : trim($_GET['timestamp']) ;

        $nonce      = empty($_GET['nonce'])     ? ""    : trim($_GET['nonce']) ;

        $msg_sign   = empty($_GET['msg_signature']) ? ""    : trim($_GET['msg_signature']) ;

        $encryptMsg = file_get_contents('php://input', 'r');

        

        libxml_disable_entity_loader(true);

        $result = json_decode(json_encode(simplexml_load_string($encryptMsg, 'SimpleXMLElement', LIBXML_NOCDATA)), true);

        

        if(config('redis_set')['use_status']){

            $redis = $wxComponentTicketModel->initializeRedis();

            $redis->set('wx_component_verify_ticket_xml',$encryptMsg);

        }

        

        $pc = new \WXBizMsgCrypt($token, $encodingAesKey, $appId);

        

        $xml_tree = new \DOMDocument();

        $xml_tree->loadXML($encryptMsg);

        $array_e = $xml_tree->getElementsByTagName('Encrypt');

        $encrypt = $array_e->item(0)->nodeValue;

        

        

        $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);

        if ($errCode == 0) {

            //print("解密后: " . $msg . "\n");

            $xml = new \DOMDocument();

            $xml->loadXML($msg);

            $array_e = $xml->getElementsByTagName('ComponentVerifyTicket');

            $component_verify_ticket = $array_e->item(0)->nodeValue;

            

            //logResult('解密后的component_verify_ticket是:'.$component_verify_ticket);

            

            $dateline = time();

            

            $data = array(

                'app_id' => $result['AppId'],

                'encrypt' => $result['Encrypt'],

                'create_time' => $dateline + 600,

                //'info_type' => $result['AppId'],

                'component_verify_ticket' => $component_verify_ticket,

                'time' => date('Y-m-d H:i:s')

            );

            

            if(config('redis_set')['use_status']){

                $redis = $wxComponentTicketModel->initializeRedis();

                $redis->set('wx_component_verify_ticket',json_encode($data));

            }

            

            $existComponentTicke = $wxComponentTicketModel->get(array('component_verify_ticket'=>$component_verify_ticket));

            if(!$existComponentTicke){

                $wx = $wxComponentTicketModel->create($data);

                if($wx){

                    echo 'success';

                    exit;

                }else{

                    echo 'fail';

                    exit;

                }

            }else{

                echo 'success';

                exit;

            }

        }else{

            echo 'fail';

            exit;

        }

    }


02.png


地址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318479&token=bc7c35421376903886e43747e4bf165c9be36663&lang=zh_CN

公众号消息与事件接收URL,直接上代码:

这个方法处理3中不同的事件推送,

1.MsgType为text类型,并且Content信息为‘QUERY_AUTH_CODE:xxxxxxxxx’:需要通过接口’https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=xxx ’POST回复过去。

2.MsgType为text类型,并且Content信息为‘TESTCOMPONENT_MSG_TYPE_TEXT’:需要把Content信息改为‘TESTCOMPONENT_MSG_TYPE_TEXT_callback’然后加密return

3.MsgType为event类型:需要注意的是当MsgType为event类型时是没有Content信息的会增加一个Event的字段,这里只要获取到Event然后在后面加上‘from_callback’保存为Content字段信息,统一加密return。

具体逻辑看代码


/**

     * 公众号消息与事件接收URL

     * @access public

     *

     */

    public function callback()

    {

        $wxComponentTicketModel = new \app\diuber\model\WxComponentTicket();

        $wxCallbackModel = new \app\diuber\model\WxCallback();

        $wxAccessTokenModel = new \app\diuber\model\WxAccessToken();

        

        $encodingAesKey = $this->encodingAesKey;

        $token = $this->token;

        $appId = $this->appId;

        $timeStamp  = empty($_GET['timestamp'])     ? ""    : trim($_GET['timestamp']) ;

        $nonce      = empty($_GET['nonce'])     ? ""    : trim($_GET['nonce']) ;

        $msg_sign   = empty($_GET['msg_signature']) ? ""    : trim($_GET['msg_signature']) ;

        

        $encryptMsg = file_get_contents('php://input');

        $pc = new \WXBizMsgCrypt($token, $encodingAesKey, $appId);

        

        $xml_tree = new \DOMDocument();

        $xml_tree->loadXML($encryptMsg);

        $array_e = $xml_tree->getElementsByTagName('Encrypt');

        $encrypt = $array_e->item(0)->nodeValue;


        $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);

        if ($errCode == 0) {

            $xml = new \DOMDocument();

            $xml->loadXML($msg);

            $array_e2 = $xml->getElementsByTagName('ToUserName');

            $ToUserName = $array_e2->item(0)->nodeValue;

            $array_e3 = $xml->getElementsByTagName('FromUserName');

            $FromUserName = $array_e3->item(0)->nodeValue;

            $array_e5 = $xml->getElementsByTagName('MsgType');

            $MsgType = $array_e5->item(0)->nodeValue;

            $nowTime = date('Y-m-d H:i:s');

            $contentx = '';

            if($MsgType=="text") {

                $array_e = $xml->getElementsByTagName('Content');

                $content = $array_e->item(0)->nodeValue;

                $needle ='QUERY_AUTH_CODE:';

                $tmparray = explode($needle,$content);

                if(count($tmparray) > 1){

                    //3、模拟粉丝发送文本消息给专用测试公众号,第三方平台方需在5秒内返回空串

                    //表明暂时不回复,然后再立即使用客服消息接口发送消息回复粉丝

                    $contentx = str_replace ($needle,'',$content);

                    $info = $wxAccessTokenModel->getMiniAppInfo($contentx);

                    $test_token = $info['info']['authorizer_access_token'];

                    $content_re = $contentx."_from_api";

                    echo '';

                    $data = '{

                            "touser":"'.$FromUserName.'",

                            "msgtype":"text",

                            "text":

                            {

                                 "content":"'.$content_re.'"

                            }

                        }';

                    $url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$test_token;

                    $ch = curl_init();

                    curl_setopt($ch, CURLOPT_URL, $url);

                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

                    curl_setopt($ch, CURLOPT_POST, 1);

                    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

                    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

                    curl_exec($ch);

                    curl_close($ch);

                }else{

                    //2、模拟粉丝发送文本消息给专用测试公众号

                    $contentx = "TESTCOMPONENT_MSG_TYPE_TEXT_callback";

                }

            }elseif($MsgType == "event"){ //1、模拟粉丝触发专用测试公众号的事件

                $array_e4 = $xml->getElementsByTagName('Event');

                $event = $array_e4->item(0)->nodeValue;

                $contentx = $event.'from_callback';

            }            

            $text = "<xml>

            <ToUserName><![CDATA[$FromUserName]]></ToUserName>

            <FromUserName><![CDATA[$ToUserName]]></FromUserName>

            <CreateTime>$nowTime</CreateTime>

            <MsgType><![CDATA[text]]></MsgType>

            <Content><![CDATA[$contentx]]></Content>

                    </xml>";

            //加密消息

            $encryptMsg = '';

            $errCode = $pc->encryptMsg($text, $timeStamp, $nonce, $encryptMsg);

            

            $wxCallbackModel->create(array('from_user_name'=>$FromUserName,'to_user_name'=>$ToUserName,'msg_type'=>$MsgType,'content'=>$contentx,'create_time'=>$timeStamp));

            echo $encryptMsg;

            exit();

        } else {

            if(config('redis_set')['use_status']){

                $redis = $wxComponentTicketModel->initializeRedis();

                $redis->set('wx_call_back_err',$errCode);

            }

            exit();

        }

    }

到这里已经全部完成了全网发布的准备了。可以直接点击全网发布监测,通过以后一般会在2-3之内通过审核。


本站文章均为深正网站建设摘自权威资料,书籍,或网络原创文章,如有版权纠纷或者违规问题,请即刻联系我们删除,我们欢迎您分享,引用和转载,但谢绝直接搬砖和抄袭!感谢...
关注深正互联

15

技术从业经验

多一份方案,会有收获...

联系深正互联,免费获得专属《策划方案》及报价

在线咨询
微信交谈
拒绝骚扰,我们只想为给您带来一些惊喜...
多一份免费策划方案,总有益处。

请直接添加技术总监微信联系咨询

深正互联微信
扫描即可沟通