微信支付服务商,![CDATA[sub_mch_id与sub_appid不匹配],微信小程序支付,签名错误,CDATA[签名错误]解决方法,支付签名验证失败

微信支付服务商,微信小程序支付,签名错误,CDATA[签名错误]解决方法

1:服务商和普通的商户支付在代码上没有太大差异(不同的是上传的参数,而且微信支付服务商参数上比较难找,官方文档又太简洁,所以很容易搞混),代码请请点击这里查看

2:先看几个比较重要而且容易搞混的参数
在这里插入图片描述

  1. 服务商的appid
    就是你注册成为服务商的公众号appid
  2. 商户号mch_id
    登录微信支付服务商平台可以查看。点我去查看
  3. 小程序的appid(sub_appid)
    登录微信公众平台可以查看。点我去查看
  4. 子商户号sub_mch_id
    登录微信支付服务商平台可以查看。点我去查看

3:一直报CDATA[签名错误]

  1. 这个问题大部分出在你的key值上面,这个是服务商的key,而不是在做普通商户支付里面用的那个key,不要搞混,否则会一直报签名错误。怎么去找呢?点击这里去查看
  2. 输入了正确的key值还是报签名错误?这个和微信支付有关,算个bug吧,你可以重置一两遍key值(领导或掌管秘钥的人不同意?这个可以重置成和原来一模一样的key值,不会对原来使用过此秘钥的地方产生影响。),就可以使用了。

4:再一个容易出错的地方就是二次加密,先看一下比较重要而且容易搞混的参数(相对于普通商户支付)
在这里插入图片描述

  1. 小程序id(appId)
    在微信支付服务商里,这里appId指的是服务商的appid,往上翻,在本文章第二部分有获取的方法。
  2. 拼接的key
    这里的key值代表微信支付服务商的key,而不是普通商户支付的key。往上翻,在本文章第三部分有获取的方法。

5:关于微信小程序调起支付需要的参数

  1. 我做的时候,小程序需要的参数,都是在二次加密(在后台进行的二次加密,然后返回)获取的。
  2. 二次加密需要的比较重要而且容易搞混的参数在第四部分(往上翻)已经说明了,代码请点击这里查看。更换成正确的参数即可。

6:关于支付签名验证失败

  1. 大部分出在二次加密的时候,往上翻,查看第四部分(二次加密),判断加密时参数是否使用错误。

7:![CDATA[sub_mch_id与sub_appid不匹配]

  1. 支付相关域名

在这里插入图片描述

  1. 特约商户APPID配置

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是一个简单的C#代码示例,用于与小程序进行微信支付的交互: ```csharp using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Web.Script.Serialization; using System.Xml; namespace WeChatPayDemo { public class WeChatPayHelper { //微信支付的API地址 private const string WECHAT_PAY_API = "https://api.mch.weixin.qq.com/pay/unifiedorder"; //微信支付商户号 private const string WECHAT_PAY_MCHID = "XXXXXXXXXXXX"; //微信支付密钥 private const string WECHAT_PAY_KEY = "XXXXXXXXXXXX"; //小程序的AppID private const string WECHAT_APPID = "XXXXXXXXXXXX"; //生成随机字符串 private static string GenerateNonceStr() { return Guid.NewGuid().ToString().Replace("-", "").Substring(0, 32); } //生成签名 private static string GenerateSign(Dictionary<string, string> data) { var list = data.ToList(); list.Sort((a, b) => string.Compare(a.Key, b.Key, StringComparison.Ordinal)); var builder = new StringBuilder(); foreach (var item in list) { if (!string.IsNullOrEmpty(item.Value)) { builder.Append(item.Key).Append('=').Append(item.Value).Append('&'); } } builder.Append("key=").Append(WECHAT_PAY_KEY); return MD5Helper.MD5(builder.ToString()).ToUpper(); } //生成XML数据 private static string GenerateXml(Dictionary<string, string> data) { var builder = new StringBuilder(); builder.Append("<xml>"); foreach (var item in data) { builder.Append("<").Append(item.Key).Append(">"); builder.Append("<![CDATA[").Append(item.Value).Append("]]>"); builder.Append("</").Append(item.Key).Append(">"); } builder.Append("</xml>"); return builder.ToString(); } //发送HTTP请求,并返回响应数据 private static string SendHttpRequest(string url, string data) { var request = WebRequest.CreateHttp(url); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; var bytes = Encoding.UTF8.GetBytes(data); request.ContentLength = bytes.Length; using (var stream = request.GetRequestStream()) { stream.Write(bytes, 0, bytes.Length); } var response = request.GetResponse(); using (var reader = new System.IO.StreamReader(response.GetResponseStream())) { return reader.ReadToEnd(); } } //生成微信支付订单信息,并返回给小程序端 public static string GenerateWeChatPayOrder(string openid, string orderId, int totalFee, string clientIP, string notifyUrl) { var nonceStr = GenerateNonceStr(); var timestamp = DateTime.Now.ToUniversalTime().ToString("yyyyMMddHHmmss"); var data = new Dictionary<string, string> { {"appid", WECHAT_APPID}, {"mch_id", WECHAT_PAY_MCHID}, {"nonce_str", nonceStr}, {"body", "测试商品"}, {"out_trade_no", orderId}, {"total_fee", (totalFee * 100).ToString()}, {"spbill_create_ip", clientIP}, {"notify_url", notifyUrl}, {"trade_type", "JSAPI"}, {"openid", openid}, {"sign_type", "MD5"}, {"time_start", timestamp}, {"time_expire", DateTime.Now.AddMinutes(30).ToUniversalTime().ToString("yyyyMMddHHmmss")}, }; data.Add("sign", GenerateSign(data)); var xml = GenerateXml(data); var responseXml = SendHttpRequest(WECHAT_PAY_API, xml); var doc = new XmlDocument(); doc.LoadXml(responseXml); var prepayId = doc.SelectSingleNode("/xml/prepay_id").InnerText; var package = $"prepay_id={prepayId}"; var data2 = new Dictionary<string, string> { {"appId", WECHAT_APPID}, {"nonceStr", nonceStr}, {"package", package}, {"signType", "MD5"}, {"timeStamp", timestamp}, }; data2.Add("paySign", GenerateSign(data2)); var serializer = new JavaScriptSerializer(); return serializer.Serialize(data2); } } } ``` 这是一个简单的示例,仅供参考。具体的实现方式可能会因为不同的业务需求而有所变化,可以根据实际情况进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一拖再拖 一拖再拖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值