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


    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']
                                });
                            },
                        });
                    },

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

     

     

  • 相关阅读:
    DHT(Distributed Hash Table) Translator
    Introducing shard translator
    【转】shell脚本中echo显示内容带颜色
    javac 错误: 编码GBK的不可映射字符
    一致性哈希(consistent hashing)
    在bash shell中使用getfattr查看文件扩展属性
    css3在不同型号手机浏览器上的兼容一览表
    META是什么意思?
    JS异步加载的三种方式
    AJAX中的同步加载与异步加载
  • 原文地址:https://www.cnblogs.com/carlpeng/p/13691990.html
Copyright © 2020-2023  润新知