>  기사  >  위챗 애플릿  >  WeChat 공개 플랫폼 개발 access_token, log

WeChat 공개 플랫폼 개발 access_token, log

高洛峰
高洛峰원래의
2017-03-01 10:09:541526검색

1. access_token

1) 웹 인증 access_token과 일반 access_token의 두 종류

1. WeChat 웹페이지 인증은 사용자가 인증할 때 구현됩니다. 공식 계정 마지막으로, 공식 계정은 웹페이지 인증별 인터페이스 호출 자격 증명(웹페이지 인증 access_token)을 얻을 수 있으며, 웹페이지 인증 access_token을 통해 기본 사용자 정보 획득 등 사후 인증 인터페이스 호출을 수행할 수 있습니다.


2. 기타 WeChat 인터페이스의 경우 기본 지원에서 "Get access_token" 인터페이스를 통해 일반 access_token 호출을 얻어야 합니다. access_token은 공식 계정의 전역적으로 고유한 티켓입니다. access_token의 유효 기간은 현재 2시간이며 정기적으로 새로 고쳐야 합니다. 그러면 마지막 access_token이 무효화됩니다.

2) 각각 access_token 획득

1. 웹페이지 인증: 이 문서를 열람하면 사용자의 기본 정보 문서를 얻기 위해 웹페이지 인증을 볼 수 있습니다. 🎜>

코드가 웹페이지 인증 access_token으로 교환되는 것을 볼 수 있는데, 이 코드는 WeChat의 인증 링크를 통해 얻은 다음, 특정 링크 주소 및 매개변수에 대해 문서의 요청에 따라 획득됩니다. , 문서를 참고해주세요.

/**
     * 创建一个需要通过微信的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. 일반: 세 가지 매개변수를 통해 얻은 액세스 토큰 문서를 보려면 클릭하세요.

여기서 주목해야 할 점은 획득한 토큰이 2시간이라는 시간에 민감한 토큰이므로 MongoDB에 저장한 후 먼저 데이터베이스와 비교하여 있는지 확인하겠습니다. 시간이 초과되었습니다. 그렇지 않은 경우 불필요한 요청을 줄이기 위해 데이터베이스에서 직접 가져옵니다.

2. 푸시 로그

WeChat과의 상호 작용 중에 많은 로그 정보가 생성되며 분석이 필요한 경우가 많습니다. 개발 중에 이러한 로그를 저장합니다. 여기서는 MongoDB에 로그를 저장합니다. MongoDB의 장점은 어떤 구조의 데이터도 문서에 넣을 수 있다는 점이다. 잘 정의된 필드 이름이 필요한 MySQL과 달리 디버깅할 때 다양한 구조를 문서에 넣는 경우가 많다.

위에서 언급한 URL(서버 주소)인 위챗 입구 페이지에서 로그를 저장하는 로직이 여기서 이루어지게 됩니다. 로직에는 팔로우 시 메시지 푸시, 팔로우할 QR 코드 스캔, 메뉴를 클릭하여 이벤트 생성, 메뉴의 하이퍼링크 클릭 등이 포함됩니다.

로그 구조는 다음과 같습니다.

1. 코드에는 서명 확인 로직이 포함되어 있습니다

2. 'php: //input')을 통해 요청 데이터를 얻어오는데, 이는 아래의 getRawMsg 메소드

3. 푸시 로그를 MongoDB에 직접 삽입

4. 수신된 요청 정보를 SimpleXMLElement 객체는 다음과 같은 구문 분석 메소드

5. handlerEventMsg는 다양한 상황을 처리합니다.

/**
     * 微信公众号入口
     */
    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. 메시지를 푸시하려면 다이 메소드를 추가해야 합니다

7. 다음 코드는 구독 이벤트와 클릭 이벤트 두 가지만 나열합니다.

8. createRawTuWenMsg가 XML을 연결하는 중입니다. 템플릿 메시지 인터페이스를 보려면 클릭하세요.

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;
    }
데모 다운로드:

github 주소: https://github.com/pwstrick/weixin_demo

CSDN 주소: http://download.csdn.net/detail/loneleaf1/9045731

WeChat 공개 플랫폼 개발 access_token 및 로그와 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요. !

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.