GH GambleHub

部分和完整refands

TL;DR

Refand是取回和的逆运算。完全关闭事务整体,部分返回部分(可能是部分到完整系列)。至关重要的是:从源头到源头,严格的幂等性,原因日志以及与网络包/撤退的编排。我们测量Refund Rate,TtR p95,Refund Error,并通过自动对账消除双打/不匹配。

1)术语和原则差异

Full Refund-返回所有已记录的金额('refund_amount=capture_amount')。
Partial Refund-返回部分('0 <refund_amount <capture_amount'),允许其余部分到总计"capture_amount"。
回收来源-退回原始支付方法/轨道(监管优先级/强制性)。
Void-取消捕获(如果受导轨支撑),不被视为重构。
Reversal/Chargeback-主动性之外的银行/铁路机械师(争议、充电器)-不要与重构溷淆。

2)何时发出完整的vs部分

完整(完整):
  • 取消整个订单/服务,重复注销,系统错误。
  • 在提供服务失败时具有约束力(根据消费者/监管机构的规则)。
部分(部分):
  • 部分取消服务,按比例调整(折扣,延迟补偿)。
  • 导轨技术限制(每次操作的最大金额)是零件系列。
  • 事后扣留佣金(在监管上允许)在iGaming中较少见。
解决方桉:缝合矩阵'reason_code × method × jurisdiction' → policy=fullpartialboth,限制,必要的批准水平。

3)政策与限制

Refund-to-source=默认为true;例外-通过MLRO/合规案例(已定义)。
切断:自捕获以来的N天允许反射(通过方法/管辖权)。
Max Partial Count:在支付上不超过K partial(典型的K ≤ 5)。
Min Partial Amount: 不低于铁路/PSP的技术最低限度。

Approval Matrix:

札幌代理:partial ≤ X, full ≤ Y。
经理/财务:超过限额,跨方法例外。
冷静地进行反复尝试(反演练)。

4)体系结构和事件流

组件:
  • Payment Orchestrator是状态真理的来源。
  • Refund Service-API,幂等,Retrais编排,日志。
  • PSP适配器-方法集成。
  • Reconciliation-自动对账,DLQ和校正。
  • Ledger/Accounting-接线,代数,清算对齐。
  • 风险/合规性-在有争议的情况下进行制裁/SoF检查。
序列(partial/full):

1. `Refund.Create '(API) →验证(限制、残差、策略、KYC/SoF(如有必要)。

2.Генерация idempotency_key (`hash(payment_id + refund_amount + reason + nonce)`).

3.PSP呼叫→ "PENDING"状态。

4.Webhook/polling → "SUCCESS"/"FAILED";超时-使用相同键的转发。

5.该活动的发布在Kafka → Ledger,BI,Alerta。

6.自动对账:将"provider_refund_id"映射到注册表。

5)相同性和反双打

相同的重构不能归功于两次:所有逻辑都通过idempotency storage (KV/Redis+TTL)。
payment_id × amount × reason上的密钥(以及必要时的"partial_index")。
Retrai使用相同的密钥。
并行分区在总和的aggregate上受到row-level locks/optimistic版本的保护。

伪代码:
python def refund(payment_id, amount, reason, idem_key):
if idem_store. exists(idem_key): return idem_store. get(idem_key)
with tx():
p = db. get_payment(payment_id, for_update=True)
assert p. captured_amount - p. refunded_amount >= amount > 0 r = p. create_refund(amount, reason, status='PENDING', idem_key=idem_key)
resp = psp. refund(p. provider_txid, amount, idem_key)
return finalize(r, resp. status, resp. ext_id)

6)数据模型(最低限度)

json
{
"payment_id": "pay_123",
"captured_amount": 150. 00,
"currency": "EUR",
"refunded_amount": 40. 00,
"refunds": [
{
"refund_id": "rf_001",
"type": "partial    full",
"amount": 20. 00,
"reason_code": "PARTIAL_SERVICE",
"idempotency_key": "idem_a1",
"status": "PENDING    SUCCESS    FAILED",
"provider_refund_id": "psp_rf_9xz",
"created_at": "2025-11-03T12:00:00Z",
"credited_at": "2025-11-03T15:05:00Z",
"notes": "ticket #456"
}
],
"flags": {
"refund_to_source": true,
"jurisdiction": "EEA",
"kyc_tier_required": "tier2"
}
}

7)支付轨道功能

卡(Visa/万事达卡)

支持full/partial;通常有几个部分;TtR取决于客户的银行(T+1…… T+5 b.d.)。
成功的Webhooks来得很快,但是出院的入学人数可能会滞后→我们在札幌模板中解释。

A2A/Open Banking/RTP

通常是即时回报(反向/信用推动);一些提供商仅支持全部或1个部分。
严格绑定到源帐户;refund-to-source是必需的。

电子钱包

普通的全部/部分;TtR分钟;部分数量和最低金额的限制。

凭证/预付款

通常,背包到源不可用→策略:退回到内部钱包或重置凭证(如果提供者知道如何)。要求遵守条款。

Crypto

铁轨-波动;优选不用作重新设计方法。如果允许:返回具有记录的汇率和佣金的同一地址/交易所;AML筛选。

8)会计,对账和财务

Ledger:捕获时的"DR Revenue/CR Cash"布线;refund-反向记录。分区按比例反映。
Recognition:在iGaming中,refand减少了相应周期的GGR(帐户策略)。
Reconciliation:每日对账'merchant_refund_id ↔ provider_refund_id'、状态、金额、FX课程。
FX:在适用的情况下捕获课程逻辑(捕获时间或返还时间);保持光栅。

9)KPI,目标和Alerta(Refund Health)

Refund Rate='Refunded_Tx/ Captured_Tx'(分段:出于原因)。

Refund Amount Ratio = `Refunded_Amount / Captured_Amount`.

TtR p95=p95('credited_at-created_at')通过方法。

Refund Error Rate = `Failed / Attempted` (<0.3%).

Refund-to-Source% ≥ 95%(可用)。

Double Refund Incidents = 0.

Alerts:
  • "TtR p95"通过→ P2方法高于SLO。
  • 在单个提供商/BIN → P1中通过"返还率"进行拼写(检查捕获/双打)。
  • 任何'Double Refund> 0' → P0(立即冻结自动重建)。

10) SQL切片

10.1 Refands配置文件

sql
SELECT
DATE_TRUNC('day', r. created_at) AS d,
method_code, provider,
COUNT() FILTER (WHERE r. status='SUCCESS')  AS refunds_ok,
COUNT() FILTER (WHERE r. status='FAILED')  AS refunds_fail,
SUM(r. amount) AS refunded_amount,
PERCENTILE_CONT(0. 95) WITHIN GROUP (ORDER BY EXTRACT(EPOCH FROM (r. credited_at - r. created_at))) AS ttr_p95_sec
FROM refunds r
JOIN payments p ON p. payment_id = r. payment_id
GROUP BY 1,2,3;

10.2部分余额控制

sql
SELECT p. payment_id,
p. captured_amount,
SUM(r. amount) AS refunded_sum,
(p. captured_amount - SUM(r. amount)) AS refundable_left
FROM payments p
LEFT JOIN refunds r ON r. payment_id = p. payment_id AND r. status IN ('SUCCESS','PENDING')
GROUP BY 1,2
HAVING (p. captured_amount - SUM(r. amount)) < 0;

11) UX和sapport

按方法划分的消息模板:地图解释可能的出院延迟,A2A几乎瞬间。
内阁状态:"正式→处理→返回";显示预期的入学日期。
原因(reason_code)是人为的:"重复注销","取消服务","部分补偿"。
自助服务部分-安全只有限制和明确的规则。

12)风险和合规性

反洗钱:反洗钱不应成为替代渠道的结果;使用MLRO批准记录例外情况。
制裁/RER:在以"红色"帐户/详细信息启动的退款时-强制性检查。
DSAR/Retention:作为存储策略的一部分存储重构痕迹。
当地规则:退货的时间和顺序(例如消费者法规)-反映在政策中。

13)频繁的错误以及如何避免错误

由于缺乏幂等性和重复的webhook而导致的双重反射,→存储idem键/状态,检查残留物。
Partial>其余部分→ row-lock/optimistic版本和严格的检查。
未经合规许可,跨方法返还→违反返还源。
报告中的void和refund混合→ KPI失真。
PSP和您的主人之间没有自动焊接→"黑洞"。

14)花花公子

提供商退货激增→检查授权故障/捕获双打,启用收件人,与PSP联系。
大规模的党派补偿(运动)→提高党派限额,包括团体操作,加强对账。
Webhook错误→切换到polling,增加TTL的等效性,延迟自动重构。
反向来源排除(很少)→ MLRO升级,有记录的付款和标记"comp_approved=true"。

15)测试桉例(UAT/Prod)

1.一次捕获后完全退款→正确地将剩余部分归零。
2.Partial系列(3 ×)→捕获≤总和;然后是剩下的全部。
3.相同性:重复同一请求→ 1个结果。
4.Webhook-drebesg: 3个相同的通知→一个注销/登记。
5.钻孔:人工模拟测验→警报和自动校正。
6.权限限制:代理不能超过分区限制。
7.切断:尝试后期重构→正确故障和拼写。

16)实施控制清单

  • 关于司法管辖区/方法的完整/部分+返还源政策。
  • DLQ的Idempotity,retrai,webhooks和polling。
  • 返回和reason_code余数据模型。
  • Ledger和每日汽车对账。
  • KPI/dashbord: Refund Rate, TtR, Error, Double Refund=0.
  • 权限和应用矩阵,札幌模式。
  • UAT测试桉例和Prod Level Alerta。

总结

Refands管理是严格的流程学科:从源到源的再融资,相等性,透明的数据模型,自动对账和可理解的部分/完整策略。有了这些基本知识,您将TtR保持在较低水平,错误-为零,双打-不可能,合规性和财务-与业务目标同步。

Contact

联系我们

如需任何咨询或支持,请随时联系我们。我们随时准备提供帮助!

Telegram
@Gamble_GC
开始集成

Email — 必填。Telegram 或 WhatsApp — 可选

您的姓名 可选
Email 可选
主题 可选
消息内容 可选
Telegram 可选
@
如果填写 Telegram,我们也会在 Telegram 回复您。
WhatsApp 可选
格式:+国家代码 + 号码(例如:+86XXXXXXXXX)。

点击按钮即表示您同意数据处理。