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);

这样,就成功发出申请了

相关推荐
黄金小码农5 小时前
c# 2025/2/19 周三
c#
susan花雨7 小时前
C#发送邮件
c#
※※冰馨※※7 小时前
【C#】无法安装程序包“DotSpatial.Symbology 4.0.656”
windows·microsoft·c#
不会编程的程序員9 小时前
C# 语法 vs. C++ 语法:全面对比与核心区别解析
开发语言·c++·c#
小张-森林人10 小时前
当C#邂逅Deepseek, 或.net界面集成deepseek
开发语言·人工智能·c#
亚历山大海11 小时前
uniapp基于JSSDK 开发微信支付(php后端)
微信·uni-app·php
yuanpan11 小时前
23种设计模式之《单例模式(Singleton)》在c#中的应用及理解
单例模式·设计模式·c#
未来之窗软件服务14 小时前
c#自动更新-源码
服务器·网络·c#
MasterNeverDown15 小时前
在WPF中实现窗口拖拽功能:打造自定义交互体验
开发语言·c#
czwy16 小时前
RFID实践——.NET IoT程序读取高频RFID卡/标签
c#·rfid·iot·raspberry pi