.net core 3.1 mvc 微信公众号开发所遇到的问题

 个人网站 https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index(扫码登陆)

 配置微信能访问到的地址(用的是natapp 官网 https://natapp.cn/article/natapp_newbie) 账号shanksliu 密码Natapp电话.

1登录公众号.进行相关的配置(一般进行了微信认证,接口权限都会有,个人的就很多没有权限)

①AppID唯一标识,AppSecret(自动生成),生成access_token需要用到不能泄露,与微信服务器验证,ip白名单(踩了一个坑,我设置了一个ip地址,然后后续微信服务器发消息过来我这边一直收不到)

②服务器地址:开发者的url,需微信服务器能够访问的(不能是本地的),进行绑定和后续微信发消息都是发到这个url中(绑定是get,发消息是post)

token 这个开发者服务器也需要保存,用来验证是否是微信服务器发过来的,消息加密秘钥和加密方式自己随意设置

2开发者服务器设置

在微信开发文档中的接入指南有详细步骤,这里就不细说了 (验证通过就可以进行后续的开发了)

       public string Test()
        {
            _logger.LogInformation("开始调试");
            var methodType = HttpContext.Request.Method;

            _logger.LogInformation(methodType);
            if (methodType.Contains("GET"))
            {
                var signature = HttpContext.Request.Query["signature"];
                var timestamp = HttpContext.Request.Query["timestamp"];
                var nonce = HttpContext.Request.Query["nonce"];
                var echostr = HttpContext.Request.Query["echostr"];
                var token = _configuration.Token;   //这个就是上面说的在微信配置的token
                SortedDictionary<string, string> sort = new SortedDictionary<string, string>();
                sort.Add("token", token);    
                sort.Add("timestamp", timestamp);
                sort.Add("nonce", nonce);
                var str = "";
                foreach (var item in sort.OrderBy(c => c.Value))
                {
                    str += item.Value;
                }
                SHA1 sHA1 = SHA1.Create();
                var hash = sHA1.ComputeHash(Encoding.UTF8.GetBytes(str));
                string shaStr = BitConverter.ToString(hash);
                shaStr = shaStr.Replace("-", "");
                if (signature == shaStr.ToLower())
                {
                    return echostr;
                }
                return "";
            }

3开发这接收微信发过来的消息,再按照一定格式返回

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>1348831860</CreateTime>
  <MsgType><![CDATA[text]]></MsgType>
  <Content><![CDATA[this is a test]]></Content>
  <MsgId>1234567890123456</MsgId>
</xml>

 

微信发过来的是这种格式,返回回去touser和fromusername要对调,然后返回的字符串不能有空格,不然也会报错

4 微信公众号返回时间格式不兼容

当后端返回的是时间格式,需要转换

var endTime = new Date(result.data.deadline);  //这是因为低版本的IE浏览器,和ios微信公众号 不能将‘yyyy-MM-dd’转换成日期格式,必须是‘yyyy/mm/dd’样式才行
var endTime = new Date(result.data.deadline.replace(/-/g, "/"));

 5 微信分享给好友,ios可以,安卓不可以

可能的情况andriod版本过低,微信分享的两个接口(老旧接口)都需要

获取“分享给朋友”按钮点击状态及自定义分享内容接口(即将废弃)
wx.onMenuShareAppMessage({
  title: '', // 分享标题
  desc: '', // 分享描述
  link: '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
  imgUrl: '', // 分享图标
  type: '', // 分享类型,music、video或link,不填默认为link
  dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
  success: function () {
    // 用户点击了分享后执行的回调函数
  }
});

自定义“分享给朋友”及“分享到QQ”按钮的分享内容(1.4.0)

wx.ready(function () {   //需在用户可能点击分享按钮前就先调用
  wx.updateAppMessageShareData({ 
    title: '', // 分享标题
    desc: '', // 分享描述
    link: '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
    imgUrl: '', // 分享图标
    success: function () {
      // 设置成功
    }
  })
}); 
 wx.config({
          debug: false,
          appId: res.appId,
          timestamp: res.timestamp,
          nonceStr: res.nonceStr,
          signature: res.signature,
          jsApiList: ['updateAppMessageShareData','onMenuShareAppMessage']
          });

 网页调用微信支付

wx.chooseWXPay({
                                    timestamp: res.data["timeStamp"], // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
                                    nonceStr: res.data["nonceStr"], // 支付签名随机串,不长于 32 位
                                    package: res.data["package"], // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
                                    signType: 'MD5', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
                                    paySign: res.data["paySign"], // 支付签名
                                    success: function (res) {
                                       
                                        setTimeout(function () {
                                            var href = "pay_success?price=" + _this.courseInfo.Price;
                                            window.location.href = href;
                                        }, 5000);


                                    }
                                });
WeChatLoad() {
                    var pageURL = window.location.href;
                    $.ajax({
                        async: false,
                        type: "POST",
                        url: '/Home/InterfacePermissionConfiguration',
                        dataType: 'JSON',
                        data: { url: pageURL },
                        success: function (res) {
                            wx.config({
                                debug: false,
                                appId: res.appId,
                                timestamp: res.timestamp,
                                nonceStr: res.nonceStr,
                                signature: res.signature,
                                jsApiList: ['chooseWXPay']
                            });
                        },
                    });
                },

 后端进行签名验证返回结果

 

 

 

 

posted @ 2020-09-18 16:29  青兰柳  阅读(456)  评论(0编辑  收藏  举报