c# 微信商家转账到零钱,最详细代码

微信小程序支付-多商户号绑定与切换实战 做过电商类小程序的朋友应该都遇到过这样的场景:你的平台上有多个商家入驻,每个商家都需要独立的收款账户。这时候如果只绑定一个微信支付商户号,所有钱都会进到同一个账户,后续分账会非常麻烦。我去年接手的一个生鲜电商项目就踩过这个坑——最初只接了一个商户号,结果每天要对账到凌晨两点。最近在给一个连锁品牌做支付系统升级,他们300多家门店各自需要独立商户号。关键是要在数据库设计阶段就考虑好多租户的场景,避免后期重构。特别提醒:如果小程序主体和商户号主体不一致,需要额外准备《联合运营承诺函》。遇到过审核被拒的情况? 阅读详情
AI摘要

该代码示例展示了如何使用C#调用微信支付API进行商户转账操作,包括查询转账详情和发起转账请求。关键点包括设置正确的请求参数、生成授权头以及处理加密签名。在查询转账时需注意参数`need_query_detail`和`detail_status`的正确设置。

 public class ShangJiaPayChange
    {
        public static string partner_trade_no { get; set; }

        public static string openId { get; set; }

        public static int amount { get; set; }

        public static string desc { get; set; }

        public static int guestType { get; set; }

        public static string AppId { get; set; }

        public static string mchid { get; set; }

        public static string serialNo { get; set; }

        public static string CerPath { get; set; }

        public static string QuaryMoneyDetail()
        {
            string url = "https://api.mch.weixin.qq.com/v3/transfer/batches/out-batch-no/"+partner_trade_no+ "?need_query_detail=True&detail_status=ALL";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            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";
            //Log.Info("发起开始申请商户转账到零钱请求", "发起请求1");
            string Authorization = GetAuthorization(url, "GET", string.Empty, mchid, serialNo);
           
            request.Headers.Add("Authorization", Authorization);
            LogHelper.Info("返回申请商户转账到零钱结果", url);
            //byte[] paramJsonBytes;
            //paramJsonBytes = System.Text.Encoding.UTF8.GetBytes(postData);
            //request.ContentLength = paramJsonBytes.Length;
            string reslut = "";
            HttpWebResponse wbResponse = (HttpWebResponse)request.GetResponse();
            using (Stream responseStream = wbResponse.GetResponseStream())
            {
                using (StreamReader sReader = new StreamReader(responseStream))
                {
                    reslut = sReader.ReadToEnd();
                }
            }
            return reslut;
        }

        public static string WithDrawsToWx()
        {
           

            //string partnerTradeNo = "xcx" + DateTime.Now.ToString("yyyyMMddHHmmfff");
            SortedDictionary<string, object> dic = new SortedDictionary<string, object>();
            dic.Add("appid", AppId);
            dic.Add("out_batch_no", partner_trade_no);
            dic.Add("batch_name", DateTime.Now.ToString("D") + "提现记录");
            dic.Add("batch_remark", DateTime.Now.ToString("D") + "提现记录");
            dic.Add("total_amount", amount);
            dic.Add("total_num", 1);

            List<object> list = new List<object>();
            SortedDictionary<string, object> dic1 = new SortedDictionary<string, object>();
            dic1.Add("out_detail_no", partner_trade_no);
            dic1.Add("transfer_amount", amount);
            dic1.Add("transfer_remark", desc);
            dic1.Add("openid", openId);

            list.Add(dic1);
            dic.Add("transfer_detail_list", list);

            var url = "https://api.mch.weixin.qq.com/v3/transfer/batches";

            
            string transactionsResponse = WxV3PostJson(url, Newtonsoft.Json.JsonConvert.SerializeObject(dic), mchid, serialNo);
          

            //Log.Info("商户转账到零钱返回:" , transactionsResponse);
            return transactionsResponse; 
        }



        public static string WxV3PostJson(string url, string postData, string mchId, string serialNo)
        {
           
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            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";
            //Log.Info("发起开始申请商户转账到零钱请求", "发起请求1");
            string Authorization = GetAuthorization(url, "POST", postData, mchId, serialNo);
            request.Headers.Add("Authorization", Authorization);
            //Log.Info("返回申请商户转账到零钱结果", Authorization);
            byte[] paramJsonBytes;
            paramJsonBytes = System.Text.Encoding.UTF8.GetBytes(postData);
            request.ContentLength = paramJsonBytes.Length;
            Stream writer;
            try
            {
                writer = request.GetRequestStream();
            }
            catch (Exception)
            {
                writer = null;
                Console.Write("连接服务器失败!");
            }
            writer.Write(paramJsonBytes, 0, paramJsonBytes.Length);
            writer.Close();
            HttpWebResponse response;
            try
            {
                response = (HttpWebResponse)request.GetResponse();
            }
            catch (WebException ex)
            {
                response = ex.Response as HttpWebResponse;
            }
            Stream resStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(resStream);
            string text = reader.ReadToEnd();
            return text;
        }

        protected static string GetAuthorization(string url, string method, string jsonParame, string mchId, string serialNo)
        {
            var uri = new Uri(url);
            string urlPath = uri.PathAndQuery;
            string nonce = Guid.NewGuid().ToString();
            var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
            //数据签名     HTTP请求方法\n接口地址的url\n请求时间戳\n请求随机串\n请求报文主体\n
            method = string.IsNullOrEmpty(method) ? "" : method;
            string message = string.Format("{0}\n{1}\n{2}\n{3}\n{4}\n", method, urlPath, timestamp, nonce, jsonParame);

            //Log.Info("请求message:", message);
            //string signTxt = Sign(message, privateKey);
            string signTxt = Sign(message);
            //Log.Info("返回签名:", signTxt);

            //Authorization和格式
            string authorzationTxt = string.Format("WECHATPAY2-SHA256-RSA2048 mchid=\"{0}\",nonce_str=\"{1}\",timestamp=\"{2}\",serial_no=\"{3}\",signature=\"{4}\"",
                mchId,
                nonce,
                timestamp,
                serialNo,
                signTxt
                );
            return authorzationTxt;

        }


        //protected static  string Sign(string message)
        //{
        //    // NOTE: 私钥不包括私钥文件起始的-----BEGIN PRIVATE KEY-----
        //    //        亦不包括结尾的-----END PRIVATE KEY-----
        //    string privateKey = "{你的私钥}";
        //    byte[] keyData = Convert.FromBase64String(privateKey);

        //    var rsa = RSA.Create();
        //    rsa.ImportPkcs8PrivateKey(keyData, out _);
        //    byte[] data = System.Text.Encoding.UTF8.GetBytes(message);
        //    return Convert.ToBase64String(rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1));
        //}

        protected static string Sign(string message)
        {
            //PASSWORD = "商户号"
            X509Certificate2 cert = new X509Certificate2(CerPath, mchid, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
            var privateKey = cert.PrivateKey.ToXmlString(true);
            var certSerialNo = cert.SerialNumber;
            using (RSACryptoServiceProvider sha256 = new RSACryptoServiceProvider())
            {
                byte[] dataInBytes = Encoding.UTF8.GetBytes(message);
                sha256.FromXmlString(privateKey);
                byte[] inArray = sha256.SignData(dataInBytes, CryptoConfig.MapNameToOID("SHA256"));
                string sign = Convert.ToBase64String(inArray);
                return sign;
            }
        }
    }

注意,查询的时候,https://api.mch.weixin.qq.com/v3/transfer/batches/out-batch-no/"+partner_trade_no+ "?need_query_detail=True&detail_status=ALL这个True,需要大写,我第一次的时候只有need_query_detail这一个参数,总是提示参数不正确,后来加上detail_status之后,好像就行了,大家注意一下!!!!

后续遇到一些加密的问题,或者Header缺少的问题可以访问:转账金额大于2000的问题

C#微信支付企业付款到零钱完整DEMO:证书与签名实现 资金流转是商户系统的核心能力,而向个人零钱转账则是分销返佣、活动奖励等场景的常见需求。微信支付企业付款到零钱接口为此提供了安全通道,它需要双向TLS证书认证与MD5签名来保障资金安全,与普通支付在技术原理上有明显差异。理解参数排序、证书加载与幂等查询等关键机制后,开发者便能应对API对接中的主要挑战。以C#后端为例,从商户配置、P12证书加载到HTTPS请求与结果解析,完整演示了该接口的落地过程,并梳理了高频报错与排查思路,为正在对接微信支付转账功能的工程师提供可直接参考的实践路径。 阅读详情

相关推荐

C#对接微信支付商家转账到零钱(企业付款)实战指南

在数字化支付场景中,接口签名与数据加密是保障资金安全的核心。C#开发者对接微信支付时,常遇到企业付款到零钱、商家转账等需求。本文基于微信支付v3接口,详解RSA-SHA256签名、AES-256-GCM回调解密、证书管理等关键技术,结合C#代码示例,演示从接口选型到转账调用、回调处理的完整流程,并总结金额单位、幂等性、回调验签等常见避坑点。适用于报销、返利、分销提成等真实业务场景,帮助开发者快速实现用户零钱打款功能,避免踩坑。

weixin_34199764的博客 241

c# 微信支付V3商家转账到零钱避坑宝典(一)

微信支付V3商家转账到零钱

Desire染指年华 3055

C# 微信支付商家转账到零钱:APIv3 签名、回调验签与幂等落地

APIv3 请求签名与回调验签是微信支付开放接口的安全基线,核心是用商户私钥对请求方法、路径、时间戳、随机串和请求体构造签名串并做 SHA256withRSA 签名,再以平台证书验签、APIv3 密钥解密回调资源。正确实现能降低 401/403、重复转账和状态不一致风险,在佣金发放、退款、活动奖励、分润等企业付款到零钱、商家转账到零钱场景中尤其关键;配合批次明细落库、唯一索引、幂等处理和主动查询兜底,C# 服务可把 Demo 逐步改造成可运维的转账链路。

weixin_33462167的博客 165

c# 微信支付V3商家转账到零钱避坑宝典(二)

上篇文章经过开通商家转账到零钱,以及设置安全证书,APIv3密钥,接下来访问接口,获取证书的key,以及授权,签名。

Desire染指年华 2278

C#微信企业付款到零钱实战:证书签名、避坑与生产级改造

企业支付接口的对接中,签名机制与双向证书认证是两大核心基础。开发者需要理解MD5签名算法如何保证参数不被篡改,以及客户端证书如何完成商户身份验证。这些原理不仅适用于微信付款,也广泛应用于各类支付API。在电商、分销返利等场景中,用户余额提现到微信零钱是高频需求,C#通过HttpClient可优雅地实现这一流程。从基础概念出发,逐步深入企业付款到零钱的完整请求链路,包括参数组装、证书加载、响应解析,并剖析常见错误码与频率限制。最后结合实际工程经验,讨论查单、幂等、对账等生产级设计,以及向新版商家转账的迁移思路

weixin_31309419的博客 218

C#微信支付V3实战:签名验签、回调解密与企业付款到零钱避坑

服务端集成支付接口时,RSA签名、证书体系与回调验签是保证交易数据真实性和完整性的关键。微信支付V3采用商户API私钥签名、平台证书验签的机制,配合APIv3密钥完成回调资源解密,只有理清这套流程才能稳定跑通下单、支付通知和转账业务。针对C#开发者,从最小可运行代码出发,讲解JSAPI/Native下单、支付回调解密验签,以及企业付款到零钱(V2 XML/MD5与V3商家转账)的实现路径,并结合金额单位、幂等单号、证书轮换等高频坑点给出工程化建议。理解签名、验签与密钥分层后,开发者可以快速定位问题并扩展退款

weixin_33585822的博客 340

C# .Net Core开发微信转账到零钱遇到的坑

首先,我要吐槽一下微信这些人办事的态度,真是不负责任,之前的【商家付款到零钱】用的好好的,强制换成这个东西,换了就换了吧,你把文档弄完善好吗,文档写的含糊不清,有些地方的链接点进去居然还是V2的东西,甚至404,我只能说呵呵了。

qq_40414697的博客 846

微信支付企业付款到零钱 C# 实战:签名、证书、回调幂等与对账

企业付款到零钱(商家转账到零钱)本质是支付链路中的出款能力:与统一下单的收款方向相反,请求需携带商户证书走双向 TLS,并按微信支付 v2 规则对非空字段做 ASCII 升序、排除 sign 后拼接 API 密钥,再以 MD5 或 HMAC-SHA256 生成签名。金额统一用整数分、XML 报文和证书加载是常见故障点;把签名原文、请求/响应报文与幂等落库、查询对账串起来,才能让佣金提现、分销返佣、活动奖励等场景稳定落地。围绕这些环节的 C# Demo 覆盖统一下单、企业付款到零钱/银行卡、回调验签与二次开发

weixin_34221654的博客 313

C# 微信转账到零钱

简介 用于企业向微信用户个人付款 ,支持向指定微信用户的openid付款。 适用场景 在拥有某小程序或公众号内的用户的openid情况下,完成企业微信你对指定用户完成转账的场景。 C# 代码 private const string mch_appid = ""; //商户账号的appid private const string mchid = ""; //商户号 private cons...

qq_41470939的博客 2750

C#微信支付企业付款到零钱:APIv3签名、状态机与幂等对账实践

资金类支付接口并非一次普通HTTP请求,而是围绕身份认证、数据加密、状态流转和幂等控制构建的工程链路。以微信支付APIv3为例,请求侧通过RSA-SHA256签名与平台证书加密敏感字段保证可信,回调侧依赖验签和AES-256-GCM解密确认事件真实,业务侧则以状态机跟踪受理、处理中、成功、失败与撤销,并通过商户单号实现重试幂等和日终对账。这套方法适用于佣金发放、报销、提现打款、批量转账及付款到银行卡等场景。落到C#微信支付企业付款到零钱DEMO,核心价值不在单个转账请求,而在签名、回调、状态查询、幂等与对账

weixin_31421613的博客 200

C#企业付款到零钱实战:核心参数、证书签名与避坑指南

支付接口对接中,资金转账与营销红包的语义差异往往被开发者忽略。理解转账的幂等性、商户证书双向认证及签名机制,是保证资金安全的关键。微信支付的企业付款到零钱接口适用于佣金结算、报销打款、返利分账等场景,其参数设计、证书加载和状态查询均有别于普通支付。针对C#后端开发,本文梳理了从接口语义、环境配置、MD5签名、证书认证到查单幂等控制的完整链路,并结合常见错误码(如SIGNERROR、CERT_ERROR、OPENID_ERROR)给出工程化解决方案,帮助开发者避开重复打款、单位混淆等隐蔽陷阱。

weixin_32183107的博客 59

微信支付商家转账对接全攻略:从企业付款到零钱到API v3实战

在资金分发场景中,平台向用户微信零钱转账是一项高频需求,常见于分销返佣、活动奖励与押金退还。这类操作依赖微信支付提供的资金转移能力,其底层接口经历了从旧版企业付款到零钱向新版商家转账的演进。新版基于API v3架构,采用RSA-SHA256签名与结构化批次明细管理,在安全性、回调完整性和参数规范性上显著提升。理解其签名原理、字段映射规则及回调验签机制,是后端开发正确接入的关键。该能力可广泛应用于返佣系统、奖励发放、余额提现及异常退款等业务。围绕商家转账的接口设计、幂等策略与异常处理,是支付系统稳定性的重要保

weixin_30357231的博客 350

微信企业付款到个人零钱 C#Demo

微信支付、企业支付、微信企业支付到个人,微信企业付款到零钱, 代码DEMO 供大家参考

商家付款到零钱,“{\“code\“:\“INVALID_REQUEST\“,\“message\“:\“此IP地址不允许调用该接口\\t\“}“

"{\"code\":\"INVALID_REQUEST\",\"message\":\"此IP地址不允许调用该接口\\t\"}"微信支付部分接口,需要配置ip验证白名单;配置之后的电脑可以调用。

天马3798 4635

微信支付-商家转账到零钱

微信提现到零钱功能既是商户号中"商家转账到零钱" PHP项目微信提现功能代码

c#微信支付、微信企业支付到个人,微信企业付款到零钱, 代码DEMO

微信支付、企业支付、微信企业支付到个人,微信企业付款到零钱, 代码DEMO 供大家参考 微信支付apiJSAPI支付 刷卡支付 扫码支付 订单退款 订单查询 退款查询 下载账单

微信付款到零钱v3接口

转载自:https://www.cnblogs.com/yuany69/p/16534912.html。微信付款到零钱v3接口C#版本。微信转账到零钱v3接口。

包子大叔的笔记 951

抖音私信卡片私信名片的原理分析

简单说一下它的功能吧:抖音私信卡片,解决了客户封号严重、引流效率低的痛点,所以从去年到现在,依然是热销品。"抖音快手私信名片链接跳转"是2022年抖音快手引流最新技术,可以生成卡片链接,支持标题、描述、logo以及跳转落地页的完全自定义配置.支持微信公众号和微信号复制唤起微信客户端app添加,同时也支持任意链接落地页跳转提高粉丝引流转化率,关注转化率,引流转化率,安全绿色私信卡片功能1、跳转微信用户点击卡片,自动跳转微信界面,显示好友和群聊二维码2、跳转链接用户点击卡片,自动跳转到指定链接,支持任意链接。3

m0_71385839的博客 5189

微信支付--商家转账到零钱

商家转账到零钱

胖胖的小只猪的博客 1371

通达信主力检测利器

主力轨迹:100*EMA(EMA(MTM,N1),N1)/EMA(EMA(ABS(MTM),N1),N1),COLORWHITE;主力拉高:IF(VAR51<REF(VAR51,1),VAR51,0),COLORYELLOW,NODRAW;洗盘:IF(VAR5<REF(VAR5,1),VAR5,0),COLOR000079,NODRAW;主力进场:IF(VAR5>REF(VAR5,1),VAR5,0),COLORRED,NODRAW;MAZL:MA(主力轨迹,N2),COLORYELLOW;

zhibiaogong的博客 7461

分位数映射数据后处理-Quantile Mapping后处理 (R语言)

统计后处理器基本上是统计模型,将观察到的关注变量与从气象或水文模型的直接模型输出(DMO)导出的适当预测变量相关联。统计后处理的重要性早已在气象预报中得到认可。早期的工作包括完善的预测(perfect prognosis),模型输出统计(MOS)和模拟方法(analog method)等模型。 近年来,已经提出了许多其他后处理方法,包括秩直方图校准(rank histogram calibrati...

水滴石穿,绳锯木断 1万+
上一篇: .NetCore 系统部署遇到的问题
下一篇: c# MVC利用LayUI导出数据
Little_Code
博客等级 码龄10年 62粉丝 77原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值