Heim  >  Artikel  >  WeChat-Applet  >  Access_token für die Entwicklung der öffentlichen WeChat-Plattform, Protokoll

Access_token für die Entwicklung der öffentlichen WeChat-Plattform, Protokoll

高洛峰
高洛峰Original
2017-03-01 10:09:541483Durchsuche

1. Zugriffstoken

1) Zwei Arten von Zugriffstoken, Webseitenautorisierung, Zugriffstoken und gewöhnlicher Zugriffstoken.

1. Die WeChat-Webseitenautorisierung wird über den OAuth2.0-Mechanismus implementiert Offizielles Konto Schließlich kann das öffentliche Konto einen Berechtigungsnachweis für die Webseitenautorisierung erhalten (Access_token für die Webseitenautorisierung), mit dem Schnittstellenaufrufe nach der Autorisierung durchgeführt werden können, z. B. das Abrufen grundlegender Benutzerinformationen.


2. Für andere WeChat-Schnittstellen müssen Sie den normalen access_token-Aufruf über die Schnittstelle „Get access_token“ in der Basisunterstützung erhalten. Der access_token ist das weltweit eindeutige Ticket für das offizielle Konto. Die Gültigkeitsdauer des access_token beträgt derzeit 2 Stunden und muss regelmäßig aktualisiert werden. Wiederholter Erwerb führt dazu, dass der letzte access_token ungültig wird.

2) Access_token erhalten

1. Klicken Sie hier, um die Webseitenautorisierung anzuzeigen, um das grundlegende Informationsdokument des Benutzers zu erhalten,

Sie können sehen, dass der Code gegen das Webseiten-Autorisierungs-Access_token ausgetauscht wird. Dieser Code wird über einen Autorisierungslink auf WeChat abgerufen und dann gemäß der Anforderung im Dokument für die spezifische Linkadresse und die Parameter abgerufen Bitte beachten Sie das Dokument.

/**
     * 创建一个需要通过微信的OAuth2.0认证的服务url
     * @param $url 服务号需要认证访问的url
     * @param $scope string snsapi_userinfo | snsapi_base
     *      snsapi_userinfo 可以用来获取用户信息
     *      snsapi_base 可以用来获取openid
     * @param string $state 自定义状态值
     *      此处约定为from_weixin代表是从微信认证过来,一般无需轻易变化
     * @return string 返回认证url地址
     */
    public function createAuthUrl($url, $scope = 'snsapi_base', $state = 'from_weixin')
    {
        $url = strval($url);
        $authUrl = 'https://open.weixin.qq.com/connect/oauth2/authorize';
        /**
         * 此处有大坑,请不要打乱param的顺序
         * 否则微信认证界面会出现白屏
         */
        $param = array(
                'appid' => $this->appId,
                'redirect_uri' => urlencode($url),
                'response_type' => 'code',
                'scope' => $scope,
                'state' => $state
        );
    
        $seg = array();
        foreach ($param as $k => $v) {
            $seg[] = "{$k}={$v}";
        }
        return $authUrl . '?' . join('&', $seg) . '#wechat_redirect';
    }

2. Klicken Sie hier, um das Zugriffstokendokument anzuzeigen, das über drei Parameter abgerufen wird.

Was hier beachtet werden muss, ist, dass das erhaltene Token zeitkritisch ist, 2 Stunden, also werde ich es in MongoDB speichern und es zuerst mit der Datenbank vergleichen, um zu sehen, ob es so ist Wenn nicht, rufen Sie es direkt aus der Datenbank ab, um unnötige Anfragen zu reduzieren.

2. Push-Protokolle

Während der Interaktion mit WeChat werden viele Protokollinformationen generiert, die häufig analysiert werden müssen diese Protokolle während der Entwicklung, hier speichere ich die Protokolle in MongoDB. Der Vorteil von MongoDB besteht darin, dass Daten beliebiger Struktur in einem Dokument platziert werden können. Im Gegensatz zu MySQL, das klar definierte Feldnamen erfordert, füge ich beim Debuggen häufig verschiedene Strukturen in ein Dokument ein.

Auf der Einstiegsseite von WeChat, bei der es sich um die oben genannte URL (Serveradresse) handelt, erfolgt hier die Logik zum Speichern des Protokolls. Die Logik umfasst das Senden einer Nachricht beim Folgen, das Scannen des QR-Codes zum Folgen, das Klicken auf ein Menü, um ein Ereignis zu generieren, das Klicken auf den Hyperlink des Menüs usw.

Die Protokollstruktur ist wie folgt:

1 Der Code enthält eine Signaturüberprüfungslogik

2. 'php: //input'), um die Anforderungsdaten zu erhalten, was die getRawMsg-Methode unten ist

3. Fügen Sie das Push-Protokoll direkt in MongoDB ein

4. Konvertieren Sie die empfangenen Anforderungsinformationen in die SimpleXMLElement-Objekt, das die folgende parseMsg-Methode

5 ist. handleEventMsg behandelt verschiedene Situationen

/**
     * 微信公众号入口
     */
    public function actionPortal()
    {
        $weixin = new Weixin();
        //签名验证逻辑
//         if($weixin->checkSignature()){
//             echo $_GET['echostr'];
//         }
//         exit;
        //读取原始请求数据
        $msg = $weixin->getRawMsg();
        
        //推送日志
        $pushlog = new WeixinPushLog();
        $pushlog->logWeixinPush($msg);
        
        $msgObj = $weixin->parseMsg($msg);
        if ($msgObj === false || !is_object($msgObj)) {
            exit;
        }
        switch ($msgObj->MsgType) {
            case 'event' : //接收事件消息
                $this->handleEventMsg($msgObj);
                break;
            default :
                //todo
                break;
        }
    }

public function getRawMsg()
    {
        return file_get_contents('php://input');
    }

    /**
     * 解析接收到的消息
     * @param string $msg 消息体
     * @return bool|SimpleXMLElement
     */
    public function parseMsg($msg = '')
    {
        if (!$msg || empty($msg)) {
            return false;
        }
        $msgObj = simplexml_load_string($msg, 'SimpleXMLElement', LIBXML_NOCDATA);
        if ($msgObj === false || !($msgObj instanceof \SimpleXMLElement)) {
            return false;
        }
        return $msgObj;
    }

6. Wenn Sie Nachrichten pushen möchten, muss die Methode hinzugefügt werden

7 Der folgende Code listet nur zwei Ereignissituationen auf, eine ist Abonnement, eine ist das Klickereignis

8. createRawTuWenMsg spleißt XML, klicken Sie, um die Vorlagennachrichtenschnittstelle anzuzeigen.

private function handleEventMsg($msgObj)
    {
        $weixin = new Weixin();
        $openId = $msgObj->FromUserName;
        $fromUserName = $msgObj->ToUserName;
        //未关注,关注后推送
        if ($msgObj->Event == 'subscribe') {
            $pushData['PicUrl'] = 'http://mmbiz.qpic.cn/';
            $pushData['Title'] = '基因检测,带你一起探索生命的奥妙 ';
            $pushData['Description'] = '为什么不同人在身高、体重、肤色和形状上长得不一样?但是往往又和自己的父母相似?';
            $pushData['Url'] = 'http://mp.weixin.qq.com';
            $msg = $weixin->createRawTuWenMsg($fromUserName, $openId, array($pushData));

            die($msg);
        }elseif($msgObj->Event == 'CLICK'){
            //die($msg);
        }
    }

public function createRawTuWenMsg($fromUserName, $toUserName, $items = array())
    {
        if (!is_array($items)) {
            return '';
        }
        $count = count($items);
        $its = '';
        foreach ($items as $item) {
            $its .= <<<ITEMTPL
<item>
<Title><![CDATA[{$item[&#39;Title&#39;]}]]></Title>
<Description><![CDATA[{$item[&#39;Description&#39;]}]]></Description>
<PicUrl><![CDATA[{$item[&#39;PicUrl&#39;]}]]></PicUrl>
<Url><![CDATA[{$item[&#39;Url&#39;]}]]></Url>
</item>
ITEMTPL;
        }
    
        $msg = <<<MSG
<xml>
<ToUserName><![CDATA[{$toUserName}]]></ToUserName>
<FromUserName><![CDATA[{$fromUserName}]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>{$count}</ArticleCount>
<Articles>
{$its}
</Articles>
</xml>
MSG;
    return $msg;
    }

Demo-Download:

Github-Adresse: https://github.com/ pwstrick/weixin_demo

CSDN-Adresse: http://download.csdn.net/detail/loneleaf1/9045731

Weitere Artikel zur Entwicklung von Access_token und Protokollen für die öffentliche WeChat-Plattform finden Sie unter die chinesische PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn