微信公众号.net core唤起配置

    长情猫 40 0

    本文主要讲述在.Net Core下开发微信公众号相关的事宜

    首先参考微信官方平台的文档

    JSSDK使用步骤

    步骤一:绑定域名

    先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。

    备注:登录后可在“开发者中心”查看对应的接口权限。

    步骤二:引入JS文件

    在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.4.0.js

    如需进一步提升服务稳定性,当上述资源不可访问时,可改访问:http://res2.wx.qq.com/open/js/jweixin-1.4.0.js (支持https)。

    备注:支持使用 AMD/CMD 标准模块加载方法加载

    步骤三:通过config接口注入权限验证配置

    所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。

    wx.config({
      debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
      appId: '', // 必填,公众号的唯一标识
      timestamp: , // 必填,生成签名的时间戳
      nonceStr: '', // 必填,生成签名的随机串
      signature: '',// 必填,签名
      jsApiList: [] // 必填,需要使用的JS接口列表
    });
    

    签名算法见文末的附录1,所有JS接口列表见文末的附录2

    步骤四:通过ready接口处理成功验证

    wx.ready(function(){
      // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
    });
    

    步骤五:通过error接口处理失败验证

    wx.error(function(res){
      // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
    });
            /// <summary>
            /// 微信签名请求
            /// </summary>
            /// <param name="href"></param>
            /// <returns></returns>
            [HttpPost]
            public async Task<JsonResult> GetScanQRCodeSign(string href)
            {
                //首先请求缓存的Ticket以及token,不存在再请求
                var ticket_cache = await _cache.GetConfigAsync();
                if (ticket_cache == null || string.IsNullOrEmpty(ticket_cache.Ticket) || string.IsNullOrEmpty(ticket_cache.Token))
                {
                    var result = await Help.Http.HttpGetAsync("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=id&secret=密钥");
                    var access_toke = JsonConvert.DeserializeObject<Dictionary<string, string>>(result);
                    if (access_toke != null && access_toke.ContainsKey("access_token"))
                    {
                        string token = access_toke["access_token"];
                        //获取jsapi_ticket
                        var ticket = await Help.Http.HttpGetAsync("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + token + "&type=jsapi");
                        var ticket_json = JsonConvert.DeserializeObject<Dictionary<string, string>>(ticket);
                        if (ticket_json != null && ticket_json.ContainsKey("ticket"))
                        {
                            string strRandom = createNonceStr();
                            string timespan = ConvertDateTimeInt(DateTime.Now).ToString();
                            string noncestr = "jsapi_ticket=" + ticket_json["ticket"] + "&noncestr=" + strRandom + "&timestamp=" + timespan + "&url=" + href;
                            string signatures = SignNonceste(noncestr);
                            await Help.CacheExt.SetObjectAsync
                                (_cache._cache, "Config",
                                new Help.WechatConfig
                                {
                                    Ticket = ticket_json["ticket"],
                                    Token = access_toke["access_token"]
                                });
                            return Json(new
                            {
                                ticket = ticket_json["ticket"],
                                token = access_toke["access_token"],
                                appid = "id",
                                timestamp = timespan,
                                nonceStr = strRandom,
                                signature = signatures
                            });
                        }
                        else
                            return Json("fail");
                    }
                    else
                        return Json("fail");
                }
                else
                {
                    string strRandom = createNonceStr();
                    string timespan = ConvertDateTimeInt(DateTime.Now).ToString();
                    string noncestr = "jsapi_ticket=" + ticket_cache.Ticket + "&noncestr=" + strRandom + "&timestamp=" + timespan + "&url=" + href;
                    string signatures = SignNonceste(noncestr);
                    return Json(new
                    {
                        ticket = ticket_cache.Ticket,
                        token = ticket_cache.Token,
                        appid = "id",
                        timestamp = timespan,
                        nonceStr = strRandom,
                        signature = signatures
                    });
                }
            }
    
            /// <summary>
            /// Hash 签名
            /// </summary>
            /// <param name="str"></param>
            /// <returns></returns>
            private static string SignNonceste(string str)
            {
                //建立SHA1对象
                SHA1 sha = new SHA1CryptoServiceProvider();
                //将mystr转换成byte[]
                ASCIIEncoding enc = new ASCIIEncoding();
                byte[] dataToHash = enc.GetBytes(str);
                //Hash运算
                byte[] dataHashed = sha.ComputeHash(dataToHash);
                //将运算结果转换成string
                return BitConverter.ToString(dataHashed).Replace("-", "");
            }
    
            /// <summary>
            /// 创建随机字符串
            /// </summary>
            /// <returns></returns>
            private static string createNonceStr()
            {
                int length = 16;
                string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
                string str = "";
                Random rad = new Random();
                for (int i = 0; i < length; i++)
                {
                    str += chars.Substring(rad.Next(0, chars.Length - 1), 1);
                }
                return str;
            }
    
            /// <summary>  
            /// 将c# DateTime时间格式转换为Unix时间戳格式  
            /// </summary>  
            /// <param name="time">时间</param>  
            /// <returns>double</returns>  
            public static int ConvertDateTimeInt(DateTime time)
            {
                DateTime startTime = TimeZoneInfo.ConvertTimeToUtc(new DateTime(1970, 1, 1));
                //   DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
                return Convert.ToInt32((time - startTime).TotalSeconds);
            }

    Js请求

            $.ajax({
                type: "post",
                url: "/wechat/GetScanQRCodeSign",//自己填写请求地址
                data: { href: window.location.href },
                success: function (result) {
                    wx.config({
                        debug: true,
                        appId: result.appid,
                        timestamp: result.timestamp,
                        nonceStr: result.nonceStr,
                        signature: result.signature,
                        jsApiList: ['scanQRCode']
                    });
                }
            })
            wx.error(function (res) {
                console.log(res.errMsg);
            });
    
            wx.ready(function () {
                    wx.checkJsApi({
                        jsApiList: ['scanQRCode'],
                        success: function (res) {
                            console.log(res);
                        }
                    });
                    wx.scanQRCode({
                        needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
                        scanType: ["qrCode"], // 可以指定扫二维码还是一维码,默认二者都有
                        success: function (res) {
                            var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
                            alert(result);
                        }
                    });
                });

    由于微信公众号队access_token 以及票据每天请求有限制 刷新时间为俩小时,所以将票据及token写入在缓存中,有则直接签名,无则重新拉去请求,并且重新写入在缓存中

    遇到问题:签名无效,反复查证是签名的URL问题!!!此处划重点,签名的URL是是整个页面的URL,不是请求的控制器URL!!官方文档未描述清楚。


    本次使用到.NET CORE 2.2

    赞一个呗 0

    该篇文章所属“长情猫”原创所有,转载请注明本文链接

    已有 0 条评论