微信公众号授权给开放平台
公众号授权给第三方平台的技术实现流程比较简单
这个步骤遗漏了开头获取第三方平台自己的accessToken
先说下流程
如何注册开放平台的第三方信息看截图
其他不说了,此文只说代码部分。
先获取第三方10分一次的ticket。
1 using (var streamReader = new StreamReader(Request.InputStream)) 2 { 3 string stringInput = streamReader.ReadToEnd(); 4 string sMsg = ""; //解析之后的明文 5 int ret = 0; 6 ret = wxcpt.DecryptMsg(signature, timestamp, nonce, stringInput, ref sMsg); 7 if (ret != 0) 8 return Content(string.Format("解析错误{0}", ret)); 9 var xDoc = XDocument.Parse(sMsg); 10 var q = (from c in xDoc.Elements() select c).ToList(); 11 var infoType = q.Elements("InfoType").First().Value; 12 switch (infoType) 13 { 14 case "component_verify_ticket": 15 var ComponentVerifyTicket = q.Elements("ComponentVerifyTicket").First().Value; 16 var wxOpen = (WebProject_GlobalConfig)WCFHelper.Invoke("WebProject_GlobalConfig", WcfFunName.SelectSingle.ToString(), 17 new object[] { "4add738c-369d-4570-ad18-77542e18a47a"});//这条请无视,只是wcf取数据。 18 wxOpen.KeyValue = ComponentVerifyTicket; 19 wxOpen.ModifyTime = DateTime.Now; 20 wxOpen = (WebProject_GlobalConfig)WCFHelper.Invoke("WebProject_GlobalConfig", WcfFunName.Save.ToString(), 21 new object[] { wxOpen }); 22 return Content("success"); 23 case "unauthorized": 24 return Content(string.Format("{0} 已取消授权", q.Elements("AuthorizerAppid").First().Value)); 25 default: 26 break; 27 } 28 } 29 return Content("参数错误!");
获取到的信息解密,并保存component_verify_ticket。
然后就开始做第三方的token事情!
拿accesstoken
var accessTokenTime = wxOpen.ModifyTime; if (accessTokenTime < DateTime.Now.AddSeconds(-7200) | String.IsNullOrEmpty(wxOpen.KeyValue)) { dynamic authorizerResult = ComponenToken(); wxOpen.ModifyTime = DateTime.Now; wxOpen.KeyValue = authorizerResult.component_access_token; WCFHelper.Invoke("WebProject_GlobalConfig", WcfFunName.Save.ToString(), new object[] { wxOpen }); } /// <summary> /// Ticket票据读取第三方token /// </summary> /// <returns></returns> public static dynamic ComponenToken() { var url = "https://api.weixin.qq.com/cgi-bin/component/api_component_token"; var jsonDate = new { component_appid = GetConfig("ComponentAppid"), component_appsecret = GetConfig("ComponentSercet"), component_verify_ticket = GetConfig("ComponentVerifyTicket") }; return CommonJsonSend.Send<dynamic>(null, url, jsonDate); }
然后就可以做授权跳转
/// <summary> /// 跳转授权 /// </summary> /// <returns></returns> public ActionResult WxRedirect() { var url = "https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid={0}&pre_auth_code={1}&redirect_uri={2}";//跳转网页 var proResult = WeChatTokenHelper.GetProCode();//预授权码 url = String.Format(url, WeChatTokenHelper.GetConfig("ComponentAppid"), proResult.pre_auth_code, "http://XXXXX/DptWxOpen/AuthInfo"); return Redirect(url); }
不知道怎么拿预授权码?好吧,看代码!
/// <summary> /// 第三方token读取预授权读取 /// </summary> /// <param name="Ticket"></param> /// <returns></returns> public static dynamic GetProCode() { var url = "https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token={0}"; var jsonData = new { component_appid = GetConfig("ComponentAppid") }; return CommonJsonSend.Send<dynamic>(GetOpenToken(), url, jsonData); }
最后的悲哀授权成功回调~
/// <summary> /// 微信回调url /// </summary> /// <param name="auth_code"></param> /// <returns></returns> public ActionResult AuthInfo(String auth_code) { var admin = Session["WebAdmin"] as WebProject_Admin; //登陆身份而已,别太在意 if (admin == null) return Redirect("/DptPages/Login"); dynamic tokenResult = WeChatTokenHelper.GetWeChat(auth_code);//换授权码 dynamic authorizationInfo = tokenResult.authorization_info; String appId = authorizationInfo.authorizer_appid; var authorizerInfo = (WebProject_AuthorizerWeChat)WCFHelper.Invoke("WebProject_AuthorizerWeChat", WcfFunName.SelectSingle.ToString(), new object[] { "x.WebId == " + admin.WebId, true }); if (authorizerInfo == null) { authorizerInfo = new WebProject_AuthorizerWeChat { WebId = admin.WebId }; authorizerInfo = (WebProject_AuthorizerWeChat)WCFHelper.Invoke("WebProject_AuthorizerWeChat", WcfFunName.Save.ToString(), new object[] { authorizerInfo }); } if (authorizerInfo == null) return Content("对象报错!"); authorizerInfo.AppId = appId; authorizerInfo.AccessToken = authorizationInfo.authorizer_access_token; authorizerInfo.AccessTokenTime = DateTime.Now; authorizerInfo.RefreshToken = authorizationInfo.authorizer_refresh_token; var Func = JSON.Deserialize<func_info>(funcinfo(authorizationInfo.func_info)); var Json = ""; foreach (var i in Func.Info) { i.funcscope_category.FuncType = i.funcscope_category.id > 0 ? (FuncType)i.funcscope_category.id : FuncType.Error; Json += JSON.ToJson(i); } authorizerInfo.FuncInfo = Json; authorizerInfo = (WebProject_AuthorizerWeChat)WCFHelper.Invoke("WebProject_AuthorizerWeChat", WcfFunName.Save.ToString(), new object[] { authorizerInfo }); return Redirect("WeChatInfo?state=true"); }
好人做到底,授权码方法:
/// <summary> /// 授权码code换身份 /// </summary> /// <param name="authCode"></param> /// <returns></returns> public static dynamic GetWeChat(String authCode) { var url = "https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token={0}"; var jsonData = new { component_appid = GetConfig("ComponentAppid"), authorization_code = authCode }; return CommonJsonSend.Send<dynamic>(GetOpenToken(), url, jsonData); }
几个关于授权信息的类工具:
#region AuthorInfo Helper public string funcinfo(dynamic info) { string newinfo = "{\"Info\":" + info + "}"; return newinfo; } public class func_info { public List<InfoList> Info { get; set; } } public class InfoList { public Info funcscope_category { get; set; } } public class Info { public Int32 id { get; set; } public FuncType FuncType { get; set; } } #endregion
若有问题请评论留言~