避免誤導,先加一句:首先,得公衆號綁定開放平臺api
這個問題困擾了我一早上,我嘗試了不少次獲取unionid都失敗。微信
微信的開發文檔上有說:this
關於特殊場景下的靜默受權spa
一、上面已經提到,對於以snsapi_base爲scope的網頁受權,就靜默受權的,用戶無感知;code
關於這點,我必需更新下,微信更新了接口,用snsapi_base獲取的code,沒法取得unionid,必須要用snsapi_userinfo去獲取的code才能夠。token
二、對於已關注公衆號的用戶,若是用戶從公衆號的會話或者自定義菜單進入本公衆號的網頁受權頁,即便是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」這裏找到了靈感。
我就想,這個怎麼這麼熟悉,我原來的頁面上就有:get
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