本文實例講述了PHP版微信第三方實現一鍵登錄及獲取用戶信息的方法。分享給大家供大家參考,具體如下:
注意,要使用微信在第三方網頁登錄是需要“服務號”才可以哦,所以必須到官方申請。
一開始你需要進入微信公眾平台開啟開發模式,並且填寫oauth2的回調地址,地址填寫你項目的域名就可以了.比如:www.baidu.com或zhidao.baidu.com.如果你的項目在二級域名就寫二級域名
前端url授權地址,在url中填寫appid與你項目中方法中的oauth的地址,具體在下面的代碼中可以看到.
再說后台邏輯,首先調用微信接口的SDK.(后面會有)
1
|
include
(
'./Card/Common/class_weixin_adv.php'
);
|
之后填入微信官方給的的appid與secret
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
;
}
}
|