.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'] }); }, }); },
后端进行签名验证返回结果