微信支付v3 Wechatpay-Serial错误

问题

添加分账接收方遇到了一个问题,需要对敏感字段加密解密,出现了Wechatpay-Serial不正确的问题

解决

安装SKIT.FlurlHttpClient.Wechat.TenpayV3
在这里插入图片描述

/// <summary>
/// 单例模式注入
/// 支付客户端
/// </summary>
public class PayClient
{
    public WechatTenpayClient Instance { get; private set; }

    /// <summary>
    /// 构造函数注入
    /// </summary>
    /// <param name="wechatConfig"></param>
    public PayClient(IOptions<ConfigModel> wechatConfig, CertificateManager manager)
    {
        var options = new WechatTenpayClientOptions()
        {
            MerchantId = wechatConfig.Value.MiniProgramMchid,
            MerchantV3Secret = wechatConfig.Value.MiniProgramMchApiKey,
            MerchantCertificateSerialNumber = wechatConfig.Value.MiniProgramMchNumber,
            MerchantCertificatePrivateKey = $"-----BEGIN PRIVATE KEY-----{wechatConfig.Value.MiniProgramMchPrivateKey}-----END PRIVATE KEY-----",
            PlatformCertificateManager = manager // 证书管理器的具体用法请参阅下文的高级技巧与加密、验签有关的章节
        };
        Instance = new WechatTenpayClient(options);
    }
}
/// <summary>
/// 获取微信平台的证书
/// </summary>
/// <returns></returns>
public async Task<CertificateEntry?> GetWechatPayCer()
{
    var client = PayClient.Instance;
    var cerList = client.PlatformCertificateManager.AllEntries();
    //证书存在直接返回
    foreach (var cer in cerList)
    {
        if (cer.IsAvailable())
        {
            return cer;
        }
    }
    //证书不存在则查询获取
    var request = new QueryCertificatesRequest();
    request.AlgorithmType = "RSA";
    var res= await client.ExecuteQueryCertificatesAsync(request);
    if (res.IsSuccessful())
    {
        //解密
        client.DecryptResponseSensitiveProperty(res);
        foreach (var tmpCer in res.CertificateList)
        {
            client.PlatformCertificateManager.AddEntry(new CertificateEntry("RSA",tmpCer.SerialNumber,tmpCer.EncryptCertificate.CipherText,tmpCer.EffectiveTime,tmpCer.ExpireTime));
        }
        return client.PlatformCertificateManager.AllEntries().FirstOrDefault();
    }
    return null;
}


/// <summary>
/// 添加分账接收方
/// </summary>
/// <param name="openid"></param>
/// <param name="isMch">是否是商户</param>
/// <param name="name">如果是商户号必填,商户全称</param>
/// <returns></returns>
public async Task<bool> AddShareOrderUser(string openid, bool isMch,string name="")
{
   var client = weChatMiniProgramPayClient.Instance;
   var appid = options.Value.MiniProgramAppId;
   //获取publickey
   var cer = await GetWechatPayCer();
   AddProfitSharingReceiverRequest request = new AddProfitSharingReceiverRequest();
   request.WechatpayCertificateSerialNumber = cer.Value.SerialNumber;
   request.AppId = appid;
   if (isMch)
   {
       request.Type = "MERCHANT_ID";
       request.Name = name;
   }
   else
   {
       request.Type = "PERSONAL_OPENID";
   }
   request.Account = openid;
   request.RelationType = "DISTRIBUTOR";
   if (isMch)
   {
       client.EncryptRequestSensitiveProperty(request);
   }
   var response = await client.ExecuteAddProfitSharingReceiverAsync(request);
   var result = response.IsSuccessful();
   if (result)
   {
       logger.LogWarning($"添加分账接收方成功:{openid}");
   }
   else
   {
       logger.LogWarning($"添加分账接收方失败:{openid},{response.ErrorCode},{response.ErrorMessage},入参:{JsonConvert.SerializeObject(request)}");
   }
   return result;
}

其他类似的接口也是一样

参考

添加分账接收方
https://pay.weixin.qq.com/docs/merchant/apis/profit-sharing/receivers/add-receiver.html
加密解密
https://pay.weixin.qq.com/docs/merchant/development/interface-rules/sensitive-data-encryption.html
解密
加密
要自己开发的话可以参考腾讯给的案例https://wechatpay-api.gitbook.io/wechatpay-api-v3/qian-ming-zhi-nan-1/qian-ming-sheng-cheng
在这里插入图片描述

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java后台微信支付V3微信支付提供的Java版本的SDK,可以用于在Java后台应用程序中集成微信支付功能。以下是使用Java后台微信支付V3的基本步骤: 1. 注册微信商户平台账号,获取商户号、API密钥和证书等信息。 2. 添加依赖 在build.gradle文件中添加以下依赖: ```java dependencies { implementation 'com.github.wechatpay-apiv3:wechatpay-apiv3-java:1.0.0' } ``` 3. 配置证书 将微信商户平台下载的证书文件,包括apiclient_cert.p12和apiclient_key.pem,放到项目的classpath路径下。 4. 初始化WechatPayHttpClientBuilder ```java WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create() .withMerchant(mchId, serialNo, privateKey) .withWechatpay(wechatpayCertificate); ``` 其中,mchId为商户号,serialNo为证书序列号,privateKey为商户私钥,wechatpayCertificate为微信支付平台证书。 5. 创建WechatPayService ```java WechatPayService wechatPayService = new WechatPayServiceImpl(builder.build()); ``` 6. 调用API 以统一下单API为例: ```java WechatPayUnifiedOrderRequest request = new WechatPayUnifiedOrderRequest.Builder() .notifyUrl("YOUR_NOTIFY_URL") .body("YOUR_BODY") .outTradeNo("YOUR_OUT_TRADE_NO") .totalAmount(1) .spbillCreateIp("YOUR_CLIENT_IP") .timeStart(LocalDateTime.now()) .timeExpire(LocalDateTime.now().plusMinutes(30)) .tradeType(WechatPayTradeType.JSAPI) .openid("YOUR_OPENID") .build(); WechatPayUnifiedOrderResponse response = wechatPayService.unifiedOrder(request); ``` 其中,notifyUrl为支付结果通知地址,body为商品描述,outTradeNo为商户订单号,totalAmount为订单金额,spbillCreateIp为客户端IP,timeStart为交易起始时间,timeExpire为交易结束时间,tradeType为交易类型,openid为用户标识。 7. 处理支付结果通知 当用户支付完成后,微信支付会向notifyUrl发送支付结果通知。开发者需要编写代码处理通知,并返回正确的响应。以下是处理通知的示例代码: ```java public String handleNotify(HttpServletRequest request) throws Exception { String body = IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8); String signature = request.getHeader("Wechatpay-Signature"); String timestamp = request.getHeader("Wechatpay-Timestamp"); String nonce = request.getHeader("Wechatpay-Nonce"); String serialNo = request.getHeader("Wechatpay-Serial"); WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create() .withMerchant(mchId, serialNo, privateKey) .withValidator(new WechatPay2Validator(wechatpayCertificate)); WechatPayService wechatPayService = new WechatPayServiceImpl(builder.build()); if (wechatPayService.verifyNotify(signature, timestamp, nonce, body)) { WechatPayNotify notify = wechatPayService.parseNotify(body); // 处理支付结果 return WechatPayNotifyResponse.success("OK"); } else { return WechatPayNotifyResponse.fail("Verify failure"); } } ``` 以上是使用Java后台微信支付V3的基本步骤,更多API和用法请参考官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

假装我不帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值