c# 微信商户转零钱 金额大于2000 遇到的问题

金额大于2000,提示缺少 Headers 中的 Wechatpay-Serial

这个,我们需要访问一下微信的接口,来获取到这个序列号 直接上代码

cs 复制代码
 public static string GetWechatpay_Serial()
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api.mch.weixin.qq.com/v3/certificates");
            request.Method = "GET";
            request.ContentType = "application/json;charset=UTF-8";
            request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36";
            request.Accept = "application/json";
            string Authorization = GetAuthorization("https://api.mch.weixin.qq.com/v3/certificates", "GET", "", mchid, serialNo);
            request.Headers.Add("Authorization", Authorization);
            //request.Headers.Add("User-Agent", "https://zh.wikipedia.org/wiki/User_agent");
            //request.Headers.Add("Accept", "application/json");

            string reslut = "";
            HttpWebResponse wbResponse = (HttpWebResponse)request.GetResponse();
            using (Stream responseStream = wbResponse.GetResponseStream())
            {
                using (StreamReader sReader = new StreamReader(responseStream))
                {
                    reslut = sReader.ReadToEnd();
                }
            }
            return reslut;

        }

这里面的 商户id 和商户的序列号,自己替换哈

获取内容后,返回的内容中,会有一个序列号,

接上篇文章中的 https://blog.csdn.net/Little_Code/article/details/130243211 WxV3PostJson,添加这个代码

cs 复制代码
 request.Headers.Add("Wechatpay-Serial", "刚刚的序列号");

这个时候,会提示,需要某些信息加密

然后就用到了这个代码

cs 复制代码
private string ALGORITHM = "AES/GCM/NoPadding";
        private  int TAG_LENGTH_BIT = 128;
        private  int NONCE_LENGTH_BYTE = 12;
        //APIV3  密钥   
        private  string AES_KEY = "APIV3密钥";//我这边用的V3,如果你是V2可能就是V2的密钥

        public  string AesGcmDecrypt(string associatedData, string nonce, string ciphertext)
        {
            GcmBlockCipher gcmBlockCipher = new GcmBlockCipher(new AesEngine());
            AeadParameters aeadParameters = new AeadParameters(
                new KeyParameter(Encoding.UTF8.GetBytes(AES_KEY)),
                128,
                Encoding.UTF8.GetBytes(nonce),
                Encoding.UTF8.GetBytes(associatedData));
            gcmBlockCipher.Init(false, aeadParameters);
            byte[] data = Convert.FromBase64String(ciphertext);
            byte[] plaintext = new byte[gcmBlockCipher.GetOutputSize(data.Length)];
            int length = gcmBlockCipher.ProcessBytes(data, 0, data.Length, plaintext, 0);
            gcmBlockCipher.DoFinal(plaintext, length);
            return Encoding.UTF8.GetString(plaintext);
        }

这个方法中的 参数,就是GetWechatpay_Serial(),这个方法返回的数据,然后放进去进行解密,解密得到的就是这样一串 ------BEGIN CEFT...这样一串公钥,拿着这个公钥,对用户的名称等信息进行加密

cs 复制代码
public static string RSAEncrypt(string text, byte[] publicKey)
        {
            using (var x509 = new X509Certificate2(publicKey))
            {
                using (var rsa = (RSACryptoServiceProvider)x509.PublicKey.Key)
                {
                    var buff = rsa.Encrypt(Encoding.UTF8.GetBytes(text), true);

                    return Convert.ToBase64String(buff);
                }
            }
        }

最后 使用这个方法:

cs 复制代码
 string jiami = RSAEncrypt(user_name, System.Text.Encoding.UTF8.GetBytes(publicKey.Replace("-----BEGIN CERTIFICATE-----", "").Replace("-----END CERTIFICATE-----", "").Replace("\n", "")));
            //publickKey.Replace("-----BEGIN CERTIFICATE-----", "") .Replace("-----END CERTIFICATE-----", "").Replace("\n", "")
            dic1.Add("user_name", jiami);

这样,就成功发出申请了

相关推荐
ISDF-工软未来4 小时前
C# 泛型简单案例
c#
疯狂的维修7 小时前
C#中一段程序类比博图
c#
时光追逐者8 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 53 期(2025年9.1-9.7)
c#·.net·.netcore
冷冷的菜哥8 小时前
ASP.NET Core使用MailKit发送邮件
后端·c#·asp.net·发送邮件·mailkit
weixin_447103589 小时前
C#之LINQ
c#·linq
ysn111119 小时前
反编译分析C#闭包
c#
one99612 小时前
WPF应用程序中的异常处理
c#·.net·wpf
almighty2712 小时前
C# ObjectListView实现树状文件夹浏览
c#·树状图·objectlistview·c#树状图·文件显示
ccut 第一混19 小时前
c# 调用basler 相机
c#·halcon·basler
TomCode先生19 小时前
c#动态树形表达式详解
开发语言·c#