避免誤導,先加一句:首先,得公眾號綁定開放平台
這個問題困擾了我一早上,我嘗試了很多次獲取unionid都失敗。
微信的開發文檔上有說:
關於特殊場景下的靜默授權
1、上面已經提到,對於以snsapi_base為scope的網頁授權,就靜默授權的,用戶無感知;
關於這點,我必需更新下,微信更新了接口,用snsapi_base獲取的code,無法取得unionid,必需要用snsapi_userinfo去獲取的code才可以。
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