PHP版微信第三方实现一键登录及获取用户信息的方法

本文实例讲述了PHP版微信第三方实现一键登录及获取用户信息的方法。分享给大家供大家参考,具体如下:

注意,要使用微信在第三方网页登录是需要“服务号”才可以哦,所以必须到官方申请。

一开始你需要进入微信公众平台开启开发模式,并且填写oauth2的回调地址,地址填写你项目的域名就可以了.比如:www.baidu.com或zhidao.baidu.com.如果你的项目在二级域名就写二级域名

前端url授权地址,在url中填写appid与你项目中方法中的oauth的地址,具体在下面的代码中可以看到.

复制代码代码如下:
<a href="https://open.weixin.qq.com/connect/oauth2/authorize?appid=appid&redirect_uri=http://www.xxxxxx.com/action/function/oauth2&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect">授权</a>

 

再说后台逻辑,首先调用微信接口的SDK.(后面会有)

?
1
include
(
‘./Card/Common/class_weixin_adv.php‘
);

之后填入微信官方给的的appid与secret

PHP版微信第三方实现一键登录及获取用户信息的方法
?
1
$weixin
=
new
class_weixin_adv(
"appid"
,
"secret"
);

初始化SDK的类,取到code,利用获取到的code在获取出openid 看下面代码注释!

?
1
2
3
$url
=
"https://api.weixin.qq.com/sns/oauth2/access_token?appid=appid&secret=secret&code="
.
$_GET
[
‘code‘
].
"&grant_type=authorization_code"
;
$res
=
$weixin
->https_request(
$url
);
//调用SDK方法获取到res 从中可以得到openid
$res
=(json_decode(
$res
, true));
//转换成array 方便调用openid

继续调用SDK方法,获取到用户信息.此时$row已经获得用户信息了 可以var_dump下看看键值方便存入数据库

?
1
$row
=
$weixin
->get_user_info(
$res
[
‘openid‘
]);

获取用户信息就大功告成了,但这还不够.我们需要的是无需注册!所以需要利用openid,openid属于唯一凭证,每个用户对不同的公众号都有不同的openid.可以理解成用户账号的感觉.我这里用的是把openid存入cookie的解决方案,类似用户登陆的感觉,一些关键数据验证只需要与数据库中的openid进行对比.其他的一些利用方法可以发挥大家的想象!可以跟我留言交流!

关于之前的a链接的授权,大家也可以判断cookie是否存在openid,从而让未授权用户直接跳转到该地址,省却了用户的一步操作.

下面是完整逻辑代码,大家可以参考下!

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public
function
oauth2(){
 
include
(
‘./Card/Common/class_weixin_adv.php‘
);
  
$weixin
=
new
class_weixin_adv(
"appid"
,
"secret"
);
  
if
(isset(
$_GET
[
‘code‘
])){
    
$url
=
"https://api.weixin.qq.com/sns/oauth2/access_token?appid=appid&secret=secret&code="
.
$_GET
[
‘code‘
].
"&grant_type=authorization_code"
;
    
$res
=
$weixin
->https_request(
$url
);
    
$res
=(json_decode(
$res
, true));
    
$row
=
$weixin
->get_user_info(
$res
[
‘openid‘
]);
    
if
(
$row
[
‘openid‘
]) {
      
//这里写上逻辑,存入cookie,数据库等操作
      
cookie(
‘weixin‘
,
$row
[
‘openid‘
],25920);
    
}
else
{
      
$this
->error(
‘授权出错,请重新授权!‘
);
    
}
  
}
else
{
    
echo
"NO CODE"
;
  
}
  
$this
->display();
}

SDK代码:微信官方有手册,我就不多讲了,自己研究,很简单的!

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
/**
 
* 微信SDK
 
* pan041ymail@gmail.com
 
*/
class
class_weixin_adv
{
  
var
$appid
=
""
;
  
var
$appsecret
=
""
;
  
//构造函数,获取Access Token
  
public
function
__construct(
$appid
= NULL,
$appsecret
= NULL)
  
{
    
if
(
$appid
){
      
$this
->appid =
$appid
;
    
}
    
if
(
$appsecret
){
      
$this
->appsecret =
$appsecret
;
    
}
    
$this
->lasttime = 1395049256;
    
$this
->access_token =
"nRZvVpDU7LxcSi7GnG2LrUcmKbAECzRf0NyDBwKlng4nMPf88d34pkzdNcvhqm4clidLGAS18cN1RTSK60p49zIZY4aO13sF-eqsCs0xjlbad-lKVskk8T7gALQ5dIrgXbQQ_TAesSasjJ210vIqTQ"
;
    
if
(time() > (
$this
->lasttime + 7200)){
      
$url
=
"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
.
$this
->appid.
"&secret="
.
$this
->appsecret;
      
$res
=
$this
->https_request(
$url
);
      
$result
= json_decode(
$res
, true);
      
$this
->access_token =
$result
[
"access_token"
];
      
$this
->lasttime = time();
    
}
  
}
//获取用户基本信息
  
public
function
get_user_info(
$openid
)
  
{
    
$url
=
"https://api.weixin.qq.com/cgi-bin/user/info?access_token="
.
$this
->access_token.
"&openid="
.
$openid
.
"&lang=zh_CN"
;
    
$res
=
$this
->https_request(
$url
);
    
return
json_decode(
$res
, true);
  
}
//https请求
  
public
function
https_request(
$url
,
$data
= null)
  
{
    
$curl
= curl_init();
    
curl_setopt(
$curl
, CURLOPT_URL,
$url
);
    
curl_setopt(
$curl
, CURLOPT_SSL_VERIFYPEER, FALSE);
    
curl_setopt(
$curl
, CURLOPT_SSL_VERIFYHOST, FALSE);
    
if
(!
empty
(
$data
)){
      
curl_setopt(
$curl
, CURLOPT_POST, 1);
      
curl_setopt(
$curl
, CURLOPT_POSTFIELDS,
$data
);
    
}
    
curl_setopt(
$curl
, CURLOPT_RETURNTRANSFER, 1);
    
$output
= curl_exec(
$curl
);
    
curl_close(
$curl
);
    
return
$output
;
  
}
}

相关文章