微信用戶受權登陸

後臺配置

網頁受權域名須要配置
不要在前面加http://
1前端

請求網址

https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

redirect_uri必定要在前面加http://
(心好累┭┮﹏┭┮)
Tips:此處不加http://,會形成「redirect_uri域名與後臺配置不一致,錯誤碼:10003」的錯誤git

參數說明

參數 是否必須 說明
appid 應用惟一標識
redirect_uri 請使用urlEncode對連接進行處理
response_type 填code
scope 應用受權做用域,擁有多個做用域用逗號(,)分隔,網頁應用目前僅填寫snsapi_login便可
state 用於保持請求和回調的狀態,受權請求後原樣帶回給第三方。該參數可用於防止csrf攻擊(跨站請求僞造攻擊),建議第三方帶上該參數,可設置爲簡單的隨機數加session進行校驗

使用盛派SDK

僅針對服務號有效,用戶能夠不關注該服務號而拿到用戶信息 github

須要注意的是,僅此次受權的時候能夠拿到用戶信息,以後再使用UserApi.InfoAsync()是拿不到用戶信息的
(因此孩子們注意保存用戶信息,吃過虧的我┭┮﹏┭┮)json

添加引用

Senparc.Weixin
Senparc.Weixin.MP.MVC

直接得到openid

下面的例子在受權得到用戶信息以後直接返回json字符串後端

private string authorizeUrl = "域名地址"; private string appId = ""; private string appSecret = ""; //這兩個接口都在WeixinController裏面 public async Task<ActionResult> GetWechatUserInfoInterface(string returnUrl) { var state = "zl-" + DateTime.Now.Millisecond; //隨機數,用於識別請求可靠性 Session["zl-weixin-sate"] = state; //儲存隨機數到Session var userLogUrl = authorizeUrl + "/weixin/GetWechatUserInfoCallBackInterface?returnUrl=" + returnUrl.UrlEncode(); //微信受權網址 //先調微信的接口,再返回帶的本身的接口 var urlUserInfo = OAuthApi.GetAuthorizeUrl(appId, userLogUrl, state, OAuthScope.snsapi_userinfo); return Redirect(urlUserInfo); } /// <summary> /// 用戶驗證回掉函數 /// </summary> /// <returns></returns> public async Task<ActionResult> GetWechatUserInfoCallBackInterface(string code, string state, string returnUrl) { if (string.IsNullOrEmpty(code)) { return Json("您拒絕了受權!"); } if (state != Session["zl-weixin-sate"] as string) { return Json("驗證失敗!請從正規途徑進入!"); } try { var token = await OAuthApi.GetAccessTokenAsync(appId, appSecret, code); if (token.errcode == ReturnCode.請求成功) { //此處得到用戶信息 var oAuthUserInfo = await OAuthApi.GetUserInfoAsync(token.access_token, token.openid); return Json(JsonConvert.SerializeObject(oAuthUserInfo), JsonRequestBehavior.AllowGet); } return Json("請求失敗!"); } catch (Exception ex) { return Json("Token受權失敗!"); } }

提供給他人調用

遇到的需求是,對方是個訂閱號,想使用我這邊的服務號發紅包,發紅包須要OpenId,而OpenId是針對公衆號惟一的,因此必須得到用戶針對服務號的OpenId
咱們不能把本身的appId和appSecret提供給對方,因此須要給他們寫接口
實踐發現,上例不適用於提供給他人調用,緣由以下:
1.若是前端直接調用接口GetWechatUserInfoInterface,會涉及跨域的問題(固然大家願意配置也是能夠的)
2.若是後端直接調用接口GetWechatUserInfoInterface,微信會認爲「沒有在微信客戶端打開」,即調用微信受權接口時失敗
因此能夠把上面的例子稍做修改,大概思路是,在咱們這邊徹底完成受權以後再跳轉對方的網站,把信息帶給他們api

private string authorizeUrl = "域名地址"; private string appId = ""; private string appSecret = ""; public async Task<ActionResult> WeiXinRedPackForeignView(string returnUrl) { var state = "zl-" + DateTime.Now.Millisecond; //隨機數,用於識別請求可靠性 Session["zl-weixin-sate"] = state; //儲存隨機數到Session var userLogUrl = authorizeUrl + "/weixin/UserLoginForRedPackForeignInterface?returnUrl=" + returnUrl.UrlEncode(); //微信受權網址 //先調微信的接口,再返回帶的本身的接口 var urlUserInfo = OAuthApi.GetAuthorizeUrl(appId, userLogUrl, state, OAuthScope.snsapi_userinfo); //這裏改成返回本身的頁面 return View("WeiXinRedPackForeignView", new NameValueDto { Name = urlUserInfo }); } /// <summary> /// 用戶驗證回掉函數 /// </summary> /// <returns></returns> public async Task<ActionResult> UserLoginForRedPackForeignInterface(string code, string state, string returnUrl) { if (string.IsNullOrEmpty(code)) { return Json("您拒絕了受權!"); } if (state != Session["zl-weixin-sate"] as string) { return Json("驗證失敗!請從正規途徑進入!"); } try { var token = await OAuthApi.GetAccessTokenAsync(appId, appSecret, code); if (token.errcode == ReturnCode.請求成功) { var oAuthUserInfo = await OAuthApi.GetUserInfoAsync(token.access_token, token.openid); SaveWeixinUserInfo(oAuthUserInfo); //這裏跳轉到對方的頁面,帶上oAuthUserInfo信息(base64加密) string url = WebConfigurationManager.AppSettings["RedPackForeignInterUrl"]; byte[] bytes = Encoding.Default.GetBytes(JsonConvert.SerializeObject(oAuthUserInfo)); string base64Str= Convert.ToBase64String(bytes); return Redirect(url+ base64Str); } return Json("請求失敗!"); } catch (Exception ex) { return Json("Token受權失敗!"); } }

示例代碼

https://github.com/zLulus/NotePractice/blob/dev3/Website/DotNetFramework/NotePractice/Controllers/WeiXinController.cs
演示須要:
請以管理員身份運行VS(會發布站點到IIS上)
給站點配置一個域名,好比花生殼,能夠參考個人文 章:https://github.com/zLulus/My_Note/wiki/%E5%BE%AE%E4%BF%A1%E8%B0%83%E8%AF%95%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E5%BC%8F
填寫好authorizeUrl、appId和appSecret
在公衆號設置-功能設置,設置「受權域名」,下載MP_verify_QvGuHOyO3bMD1fLJ.txt到站點根目錄跨域

參考資料

https://www.jianshu.com/p/5b5c2131bff9微信

相關文章
相關標籤/搜索