關於微信網頁授權開發總結整理
微信網頁授權是怎麼一回事?
我的理解是,使用者在微信客戶端內操作第三方網頁,由該第三方(往往是微信開發者)向微信發起網頁授權請求。
該請求可以獲取此時正在操作的微信使用者資訊,包括主要的openid,nickname等。。。。。
想要網頁授權成功,需要三步準備。
第一,將網頁授權.txt文件放置在伺服器專案的根目錄下。
登入微信公眾號平臺——開發——介面許可權——網頁授權——修改-。
注意事項:1.彈出框的下部許多說明文字,其中藍色標註的MP_verify_*^&*@%^ .txt 的這個文件下載本地
2.將.txt文件放在你專案部署伺服器的專案根目錄下。
第二,配置網頁授權回撥域名地址。
緊接著第一步,在彈出框的輸入框內設定回撥域名
注意事項:1.回撥地址必須是全域名形式並且不帶http,即www.***.***。
比如:www.qq.com,配置以後此域名下面的頁面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以進行網頁授權鑑權。
但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com無法進行網頁授權鑑權
2.點選完成,頁面頂部會出現綠色框框提示結果。
此時你可以做個小測試,檢測之前做的第一,第二步是否成功有效。
你可以在瀏覽器位址列輸入:你設定的回撥域名/MP_verify_*^&*@%^ .txt (即第一步上傳你伺服器的txt文件名)。
如果可以正常訪問到,那恭喜你設定成功!可以進行第三步程式碼開發了。
如果訪問不到,報無法找到資源的話,即可能是:
1.設定的域名地址不正確(往往是層級不對,可以嘗試在設定域名下再加上你專案工程名再試試,比如我的設定的就是:www.域名.com/我自己的專案名AA)
2.你的txt文件放的位置不在你伺服器該專案的的根目錄下。
第三,相關的程式碼開發。
程式碼開發又分為兩步。
1).請求微信介面地址獲取code
介面地址:https://open.weixin.qq.com/connect/oauth2/authorize?appid=【你公眾號appid】&redirect_uri=http://你網頁授權設定的域名下的業務連結?業務引數1=value1%26業務引數2=value2%26.........&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect
引數說明:redirect_uri=>必須是在你的此前設定的網頁授權域名下的業務連結(即:www.qq.com/業務連結),即是你網頁授權請求之後回到你自己業務的連線
redirect_uri中業務連結後面帶的業務引數個數一般不限制,有多個的時候引數與引數之間用轉義符%26連線。原因有二:
其一,redirect_uri回撥地是作為引數包含在微信介面地址裡的,直接用&,會被微信認為是你傳參給微信伺服器的,就會報錯若提示“該連結無法訪問”,請檢查引數錯誤,我就是吃過這個虧,一開始redirect_uri裡傳參3個,之間用的&連線,都提示引數錯誤。後改成redirect_uri後只帶一個引數(用不著&拼接),就可以正常網頁授權。但是往往我們的業務引數是不可能只傳一個的。這就很麻煩!
其二,發現我用轉義%26去連線我回調地址裡的多個業務引數,即:redirect_uri=http://你網頁授權設定的域名下的業務連結?業務引數1=value1%26業務引數2=value2%26.........,,,這時網頁授權都是正常,業務引數也都能獲取到。
所以redirect_uri裡用%26,,,這時過來人的經驗,也是個細節,免走彎路。
scope值可以有兩種:snsapi_base / snsapi_userinfo
區別:
snsapi_base:是靜默授權的,即使用者無感知的就預設通過允許該公眾號獲取使用者資訊。但是這種方式往往只能獲取當前微信使用者的openid。
snsapi_userinfo:是需要使用者手動同意授權,使用者是有感知的。這種方式可以獲取當前微信使用者的基本資訊,包括:openid,nickname,city,sex性別等等。
這樣說你肯定比較抽象跟空泛。你在操作微信時遇到這種介面:
這種就是snsapi_userinfo使用者有感知的授權方式。
這一步正確請求微信伺服器之後,微信伺服器會主動請求你redirect_uri裡填寫的回撥地址,並且在後面拼接一個code引數與值,
即:http://你網頁授權設定的域名下的業務連結?業務引數1=value1&業務引數2=value2&.......&code=【CODE值】
說明:code只能使用一次,5分鐘未被使用自動過期。
2).用code置換出openId
介面地址:https://api.weixin.qq.com/sns/oauth2/access_token?appid=【你公眾號的appid】&secret=【你公眾號的金鑰】&code=【CODE值】&grant_type=authorization_code
這裡的引數沒啥好說的。一目瞭然。
關於程式碼開發的這兩步就是分別的去請求不同的微信介面地址,獲取響應的值,code---------->openid等。
具體的程式碼就不一贅述了。舉一個用code置換openid等相關基本資訊的例子
String redirectUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?"
+ "appid="+ appId
+ "&secret=" + appSecret
+ "&code=" + code + "&grant_type=authorization_code";
PostMethod get = null;
try
{
get = new PostMethod(redirectUrl);
HttpClient httpClient = new HttpClient();
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(30000);
httpClient.getHttpConnectionManager().getParams().setSoTimeout(30000);
httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "GBK");
int statusCode = httpClient.executeMethod(get);
if (statusCode == HttpStatus.SC_OK)
{
String message = get.getResponseBodyAsString();
//解析返回json
JSONObject demoJson = new JSONObject(message);
openId = demoJson.getString("openid");
}
}catch (Exception e){
e.printStackTrace();
}finally{
//釋放資源
get.releaseConnection();
}
介面返回的都是json資料包,
正確時返回的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"
}
之後就是進行你自己的業務流程了。