微信第三方登录

 因网站需求,需要在网站中加入微信第三方登录,因本人是菜鸟,所以用了半天的时间才搞定,以防以后需求用到,记录一下,以后就可以直接拿来用了

第一步: 首先在微信开放平台,申请账号并且认证,认证费用300RMB,认证期过后需要创建一个应用,需要注意的是: 应用回调地址,微信不同于QQ第三方登录,回调地址写成: www.xxx.com即可,后面不要再跟东西,因为这个,我搞了好长时间

 这样,当应用审核通过以后,我们就可以拿到应用的Appid 和 AppSecret

 

第二步: 创建一个页面,可以存放微信第三方登录二维码,在点击微信图标的时候,跳转到这个页面,页面中引入一个js文件:

<script src="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>

<script type="text/javascript">
//id和scope不用改、appid和redirect_uri改为自己的
var obj = new WxLogin({
    id:"login_container", 
    appid: "你拿到的appid", 
    scope: "snsapi_login", 
    redirect_uri:"你设置的回调地址",   //这个回调地址需要通过加密成这样: http%3a%2f%2fwww.baidu.com%2f
    state: "WECHAT",   //因为我是QQ和微信都需要,所以这里添加了自己的标识来进行判断,可以不加,也可以md5加密处理
    style: "white",    //二维码颜色
    href: ""
});

</script>

 第三步: 扫码完毕并且授权登录以后,会自动跳转回你设置的回调地址中,因此逻辑代码需要在此控制器中编写

①. 返回回调地址时会带两个参数过来,分别是code和state

$code = I('get.code') ? I('get.code') : '';  //微信第三方登陆用户授权标识
$state = I('get.state') ? I('get.state') : '';

 首先要进行判断,如果code存在,并且你自己设置的state是正确的,那么才可以进行下一步操作

 在访问api地址的时候,lang=zh_CN  参数建议加上,这样返回回来的数据,地址信息就会成为汉字而不是拼音

$getUrl = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token['access_token'].'&openid='.$access_token['openid'].'&lang=zh_CN';
//发送curl请求,获取返回数据
$result = $this->http($getUrl, 'get');

 

 

首先要获取到access_token,

 

 public function getAccessToken($code,$type){
        $appid = '你拿到的appid';
        $app_secret = '你拿到的app_secret';
        $redirect_uri = '已经处理过的回调地址';
        $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$app_secret.'&code='.$code.'&grant_type=authorization_code';
        $result = $this->http($url, 'get');
        //判断请求状态是否正确
        if ($result[0] == 200) {
            //将json数据转换为数组,得到accesstoken等数据
            $arr = json_decode($result[1],true);
        }
        return $arr;
    }

 

拿到token以后,我们要判断一下,有没有过期,因为有时间限制,所以如果已经过期的话,我们要刷新一下token,刷新token需要传入refresh_token  才可以

$url = 'https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=' . $appid. '&grant_type=refresh_token&refresh_token=' . $refresh_token;

 这里附上http请求的方法,

/**
     * @param $url 地址
     * @param $method 请求方式
     * @param null $postfields post的数据
     * @param array $headers 请求头
     * @param bool $debug 调试模式
     * @return array
     */
    private function http($url, $method, $postfields = null, $headers = array(), $debug = false)
    {
        $ci = curl_init();
        /* Curl settings */
        curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ci, CURLOPT_TIMEOUT, 30);
        curl_setopt($ci, CURLOPT_RETURNTRANSFER, true);

        switch ($method) {
            case 'POST':
                curl_setopt($ci, CURLOPT_POST, true);
                if (!empty($postfields)) {
                    curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
                    $this->postdata = $postfields;
                }
                break;
        }
        curl_setopt($ci, CURLOPT_URL, $url);
        curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ci, CURLINFO_HEADER_OUT, true);

        $response = curl_exec($ci);
        $http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);

        if ($debug) {
            echo "=====post data======\r\n";
            var_dump($postfields);

            echo '=====info=====' . "\r\n";
            print_r(curl_getinfo($ci));

            echo '=====$response=====' . "\r\n";
            print_r($response);
        }
        curl_close($ci);
        return array($http_code, $response);
    }

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值