JeffreySu / WeiXinMPSDK

微信全平台 .NET SDK, Senparc.Weixin for C#,支持 .NET Framework 及 .NET Core、.NET 8.0。已支持微信公众号、小程序、小游戏、微信支付、企业微信/企业号、开放平台、JSSDK、微信周边等全平台。 WeChat SDK for C#.
https://weixin.senparc.com
Apache License 2.0
8.33k stars 4.34k forks source link

HTTP header缺少微信支付平台证书序列号(Wechatpay-Serial) #2654

Open 149392914 opened 2 years ago

149392914 commented 2 years ago

此版块专为反馈 bug 及提交需求服务,不负责解答开发问题,请勿发表开发问题, 如果您需要这方面的帮助,请移步问答社区https://weixin.senparc.com/QA

问题描述

微信支付v3需要对敏感字段加密,例如分账个人接收方姓名,但是目前好像没有对应的加密过程 如果自行进行加密,又发现需要传Wechatpay-Serial,否则会提示如下信息: HTTP header缺少微信支付平台证书序列号(Wechatpay-Serial)

这个问题目前有没有解决办法?

JeffreySu commented 2 years ago

Wechatpay-Serial 目前是会自动写入的,麻烦按照 issue 模板发一下文档等内容,方便大家同步信息,然后测试或者讨论。

149392914 commented 2 years ago

此版块专为反馈 bug 及提交需求服务,不负责解答开发问题,请勿发表开发问题, 如果您需要这方面的帮助,请移步问答社区https://weixin.senparc.com/QA

问题描述

微信支付v3需要对敏感字段加密,例如分账个人接收方姓名,但是目前好像没有对应的加密过程 如果自行进行加密,又发现需要传Wechatpay-Serial,否则会提示如下信息: HTTP header缺少微信支付平台证书序列号(Wechatpay-Serial)

这个问题目前有没有解决办法?

重现问题步骤(如果可以)
  1. ...
  2. ...
微信官方文档 URL

https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_1_8.shtml

微信官方文档快照(直接复制关键内容到下方)

分账接收方类型是MERCHANT_ID时,是商户全称(必传),当商户是小微商户或个体户时,是开户人姓名 分账接收方类型是PERSONAL_OPENID时,是个人姓名(选传,传则校验) 1、此字段需要加密,加密方法详见:敏感信息加密说明 2、使用微信支付平台证书中的公钥:获取平台证书 3、使用RSAES-OAEP算法进行加密 4、将请求中HTTP头部的Wechatpay-Serial设置为证书序列号 示例值:hu89ohu89ohu89o

发现问题的模块
模块对应的 .net 版本
开发环境
缓存环境
系统环境
联系方式

Email:

(也可将问题地址及联系方式发送到 www.jeffrey.su@gmail.com)

发布问题后,请保持对 issue 的关注,有时会有需要进一步沟通的信息,很长时间内没有得到答复的 issue 将被关闭。

149392914 commented 2 years ago

Wechatpay-Serial 目前是会自动写入的,麻烦按照 issue 模板发一下文档等内容,方便大家同步信息,然后测试或者讨论。

目前看到最终请求的类是 Senparc.Weixin.TenPayV3.TenPayApiRequest,里面并无设置Wechatpay-Serial 相关头的过程,(注,这里是指请求头)

//TODO:此处重构使用ISenparcWeixinSettingForTenpayV3
TenPayHttpHandler httpHandler = new(_tenpayV3Setting);

//创建 HttpClient
HttpClient client = new HttpClient(httpHandler);//TODO: 有资源消耗和效率问题
//设置超时时间
client.Timeout = TimeSpan.FromMilliseconds(timeOut);

//设置 HTTP 请求头
SetHeader(client);
/// <summary>
/// 设置 HTTP 请求头
/// </summary>
/// <param name="client"></param>
public void SetHeader(HttpClient client)
{
    //ACCEPT header
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));

    //User-Agent header
    var userAgentValues = UserAgentValues.Instance;
    client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("Senparc.Weixin.TenPayV3-C#", userAgentValues.TenPayV3Version));
    client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue($"(Senparc.Weixin {userAgentValues.SenparcWeixinVersion})"));
    client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue(".NET", userAgentValues.RuntimeVersion));
    client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue($"({userAgentValues.OSVersion})"));
}