1. 程式人生 > >關於微信網頁授權開發總結整理

關於微信網頁授權開發總結整理

微信網頁授權是怎麼一回事?

我的理解是,使用者在微信客戶端內操作第三方網頁,由該第三方(往往是微信開發者)向微信發起網頁授權請求。

該請求可以獲取此時正在操作的微信使用者資訊,包括主要的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" 

}

通過demoJson.getString("引數名");獲取你所需的引數。

之後就是進行你自己的業務流程了。