C#怎么实现微信支付_C# V3版API签名与回调处理【核心】

冰火之心

冰火之心

2026-04-27

987人浏览

原创

微信支付v3签名通不过90%因字符串拼接不规范、编码非utf-8或时间戳/随机串不匹配;须严格按“方法\n路径\n时间戳\n随机串\n请求体sha256”五段换行拼接,再用pkcs#8私钥rsa-sha256签名。

c#怎么实现微信支付_c# v3版api签名与回调处理【核心】

微信支付 V3 签名生成失败:GenerateSignature 怎么写才对

签名通不过,90% 是因为没严格按 V3 规则拼接字符串、没用 UTF-8 编码、或时间戳/随机串没对齐。V3 不是简单 HMAC-SHA256,它要求:HTTP 方法 + \n + 路径 + \n + 时间戳 + \n + 随机串 + \n + 请求体 SHA256(空请求体用空字符串),五段换行拼接后,再用商户私钥(PKCS#8 格式)做 RSA-SHA256 签名。

实操要点:

  • HttpClient 发请求前必须自己算签名,不能依赖第三方 SDK 的“自动签名”——很多老 SDK 只支持 V2
  • 时间戳必须用 DateTimeOffset.UtcNow.ToUnixTimeSeconds(),不是 DateTime.Now 或毫秒时间戳
  • 随机串推荐用 Convert.ToBase64String(RandomNumberGenerator.GetBytes(16)),避免特殊字符和长度不一致
  • 请求体(如 JSON)必须原样参与签名,不能格式化、不能带多余空格,且必须是 UTF-8 字节数组的 SHA256 哈希值(SHA256.HashData(Encoding.UTF8.GetBytes(body))
  • 私钥必须是 PKCS#8 格式(以 -----BEGIN PRIVATE KEY----- 开头),不是 PKCS#1(-----BEGIN RSA PRIVATE KEY-----)。用 OpenSSL 转换:openssl pkcs8 -topk8 -inform PEM -in apiclient_key.pem -outform PEM -nocrypt

回调验签总失败:为什么 VerifySignature 返回 false

微信回调的 WECHATPAY-SIGNATUREWECHATPAY-TIMESTAMPWECHATPAY-NONCEWECHATPAY-SERIAL 四个 header 必须全部提取,且 body 必须是原始未解析的字节流(不能先 ReadAsStringAsync() 再转 byte[],会破坏换行和编码)。

验签逻辑关键点:

  • 验签字符串拼接顺序是:时间戳 + \n + 随机串 + \n + 响应体(原始字节流的 UTF-8 字符串) + \n,注意末尾那个 \n 容易漏
  • 证书序列号(WECHATPAY-SERIAL)要用来查本地缓存的平台公钥;首次收到新序列号时,必须调用 /v3/certificates 接口下载并验证证书链,不能硬编码
  • 验签用的是微信平台公钥(RSA),不是你的商户私钥;公钥需从证书中提取:RSA.ImportFromPem(publicKeyPem),不能直接用 X509Certificate2.GetRSAPublicKey()(.NET Core 3.1+ 才安全)
  • 回调 body 必须用 HttpContext.Request.Body 同步读取一次,读完重置 position,否则后续模型绑定会失败

使用 HttpClient 调用微信接口时,如何管理证书和超时

V3 接口强制 HTTPS,且必须双向认证(客户端证书),但微信只要求上传商户证书(apiclient_cert.p12),不校验服务端证书链。别在 HttpClientHandler 里设 ServerCertificateCustomValidationCallback 去忽略证书错误——这反而会让微信拒绝连接。

微信公众平台开发入门教程 中文WORD版
微信公众平台开发入门教程 中文WORD版

由于微信的大热,为了更好的方便使用微信的用户查询一些信息,这篇文章是入门级的微信公众平台开发教程,需要的朋友可以参考下 这篇入门教程将引导你完成如下任务: 创建百度云平台应用启用微信公众平台开发模式获取订阅、文字、图片、语音、视频消息回复文本、图文及音乐消息程序开发

下载

正确做法:

  • apiclient_cert.p12 加载为 X509Certificate2,密码不能为空字符串(微信导出时若没设密码,填 " " 一个空格)
  • HttpClientHandler.ClientCertificates.Add(cert) 后,必须设置 HttpClientHandler.SslProtocols = SslProtocols.Tls12,微信不支持 TLS 1.0/1.1
  • 超时建议设为 25 秒(微信文档要求),用 new HttpClient(handler) { Timeout = TimeSpan.FromSeconds(25) },不要用 CancellationToken 替代
  • 不要复用同一个 HttpClient 实例去发不同商户的请求——证书是绑定到 handler 的,混用会导致签名错乱

NotifyResult 返回 200 却仍被重复回调:怎么幂等处理

微信回调不保证只推一次,200 响应后网络中断也会触发重试。不能只靠数据库 INSERT IGNORE 或唯一索引挡——订单可能已创建但支付状态未更新。

可靠幂等方案:

  • 回调解析出 resource.algorithmresource.ciphertextresource.nonceresource.associated_data 后,先解密得到原始通知(AES-GCM),再从中提取 out_trade_notransaction_id
  • out_trade_no 查库,如果订单已存在且 status == "SUCCESS",直接返回成功;如果不存在或状态非终态,再走完整支付结果处理流程
  • 解密失败、验签失败、字段缺失等异常,一律返回 401 或 500,微信会重试;返回 200 仅表示“我收到了,且业务上认可这次通知”
  • 强烈建议加 Redis 分布式锁:SET lock:out_trade_no:{outTradeNo} 1 EX 30 NX,防止集群下并发处理同一笔订单

最常被忽略的一点:微信回调 body 是加密的,你必须先解密才能拿到真实交易数据——跳过解密直接查 out_trade_no,等于没做验签,也拿不到真实金额和状态。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关文章

微信app下载
微信app下载

微信是一款手机通信软件,支持通过手机网络发送语音短信、视频、图片和文字。微信可以单聊及群聊,还能根据地理位置找到附近的人,带给大家全新的移动沟通体验,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

微信 c# 微信支付

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1109

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

2240

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

2130

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

2301

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

335

5

c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

2023.08.08

528

5

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

2023.08.31

1158

3

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

2024.03.13

556

8

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2024.03.14

1051

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Codebuddy 插件
Codebuddy 插件

共0课时 | 0人学习

秒哒微信小程序发布
秒哒微信小程序发布

共0课时 | 0人学习

腾讯元宝使用手册
腾讯元宝使用手册

共0课时 | 0人学习