微信第三方平臺開發詳解——PHP版

微信第三方平臺開發詳解之申請以及全網發佈流程 php

微信第三方平臺開發詳解之受權流程 node

微信第三方平臺開發詳解之代小程序開發 redis

 

申請第三方平臺,這個很簡單直接按照提示填寫,下面的受權事件接收URL中獲取的component_verify_ticket是會過時的,因此不要只獲取一次,緩存起來每10分鐘會發送一次,每1小時會更新一次。數據庫

附上個人獲取component_verify_ticket的代碼:我是緩存和數據庫都保存了json

微信有提供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;
        }
    }api

地址: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中不一樣的事件推送,app

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){
                    //三、模擬粉絲髮送文本消息給專用測試公衆號,第三方平臺方需在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{
                    //二、模擬粉絲髮送文本消息給專用測試公衆號
                    $contentx = "TESTCOMPONENT_MSG_TYPE_TEXT_callback";
                }
            }elseif($MsgType == "event"){ //一、模擬粉絲觸發專用測試公衆號的事件
                $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以內經過審覈。

相關文章
相關標籤/搜索