fix: enable sdk payment checkout providers

This commit is contained in:
xiong
2026-07-26 19:46:39 +08:00
parent 9a62f7b23a
commit f512e9d367
2 changed files with 100 additions and 8 deletions

View File

@@ -16,10 +16,7 @@ internal sealed class WechatPayProvider : IPaymentProvider
CreatePaymentProviderRequest request,
CancellationToken cancellationToken = default)
{
_ = BuildClient(account);
throw new PaymentProviderException(
"WeChat Pay SDK is configured; checkout call is enabled in the commerce checkout batch.",
"wechat_pay_checkout_not_enabled");
return CreatePaymentCoreAsync(account, request, cancellationToken);
}
public Task<PaymentNotificationResult> ParsePaymentNotificationAsync(
@@ -73,6 +70,59 @@ internal sealed class WechatPayProvider : IPaymentProvider
return WechatTenpayClientBuilder.Create(options).Build();
}
private async Task<CreatePaymentProviderResult> CreatePaymentCoreAsync(
PaymentProviderAccount account,
CreatePaymentProviderRequest request,
CancellationToken cancellationToken)
{
if (string.IsNullOrWhiteSpace(request.OpenId))
{
throw new PaymentProviderException("WeChat Pay JSAPI requires openId.", "wechat_pay_openid_required");
}
var client = BuildClient(account);
var appId = Required(account.ConfigPublic, "appId");
var wxRequest = new CreatePayTransactionJsapiRequest
{
AppId = appId,
Description = request.Subject,
OutTradeNumber = request.OrderNo,
NotifyUrl = request.NotifyUrl,
Amount = new CreatePayTransactionJsapiRequest.Types.Amount
{
Total = request.AmountCents
},
Payer = new CreatePayTransactionJsapiRequest.Types.Payer
{
OpenId = request.OpenId
}
};
var response = await client.ExecuteCreatePayTransactionJsapiAsync(wxRequest, cancellationToken);
if (!response.IsSuccessful())
{
throw new PaymentProviderException(
$"WeChat Pay create transaction failed: {response.ErrorCode}",
"wechat_pay_create_failed");
}
var clientPayload = JsonSerializer.SerializeToElement(
client.GenerateParametersForJsapiPayRequest(appId, response.PrepayId));
var rawPayload = JsonSerializer.SerializeToElement(new
{
response.PrepayId,
request.OrderNo,
request.AmountCents
});
return new CreatePaymentProviderResult(
Provider,
request.Method,
"pending",
null,
clientPayload,
rawPayload);
}
private static string Required(JsonElement element, params string[] keys)
{
if (element.ValueKind == JsonValueKind.Object)