原生PHP實現微信受權並獲取用戶信息

微信公衆號受權獲取用戶信息一共分爲三部: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

wechat_redirect:不管直接打開仍是作頁面302重定向時候,必須帶此參數

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;
}
相關文章
相關標籤/搜索