避免誤導,先加一句:首先,得公眾號綁定開放平臺 這個問題困擾了我一早上,我嘗試了很多次獲取unionid都失敗。 微信的開發文檔上有說: 關於特殊場景下的靜默授權 1、上面已經提到,對於以snsapi_base為scope的網頁授權,就靜默授權的,用戶無感知; 2、對於已關註公眾號的用戶,如果用戶從 ...
避免誤導,先加一句:首先,得公眾號綁定開放平臺
這個問題困擾了我一早上,我嘗試了很多次獲取unionid都失敗。
微信的開發文檔上有說:
關於特殊場景下的靜默授權
1、上面已經提到,對於以snsapi_base為scope的網頁授權,就靜默授權的,用戶無感知;
2、對於已關註公眾號的用戶,如果用戶從公眾號的會話或者自定義菜單進入本公眾號的網頁授權頁,即使是scope為snsapi_userinfo,也是靜默授權,用戶無感知。
而我現在的情況屬於第2種,因此我一直都沒有考慮要跳到用戶授權的界面,事實上也不需要考慮這一個。
我通過網上搜索了別人的方法,都說通過
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN 來獲取unionid,其實這並沒有錯,這是一般方法。
而對於已關註公眾號的用戶(我是開發公眾號,也僅針對關註公眾號的用戶),並不需要走這一步,其實在從公眾號進入你的網頁時,unionid就已經獲取到了,只是一直沒有發現。最後在“第二步:通過code換取網頁授權access_token”這裡找到了靈感。
我就想,這個怎麼這麼熟悉,我原來的頁面上就有:
jsApiPay.GetOpenidAndAccessToken();
ViewState["openid"] = jsApiPay.openid;
而就在jsApiPay.GetOpenidAndAccessToken()方法里就有
if (!string.IsNullOrEmpty(page.Request.QueryString["code"]))
{
//獲取code碼,以獲取openid和access_token
string code = page.Request.QueryString["code"];
Log.Debug(this.GetType().ToString(), "Get code : " + code);
GetOpenidAndAccessTokenFromCode(code);
}
傻啦?這不就有code,難道在這裡已經獲取了unionid?
於是我開始嘗試在這裡獲取unionid,對JsApiPay做了一些小修改。
首先,增加了一個屬性:
/// <summary>
/// 開放平臺統一ID
/// </summary>
public string unionid { get; set; }
然後在public void GetOpenidAndAccessTokenFromCode(string code)這個方法里添加
if (jd["unionid"] != null) unionid = (string)jd["unionid"];
由於害怕沒有這個欄位,所以添加了判斷。
最後在頁面里用jsApiPay.unionid 獲取看是否成功,OK GET!
詳細可以閱讀開發文檔 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842