Մասնակի և ամբողջական refands
TL; DR
Refand-ը captured գումարով հակառակը վիրահատություն է։ Ամբողջովին փակում է գործարքը ամբողջ, մասնիկը վերադարձնում է մի մասը (միգուցե մի շարք partial մինչև ամբողջական)։ Քննադատական է 'refund-to-source, խիստ գաղափարախոսություն, պատճառների ամսագրում, և նվագախումբ' webhuks/reat։ Մենք չափում ենք Refund Rate, TtR p95, Refund Error-ը և վերացնում դուբլները/անհամապատասխանությունները մեքենայով։
1) Տերմինները և սկզբունքային տարբերությունները
Fox Refund-ը ամբողջ ամրագրված գումարի կոդն է («refund _ amount = capture _ amount»)։
Partial Refund-ը եվրոպական հատվածներ է («0 Refund to Source-ը տեղադրված է աղբյուրի մեթոդի/ռելսերի վրա։ Void-ը մինչև capture-ը (եթե ռելսերը աջակցվում են), չի համարվում refand։ Reversal/Chargeback-ը ձեր նախաձեռնությունից դուրս բանկային/ռելսային մեխանիկներն են (բանավեճեր, chargbaki) - ոչ թե շփոթել ռեֆանդի հետ։ 2) Երբ թողարկել ամբողջական vs մասնիկ Ամբողջական (Fox) Մրցույթի/ծառայությունների վերացումը ամբողջովին, կրկնօրինակելով դուրս գրելը, համակարգային սխալ է։ Պարտավորվում է ծառայություններ մատուցելիս (սպառողի/կարգավորողի կանոններով)։ Մասնակի (Partial) Ծառայությունների մասնակի վերացումը, համամասնությունները (զեղչեր, ուշացումների փոխհատուցում)։ Ռելսերի տեխնոլոգիական լիմիթները (մեկ վիրահատության համար գումար) պարթիալ շարքն է։ Հետպատերազմյան ֆակտումը (որտեղ կարգավորող թույլատրվում է) ավելի քիչ iGaming-ում է։ 3) Քաղաքականություններ և սահմաններ Refund-to-source = time լռելյայն; բացառությունները MLRO/Cass-ի միջոցով (տրամաբանվում է)։ Cut-off: refands թույլատրվում են N օր capture-ից (մեթոդով/իրավասությամբ)։ Max Partial Count: ոչ ավելի քան K partial paytial-ում (տիպիկ K-5)։ Min Partial Amount: ոչ ավելի ցածր, քան ռելսերի/PSA տեխնոլոգիական նվազագույնի։ 4) Ճարտարապետությունը և իրադարձությունների հոսքը Բաղադրիչները Payts Orchestram-ը կարգավիճակների ճշմարտության աղբյուրն է։ Refund Express-API-ը, idempotenty, retrav նվագախումբը, ամսագիրը։ PMS Adapters-ը ռուսական է։ Reconciliation-ը, DLQ, ռուսական։ Ledger/Accounting-ը 108 է, դեֆերը, հավասարեցումը կլիրինգների հետ։ Risk/Compli.ru - սանկցիաների/SoF-ի ստուգումներ վիճահարույց սցենարների ժամանակ։ Հաջորդականությունը (partial/fox) 1. `Refund. Create '(API) վալիդացիան (limits, մնացած, policy, KYC/SoF անհրաժեշտության դեպքում)։ 2. Генерация idempotency_key (`hash(payment_id + refund_amount + reason + nonce)`). 3. PBS-ի մարտահրավերը հաստատեց «PENDING» կարգավիճակը։ 4. Webhuk/SUCCESS '/« FAILED »; Time-ute-ը նույն բանալին է։ 5. Իրադարձությունների հրապարակումը Kafka-ում տեղադրված է Ledger, BI, alerts-ում։ 6. Avto-suck 'համեմատություն' provider _ refund _ id 'հետ։ 5) Idempotenty-ը և anti-ubley-ը Նույն ռեֆանդը չի կարող կրկնապատկվել, ամբողջ տրամաբանությունը idempotency storage (KV/Redis + TTL) միջոցով։ Payme _ id medamount medreason (և, անհրաժեշտության դեպքում, «partial _ index»)։ Ռետրոյները օգտագործում են նույն բանալին։ Զուգահեռ partial պաշտպանվում է row-level proks/optimistic version գումարով։ Prindocod 6) Տվյալների մոդելը (նվազագույն բավարար) 7) Երկրորդային ռելսերի առանձնահատկությունները Քարտեզներ (Visa/Wintercard) Աջակցում են fox/partial; հաճախ մի քանի partial; TTR կախված է հաճախորդի բանկից (T + 1... T + 5 b.d.)։ Webhuks-ը արագ է գալիս հաջողության մասին, բայց խմիչքի վրա ներարկումը կարող է սայթաքել։ Հաճախ ակնթարթային կոմպոզիցիա (reversal/credit push); որոշ պրովայդերներ աջակցում են միայն fox կամ 1 partial։ Խիստ կապվածություն սկզբնական հաշվի հետ։ refund-to-source պարտական է։ Սովորական fox/partial; TtR րոպե; սահմանափակումներ partial և նվազագույն գումարով։ Սովորաբար refund-to-source-ը հասանելի չէ ռուսական քաղաքականությանը 'ներքին դրամապանակին կամ re-issue վաուչերին (եթե պրովայդերը կարող է)։ Պահանջում է կոմպլենս-2019։ Ռելսերը 'ալատիլային; Նախատեսվում է չօգտագործել որպես ռեֆանդի մեթոդ։ Եթե թույլատրվում է, նույն հասցեն/փոխանակումը փաստագրված փոխարժեքով և միջնորդություններով։ AML սկրինինգը։ 8) Մոսկվան, հասակը և ֆինանսները Ledger: www.DR Revenue/CR Cash 'capture; refund-ը հակառակն է։ Partial արտահայտվում է համամասնորեն։ Recognect: iGaming refand-ում նվազեցնում է GGR համապատասխան ժամանակահատվածը (ռուսական քաղաքականությունը)։ Reconciliation: Ամենօրյա մուտքերը 'merchant _ refund _ id, provider _ refund _ id ", կարգավիճակները, գումարները, FX դասընթացները։ FX 'գրանցեք դասընթացների տրամաբանությունը (capture պահին կամ refund պահին), որտեղ կիրառելի է։ պահեք ներքնազգեստների ճաղը։ 9) KPI, նպատակներ և ալերտներ (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% 2495 տոկոսը (որտեղ հասանելի է)։ Double Refund Incidents = 0. Ալերտա «TtR p95» -ը SLO-ից բարձր է P2 մեթոդով։ Spikes-ը «Refund Rate» -ում մեկ պրովայդերում/BIN no P1 (ստուգել հափշտակները/դուբլի)։ Ցանկացած 'Double Refund> 0' www.P0 (Avto Refands)։ 10) SQL կտրվածքներ 10. 1 Ռեփանդների պրոֆիլը 10. 2 Partial 11) UX և sapport Հաղորդագրությունների ձևանմուշները, որոնք ցույց են տալիս, որ քարտեզները հնարավոր հետաձգում են, A2A-ը գրեթե անմիջապես է։ Գրասենյակում գտնվող կարգավիճակները '<<Նախագծված է & lt; ցույց տալ սպասվող հաշվարկման ամսաթիվը։ Պատճառները (reason _ code) մարդասպան են '«Կրկնապատկման կրկնօրինակումը», «Ծառայությունների վերացումը», «Մասնակի փոխհատուցումը»։ Winf-interpartial-ը անվտանգ է միայն սահմանների և հստակ կանոնների հետ։ 12) Ռիսկը և բաղադրիչը Անտի լվացում 'ռեֆանդը չպետք է վերածվի այլընտրանքային ալիքի։ գրանցեք բացառություններ MLRO-ի հավանությամբ։ Սանկցիաները/RER '«կարմիր» հաշիվներին/ռեքվիզիտներին ուղղված վերադարձումների ժամանակ պարտադիր ստուգում է։ DSAR/Retention: Պահեք refands հետքերը տվյալների պահպանման քաղաքականության շրջանակներում։ Տեղական կանոնները 'վերադարձման ժամկետները և կարգը (օրինակ սպառողական հաշվարկները), արտացոլում ենք պոլիկիում։ 13) Հաճախակի սխալներ և ինչպես խուսափել դրանցից Կրկնակի ռեֆանդը, քանի որ գաղափարախոսության և կրկնվող webhucks-ը թույլ են տալիս պահպանել idem-բանալին/կարգավիճակը, ստուգել մնացորդը։ Partial> մնացած www.row-ww.k/optimistic version և խիստ ստուգումներ։ Cross-method refund-ը առանց համակարգչի թույլտվության խախտում է refund-to-source-ը։ Void-ի և refund-ի խառնուրդը զեկույցներում ցույց է տալիս KPI-ի աղավաղումը։ Ոչ մի մեքենա-Swart-ը PBS-ի և ձեր սառցադաշտի միջև «սև անցքեր» է։ 14) Պլեյբուկի Պրովայդերի վերադարձի աճը պլանավորվում է ստուգել ավտոզիզացիոն ձախողումները/կաղնիները, ներառել ֆեյլերը, կապ PSA-ի հետ։ Զանգվածային partial-փոխհատուցումը (քարոզարշավը) խորհուրդ է տալիս բարձրացնել partial-ի սահմանը, ներառել խմբակային վիրահատությունները, ուժեղացնել նվազումները։ Webhuks-ի սխալը պլանավորվում է անցնել կիսագնդին, բարձրացնել TTL idempotenty-ը, հետաձգել Auto-refands-ը։ Refund-to-source (հազվադեպ) բացառությունը բացատրում է MLRO-ի էսկալացիան, փաստաթղթավորված վճարումը և նշումը 'comp _ aproved = www.ru։ 15) Թեստային քեյսները (UAT/Lenta.ru) 1. Fox refund-ը մեկ capture-ից հետո ճիշտ շրջում է մնացորդը։ 2. Partial (3 ռուբլիներ) շարքը նշված է www.capture-ի գումարը։ ապա fox մնացորդի վրա։ 3. Idempotention 'նույն հարցման կրկնօրինակը 1 արդյունք է։ 4. Webhuk-drebesg: 3 նույն ծանուցումը մեկ ապացույց է։ 5. Սավկի 'արհեստական mismatch wwww.alert և ավտոկորեքսիա։ 6. Իրավունքների սահմանափակումը 'գործակալը չի կարող գերազանցել սահմանափակումը։ 7. Cut-off 'ուշ ռեֆանդի փորձը ճիշտ մերժում և տրամաբանություն է։ 16) Ստուգման չեկի թերթ Refands-ի կառավարումը գործընթացների խիստ կարգապահությունն է 'refund-to-source, idempotention, թափանցիկ տվյալների մոդել, avto-suck և հասկանալի քաղաքականություններ partial/fox։ Նման հիմքերով դուք պահում եք TTR-ն ցածր, սխալները 'զրոյի, դուբլի, անհնար են, իսկ կոմպլենսները և ֆինանսները համաժամեցված են բիզնեսի նպատակների հետ։
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)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"
}
}A2A/Open Banking/RTP
Էլեկտրոնային դրամապանակներ
Wauchers/Winpaid/Winpaid
Crypto
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;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;
Ռեզյումե