ASP.NET之MVC 微信公众号授权给第三方平台的技术实现流程一(获取第三方平台access_token)

Posted 一个人的行走范围,就是他的世界。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET之MVC 微信公众号授权给第三方平台的技术实现流程一(获取第三方平台access_token)相关的知识,希望对你有一定的参考价值。

“出于安全考虑,在第三方平台创建审核通过后,微信服务器每隔10分钟会向第三方的消息接收地址推送一次component_verify_ticket,用于获取第三方平台接口调用凭据”。这是文档中的原话,也就是说我们在获取access_token的时候是要先得到component_verify_ticket的,而component_verify_ticket每10分钟向我们的接收地址推送一次

而域名地址是由我们自己去服务器上去部署,如下图:

 

 /// <summary>
        /// 一.推送component_verify_ticket
        /// </summary>
        /// <param name="collection"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult Index(FormCollection collection)
        {
            //在公众号第三方平台创建审核通过后,微信服务器会向其“授权事件接收URL”每隔10分钟定时推送component_verify_ticket。第三方平台方在收到ticket推送后也需进行解密
            byte[] data = Request.BinaryRead(Request.TotalBytes);
            string postData = Encoding.Default.GetString(data);
            //公众号第三方平台的appid
            string appId = ConfigurationManager.AppSettings["WeixinAppID"];
            //第三方平台申请时填写的接收消息的校验token
            string token = ConfigurationManager.AppSettings["WeixinToken"];
            //第三方平台申请时填写的接收消息的加密symmetric_key
            string encodingAesKey = ConfigurationManager.AppSettings["WeixinEncodingAESKey"];
            string sMsg = "";//解密后的内容
            var msg = new Tencent.WXBizMsgCrypt(token, encodingAesKey, appId);

            int ret = msg.DecryptMsg(
                Request.QueryString["msg_signature"],
                Request.QueryString["timestamp"],
                Request.QueryString["nonce"],
                postData,
                ref sMsg);

            var xDoc = XDocument.Parse(sMsg);
            var q = (from c in xDoc.Elements() select c).ToList();
            var infoType = q.Elements("InfoType").First().Value;
            switch (infoType)
            {
                case "component_verify_ticket":
                    //q.Elements("ComponentVerifyTicket").First()
                    //这里就是component_verify_ticket的值,保存起来就可以了,处理完成后在页面上输出success,通知微信服务器已经接收到ticket
                    string _AppId = q.Elements("AppId").First().Value;
                    string _CreateTime = q.Elements("CreateTime").First().Value;
                    string _InfoType = q.Elements("InfoType").First().Value;
                    string _ComponentVerifyTicket = q.Elements("ComponentVerifyTicket").First().Value;
                    DateTime dt = DateTime.Now;



                    var datacvt = from t in dbContext.tb_ComponentVerifyTicket
                                  select t;
                    tb_ComponentVerifyTicket tb = new tb_ComponentVerifyTicket();
                    if (datacvt.ToList().Count == 0)//添加
                    {
                        tb.Cvt_AppId = _AppId;
                        tb.Cvt_CreateTime = _CreateTime;
                        tb.Cvt_InfoType = _InfoType;
                        tb.Cvt_ComponentVerifyTicket = _ComponentVerifyTicket;
                        tb.Cvt_DateTime = dt;
                        dbContext.tb_ComponentVerifyTicket.Add(tb);
                        dbContext.SaveChanges();
                    }
                    else//修改
                    {
                        foreach (var item in datacvt)
                        {
                            item.Cvt_Id = item.Cvt_Id;
                            item.Cvt_AppId = _AppId;
                            item.Cvt_CreateTime = _CreateTime;
                            item.Cvt_InfoType = _InfoType;
                            item.Cvt_ComponentVerifyTicket = _ComponentVerifyTicket;
                            item.Cvt_DateTime = dt;
                        }
                        dbContext.SaveChanges();
                    }
                    Response.Write("success");
                    Response.End();
                    break;
                default:
                    break;
            }
            return View();
        }

  这里我们得到了component_verify_ticket,也就是我要的“ string _ComponentVerifyTicket = q.Elements("ComponentVerifyTicket").First().Value; ”

OK,到这里之后我们接下来的就是要获取access_token。

因为access_token的有效期为两个小时“第三方平台compoment_access_token是第三方平台的下文中接口的调用凭据,也叫做令牌(component_access_token)。每个令牌是存在有效期(2小时)的,且令牌的调用不是无限制的,请第三方平台做好令牌的管理,在令牌快过期时(比如1小时50分)再进行刷新。” So,我们可以考虑做一个Windows服务每两个小时去执行向微信服务发送请求又或者是时间对比法 (先记录得到component_access_token的时间再取component_access_token值的时候查得当前时间,通过两个时间差做比较,如果大于等于2小时就重新去查询,否则去查询数据库或缓存中的component_access_token)

 protected override void OnStart(string[] args)
        {
            string str = "服务开启";
            System.Threading.Timer t = new System.Threading.Timer
             (new System.Threading.TimerCallback(testTheNet), null, 1000 * 60 * 120, 1000 * 60 * 120);

            //System.Threading.Timer t = new System.Threading.Timer
            // (new System.Threading.TimerCallback(_testime), null, 1000 * 60, 1000 * 60);

        }

  

到这里access_token我们就已经获取到了~~

 

以上是关于ASP.NET之MVC 微信公众号授权给第三方平台的技术实现流程一(获取第三方平台access_token)的主要内容,如果未能解决你的问题,请参考以下文章

微信第三方平台处理授权公众号的网页授权接口

微信开发之分清公众平台和开放平台公众号全局凭证和网页授权凭证

微信公众号第三方平台开发 授权流程

nopCommerce 3.9 大波浪系列 之 微信公众平台登录插件

微信公众平台 微信网页授权

免费创建微信公众号全攻略