feat: 支付验签框架 — 策略模式 + 装饰器重试

- 新增 IPaymentVerifier 接口 (Verify + Consume),渠道无关
- 新增 PaymentVerifierFactory 按 Channel 分发
- 新增 FlexionPaymentVerifier: HTTP 验签 + 线性 backoff 重试
- 新增 DummyPaymentVerifier: 占位验签实现
- 新增 RetryablePaymentVerifier: 装饰器,流程级重试
- TYSdkFacade_Pay: PayResult 增加验签分支,先验签后消费再回调
- TYSdkModel: PaymentInfo 增加 verified 字段
- UnityBridgeFunc: 移除 ConsumeFlexionPurchase(职责收归 Verifier)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-11 11:25:20 +08:00
parent fd5ba9297d
commit de3ff3b7a4
5 changed files with 243 additions and 9 deletions

View File

@@ -128,7 +128,47 @@ namespace tysdk
}
return;
}
TYSDKCallbackManager.Instance.TryTriggerCallback(result);
var verifier = PaymentVerifierFactory.GetVerifier();
if (verifier != null && !string.IsNullOrEmpty(result.purchaseJson))
{
_VerifyPurchase(result, verifier);
}
else
{
TYSDKCallbackManager.Instance.TryTriggerCallback(result);
}
}
private async void _VerifyPurchase(PaymentInfo result, IPaymentVerifier verifier)
{
TYSDKCallbackManager.Instance.ResetCallbackTimeout<PaymentInfo>(TimeSpan.FromSeconds(60));
try
{
var verifyResult = await verifier.Verify(result);
if (verifyResult.success)
{
result.verified = true;
if (!string.IsNullOrEmpty(result.purchaseToken))
{
verifier.Consume(result.purchaseToken);
}
TYSDKCallbackManager.Instance.TryTriggerCallback(result);
}
else
{
Debug.LogWarning("[TYSdkFacade] Payment verification failed: " + verifyResult.msg);
result.code = "-1";
result.msg = "verification_failed: " + verifyResult.msg;
TYSDKCallbackManager.Instance.TryTriggerCallback(result);
}
}
catch (Exception e)
{
Debug.LogError("[TYSdkFacade] Verification exception: " + e.Message);
result.code = "-1";
result.msg = "verification_error: " + e.Message;
TYSDKCallbackManager.Instance.TryTriggerCallback(result);
}
}
public async Task<ProductListInfo> GetSKUList()