github
手把手實現(xiàn)微信網(wǎng)頁授權和微信支付,附源代碼(VUE and thinkPHP)
概述
公眾號開發(fā)是痛苦的,痛苦在好多問題開發(fā)者文檔是沒有提到的,是需要你猜的. 在開發(fā)過程中翻了好多的文檔,都是說明其中的一部分問題的,很費時間,所以在此總結(jié)大體過程。我們模擬的是一個支付的商城,在實現(xiàn)購買過程中基本是把微信公眾號最主要模塊實現(xiàn)了,其余的功能我們沒有涉及,但應該是觸類旁通的。
我們敘述的過程是按開發(fā)流程進行敘述的,不會是按照開發(fā)文檔的形式敘述,希望您能結(jié)合微信的開發(fā)文檔一起閱讀,當然在流程中我們會提醒你閱讀的部分
目錄
-
概述
- [解決的問題]
- [前端技術棧]
- [后端技術棧]
- [基本說明]
- [開發(fā)過程]
- [0.準備]
- [1.基本配置]
- [2.網(wǎng)頁授權]
-
JS-SDK
- [簽名]
- [簽名后臺]
- [簽名前臺]
- [微信支付]
解決的問題
- [x] 微信網(wǎng)頁授權
- [x] 公眾號支付
- [x] 公眾號分享
- [x] 公眾號掃一掃
- [x] 微信后臺獲取webapp(spa-vue)路由,導致 invalid 問題
- [x] 前端history.pushState()導致ios失效問題
- [x] 換取微信openID 順序問題
- [x] 網(wǎng)頁授權后強制登錄官網(wǎng)賬戶,全局進行攔截
前端技術棧
vue2 + vuex + vue-router + webpack + ES6/7 + axios + sass + flex
后端技術棧
thinkPHP3.2 + mysql + 阿里云Linux Ubuntu
基本說明
開發(fā)環(huán)境 macOS 10.13.3 nodejs 8.0.0 centOS 7.4
本文中使用的url是m.example.com (demo), 開發(fā)過程中需要替換成你的URL。
如有問題請直接在 Issues 中提,或者您發(fā)現(xiàn)問題并有非常好的解決方案,歡迎 PR
本著
線上線下一樣的原則,最好申請兩個認證微信公眾號,一個是發(fā)布使用,一個是本地開發(fā)使用。微信自帶提供的微信測試功能也不太好用
可以添加群交流 544958637
開發(fā)過程
0.準備
請閱讀以下微信開發(fā)者文檔
附:參數(shù)說明
appid:公眾號唯一標識id(公眾號-開發(fā)-基本配置中查看)。
secret:公眾號開發(fā)密鑰(初次請保存本地,忘記請重置)。
openid: 每個微信用戶關注此公眾號后會生成openid,并且在此公眾號中每個用戶得openid是唯一的。
code : code作為換取access_token的票據(jù),每次用戶授權帶上的code將不一樣,code只能使用一次,5分鐘未被使用自動過期。
IP 白名單:允許訪問微信服務器的ip(linux 公網(wǎng)ip 注意如果服務器有CDN加速,CDN請?zhí)砑影酌麊危?/p>
1.基本配置
-
基礎工具
- 一個已經(jīng)認證的公眾號(就是你已經(jīng)交300元)
- 已經(jīng)備案的域名
- 域名解析到服務器 傳送門node項目發(fā)布+域名及其二級域名配置+nginx反向代理+pm2
- 微信開發(fā)者工具下載 : 微信開發(fā)可定使用這個工具。必須把前端代碼放到》服務器上》用這個工具調(diào)試。請仔細閱讀微信web開發(fā)者工具 使用指南
-
設置
web開發(fā)者工具在
開發(fā)-開發(fā)者工具-web開發(fā)者工具設置開發(fā)者賬號 -
設置IP 白名單
在
設置-安全中心-IP白名單設置你服務器的IP,通過開發(fā)者ID及密碼調(diào)用獲取access_token接口時,需要設置訪問來源IP為白名單。 -
設置基本配置-開發(fā)者ID
設置開發(fā)者密碼(AppSecret)
image我們獲取到的AppSecret (eg) a66b789009df271cde47aaaaaaa
-
設置服務器基本配置
這部的目的是為了和微信服務器建立聯(lián)系, 通過微信平臺實現(xiàn)我們的業(yè)務邏輯。

詳細版:

接入微信公眾平臺開發(fā),開發(fā)者需要按照如下步驟完成:
1、填寫服務器配置
2、驗證服務器地址的有效性
3、依據(jù)接口文檔實現(xiàn)業(yè)務邏輯
下面詳細介紹這3個步驟。
**第一步:填寫服務器配置**
* 登錄微信公眾平臺官網(wǎng)后,在公眾平臺官網(wǎng)的開發(fā)-基本設置頁面,勾選協(xié)議成為開發(fā)者,點擊“修改配置”按鈕、。
* 填寫服務器地址(URL)、Token和EncodingAESKey
* URL是開發(fā)者用來接收微信消息和事件的接口URL。
* Token可由開發(fā)者可以任意填寫,用作生成簽名(該Token會和接口URL中包含的Token進行比對,從而驗證安全性)
* EncodingAESKey由開發(fā)者手動填寫或隨機生成,將用作消息體加解密密鑰。
* 同時,開發(fā)者可選擇消息加解密方式:明文模式、兼容模式和安全模式。模式的選擇與服務器配置在提交后都會立即生效
* 加解密方式的默認狀態(tài)為明文模式,選擇兼容模式和安全模式需要提前配置好相關加解密代碼

第二步:驗證消息的確來自微信服務器
?
現(xiàn)在如果你點擊確認 按鈕,肯定會報認證錯誤。因為我們沒有做微信認證請求 接收。 開發(fā)者提交信息后,微信服務器將發(fā)送GET請求到填寫的服務器地址URL上,GET請求攜帶參數(shù)如下表所示:
?
| 參數(shù) | 描述 |
|---|---|
| signature | 微信加密簽名,signature結(jié)合了開發(fā)者填寫的token參數(shù)和請求中的timestamp參數(shù)、nonce參數(shù)。 |
| timestamp | 時間戳 |
| nonce | 隨機數(shù) |
| echostr | 隨機字符串 |
開發(fā)者通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信服務器,請原樣返回echostr參數(shù)內(nèi)容,則接入生效,成為開發(fā)者成功,否則接入失敗。加密/校驗流程如下:
- 將token、timestamp、nonce三個參數(shù)進行字典序排序
- 將三個參數(shù)字符串拼接成一個字符串進行sha1加密
- 開發(fā)者獲得加密后的字符串可與signature對比,標識該請求來源于微信
微信官方提供在文檔中提供了PHP原生示例 PHP原生驗證demo
Thinkphp 3.2 驗證示例
<?php
namespace Home\Controller;//命名空間注意用自己的
use Think\Controller; //引入Think Controller
/**
* Class IndexController
* @package Home\Controller
* @name 微信服務器驗證類
* @author weikai
*/
class IndexController extends Controller {
//微信服務器接入
public function index()
{
//這個echostr呢 只有說驗證的時候才會echo 如果是驗證過之后這個echostr是不存在的字段了
if($_GET['echostr']){
$echoStr = $_GET["echostr"];
if ($this->checkSignature()) {
ob_clean();//防止之前緩存區(qū)數(shù)據(jù)影響
echo $echoStr;
exit;
}
}else{
$this->responseMsg(); //如果沒有echostr,則返回消息
}
}
//驗證微信開發(fā)者模式接入是否成功
private function checkSignature()
{
//signature 是微信傳過來的簽名
$signature = $_GET["signature"];
//微信發(fā)過來的時間戳
$timestamp = $_GET["timestamp"];
//微信傳過來的值隨機字符串
$nonce = $_GET["nonce"];
//定義你在微信公眾號開發(fā)者模式里面定義的token 這里舉例為weixin
$token = "weixin";
//三個變量 按照字典排序 形成一個數(shù)組
$tmpArr = array(
$token,
$timestamp,
$nonce
);
// 字典排序
sort($tmpArr, SORT_STRING);
$tmpStr = implode($tmpArr);
//哈希加密 在laravel里面是Hash::
$tmpStr = sha1($tmpStr);
//哈希加密后的數(shù)據(jù) 和微信服務器傳過來的簽名比較
if ($tmpStr == $signature) {
return true;
} else {
return false;
}
}
/**
* @name 消息接收
* @author weikai
*/
public function responseMsg()//執(zhí)行接收器方法
{
//獲取微信服務器的XML數(shù)據(jù) 轉(zhuǎn)化為對象 判斷消息類型
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$RX_TYPE = trim($postObj->MsgType);
switch($RX_TYPE){
case "event":
$result = $this->receiveEvent($postObj);
break;
case "text":
$result = $this->handleText($postObj);
break;
}
echo $result;
}else{
echo "";
exit;
}
}
} //classend
**注意:示例代碼中 Token 要與微信公眾號基本配置中的Token 一致 **
微信公眾號基本配置中點擊啟用配置,如果驗證失敗可能是網(wǎng)絡延遲導致,再點擊啟用多試幾次,3次以上不成功,請檢查代碼。
2.網(wǎng)頁授權
如果使用支付功能,必須先授權
大家應該經(jīng)歷過,我們在公眾號打開頁面,一般都會彈出一個按鈕需要我們點擊同意才會繼續(xù)瀏覽頁面

但是我們第二次點擊的時候是不需要點擊授權的,這兩個過程是不同的,是兩種授權:(樣例不可直接使用,是demo)
- 非靜默授權的 URL 樣例:(scope=snsapi_userinfo)
請注意加粗部分
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx841a97238d9e17b2&redirect_uri=http://cps.dianping.com/weiXinRedirect&response_type=code&scope=snsapi_userinfo&state=type%3Dquan%2Curl%3Dhttp%3A%2F%2Fmm.dianping.com%2Fweixin%2Faccount%2Fhome
點擊`允許`即可帶著用戶信息跳轉(zhuǎn)到第三方頁面,如上圖.
作用: 是用來獲取用戶的基本信息的
- 靜默授權的 URL 樣例: (scope=snsapi_base)
請注意加粗部分
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx841a97238d9e17b2&redirect_uri=http://cps.dianping.com/weiXinRedirect&response_type=code&scope=snsapi_base&state=type%3Dquan%2Curl%3Dhttp%3A%2F%2Fmm.dianping.com%2Fweixin%2Faccount%2Fhome
在微信 web 開發(fā)者工具中打開類似的授權頁 URL 則會`自動跳轉(zhuǎn)`到第三方頁面。
作用:是用來獲取進入頁面的用戶的openid的
注意:倆者授權區(qū)別
非靜默授權:可獲取微信用戶基礎信息如 用戶微信昵稱 、城市、語言、頭像、關注公眾號時間、openid等。
靜默授權:用戶體驗好,用戶不知覺間完成授權,但只可以獲取到用戶得openid。
網(wǎng)頁授權
請通讀微信網(wǎng)頁授權
請注意 關于網(wǎng)頁授權access_token和普通access_token的區(qū)別 章節(jié)
具體而言,網(wǎng)頁授權流程分為四步:
注意: 步驟一是由前臺完成的,前臺獲取code 之后需要傳給后臺,由后臺完成 2 3 4
1. 引導用戶進入授權頁面同意授權后微信跳轉(zhuǎn)回調(diào)地址并傳遞參數(shù)code 獲取code
2. 通過code換取網(wǎng)頁授權access_token(與基礎支持中的access_token不同)
3. 如果需要,開發(fā)者可以刷新網(wǎng)頁授權access_token,避免過期
4. 通過網(wǎng)頁授權access_token和openid獲取用戶基本信息(支持UnionID機制)

1、引導用戶進入授權頁面同意授權,獲取code
建議:如果路由由vue管理,建議code由前臺獲取并發(fā)送給后臺。 在公眾賬號中配置授權回調(diào)域名

(${redirect_url}看下面)
微信授權是前端發(fā)起的,
時機: 是在你需要獲取微信信息之前的頁面發(fā)起請求,當然大部分情況是用戶進入webapp 我們就開始授權,我們的dome中就是進入立馬授權
前臺(Vue): 前臺做引導到授權頁面,使用location.href 就可以實現(xiàn)。授權過程中會有幾次這頁面跳轉(zhuǎn)。我們把授權函數(shù)放在
router.beforeEach((to, from, next)=> {})函數(shù)中,好控制。跳轉(zhuǎn): 我們剛才提到前臺需要引導,這個引導路徑是需要后臺提供,基本的形式是
location.href = http://m.example.com/Home/WxSignature/getBaseInfos?redirect_url=${redirect_url}。要注意redirect_url=${redirect_url},${redirect_url}是告訴后臺回調(diào)到前臺的URL(請encodeURIComponent).
-
后臺(PHP): 前臺調(diào)到了后臺,后臺此時需要獲取code了。后臺要通過 特定的URL(見官網(wǎng)
第一步:用戶同意授權,獲取code)獲取code.api參數(shù)解釋:
appid : 請查看本文 參數(shù)說明
redirect_uri : 回調(diào)鏈接,完成用戶授權后微信服務器自動回調(diào)得uri,一般為業(yè)務首頁鏈接(注意請轉(zhuǎn)義)。
response_type : 固定為code 。
scope : 授權方式 可選靜默(snsapi_base) 或者非靜默(snsapi_userinfo)
state : 此參數(shù)可為業(yè)務需求使用,根據(jù)業(yè)務需要傳入。
靜默授權方式獲取code:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=你的appid&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect非靜默授權方式獲取code:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
/**
* @name 授權引導后微信會跳轉(zhuǎn)到回調(diào)地址并攜帶code參數(shù)
* @author weikai
*/
public function getBaseInfos(){
$redirect_url = I('get.redirect_url');//獲取前臺傳遞的回調(diào)地址
$app_id = C('WX_APPID');//獲取自己公眾號的 appid
$redirect_uri = urlencode($redirect_url);//處理url
$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$app_id."&redirect_uri=".$redirect_uri."&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";
header('location:'.$url);
}
錯誤返回碼說明如下:
| 返回碼 | 說明 |
|---|---|
| 10003 | redirect_uri域名與后臺配置不一致 |
| 10004 | 此公眾號被封禁 |
| 10005 | 此公眾號并沒有這些scope的權限 |
| 10006 | 必須關注此測試號 |
| 10009 | 操作太頻繁了,請稍后重試 |
| 10010 | scope不能為空 |
| 10011 | redirect_uri不能為空 |
| 10012 | appid不能為空 |
| 10013 | state不能為空 |
| 10015 | 公眾號未授權第三方平臺,請檢查授權狀態(tài) |
| 10016 | 不支持微信開放平臺的Appid,請使用公眾號Appid |
-
前臺獲取code
引導用戶到授權頁面后 微信服務器會根據(jù)redirect_uri參數(shù)跳轉(zhuǎn),并且攜帶code參數(shù)和值

前臺截取出code 就可以了,傳給后臺,到這里基本就可以了。但是我們通常是用戶每次登陸都需要進行授權,我們判斷url中的參數(shù)就可以實現(xiàn)了。往往我們也要監(jiān)聽用戶是否登錄,判斷用戶是否需要賬號密碼登錄也需要在 router.beforeEach((to, from, next)=> {}) 實現(xiàn),beforeEach()有些復雜了,請大家閱讀具體代碼。請結(jié)合自己具體的業(yè)務書寫
/**
* 判斷用戶是否需要賬號密碼登錄,login頁面監(jiān)聽
* @Author Hybrid
* @DateTime 2018-02-28
*/
let checkIsLoginGotologin = function(to, next) {
// isRelation 判斷用戶微信賬戶是否關聯(lián)官網(wǎng)賬戶
// routeArr 是一些路由是不需要受監(jiān)聽的
// !res ? 已經(jīng)授權 :沒有授權
isRelation().then(res => {
if (routeArr.includes(to.path)) {
!res ? next('index') : next();
} else {
// 沒有授權且不是授權頁 // 當在授權的情況下是不允許訪問login頁面
(res && to.path !== '/login') ? next('/login'): ((!res && to.path === '/login') ? next('index') : next())
}
})
}
/**
* 獲取和推送code
* @Author Hybrid
* @DateTime 2018-02-28
* @param {} url 路徑
*/
let getCodePullCode = async function(url) {
let mycode = url.substring(url.indexOf('code=') + 5, url.indexOf('state=') - 1);// 前臺截取code
selfStore.set('wechatCodeStr', mycode); // 存儲code
//傳送給后臺code
await axios
.get("/home/WxSignature/getCode", {
params: {
code: mycode
}
})
.then(res => {
//需要登錄
var res = res.data;
if (res && res.status === 1) {
selfStore.set('openId', res.data);//本地存儲Openid,也可以不存儲。由后臺調(diào)配
location.href = `http://m.example.com/?a=1#${location.href.split('#')[1]}`; // 增加a=1 防止支付錯誤 防止前臺死循環(huán)
}
});
}
/**
* 全局路由
* @Author Hybrid
* @DateTime 2018-02-28
*/
if (process.env.NODE_ENV == 'production') {
router.beforeEach((to, from, next) => {
let url = location.href;
// 同時判斷'a=1' 和code= 防止前臺死循環(huán)
// wechatCode沒有 發(fā)起授權
if ((url.indexOf('a=1') < 1) && (url.indexOf('code=') < 1)) {
let redirect_url = encodeURIComponent(`http://m.example.com#${to.path}`);
location.href = `http://m.example.com/Home/WxSignature/getBaseInfos?redirect_url=${redirect_url}`;
} else {
// 后臺重定向頁面,授權登錄
(!(url.indexOf('code=') < 1)) ? getCodePullCode(url): checkIsLoginGotologin(to, next)
}
})
}
2、通過code換取網(wǎng)頁授權access_token(與基礎支持中的access_token不同)
appid : 請查看本文 參數(shù)說明
secret : 請查看本文 參數(shù)說明
code :獲取到得code。
grant_type : 固定為authorization_code
獲取code后,請求以下鏈接獲取access_token以及用戶得openid:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=你的appid&secret=你的sercret&code=剛剛獲取得code&grant_type=authorization_code
/**
* 前臺傳遞code,后臺存儲
* @Author weikai
* @DateTime 2017-11-23
* @return [type] [description]
*/
public function getCode() {
$code = I('get.code');//授權用code
$appid = C('WX_APPID');//你的公眾號appid
$secret = C('WX_APPSECRET');//你的公眾號secret
// 組合獲取的url
$url="https://api.weixin.qq.com/sns/oauth2/access_token? appid=$appid&secret=$secret&code=$code&grant_type=authorization_code";
// curl獲取access_token 和openid
$result=$this->curl_get_contents($url);//curl get請求函數(shù)請自行百度
$result=json_decode($result,true);//json轉(zhuǎn)數(shù)組
$data['openid']=$result['openid'];
$data['access_token'] = $result['access_token'];
$data['refresh_token'] = $result['refresh_token'];
if($data){
return $this->ajaxReturn(show(1,'獲取access_token 和openid',$data));//show()方法為自定義封裝消息
}else{
return $this->ajaxReturn(show(0,'沒有access_token 和openid'));
}
}
正確時返回的JSON數(shù)據(jù)包如下:
{ "access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE" }
有些數(shù)據(jù)是需要存儲到后臺數(shù)據(jù)庫的如openid
| 參數(shù) | 描述 |
|---|---|
| access_token | 網(wǎng)頁授權接口調(diào)用憑證,注意:此access_token與基礎支持的access_token不同 |
| expires_in | access_token接口調(diào)用憑證超時時間,單位(秒) |
| refresh_token | 用戶刷新access_token |
| openid | 用戶唯一標識,請注意,在未關注公眾號時,用戶訪問公眾號的網(wǎng)頁,也會產(chǎn)生一個用戶和公眾號唯一的OpenID |
| scope | 用戶授權的作用域,使用逗號(,)分隔 |
錯誤時微信會返回JSON數(shù)據(jù)包如下(示例為Code無效錯誤):
{"errcode":40029,"errmsg":"invalid code"}
其實完成第二步就完成了基本的網(wǎng)頁授權但是還沒有獲取到用戶的信息,授權也沒有實際作用了。
3、刷新access_token(如果需要)
由于獲取用戶信息所用得access_token有效時常比較短,如果想獲取access_token后間隔時間較長獲取微信用戶基本信息請請求刷新access_token api
我這里沒有采用授權后拉取用戶信息的api,而是采用用戶信息獲取的api。
請求方法
獲取第二步的refresh_token后,請求以下鏈接獲取access_token:
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
| 參數(shù) | 是否必須 | 說明 |
|---|---|---|
| appid | 是 | 公眾號的唯一標識 |
| grant_type | 是 | 填寫為refresh_token |
| refresh_token | 是 | 填寫通過access_token獲取到的refresh_token參數(shù) |
/**
* 刷新access_token
* @Author weikai
* @refresh_token 用與刷新access_token的參數(shù)
* @DateTime 2017-11-23
* @return [type] [description]
*/
public function reAccessToken($refresh_token) {
$appid = C('WX_APPID');//你的公眾號appid
// 組合獲取的url
$url="https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=$appid&grant_type=refresh_token&refresh_token=$refresh_token";
// curl請求刷新access_token
$result=$this->curl_get_contents($url);//curl get請求函數(shù)請自行百度
$result=json_decode($result,true);//json轉(zhuǎn)數(shù)組
$data['access_token'] = $result['access_token'];
if($data){
return $this->ajaxReturn(show(1,'獲取access_token' ,$data));//show()方法為自定義封裝消息
}else{
return $this->ajaxReturn(show(0,'沒有access_token'));
}
}
返回說明
正確時返回的JSON數(shù)據(jù)包如下:
{ "access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE" }
和上步返回的數(shù)據(jù)相同,目的就是刷新了access_token 的有效時間,有效期內(nèi)可以使用access_token 和openid獲取微信用戶信息
4、通過網(wǎng)頁授權access_token和openid獲取用戶基本信息
注意:
這里微信提供了兩個不同的api
1.在微信授權里微信提供拉取用戶信息的api(access_token時間限制為五分鐘失效)
http:GET
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
參數(shù)說明
| 參數(shù) | 描述 |
|---|---|
| access_token | 網(wǎng)頁授權接口調(diào)用憑證,注意:此access_token與基礎支持的access_token不同 |
| openid | 用戶的唯一標識 |
| lang | 返回國家地區(qū)語言版本,zh_CN 簡體,zh_TW 繁體,en 英語 |
2.微信用戶管理提供的獲取用戶信息api(只需要使用全局access_token有效期2小時,和openid)
推薦使用這個接口獲取用戶信息
http: GET
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
參數(shù)說明
| 參數(shù) | 描述 |
|---|---|
| access_token | 全局access_token 有效期7200秒 |
| openid | 用戶的唯一標識 |
| lang | 返回國家地區(qū)語言版本,zh_CN 簡體,zh_TW 繁體,en 英語 |
如果網(wǎng)頁授權參數(shù)為snsapi_userinfo(非靜默授權),則此時可以通過access_token和openid獲取用戶信息了。
PHP示例
/**
* @return mixed
* @name 使用全局access_token獲取用戶詳細信息
* @author weikai
*/
public function getWxUserInfo($openid){
$access_token = $this->getAccess_Token();
$url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$access_token."&openid=".$openid."&lang=zh_CN";
$data = $this->cUrl($url);
$data = json_decode($data);
if($data){
return $data;
}
}
返回說明
正確時返回的JSON數(shù)據(jù)包如下:
{ "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"
}
| 參數(shù) | 描述 |
|---|---|
| openid | 用戶的唯一標識 |
| nickname | 用戶昵稱 |
| sex | 用戶的性別,值為1時是男性,值為2時是女性,值為0時是未知 |
| province | 用戶個人資料填寫的省份 |
| city | 普通用戶個人資料填寫的城市 |
| country | 國家,如中國為CN |
| headimgurl | 用戶頭像,最后一個數(shù)值代表正方形頭像大?。ㄓ?、46、64、96、132數(shù)值可選,0代表640*640正方形頭像),用戶沒有頭像時該項為空。若用戶更換頭像,原有頭像URL將失效。 |
| privilege | 用戶特權信息,json 數(shù)組,如微信沃卡用戶為(chinaunicom) |
| unionid | 只有在用戶將公眾號綁定到微信開放平臺帳號后,才會出現(xiàn)該字段。 |
錯誤時微信會返回JSON數(shù)據(jù)包如下(示例為openid無效):
{"errcode":40003,"errmsg":" invalid openid "}