资讯专栏INFORMATION COLUMN

微信网页授权

岳光 / 1640人阅读

摘要:重新整理做过的功能,以及过程遇到问题,温故而知新官方文档一准备工作接入配置修改添加业务域名网页授权域名授权回调域名不加协议头绑定时微信要求将文件上传根目录,需要将文件添加到我项目许可中确保文件可被访问,否则绑定不通过公众平台参数二功能流程结

重新整理做过的功能,以及过程遇到问题,温故而知新 
官方文档
一 准备工作 (a.接入 b.配置)

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

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

b) 公众平台 参数

appid
secret

二 功能

流程

结合项目实现以下功能:

a) 首次授权获取userData存库 openid/unionid 关系对应
b) openid/unionid session缓存
c) session有效期内 延时
d) access_token缓存、刷新;

简单画一个流程图:

access_token 缓存/刷新 感觉没必要;因为openid过期,也要重新获取的;
code获取需要重定向,所以可以写在父类;

ci框架

class WX_Controller extends CI_Controller
{
    public $wx_code;
    public $wx_openid;
    public $wx_unionid;
    public $access_token;

    public function __construct() {
        parent::__construct();
        $this->load->library("session");

        // 存在session缓存 刷新 缓存时间
        if (isset($_SESSION["openid"])) {
            $this->session->mark_as_temp("openid", WX_USER_TEMPTIME);
            $this->session->mark_as_temp("unionid", WX_USER_TEMPTIME);
            $this->session->mark_as_temp("userData", WX_USER_TEMPTIME);
        }else {
            // 1. code
            $this->get_wx_code();

            // 2. token and openid
            $this->get_wx_acctoken();
            // 3. 验证token

            // 4. 如果首次授权请求微信,否则查库获取userData
            $this->load->model("Mwxuser");
            $where = array("openid"=>$this->wx_openid);
            $userData = $this->Mwxuser->wx_user_list(0, 1, $where);
            if (!$userData) {
                $userData = $this->get_wx_user_data();
            }

            // 5. 缓存openid unionid userData
            $sessionData = array("openid"=>$this->wx_openid, "unionid"=>$this->wx_unionid, "userData"=>$userData);
            $this->session->set_userdata($sessionData);
        }
    }
 }

code

/*----------------------------------------------------------*
                     微信公众号授权登录
*----------------------------------------------------------*/
    // get wx code 公众号 scope:snsapi_userinfo同样静默
    public function get_wx_code() {
        $code = $this->input->get("code");
        if ($code) {
            $this->wx_code = $code;
        }else {
            $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);
        }
    }

acc-token

    // get wx access token
    // FIXME.jtwang: 这里缓存token貌似也没什么用,如果session-openid过期,这里缓存token也是没用的
    public function get_wx_acctoken() {
        // a. 查询有效 token

        // b. token过期 refresh token 刷新

        // c. refresh 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=".$this->wx_code."&grant_type=authorization_code";
        $returnContent = $this->mycurl->curl_get($wx_get_token);
        $returnContent = json_decode($returnContent, true);

        if (!isset($returnContent["access_token"])) {
            die("error-page-todo-later-token".$returnContent["errcode"]);
        }

        $access_token     = $returnContent["access_token"];
        $refresh_token    = $returnContent["refresh_token"];
        $this->wx_openid  = $returnContent["openid"];           //openid
        $this->wx_unionid = $returnContent["unionid"];          //unionid
        $token_tempdate   = time()+7200;
        $refresh_tempdate = time()+30*24*60*60;

        $this->access_token = $access_token;
    }

拉取userData

    // 请求微信 拉取用户信息 返回 userData
    public function get_wx_user_data() {
        $wx_get_userinfo = "https://api.weixin.qq.com/sns/userinfo?access_token=".$this->access_token."&openid=".$this->wx_openid."&lang=zh_CN";
        $returnContent   = $this->mycurl->curl_get($wx_get_userinfo);
        $returnContent   = json_decode($returnContent, true);

        if (!isset($returnContent["openid"])) {
            die("error-page-todo-later-userdata".$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"];

        // 入库
        $this->load->model("Mwxuser");
        $res = $this->Mwxuser->wx_user_add($userData);

        if (!$res) {
            die("error-page-todo-later add user-data error");
        }

        return $userData;
    }
}
不对的地方还请指教。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30785.html

相关文章

  • 浅析微信支付:微信公众号网页授权

    摘要:浅析微信支付微信公众号网页授权本文是浅析微信支付系列文章的第四篇,主要讲解微信支付前如何获取获取网页授权及用户信息获取。浅析微信支付系列已经更新三篇了哟,没有看过的朋友们可以看一下哦。 浅析微信支付:微信公众号网页授权 本文是【浅析微信支付】系列文章的第四篇,主要讲解微信支付前如何获取获取网页授权及用户信息获取。 浅析微信支付系列已经更新三篇了哟~,没有看过的朋友们可以看一下哦。 浅...

    tinyq 评论0 收藏0
  • H5/web app/第三方网页 微信授权登录 调研

    摘要:微信登录用户可使用微信帐号快速登录你的网站,同一用户使用微信登录你的不同应用和公众帐号,会对应同一个,以便进行不同业务间的帐号统一微信授权登录可分为扫码登录一般用于网页微信开放平台跳转授权登录第三方使用微信开放平台微信内置浏览器内登录一 微信登录: 用户可使用微信帐号快速登录你的网站,同一用户使用微信登录你的不同应用和公众帐号,会对应同一个UnionID,以便进行不同业务间的帐号统一 ...

    keithxiaoy 评论0 收藏0
  • vue微信网页授权最终解决方案

    摘要:微信网页授权,基于适配方案,开发的微信授权方案。项目地址又又又一次来写微信网页授权,一年前写过的微信授权解决方案。 vue微信网页授权,基于vue-cli3.0+webpack 4+vant ui + sass+ rem适配方案+axios,开发的微信授权方案。项目地址:vue-wechat-auth 又又又一次来写微信网页授权,一年前写过的 [vue 微信授权解决方案]。 参考了[v...

    wawor4827 评论0 收藏0
  • ajax 实现微信网页授权登录

    摘要:项目背景因为项目采用前后端完全分离方案,所以,无法使用常规的微信授权登录作法,需要采用实现微信授权登录。其实实现这个也麻烦,在实现之前,我们需要了解一下微信授权的整个流程。用户微信登录授权以后回调过来的会携带两个参数,第一个是另一个就是。 项目背景 因为项目采用前后端完全分离方案,所以,无法使用常规的微信授权登录作法,需要采用 ajax 实现微信授权登录。 需求分析 因为本人是一个ph...

    binaryTree 评论0 收藏0
  • VueJs单页应用实现微信网页授权微信分享功能

    摘要:在实际开发中,无论是做端端还是微信公众号等类型的项目的时候,或多或少都会涉及到微信相关的开发,最近公司项目要求实现微信网页授权,并获取微信用户基本信息的功能及微信分享的功能,现在总算完成了,但开发过程中遇到好几个坑。 在实际开发中,无论是做PC端、WebApp端还是微信公众号等类型的项目的时候,或多或少都会涉及到微信相关的开发,最近公司项目要求实现微信网页授权,并获取微信用户基本信息的...

    doodlewind 评论0 收藏0
  • VueJs单页应用实现微信网页授权微信分享功能

    摘要:在实际开发中,无论是做端端还是微信公众号等类型的项目的时候,或多或少都会涉及到微信相关的开发,最近公司项目要求实现微信网页授权,并获取微信用户基本信息的功能及微信分享的功能,现在总算完成了,但开发过程中遇到好几个坑。 在实际开发中,无论是做PC端、WebApp端还是微信公众号等类型的项目的时候,或多或少都会涉及到微信相关的开发,最近公司项目要求实现微信网页授权,并获取微信用户基本信息的...

    BicycleWarrior 评论0 收藏0

发表评论

0条评论

岳光

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<