微信支付签名需严格按文档字段顺序拼接并MD5/HMAC-SHA256加密,注意URL编解码、nonce_str为ASCII、密钥为32位商户key;jsapi_ticket与access_token须内存+Redis缓存并提前刷新;扫码支付FAIL需查Content-Type、UTF-8无BOM、spbill_create_ip及金额单位;p12证书须用密码加载字节数组且避免硬编码路径。

微信支付签名怎么算才不被拒
微信支付所有接口都要求对参数做 MD5 或 HMAC-SHA256 签名,签名错一个字符(比如空格、字段顺序、未参与签名的字段混入)就会返回 "INVALID_SIGNATURE"。C# 里最容易出问题的是字符串拼接逻辑和编码处理。
- 必须严格按微信文档字段顺序拼接,
appid、mch_id、nonce_str、body……不能漏、不能多、不能换序 -
nonce_str要用纯 ASCII 字符生成(推荐Guid.NewGuid().ToString("N")),别用中文或 Unicode 字符 - 签名前所有参数值要 URL 解码(
WebUtility.UrlDecode),但签名后发请求时再 URL 编码 —— 微信这一步是反直觉的 - 密钥
key是商户平台后台设置的 32 位字符串,不是 API 证书密码,也不是 APIv3 的私钥
JSAPI 支付的 jsapi_ticket 和 access_token 怎么安全缓存
JSAPI 支付前端调起 WXJSSDK 需要 jsapi_ticket,它依赖 access_token,两者有效期都是 2 小时,且调用微信 OAuth2 接口有频次限制。直接每次请求都去拉取,很快触发限流并导致支付失败。
- 必须本地内存缓存(如
MemoryCache),并设置绝对过期时间 + 滑动过期(建议提前 5 分钟刷新) - 不要用
HttpContext.Cache(.NET Core 已废弃),也不要存 Session 或 Cookie - 多个服务器部署时,需用 Redis 同步缓存,否则各节点 ticket 不一致,签名会失败
- 首次获取失败时别静默重试 —— 检查
appid和secret是否配错,错误响应是{"errcode":40013,"errmsg":"invalid appid"}
扫码支付返回 result_code=FAIL 但没 err_code 怎么排查
扫码支付统一下单接口返回 XML,常见是 ,但里面没有具体错误码,只有一句“签名错误”或空内容。根本原因通常是请求体构造不合规,而非签名本身。
- 检查 HTTP 请求头:
Content-Type必须是application/xml,不能是text/xml或缺失 - XML 必须以 UTF-8 无 BOM 编码发送,用
Encoding.UTF8构造StringWriter,别用Encoding.Default -
spbill_create_ip必须填真实公网 IP(不是127.0.0.1或内网地址),否则返回 FAIL 且无提示 - 金额单位是分,
total_fee必须是整数字符串(如"100"),不能带小数点或逗号
.NET Core 中如何安全加载微信 API 证书(p12)
JSAPI 和 Native 支付的退款、查询等敏感接口需要双向证书认证,微信提供的是 apiclient_cert.p12 文件。C# 加载不当会导致 "The request was aborted: Could not create SSL/TLS secure channel."。
- 用
X509Certificate2构造函数加载时,第二个参数必须传入 p12 文件的密码(商户平台下载时设置的),不能留空或传错 - 证书必须导入到当前用户或机器的证书存储区才能用于 HttpClient —— 更稳妥的做法是直接用字节数组初始化,避免权限问题
- 别把 p12 文件放在 wwwroot 下,也不要在代码里硬编码路径;用
IWebHostEnvironment.ContentRootPath拼接,并设文件权限为仅读 - 证书有效期为一年,到期前 15 天微信会邮件提醒,但不会自动续期 —— 过期后所有带证书的接口全部 401
微信支付最麻烦的不是写代码,是调试时看不到完整链路:签名、IP、证书、缓存、编码,任一环在不同环境表现不一致。尤其上线后复现问题,得靠日志把每一步原始请求/响应全打出来,不然光看错误码基本等于盲猜。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










