微信小程序支付服务器端C#(.net 5)使用API v3密钥签名踩坑经历
发布于 1 年前 作者 taoduan 976 次浏览 来自 分享

由于官方没有提供 .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;
        }
        }

后来出现的问题:

  1. 一开始代码中使用 JsonContent.Create 创建 HttpContent 给 HttpClient 用,结果发现 HttpHandler 中使用 request.Content 读出来的内容都是没有值的(只有JSON键名),改成 StringContent 创建 HttpContent 则没有问题。
  2. 后来微信服务器返回 HTTP 400 错误,原来 HttpClient 没有提供默认的 Accept 和 UserAgent(https://pay.weixin.qq.com/wiki/doc/api_external/ch/faq/chapter1_5_1.shtml),在 HttpHandler 中补上了这两个 header 解决了问题。
回到顶部