微信公衆號受權獲取用戶信息一共分爲三部:php
1:用戶贊成受權,獲取codejson
跳轉到微信受權頁面並獲取到受權返回的code值api
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
get參數說明:微信
appid:微信公衆號的惟一標識appidsession
redirect_uri:受權回調地址app
response_type:返回類型,填codecurl
scope:受權方式:snsapi_base:靜默受權(不彈出受權頁面,直接跳轉,只能獲取用戶openid), snsapi_userinfo:獲取用戶的詳細信息this
state:回調時帶的參數url
2:經過code換取網頁受權access_token3d
調取獲取access_token接口
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
get參數說明:
appid:微信公衆號的惟一標識appid
secret:微信公衆號的appsecret
code:微信受權返回的code值
grant_type:固定填寫:authorization_code
調取上面的接口返回數據以下:
{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE" }
若是使用的是靜默受權的話到此就能夠了
3:獲取用戶信息
調取獲取用戶信息接口
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
get參數說明:
access_token:上面接口獲取的access_token
openid:上面接口獲取的openid,即用戶的惟一標識
lang:返回國家地區語言版本,zh_CN 簡體,zh_TW 繁體,en 英語
調取上面的接口返回數據以下:
{ "openid":" OPENID", " nickname": NICKNAME, "sex":"1", "province":"PROVINCE" "city":"CITY", "country":"COUNTRY", "headimgurl": "http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46", "privilege":[ "PRIVILEGE1" "PRIVILEGE2" ], "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" }
根據上面的步驟原生php時間代碼以下:
public function actionGetMember() { //開啓session session_start(); if (!isset($_SESSION['member'])) { //appid $appId = 'wx73d0c47a64aa5315'; //secret $appSecret = 'aba2793c10623350f6aeee5a728099d3'; if (!isset($_GET['code'])) { //受權 $this->authorize($appId); } else { $code = $_GET['code']; //獲取access_token和openID $res = $this->getAccessToken($appId, $appSecret, $code); $accessToken = $res['access_token']; $openId = $res['openid']; //獲取用戶信息 $this->getMember($accessToken, $openId); } } $member = isset($_SESSION['member']) ? $_SESSION['member'] : []; var_dump($member); } /* * 獲取用戶信息 */ public function getMember($accessToken, $openId) { $params = []; $params['access_token'] = $accessToken; $params['openid'] = $openId; $params['lang'] = 'zh_CN'; $urlParams = $this->urlParams($params); $memberUrl = 'https://api.weixin.qq.com/sns/userinfo?' . $urlParams; $member = $this->http_curl($memberUrl); $member = json_decode($member, true); $_SESSION['member'] = $member; } /* * 受權 */ public function authorize($appId) { //獲取當前url $redirectUrl = $this->getUrl(); $params = []; $params['appid'] = $appId; $params['redirect_uri'] = $redirectUrl; $params['response_type'] = 'code'; $params['scope'] = 'snsapi_userinfo'; $params['state'] = 'STATE'; $urlParams = $this->urlParams($params); $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?'. $urlParams .'#wechat_redirect'; header('location:' . $url); } /* * 字符串拼接 */ public function urlParams($params) { $options = ''; foreach ($params as $key => $value) { $options .= $key . '=' . $value .'&'; } $options = rtrim($options, '&'); return $options; } /* * 獲取當前url */ public function getUrl() { //獲取協議類型 $protocalPort = isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://'; //獲取當前執行腳本的url $phpSelf = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME']; $pathInfo = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : ''; $queryString = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : ''; $relateUrl = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $phpSelf . (!empty($queryString) ? '?' . $queryString : $pathInfo); $url = $protocalPort . (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '') . $relateUrl; return $url; } /* * 獲取access_token */ public function getAccessToken($appId, $appSecret, $code) { $params = []; $params['appid'] = $appId; $params['secret'] = $appSecret; $params['code'] = $code; $params['grant_type'] = 'authorization_code'; $urlParams = $this->urlParams($params); $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?' . $urlParams; $result = $this->http_curl($url); $result = json_decode($result, true); return $result; } /* * curl接口調用 */ public function http_curl($url, $data=null) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); $result = curl_exec($curl); curl_close($curl); return $result; }