重新整理做过的功能,以及过程遇到问题,温故而知新
官方文档

一 准备工作 (a.接入 b.配置)

a) 修改/添加 业务域名、网页授权域名; 授权回调域名 不加 http:// 协议头

绑定时微信要求将 *.txt文件上传根目录,需要将文件 添加到我项目.htaccess许可中 确保文件可被访问,否则绑定不通过

b) 公众平台 参数

appid
secret

二 授权登录

简单画一个流程图
图片描述

  1. 网上很多人说微信浏览器 session 失效的问题,我测试并不存在; 不太懂为什么session会失效;暂时get不到
  2. 忽略了refresh_token 刷新access_token步骤

ci框架

    function __construct()    {
        parent::__construct();
        $this->load->library('session');
    }

    public function index() {
        if (!isset($_SESSION['wx_user_data'])) {
            // 1. 获取缓存token: 如果token过期则通过 refresh_token获取,都过期或首次请求则获取code
            $code = $this->input->get('code');
            if (!$code) {
                //获取现有token
                $access_token = $this->get_wx_access_token();
            }

            // 2. get access token
            $this->load->library('mycurl');
            $wx_get_token = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.WX_APP_ID.'&secret='.WX_SECRET.'&code='.$code.'&grant_type=authorization_code';
            list($returnCode, $returnContent) = $this->mycurl->curl_post_json_to_java($wx_get_token);
            $returnContent = json_decode($returnContent, true);

            if ($returnCode ===200 && !isset($returnContent['access_token'])) {
                die('error-page-todo-later'.$returnContent['errcode']);
            }

            $access_token  = $returnContent['access_token'];
            $refresh_token = $returnContent['refresh_token'];
            $expires_date  = time()+7100;
            $openid        = $returnContent['openid'];

            // 3. 刷新 access token
            // 4. 拉取用户信息
            $wx_get_userinfo = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN';
            list($returnCode, $returnContent) = $this->mycurl->curl_post_json_to_java($wx_get_userinfo);
            $returnContent = json_decode($returnContent, true);

            if ($returnCode ===200 && isset($returnContent['errcode'])) {
                die('error-page-todo-later'.$returnContent['errcode']);
            }

            $userData = array();
            $userData['openid']     = $returnContent['openid'];
            $userData['unionid']    = $returnContent['unionid'];
            $userData['nickname']   = $returnContent['nickname'];
            $userData['sex']        = $returnContent['sex'];
            $userData['province']   = $returnContent['province'];
            $userData['city']       = $returnContent['city'];
            $userData['country']    = $returnContent['country'];
            $userData['headimgurl'] = $returnContent['headimgurl'];
            $userData['privilege']  = $returnContent['privilege'];

            // 5. session 存储userData 缓存做不到每次从入口进来实时刷新用户信息
            $this->session->set_userdata('wx_user_data', $userData);
        }

        // 6. 项目主逻辑
        $templateData['userData'] = $_SESSION['wx_user_data'];
        $this->load->view('union_m/index.html', $templateData);
    }

    /**
     * 跳转至授权页面,公众号入口 scope user-info 同样静默
     * @return [type] [description]
     */
    public function redirect_wx_url() {
        $wx_get_code  = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.WX_APP_ID.'&redirect_uri='.urlencode(UNION_INDEX).'&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect';
        $this->load->helper('url');
        redirect($wx_get_code);
    }

    // access token 维护
    public function get_wx_access_token() {
        // 1. 是否有未过期 token 直接return
        // 2. 是否有未过期 refresh_token 则获取 token, 刷新access_token (忽略)
        // 3. 都不存在 首次授权 或 全部过期的情况 跳转授权页面
        $this->redirect_wx_url();
    }
结合项目最后实现地址

王江涛
20 声望0 粉丝

下一篇 »
微信网页授权