搜索
首页微信小程序微信开发微信公众平台开发access_token、日志

微信公众平台开发access_token、日志

Mar 01, 2017 am 10:09 AM
微信开发

一、access_token

1)两种access_token,网页授权access_token和普通access_token

1、微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权access_token),通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息。


2、其他微信接口,需要通过基础支持中的“获取access_token”接口来获取到的普通access_token调用。access_token是公众号的全局唯一票据,access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

 

2)分别获取access_token

1、网页授权的:点击查看网页授权获取用户基本信息文档,通过查看这个文档,

可以看到通过code换取网页授权access_token,而这个code是通过微信的一个授权链接获取到的,然后再根据文档中的请求获取到的,具体的链接地址和参数可以参考文档。

/**
     * 创建一个需要通过微信的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、普通的:点击查看获取access token文档,通过三个参数获取到。

这里需要注意的是,获取到的token,是有时效性的,2 个小时,所以我会保存在MongoDB中,先从数据库中比对超时了没有,没有的话就直接从数据库中获取,减少不必要的请求。

 

二、推送日志

  在与微信的交互中,会产生很多日志信息,并且开发的时候经常需要分析这些日志,这里我将日志都保存在了MongoDB中。MongoDB方便的地方是任何结构的数据都能放在一个document中,不像MySQL要定义好字段名,我经常调试的时候将各种结构放在一个document中。

 

在微信的入口页面中,也就是前面提到的URL(服务器地址),会在这里面做保存日志的逻辑。逻辑包括关注的时候推送一条消息,二维码扫描关注,点击某个菜单产生事件,点击菜单的超链接等。

日志结构如下:

1、代码中包括签名验证逻辑

2、通过file_get_contents('php://input')来获取请求数据,就是下面的getRawMsg方法

3、将推送日志直接塞入到MongoDB中

4、将接收到的请求信息SimpleXMLElement对象,就是下面的parseMsg方法

5、handleEventMsg就是在处理各种不同情况了

/**
     * 微信公众号入口
     */
    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、如果要推送消息,die这个方法得要加上

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;
    }

demo下载:

github地址:https://github.com/pwstrick/weixin_demo

CSDN地址:http://download.csdn.net/detail/loneleaf1/9045731

更多微信公众平台开发access_token、日志相关文章请关注PHP中文网!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境