1. 程式人生 > >PHP---微信OAuth2.0網頁授權獲取使用者資訊

PHP---微信OAuth2.0網頁授權獲取使用者資訊

本人最近做了微信網頁授權開發,其中走了很多彎路,遇到的問題也很多,我把我的開發步驟和問題寫出來,以供參考.

一、開發前準備

①獲取到網頁授權的介面許可權;

1、獲得此介面的條件為:微信公眾號的型別必須為服務號,該服務號必須通過微信認證;

2、登入到微信公眾平臺後,到開發=》介面許可權=》網頁服務=》網頁帳號=》網頁授權,看是否獲取網頁授權的介面許可權;

②配置微信網頁授權的回撥域名;

首先需要獲取到開發者需要先到公眾平臺官網中的“開發 - 介面許可權 - 網頁服務 - 網頁帳號 - 網頁授權獲取使用者基本資訊”的配置選項中,修改授權回撥域名。【請注意這裡填寫的是域名(是一個字串),而不是URL,因此請勿加 http:// 等協議頭。 】(授權回撥域名配置規範為全域名,比如需要網頁授權的域名為:www.aa.com,配置以後此域名下面的頁面,http://www.aa.com/index.html 、 http://www.aa.com/test.html 都可以進行OAuth2.0鑑權。但http://pay.aa.com 、 http://music.aa.com 、 http://aa.com無法進行OAuth2.0鑑權 

二、準備開發

開發前注意:

1、大概流程:

在微信網頁中,讓使用者訪問你的微信授權的這個域名網站,使用者可以跳轉到微信的授權頁面,點選按鈕確認授權,從而進行微信網頁授權完成

2、關於Unionid機制

如果開發者擁有多個微信公眾號或者在公眾號、移動應用之間統一使用者賬號,需要到微信開放平臺(open.weixin.qq.com)繫結公眾號後,才能利用Unionid機制,可通過獲取使用者基本資訊中的unionid來區分使用者的唯一性,因為同一使用者,對同一個微信開放平臺下的不同應用(移動應用、網站應用和公眾帳號),unionid是相同的。

3、開發步驟(微信網頁授權大致分為4步完成)如下的程式碼是以thinkphp為例子的

①當用戶在微信網頁中進入咱們網站中,需要判斷該使用者是否需要授權登入,如果需要,則引導使用者進入微信授權頁面(即跳轉到第三方授權登入頁)

//微信網頁授權
public function wechatLogin(){
$WX_APPID = '微信公眾號在微信的appid';
$redirectUrl = urlencode("你的回撥頁面的地址");
$url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' . $WX_APPID . '&redirect_uri=' . $redirectUrl . '&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect';
header("Location:" . $url);
}
②在微信的授權頁面,當用戶點選”同意授權“,則微信會重新跳轉到第三方網頁(咱們網站中)的回撥地址,並且帶上code引數;
③在你們網站的回撥頁面,獲取到code引數的值,根據code換取到openid和access_token(此access_token和微信公眾平臺的基礎的access_token不同);
④最後就可以根據openid和access_token獲取到使用者的基本資訊了;
public function redirectUrl() {
$code = $_GET["code"];
$get_token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $WX_APPID . '&secret=' . $WX_SECRET . '&code=' . $code . '&grant_type=authorization_code';
$json = $this->curl_post($get_token_url);
$arr = json_decode($json, true);
$token = $arr['access_token'];
$openid = $arr['openid'];
//拿到token後就可以獲取使用者基本資訊了
$url = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $token . '&openid=' . $openid . '&lang=zh_CN';
$json = $this->curl_post($url); //獲取微信使用者基本資訊
$user_data = json_decode($json, true);
print_r($user_data);
}
/**
* curl post請求
*/
function curl_post($url, $data) {
$query_str = '';
foreach ($data as $key => $value) {
$query_str .= '&' . $key . '=' . $value;
}
$query_str = ltrim($query_str, '&');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); // 配置閘道器地址
curl_setopt($ch, CURLOPT_HEADER, 0); // 過濾HTTP頭
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1); // 設定post提交
curl_setopt($ch, CURLOPT_POSTFIELDS, $query_str); // post傳輸資料
$return_data = curl_exec($ch);
curl_close($ch);
return $return_data;

}