前一段時間在學校做過一個項目,就是利用的Senparc.Weixin SDK 做的,於是翻看以前代碼,雖然有注釋,但是還是看的迷迷糊糊的,干脆就單步執行一遍看看是怎么實現的,然后就重新寫了個簡易的授權的界面。貼上代碼,溫故而知新。
用的MVC
<appSettings> //配置文件里面寫上自己的appid 和appsecret <add key="appID" value="xxxxxxxxxxxa"/> <add key ="appsecret" value="bxxxxxxxxx8"/> </appSettings>
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Configuration; using Senparc.Weixin;//引用sdk 命名空間 using Senparc.Weixin.MP.AdvancedAPIs; using Senparc.Weixin.MP.AdvancedAPIs.OAuth; namespace WeChat.Controllers {
//授權控制器 public class OAuthController : Controller { //這兩個已經在web.config里面寫入,所以直接利用ConfiurationManager類下的AppSetting方法獲取 public static readonly string appID = ConfigurationManager.AppSettings["appID"]; public static readonly string appsecret = ConfigurationManager.AppSettings["appsecret"]; public static readonly string Domin = "http://zhao.xxxx.xin";//這個是構造回調網頁所需要的前綴, 一定要加上http:// 不然會出現redirect_uri錯誤 // GET: OAuth public ActionResult Index(string returnUrl) { //2.構造redirect_uri 也就是回調函數 $"" 相當於string.format在C#6.0之后出現的也是占位符 //new { returnUrl} 這個的意思就是匿名構造函數,為什么只有一個值,因為returnUrl=returnUrl 一致,所以可以直接寫 /* *Url.Action("方法名","匿名方法") 需要回調函數,所以需要再寫一個CallBack方法,如果不使用過濾器的話,就returnUrl="/" */ string redirect_uri = $"{Domin}{Url.Action("CallBack", new { returnUrl="/" })}"; //3.state 也是下面的方法需要的參數,這個參數是可以自定義的 string state = "wx" + DateTime.Now.Millisecond; Session["state"] = state;//一旦比較完之后需要清空必須清空 //1.OAuthApi下的GetAuthorizeUrl方法用來獲取驗證地址,第二個參數是redirect_uri,所以我們就需要構造這個參數 string redirect= OAuthApi.GetAuthorizeUrl(appID, redirect_uri, state, Senparc.Weixin.MP.OAuthScope.snsapi_base); return Redirect(redirect); } ////為什么需要CallBack,在獲取到用戶的授權之后,需要獲取用戶的code public ActionResult CallBack(string code, string state, string returnUrl) { if (Session["state"].ToString() != state) { Session["state"] = null; return Content("請重新進入"); } Session["state"] = null; //如果code返回的是個空值,則需要回到授權界面,重新授權 if (string.IsNullOrEmpty(code)) { return RedirectToAction("index"); } //通過回調函數返回的code來獲取令牌 ,如果不懂可單步執行,看url的變化 var accessToken = OAuthApi.GetAccessToken(appID, appsecret, code);//這里返回的是一個對象,可以用弱類型var接收 if (accessToken.errcode != ReturnCode.請求成功) { //如果令牌的錯誤信息不等於請求成功,則需要重新返回授權界面 return RedirectToAction("index"); } Session["oauthAccessToken"] = accessToken;//保存起來過濾器判斷 try { Session["userInfo"] = OAuthApi.GetUserInfo(accessToken.access_token, accessToken.openid); return Redirect(returnUrl); } catch { //如果沒有獲取到用戶的信息,則需要重新進去授權界面
string redirect_uri = $"{Domin}{Url.Action("CallBack", new { returnUrl="/" })}";
string state1 = "wx"+DateTime.Now.Millisecond;
Session["state"] =state1;//一旦比較完之后需要清空必須清空
string redirect = OAuthApi.GetAuthorizeUrl(appID, redirect_uri, state1, Senparc.Weixin.MP.OAuthScope.snsapi_base); return Redirect(redirect);
}
}
}