今天接到一個需求,需要微信授權另一個項目(微信投票項目),但之前已經有一個項目(麥唱K歌房微信端)做了微信網頁授權的業務,因為微信網頁回調的地址只能填一個而且不能在上面加端口,所以就造成回調后直接返回到默認的80端口上了,所以就會出現一會回調到一個固定的頁面上;
怎么解決這個問題呢?
增加一次重定向操作
說白了就一句話:就是最原始的鏈接上添加字段,專門准備一個頁面發請求,拿到用戶信息,根據字段在里面加判斷條件跳轉到不同的項目中去用,
其實微信授權原理很簡單:
1、引導用戶進入授權頁面同意授權,獲取code 2、通過code換取網頁授權access_token(與基礎支持中的access_token不同) 3、如果需要,開發者可以刷新網頁授權access_token,避免過期 4、通過網頁授權access_token和openid獲取用戶基本信息(支持UnionID機制)
怎么拿到code?
看到上面那個鏈接了么?里面有個redirect_uri 這個是回調的地址,你請求回來之后會跳到這個頁面,此時微信會把code用 & 符號 鏈接到REDIRECT_URI連接上返回給你,如果想拿到的話就寫個方法,從網頁鏈接上截取code;
function queryParam(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if(r != null) return unescape(r[2]);
return null;
};//從網頁上截取參數的方法
調用:var _code = queryParam("code"); 此時就拿到code了
其實為什么要有一個回調的頁面地址呢?
不就是要拿到code嗎?
那我們拿到code的話就不能多用了么?就只能服務於一個項目么?不能用code去服務兩個,三個或者多個項目么?
答案是可以的!
接下來就是我要講的:
增加一次重定向操作
看見上面的圖了么?表示了大致意思
講解:
最上面的請求回調其實就做了一件事-----拿到code;把code放到一個頁面里
下面三個域名其實就是:
把拿到的code傳到三個不同的頁面中(也可以說成不同的域名----意思就是不用的項目放在不同的服務器上),然后用這個code換取網頁授權access_token,然后再換取用戶信息;
這樣就突破了微信回調域名只能是一個的界限;
總結:就是最原始的鏈接上添加字段,專門准備一個頁面發請求,拿到用戶信息,在里面加判斷條件跳轉到不同的項目中去用,
bug:特別注意:
就是用code去 那token
調用這個鏈接
https://api.weixin.qq.com/sns/oauth2/access_token?appid=你的appid&secret=你的secret&code='.$code.'&grant_type=authorization_code
的時候會報錯
報錯信息如下:
{"errcode":40125,"errmsg":"invalid appsecret, view more at http:\/\/t.cn\/RAEkdVq, hints: [ req_id: tQrXIA0696th19 ]"}
我猜想應該是微信知道你發請求的頁面的域名不在你設置的回調域名下,這就很尷尬了,我后來百度了下,說是讓重置一下appsecret,其實最根本的原因還是,不能一個服務號服務多個項目;
難道真的不行么?
最后我想了個辦法,我這邊在其他域名拿到code后直接把code在傳到回調域名的服務器上,用后台語言拿code去換取用戶信息,完了我這邊在請求回調域名下的接口,讓他把拿到的用戶信息
字段再返還給我,我這邊在進行操作,這樣就合情合理了!
總結:就是最原始的鏈接上添加字段,專門准備一個頁面發請求,拿到用戶信息,在里面加判斷條件跳轉到不同的項目中去用,