关闭

[置顶] 微信第三方网页授权

205人阅读 评论(0) 收藏 举报
分类:

1、需求说明

项目的需求是需要用户从微信进入第三方网页的时候让用户进行授权登录,授权成功后获取用户的基本信息,比如用户的头像,用户的昵称,用户的unionid,用户的openid。
拿到这些获取的信息去数据库对比是否存在此用户,如果存在,表示该用户已在本网站注册过账号,则直接登录;如果不存在此用户则让用户去注册页注册账号,注册也不需要填写名称或者上传头像,就直接用微信中获取到的默认的,只需要用户绑定他的手机号即可。


2、贴上所需链接地址

微信公众平台:点击打开链接



微信开发者文档:点击打开链接


3、首先配置平台基本信息

在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头;

这个是微信官方文档的解释,我就在这里贴一张路径图,就不做解释了





3、关于网页授权的两种scope的区别说明

这个在微信官方文档上已经写的很详细了我就不做解释了。
个人感觉,用snsapi_userinfo比较好。
因为微信如果要做JSSDK功能,微信页面分享给了其他人,该用户未关注你的服务号授权登录了你的服务号也是可以直接玩的。
但是snsapi_base就是需要用户必须关注你的服务号才可以玩,因为snsapi_base只返回一个openid,你要拿这个openid去获取用户的基本信息的接口,这个接口是要用户关注了你的服务号才可以获取的到。


5、网页授权流程

这里是粘贴的微信服务号上的流程
1、引导用户进入授权页面同意授权,获取code
2、通过code换取网页授权access_token(与基础支持中的access_token不同)
3、如果需要,开发者可以刷新网页授权access_token,避免过期
4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)

6、先将代码贴上,在做讲解

<?php

class WechatAction extends Action{
    private static $appid;
    private static $appsecret;
    private static $access_token;
    private static $openid;


    public function __construct(){
        self::$appid = C('APPID');
        self::$appsecret = C('APPSECRET');
        
    }


    /**
     *  获取微信用户的unionid做对比
     *  微信用户的基本信息
     *  用户的Token通过地址栏传递值
     */
    public function login(){
        $userinfo = $this->get_userinfo();
        if($userinfo['subscribe'] === 0){
            $this->errorMSG(1,'您还未关注');
        }elseif($userinfo['errcode'] == 40013){
            $this->errorMSG(2,'系统错误');
        }

        // TODO 获取用户的token基本完成,以下开始实现自己的业务逻辑代码

        /*
        用户的微信是否注册过
        去数据库查取
        注册过直接登录
        未注册就让其注册
        */
    }

    /**
     * 用户同意授权后,获取用户的openid和unionid
     * @return bool|mixed
     */
    public function get_oauth_message(){
        $code = isset($_GET['code']) ? $_GET['code'] : '';
        if(!$code) return false;
        //通过code,换取access_token
        $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.self::$appid.'&secret='.self::$appsecret.'&code='.$code.'&grant_type=authorization_code';
        $result = self::request($url);
        if($result){
            $oauthMessage = json_decode($result,true);
            if($oauthMessage){
                self::$access_token = $oauthMessage['access_token'];
                self::$openid = $oauthMessage['openid'];
                return $oauthMessage;
            }
        }
        return false;
    }

    /**
     *  根据openid获取用户的基本信息
     *  unionid	只有将公众号绑定到微信开放平台帐号后,才会出现该字段。
     */
    public function get_userinfo(){
        if($this->get_oauth_message()){
            $url = 'https://api.weixin.qq.com/sns/userinfo?access_token='.self::$access_token.'&openid='.self::$openid.'&lang=zh_CN';
            $result = json_decode(self::request($url),true);
            return $result;
        }
        return false;
    }

    /**
     * @param $url 需要发送请求的URL地址
     * @param $https 是http请求还是https请求
     * @param string $method 是get还是post请求方式
     * @param null $data post请求要带上的数据
     * @return mixed 请求返回结果字符串
     *
     */
    public static function request($url,$https=true,$method='get',$data=null){
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不输出在浏览器上,保存在变量中
        if($https === true){
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);  // 不从证书中检查SSL加密算法是否存在
        }
        if($method === 'post'){
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        }
        $content = curl_exec($ch);//发送请求
        curl_close($ch);//关闭资源
        return $content;
    }

}

以下是代码讲解部分

7、获取code换取access_token

首先要拼接授权的链接地址



拼接好改路径后在微信中打开此链接就是此效果


点击这个确认登录,也就是授权了,这个时候就会跳转到刚才的授权链接地址中填写的redirect_url这个参数值的页面中去,也就是要在这个参数中获取code的参数值,我在代码中的get_oauth_message( )方法就是获取code换取access_token。这个access_token和基础接口中的token不一样,然后就是拿着个access_token去获取用户的信息,就是get_userinfo( )方法中的代码,我不需要第三步,所以就跳过了第三步

8、openidunionid的区别

已经拿到了用户的基本信息,现在对用户的基本信息进行数据库存储啊,还是注册登录操作就看公司的业务需求了,这里说一下openidunionid的区别:

openid是用户针对每个服务号产生的参数值,就是说一个用户对于不同的服务号,产生的openid都不一样。

unionid同一个微信开放平台下的不同应用产生的相同的参数值,就是说当你们公司旗下的服务号不止一个的时候,但是用户来访问你们公司旗下的每一个服务号都会产生不同的openid,这时候怎么标明这个用户的唯一性呢,那就是unionid了,你将你公司所有的服务号都绑定在一个微信开放平台下,那么同一个用户来访问你公司旗下的服务号,产生的unionid都是一样的



1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2936次
    • 积分:109
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类