因网站需求,需要在网站中加入微信第三方登录,因本人是菜鸟,所以用了半天的时间才搞定,以防以后需求用到,记录一下,以后就可以直接拿来用了
第一步: 首先在微信开放平台,申请账号并且认证,认证费用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);
}