微信小程序支付服务器端C#(.net 5)使用API v3密钥签名踩坑经历
由于官方没有提供 .net 的 SDK,所以都是自己在实现(https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay6_0.shtml)
签名代码复制自官方页面(https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay4_0.shtml),这里稍微做了一点调整,把直接 new HttpClient 改成在 Startup.cs 中注入 HttpClient。
Startup.cs
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient("WxpayHttpClient").AddHttpMessageHandler<HttpHandler>(); // 这里的 HttpHandler 就是官方示例里那个
}
}
调用端(WxpayHttpClient 这个命名要匹配)
public class WxpayService
{
private readonly HttpClient http;
private readonly WeixinSettings settings;
public WxpayService(IHttpClientFactory httpClientFactory, IOptions<WeixinSettings> weixinSettings)
{
http = httpClientFactory.CreateClient("WxpayHttpClient");
settings = weixinSettings.Value;
}
}
后来出现的问题:
- 一开始代码中使用 JsonContent.Create 创建 HttpContent 给 HttpClient 用,结果发现 HttpHandler 中使用 request.Content 读出来的内容都是没有值的(只有JSON键名),改成 StringContent 创建 HttpContent 则没有问题。
- 后来微信服务器返回 HTTP 400 错误,原来 HttpClient 没有提供默认的 Accept 和 UserAgent(https://pay.weixin.qq.com/wiki/doc/api_external/ch/faq/chapter1_5_1.shtml),在 HttpHandler 中补上了这两个 header 解决了问题。