日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

微信开发_网页授权获取用户的基本信息

發(fā)布時間:2024/3/13 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微信开发_网页授权获取用户的基本信息 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
如果用戶在微信客戶端中訪問第三方網(wǎng)頁,公眾號可以通過微信網(wǎng)頁授權(quán)機(jī)制,來獲取用戶基本信息,進(jìn)而實(shí)現(xiàn)業(yè)務(wù)邏輯。

關(guān)于OAuth2.0的說明

官方網(wǎng)站:http://oauth.net/ ??http://oauth.net/2/

權(quán)威定義:OAuth is An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications.?

OAuth是一個開放協(xié)議,允許用戶讓第三方應(yīng)用以安全且標(biāo)準(zhǔn)的方式獲取該用戶在某一網(wǎng)站、移動或桌面應(yīng)用上存儲的私密的資源(如用戶個人信息、照片、視頻、聯(lián)系人列表),而無需將用戶名和密碼提供給第三方應(yīng)用。

OAuth 2.0是OAuth協(xié)議的下一版本,但不向后兼容OAuth 1.0。 OAuth 2.0關(guān)注客戶端開發(fā)者的簡易性,同時為Web應(yīng)用,桌面應(yīng)用和手機(jī),和起居室設(shè)備提供專門的認(rèn)證流程。

OAuth允許用戶提供一個令牌,而不是用戶名和密碼來訪問他們存放在特定服務(wù)提供者的數(shù)據(jù)。每一個令牌授權(quán)一個特定的網(wǎng)站(例如,視頻編輯網(wǎng)站)在特定的時段(例如,接下來的2小時內(nèi))內(nèi)訪問特定的資源(例如僅僅是某一相冊中的視頻)。這樣,OAuth允許用戶授權(quán)第三方網(wǎng)站訪問他們存儲在另外的服務(wù)提供者上的信息,而不需要分享他們的訪問許可或他們數(shù)據(jù)的所有內(nèi)容。

新浪微博API目前也使用OAuth 2.0。

微信公眾平臺OAuth2.0授權(quán)

大體流程如下圖:

?

用戶請求

用戶首先請求第三方網(wǎng)頁

第三方服務(wù)器處理

第三方服務(wù)器獲取用戶請求后會進(jìn)行判斷,是否需要獲取code(正常請求肯定是需要code的,這里我們可以參考一下官方JsApiPay的mode,來看獲取openid的大體流程)

1 <?php 2 require_once "../lib/WxPay.Api.php"; 3 /** 4 * 5 * JSAPI支付實(shí)現(xiàn)類 6 * 該類實(shí)現(xiàn)了從微信公眾平臺獲取code、通過code獲取openid和access_token、 7 * 生成jsapi支付js接口所需的參數(shù)、生成獲取共享收貨地址所需的參數(shù) 8 * 9 * 該類是微信支付提供的樣例程序,商戶可根據(jù)自己的需求修改,或者使用lib中的api自行開發(fā) 10 * 11 * @author widy 12 * 13 */ 14 class JsApiPay 15 { 16 /** 17 * 18 * 網(wǎng)頁授權(quán)接口微信服務(wù)器返回的數(shù)據(jù),返回樣例如下 19 * { 20 * "access_token":"ACCESS_TOKEN", 21 * "expires_in":7200, 22 * "refresh_token":"REFRESH_TOKEN", 23 * "openid":"OPENID", 24 * "scope":"SCOPE", 25 * "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" 26 * } 27 * 其中access_token可用于獲取共享收貨地址 28 * openid是微信支付jsapi支付接口必須的參數(shù) 29 * @var array 30 */ 31 public $data = null; 32 33 /** 34 * 35 * 通過跳轉(zhuǎn)獲取用戶的openid,跳轉(zhuǎn)流程如下: 36 * 1、設(shè)置自己需要調(diào)回的url及其其他參數(shù),跳轉(zhuǎn)到微信服務(wù)器https://open.weixin.qq.com/connect/oauth2/authorize 37 * 2、微信服務(wù)處理完成之后會跳轉(zhuǎn)回用戶redirect_uri地址,此時會帶上一些參數(shù),如:code 38 * 39 * @return 用戶的openid 40 */ 41 public function GetOpenid() 42 { 43 //通過code獲得openid 44 if (!isset($_GET['code'])){ 45 //觸發(fā)微信返回code碼 46 $baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']); 47 $url = $this->__CreateOauthUrlForCode($baseUrl); 48 Header("Location: $url"); 49 exit(); 50 } else { 51 //獲取code碼,以獲取openid 52 $code = $_GET['code']; 53 $openid = $this->getOpenidFromMp($code); 54 return $openid; 55 } 56 } 57 58 /** 59 * 60 * 獲取jsapi支付的參數(shù) 61 * @param array $UnifiedOrderResult 統(tǒng)一支付接口返回的數(shù)據(jù) 62 * @throws WxPayException 63 * 64 * @return json數(shù)據(jù),可直接填入js函數(shù)作為參數(shù) 65 */ 66 public function GetJsApiParameters($UnifiedOrderResult) 67 { 68 if(!array_key_exists("appid", $UnifiedOrderResult) 69 || !array_key_exists("prepay_id", $UnifiedOrderResult) 70 || $UnifiedOrderResult['prepay_id'] == "") 71 { 72 throw new WxPayException("參數(shù)錯誤"); 73 } 74 $jsapi = new WxPayJsApiPay(); 75 $jsapi->SetAppid($UnifiedOrderResult["appid"]); 76 $timeStamp = time(); 77 $jsapi->SetTimeStamp("$timeStamp"); 78 $jsapi->SetNonceStr(WxPayApi::getNonceStr()); 79 $jsapi->SetPackage("prepay_id=" . $UnifiedOrderResult['prepay_id']); 80 $jsapi->SetSignType("MD5"); 81 $jsapi->SetPaySign($jsapi->MakeSign()); 82 $parameters = json_encode($jsapi->GetValues()); 83 return $parameters; 84 } 85 86 /** 87 * 88 * 通過code從工作平臺獲取openid機(jī)器access_token 89 * @param string $code 微信跳轉(zhuǎn)回來帶上的code 90 * 91 * @return openid 92 */ 93 public function GetOpenidFromMp($code) 94 { 95 $url = $this->__CreateOauthUrlForOpenid($code); 96 //初始化curl 97 $ch = curl_init(); 98 //設(shè)置超時 99 curl_setopt($ch, CURLOPT_TIMEOUT, $this->curl_timeout); 100 curl_setopt($ch, CURLOPT_URL, $url); 101 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,FALSE); 102 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,FALSE); 103 curl_setopt($ch, CURLOPT_HEADER, FALSE); 104 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 105 if(WxPayConfig::CURL_PROXY_HOST != "0.0.0.0" 106 && WxPayConfig::CURL_PROXY_PORT != 0){ 107 curl_setopt($ch,CURLOPT_PROXY, WxPayConfig::CURL_PROXY_HOST); 108 curl_setopt($ch,CURLOPT_PROXYPORT, WxPayConfig::CURL_PROXY_PORT); 109 } 110 //運(yùn)行curl,結(jié)果以jason形式返回 111 $res = curl_exec($ch); 112 curl_close($ch); 113 //取出openid 114 $data = json_decode($res,true); 115 $this->data = $data; 116 $openid = $data['openid']; 117 return $openid; 118 } 119 120 /** 121 * 122 * 拼接簽名字符串 123 * @param array $urlObj 124 * 125 * @return 返回已經(jīng)拼接好的字符串 126 */ 127 private function ToUrlParams($urlObj) 128 { 129 $buff = ""; 130 foreach ($urlObj as $k => $v) 131 { 132 if($k != "sign"){ 133 $buff .= $k . "=" . $v . "&"; 134 } 135 } 136 137 $buff = trim($buff, "&"); 138 return $buff; 139 } 140 141 /** 142 * 143 * 獲取地址js參數(shù) 144 * 145 * @return 獲取共享收貨地址js函數(shù)需要的參數(shù),json格式可以直接做參數(shù)使用 146 */ 147 public function GetEditAddressParameters() 148 { 149 $getData = $this->data; 150 $data = array(); 151 $data["appid"] = WxPayConfig::APPID; 152 $data["url"] = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; 153 $time = time(); 154 $data["timestamp"] = "$time"; 155 $data["noncestr"] = "1234568"; 156 $data["accesstoken"] = $getData["access_token"]; 157 ksort($data); 158 $params = $this->ToUrlParams($data); 159 $addrSign = sha1($params); 160 161 $afterData = array( 162 "addrSign" => $addrSign, 163 "signType" => "sha1", 164 "scope" => "jsapi_address", 165 "appId" => WxPayConfig::APPID, 166 "timeStamp" => $data["timestamp"], 167 "nonceStr" => $data["noncestr"] 168 ); 169 $parameters = json_encode($afterData); 170 return $parameters; 171 } 172 173 /** 174 * 175 * 構(gòu)造獲取code的url連接 176 * @param string $redirectUrl 微信服務(wù)器回跳的url,需要url編碼 177 * 178 * @return 返回構(gòu)造好的url 179 */ 180 private function __CreateOauthUrlForCode($redirectUrl) 181 { 182 $urlObj["appid"] = WxPayConfig::APPID; 183 $urlObj["redirect_uri"] = "$redirectUrl"; 184 $urlObj["response_type"] = "code"; 185 $urlObj["scope"] = "snsapi_base"; 186 $urlObj["state"] = "STATE"."#wechat_redirect"; 187 $bizString = $this->ToUrlParams($urlObj); 188 return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString; 189 } 190 191 /** 192 * 193 * 構(gòu)造獲取open和access_toke的url地址 194 * @param string $code,微信跳轉(zhuǎn)帶回的code 195 * 196 * @return 請求的url 197 */ 198 private function __CreateOauthUrlForOpenid($code) 199 { 200 $urlObj["appid"] = WxPayConfig::APPID; 201 $urlObj["secret"] = WxPayConfig::APPSECRET; 202 $urlObj["code"] = $code; 203 $urlObj["grant_type"] = "authorization_code"; 204 $bizString = $this->ToUrlParams($urlObj); 205 return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString; 206 } 207 } 展開代碼

授權(quán)

如果需要獲取code,第三方服務(wù)器會跳轉(zhuǎn)到授權(quán)頁面

在確保微信公眾賬號擁有授權(quán)作用域(scope參數(shù))的權(quán)限的前提下(服務(wù)號獲得高級接口后,默認(rèn)擁有scope參數(shù)中的snsapi_base和snsapi_userinfo),引導(dǎo)關(guān)注者打開如下頁面

請求方法如下:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 若提示“該鏈接無法訪問”,請檢查參數(shù)是否填寫錯誤,是否擁有scope參數(shù)對應(yīng)的授權(quán)作用域權(quán)限。

參數(shù)說明:

參數(shù)必須說明
appid公眾號的唯一標(biāo)識
redirect_uri授權(quán)后重定向的回調(diào)鏈接地址
response_type返回類型,請?zhí)顚慶ode
scope應(yīng)用授權(quán)作用域,snsapi_base (不彈出授權(quán)頁面,直接跳轉(zhuǎn),只能獲取用戶openid),snsapi_userinfo (彈出授權(quán)頁面,可通過openid拿到昵稱、性別、所在地。并且,即使在未關(guān)注的情況下,只要用戶授權(quán),也能獲取其信息
state重定向后會帶上state參數(shù),開發(fā)者可以填寫任意參數(shù)值
#wechat_redirect直接在微信打開鏈接,可以不填此參數(shù)。做頁面302重定向時候,必須帶此參數(shù)

下圖為scope等于snsapi_userinfo時的授權(quán)頁面:

用戶同意授權(quán)

用戶同意授權(quán)將信息發(fā)送到微信公眾平臺,微信公眾平臺會內(nèi)部進(jìn)行授權(quán)驗(yàn)證

用戶同意授權(quán),頁面將跳轉(zhuǎn)至 redirect_uri/?code=CODE&state=STATE。

code說明 : code作為換取access_token的票據(jù),每次用戶授權(quán)帶上的code將不一樣,code只能使用一次,5分鐘未被使用自動過期。

獲取網(wǎng)頁授權(quán)

驗(yàn)證通過返回給第三方服務(wù)器code

通過code換取網(wǎng)頁授權(quán)access_token

首先請注意,這里通過code換取的是一個特殊的網(wǎng)頁授權(quán)access_token,與基礎(chǔ)支持中的access_token(該access_token用于調(diào)用其他接口)不同。公眾號可通過下述接口來獲取網(wǎng)頁授權(quán)access_token。如果網(wǎng)頁授權(quán)的作用域?yàn)閟nsapi_base,則本步驟中獲取到網(wǎng)頁授權(quán)access_token的同時,也獲取到了openid,snsapi_base式的網(wǎng)頁授權(quán)流程即到此為止。

請求方法如下:

access_token: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

參數(shù)說明:

參數(shù)是否必須說明
appid公眾號的唯一標(biāo)識
secret公眾號的appsecret
code填寫第一步獲取的code參數(shù)
grant_type填寫為authorization_code

返回說明:

正確時返回的JSON數(shù)據(jù)包如下:

{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE" }

參數(shù)說明:

?參數(shù)描述
access_token網(wǎng)頁授權(quán)接口調(diào)用憑證,注意:此access_token與基礎(chǔ)支持的access_token不同
expires_inaccess_token接口調(diào)用憑證超時時間,單位(秒)
refresh_token用戶刷新access_token
openid用戶唯一標(biāo)識,請注意,在未關(guān)注公眾號時,用戶訪問公眾號的網(wǎng)頁,也會產(chǎn)生一個用戶和公眾號唯一的OpenID
scope用戶授權(quán)的作用域,使用逗號(,)分隔

?錯誤時微信會返回JSON數(shù)據(jù)包如下(示例為Code無效錯誤):

{"errcode":40029,"errmsg":"invalid code"}

判斷access_token過期

如果access_token過期了需要重新刷取access_token(初次使用可以先忽略)

請求方法如下:

https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

參數(shù)說明:

?參數(shù)是否必須說明
appid公眾號的唯一標(biāo)識
grant_type填寫為refresh_token
refresh_token填寫通過access_token獲取到的refresh_token參數(shù)

拉取用戶信息

官方文檔有說明,需要scope為snsapi_userinfo

請求方法如下:

http:GET(請使用https協(xié)議) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

參數(shù)說明:

參數(shù)描述
access_token網(wǎng)頁授權(quán)接口調(diào)用憑證,注意:此access_token與基礎(chǔ)支持的access_token不同
openid用戶的唯一標(biāo)識

返回說明

正確時返回的JSON數(shù)據(jù)包如下:

{ "openid":" OPENID", " nickname": NICKNAME, "sex":"1", "province":"PROVINCE" "city":"CITY", "country":"COUNTRY", "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46", "privilege":[ "PRIVILEGE1" "PRIVILEGE2" ], "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" }

參數(shù)說明:

?參數(shù)描述
openid用戶的唯一標(biāo)識
nickname用戶昵稱
sex用戶的性別,值為1時是男性,值為2時是女性,值為0時是未知
province用戶個人資料填寫的省份
city普通用戶個人資料填寫的城市
country國家,如中國為CN
headimgurl用戶頭像,最后一個數(shù)值代表正方形頭像大小(有0、46、64、96、132數(shù)值可選,0代表640*640正方形頭像),用戶沒有頭像時該項(xiàng)為空
privilege用戶特權(quán)信息,json 數(shù)組,如微信沃卡用戶為(chinaunicom)

?錯誤時微信會返回JSON數(shù)據(jù)包如下(示例為openid無效):

{"errcode":40003,"errmsg":" invalid openid "}

其他一些細(xì)節(jié)性的問題請參考官方文檔:https://mp.weixin.qq.com/wiki

轉(zhuǎn)載于:https://www.cnblogs.com/bndong/p/6222266.html

總結(jié)

以上是生活随笔為你收集整理的微信开发_网页授权获取用户的基本信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。