1. 程式人生 > >呼叫微信OAuth2.0網頁授權介面實現使用者資訊的繫結

呼叫微信OAuth2.0網頁授權介面實現使用者資訊的繫結

在微信網頁開發中,可以通過OAuth2.0網頁授權機制,來獲取使用者基本資訊,進而實現自己的業務邏輯。
微信官方文件
關於網頁授權回撥域名的說明
1、在微信公眾號請求使用者網頁授權之前,開發者需要先到公眾平臺官網中的“開發 - 介面許可權 - 網頁服務 - 網頁帳號 - 網頁授權獲取使用者基本資訊”的配置選項中,修改授權回撥域名。請注意,這裡填寫的是域名(是一個字串),而不是URL,因此請勿加 http:// 等協議頭;
2、授權回撥域名配置規範為全域名,比如需要網頁授權的域名為:www.qq.com,配置以後此域名下面的頁面http://www.qq.com/music.htmlhttp://www.qq.com/login.html

都可以進行OAuth2.0鑑權。但http://pay.qq.comhttp://music.qq.comhttp://qq.com無法進行OAuth2.0鑑權

關於網頁授權的兩種scope的區別說明
1、以snsapi_base為scope發起的網頁授權,是用來獲取進入頁面的使用者的openid的,並且是靜默授權並自動跳轉到回撥頁的。使用者感知的就是直接進入了回撥頁(往往是業務頁面)
2、以snsapi_userinfo為scope發起的網頁授權,是用來獲取使用者的基本資訊的。但這種授權會產生一個授權頁面,需要使用者手動同意,在使用者同意後,就可以通過獲取使用者基本資訊的介面獲取該使用者的基本資訊。 如使用者的openid,暱稱,性別,頭像,所在地等。

步驟
具體而言,網頁授權流程分為四步:
1、引導使用者進入授權頁面或開啟授權連結同意授權,獲取code
2、通過code換取網頁授權access_token(與基礎支援中的access_token不同)
3、如果需要,開發者可以重新整理網頁授權access_token,避免過期
4、通過網頁授權access_token和openid獲取使用者基本資訊

尤其需要注意的是redirect_uri這個引數,它代表了授權完成後的回撥頁面,也就是我們的業務頁面,必須以https://開頭(官方文件的要求),並且該連結需要經過urlEncode編碼

使用者同意授權後

如果使用者同意授權,頁面將跳轉至 redirect_uri/?code=CODE&state=STATE。會跳轉至我們指定的頁面,並帶上code和state兩個引數。根據code值,我們可以獲得access_token和openid,再通過access_token和openid,呼叫獲取使用者基本資訊的介面,就可以獲得使用者暱稱,性別,頭像等資料。

第二步:通過code換取網頁授權access_token
首先請注意,這裡通過code換取的是一個特殊的網頁授權access_token,與基礎支援中的access_token(該access_token用於呼叫其他介面)不同。公眾號可通過下述介面來獲取網頁授權access_token。如果網頁授權的作用域為snsapi_base,則本步驟中獲取到網頁授權access_token的同時,也獲取到了openid,snsapi_base式的網頁授權流程即到此為止。

第三步:拉取使用者資訊(需scope為 snsapi_userinfo)
請求方法
http:GET(請使用https協議)
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
正確時返回的JSON資料包如下:
{ “openid”:” OPENID”,
” nickname”: NICKNAME,
“sex”:”1”,
“province”:”PROVINCE”
“city”:”CITY”,
“country”:”COUNTRY”,
“headimgurl”: “http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ
4eMsv84eavHiaiceqxibJxCfHe/46”,
“privilege”:[ “PRIVILEGE1” “PRIVILEGE2” ],
“unionid”: “o6_bmasdasdsad6_2sgVt7hMZOPfL”
}
至此我們獲取到了使用者微訊號的完整資訊,並可以與業務中的user進行繫結,以進行後續的使用者定製和開發。

網頁授權獲取使用者資訊完整PHP程式碼示例

1.首先寫一個lib.php封裝php的get和post請求等操作

<?php
/**
 * 封裝向微信伺服器傳送http請求的post和get方法
 *
 */


/**
 * 初始化,根據APPID和APPSECRET獲取ACCESS_TOKEN
 *
 */
function init(){

    //設定預設時區
    date_default_timezone_set( "Asia/shanghai");

    //APPID
    define("APPID" , "省略");

    //APPSECRET
    define("APPSECRET" , "省略");

    $token_access_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".APPID."&secret=".APPSECRET;

    //獲取access_token請求的url地址
    $res = file_get_contents( $token_access_url );

    //將獲取的返回json值轉換為陣列格式
    $arr_result = json_decode($res,true);

    //定義為全域性方便使用
    define("ACCESS_TOKEN" , $arr_result['access_token']);

}


/**
 * post方式提交資料
 *
 * @param $url   提交的url地址
 * @param $data  post需要的資料
 * @return object 返回提交後返回的json物件資料
 */
function postMessage( $url , $data){
    $ch = curl_init();
    curl_setopt($ch , CURLOPT_URL , $url );
    curl_setopt($ch , CURLOPT_CUSTOMREQUEST , "POST");
    curl_setopt($ch , CURLOPT_SSL_VERIFYPEER , FALSE);
    curl_setopt($ch , CURLOPT_SSL_VERIFYHOST , FALSE);
    curl_setopt($ch , CURLOPT_USERAGENT , 'Mozilla/5.0 (compatible; MSIE
                                                 5.01 ; Windows NT 5.0)');
    curl_setopt($ch , CURLOPT_FOLLOWLOCATION , 1 );
    curl_setopt($ch , CURLOPT_AUTOREFERER , 1 );
    curl_setopt($ch , CURLOPT_POSTFIELDS , $data );
    curl_setopt($ch , CURLOPT_RETURNTRANSFER , true );

    $info = curl_exec($ch);                               //將執行返回的資料儲存到臨時變數
    if( curl_errno($ch) ){                                //判斷資料在執行過程中是否有錯誤
        echo 'Errno'.curl_error($ch);

    }

    curl_close($ch);
    return $info ;
}


/**
 * get方式獲取資料 , 通過curl
 *
 * @param $url   提交的url地址
 * @return object 返回獲取json物件資料
 */
function getCach($url){

    $ch = curl_init();
    curl_setopt($ch , CURLOPT_URL , $url );
    curl_setopt($ch , CURLOPT_HEADER, false);
    curl_setopt($ch , CURLOPT_RETURNTRANSFER , true );
    curl_setopt($ch , CURLOPT_SSL_VERIFYPEER , false);
    curl_setopt($ch , CURLOPT_USERAGENT , 'Mozilla/5.0 (Windows NT 6.1)
                                           AppleWebKit/537.11 ( KHTML , like Geko ) Chrome/23.0.1271.1 Safari/537.11');
    $res = curl_exec($ch);
    $rescode = curl_getinfo($ch , CURLINFO_HTTP_CODE);
    curl_close($ch);
    return $res;

}

/**
 * get方式獲取資料
 *
 * @param $url   提交的url地址
 * @return object 返回讀取的資料
 */
function getFileGetContent($url){
    $result = file_get_contents($url);
    return $result ;
}

/**
 * 格式輸出除錯資訊
 *
 */
function p($arr){
    var_dump($arr);
}

然後在業務邏輯頁面中獲取使用者的基本資訊

<?php
require_once "lib.php";

//APPID
define("APPID" , "省略");

//APPSECRET
define("APPSECRET" , "省略");

if( isset( $_GET['code'])){

    //獲取授權頁回撥過來的code值
    define("CODE",$_GET['code']);

    //請求access_token的url
    $get_access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".APPID."&secret=".APPSECRET."&code=".CODE."&grant_type=authorization_code";
    $json_result = getCach($get_access_token_url);
    $arr_result = json_decode($json_result,true);
    define("ACCESS_TOKEN",$arr_result['access_token']);
    define("OPEN_ID",$arr_result['openid']);

    //獲取使用者基本資訊的介面url
    $get_user_info_url = "https://api.weixin.qq.com/sns/userinfo?access_token=".ACCESS_TOKEN."&openid=".OPEN_ID;
    $userinfo_json = getCach($get_user_info_url);
    $userinfo_arr = json_decode($userinfo_json,true);

    //獲得使用者的openid
    $openid = $userinfo_arr['openid'];
    //獲得使用者的暱稱
    $nickname = $userinfo_arr['nickname'];
    //獲得使用者的性別
    $sex = $userinfo_arr['sex'];
    //獲得使用者的頭像url
    $imgicon = $userinfo_arr['headimgurl'];

}
?>