PSP 지불 및 보고서의 조정
TL; DR
조정은 PSP/acquirer/bank 보고서를 통해 원장 및 이벤트 (지정/캡처/환불/지불) 의 일일 자동 스티칭입니다. 성공의 열쇠: 단일 데이터 모델, 결정 론적 매칭 키, 엄격한 dempotency, sum/FX/time tolerances, 논란의 여지가있는 사례에 대한 DLQ 큐 및 자동 교정 플레이 북. KPI: 정찰된 불일치 비율의 정찰기, 조정되지 않은 나이의 노화, 자동 일치 비율인가.
1) 왜 그리고 우리가 확인하는 것
목표: 수익 및 수수료 확인, 중복/손실 탐지, 일 및 통화 별 정확한 결제, 환불 대 소스 제어, 감사/규제 기관 준수.
조정 대상:- 예금: '의심 → 캡처 → 정착'
- 환불: 전체/부분, 상태 및 금액
- 지불/철회: 발신 방법 지불
- 수수료 및 조정: PSP 수수료, 교환 체계, 수정
- 충전/분쟁: 이니셔티브를 넘어서
- FX/변환: 요금, 스프레드, 고정 지점
2) 데이터 소스
내부 이벤트: 이벤트 버스/카프카, '결제 _ flat', '환불', '지불', 원장.
PSP 보고서 (STP/API/webhook 덤프):- 거래 (운영 명세서)
- 정착/배치
- 수수료/명세서
- 충전기/분쟁
- 지불/OCT/RTP/SEPA 등록
- 은행 계좌 명세서: CAMT MT940/CS/EX20022, 신용 리프트.
3) 일치하는 키
우선 순위 키 트리 (정확도가 내림):1. (PHP 3 = 3.0.6, PHP 4)
2. demempotency _ key/maler _ reference (PSP에서 안정적인 경우)
3. (금액, 통화, 타임 스탬프 _ 버킷, last4/bin,
4. 퍼지 레이어: 합계/시간, BIN/발행자 국가, 상태 패밀리에 의하여 공차
권장 사항:- 'payment _ id' 와 'propessor _ txid' 를 모두 유지하십시오.
- 부분/환불을 위해 'sequence _ indx' 또는 'refund _ line _ id' 를 추가하십시오.
- 지불금- 'payout _ batch _ id + line _ id'.
- FX- 'exec- _ id' (변환) 및 요율 소스.
4) 데이터 모델 (정규화 된 계층)
json
{
"source": "INTERNAL PSP_TX PSP_SETTLEMENT BANK",
"provider": "Acquirer_A",
"payment_id": "pay_123",
"provider_txid": "psp_tx_789",
"kind": "AUTH CAPTURE REFUND PAYOUT FEE SETTLEMENT CHARGEBACK",
"sequence": 0,
"amount": 100. 00,
"currency": "EUR",
"fee_amount": 1. 20,
"fx_rate": 1. 0000,
"fx_src": "PSP ECB BANK",
"status": "APPROVED CAPTURED SUCCESS FAILED SETTLED",
"event_ts": "2025-11-03T12:00:00Z",
"settlement_date": "2025-11-05",
"account": "PSP_MERCHANT_CARD_A",
"matching_keys": {
"provider_txid": "psp_tx_789",
"merchant_ref": "mr_456",
"idem_key": "idem_abc"
},
"hash_row": "sha256(...)"
}
5) 조정 프로세스 (ETL/오케스트레이션)
1. Ingest: PSP 보고서 (STP/API) 를 가져 와서 체계/서명을 검증하고 '원시' 로 저장합니다.
2. 정규화: 필드의 통합 형식 (통화 ISO, 10 진수, UTC 시간대) 에 대한 매핑.
3. 일치: 키 트리와 공차를 일치시키는 알고리즘.
4. 경기 후: 원장/수정에 대한 양식 diff (불일치) 및 저널 항목.
5. 정착: 스티치 'PSP _ SETTLEMENT banK' (계정에 대한 크레딧), 주간/배치별로 산란됩니다.
6. 보고서: 대시 보드, 경고; 수동 파싱/자동 재생을 위해 DLQ에서 논란의 여지가 있습니다.
이데올로기: 각 파일/페이지마다- 'ingest _ id'. 재 장전은 결과를 변경하지 않습니다.
6) 공차 및 규칙
시간: 거래의 경우 '
금액: 'λ0. FX/수수료 차이에 대한 01 '기본 통화 또는' 계정 10 bps '.
FX: 환율의 출처가 다른 경우 은행과 불일치를 허용합니다. 'fx _ src' 를 수정하십시오.
부분/다중: 부분/환불 라인의 합은 내부 잔액과 같아야합니다.
7) Diff 분류법
8) 원장 및 회계
캡처: 'DR 계정 수령 가능/CR 수익' 겠습니다 'DR 현금 (결제시 )/CR 계정 수령'
요금: 'DR 요금/CR 현금 또는 지불'
환불: 리버스 포스팅 프로 라타 부분
충전: 별도의 계정 및 분쟁 예약
FX reval: 'fx _ src _ policy' 에서 AR/캐시 밸런스의 일일 재평가
9) KPI 및 목표
자동 일치% = 자동 일치 라인/모든 라인 (95% 이하 대상)
Recon Mismatch Rate = diff line/all line (할 수 있음 1-2%)
Unconciled의 노화: DLQ에서 p50/p95 일 (p95 소 3 일)
정착 시간: D-day 은행으로 꿰매는 배치 비율 (99% 이상)
수수료 정확도: 공급자 수수료 불일치 ( 매출의 1%)
중복/고아 사건: 0 목표
10) SQL 슬라이스
10. 1 기본 공급자 _ txid 일치
sql
WITH i AS (
SELECT provider, provider_txid, kind, amount, currency, event_ts
FROM internal_norm
),
p AS (
SELECT provider, provider_txid, kind, amount, currency, event_ts
FROM psp_norm
)
SELECT
COALESCE(i. provider_txid, p. provider_txid) AS txid,
COALESCE(i. provider, p. provider) AS provider,
i.kind AS kind_internal, p. kind AS kind_psp,
i.amount AS amount_internal, p. amount AS amount_psp,
i.currency, p. currency,
CASE
WHEN i.provider_txid IS NULL THEN 'MISSING_INTERNAL'
WHEN p. provider_txid IS NULL THEN 'MISSING_PSP'
WHEN ABS(i. amount - p. amount) > 0. 01 THEN 'AMOUNT_MISMATCH'
ELSE 'MATCHED'
END AS recon_status
FROM i
FULL OUTER JOIN p USING (provider, provider_txid);
10. 2 정산 은행
sql
SELECT s. settlement_date, s. batch_id, s. currency,
s. amount_settled, b. amount_bank,
(b. amount_bank - s. amount_settled) AS diff
FROM psp_settlements s
LEFT JOIN bank_statements b
ON b. value_date = s. settlement_date
AND b. currency = s. currency
AND ABS(b. amount_bank - s. amount_settled) <= 0. 5;
10. 3 노화 DLQ
sql
SELECT diff_type,
COUNT() AS cnt,
PERCENTILE_CONT(0. 5) WITHIN GROUP (ORDER BY AGE(NOW(), created_at)) AS p50_age,
PERCENTILE_CONT(0. 95) WITHIN GROUP (ORDER BY AGE(NOW(), created_at)) AS p95_age
FROM recon_dlq
GROUP BY diff_type
ORDER BY cnt DESC;
11) 레일/케이스 기능
지도: '지정' 과 '캡처', 늦은 '결제' 조정, 교환/회로 요금-별도의 회선.
A2A/Open Banking/RTP: 즉각적인 확인이지만 '반전' 이 가능합니다. '지불' 및 반품을 확인하십시오.
지갑: 종종 완벽한 '제공자 _ txid', 빠른 '환불'; 요금 회선을보십시오.
바우처: 대칭 환불 없음-정책 및 보고서에 올바르게 반영됩니다.
암호화: 체인 해시 해시 공급자 _ txid; 확인 N; 네트워크 수수료 및 가능한 리베이트 회계; 환율-전환 시점.
12) 운영 플레이 북
MISSING _ INTERNAL 급증: 웹 후크/리트레이 손실 여부 확인, 섭취 재생, API 폴링 활성화.
하나의 PSP에서 AMOUNT _ MISMATCH: 반올림/VAT/수수료 모델 비교, 수정 명세서 요청.
합의는 은행에 연결되지 않습니다: 확인 가치 날짜, 은행 수수료, T + N 지연; 일시적으로 "서스펜스 계정" 에 넣습니다.
Mass REFUND _ OVER: 즉시 정지 자동 수리, demotency 감사, 수동 수정.
FX _ DRIFT: 환율 소스 (ECB/PSP/BANK) 의 정책을 수정하고 P&L 차이를 다시 계산하십시오.
13) 통제 및 안전
섭취의 이데올로기: '파일 _ id + 체크섬' 및 다운로드 기록.
액세스 (RBAC) 및 4 눈 제어: 수동 수정/저널 항목.
감사 트레일: 변경 불가능한 로그에서 모든 일치/확장/수정.
데이터 품질: 체계, 필수 필드, 통화/규모 검증.
14) 대시 보드 및 경고
위젯: 자동 일치%, 불일치 속도, 노화 DLQ, 정산 타이밍, 수수료 정확도, diff 별 최고 PSP, diff 유형 맵.
경고:- 공급자/일 → P1에 의한 '자동 일치% <90%'
- '노화 p95> 3 일' → P2
- 'AMOUNT _ MISMATCH 스파이크' → P1
- 금액/통화 → P0에 의하여 '은행 번호 결제'
15) 테스트 사례 (UAT/Prod)
1. 동일한 파일 → 0 부작용 (demotency) 을 다시로드합니다.
2. 부분 리판 (3 줄) → 양이 일치하며 순서대로 일치합니다.
3. FX 변환: 공차 내 환율 불일치 → 정확한 일치.
4. (PHP 3 = 3.0.6, PHP 4)
5. 누락 된 웹 후크 캡처 → 폴링은 간격을 좁히고 상태는 정렬됩니다.
6. 수수료 회선이있는 결제 배치 → 수익/수수료/인터넷의 정확한 분석.
16) 빈번한 실수와 피하는 방법
'시도' 와 '캡처' 비교 → 동일한 세분성을 유지합니다.
→ 로그에 'provider _ txid' 가 없으면 경기의 정확도가 떨어집니다.
시간대 → 정산 날짜별로 오프셋을 무시하십시오
DLQ/retras → "영원한" 불일치는 없습니다.
감사에 대한 로그 → 불일치없이 수동 편집.
퍼지 공차 → 재 대결 또는 "DLQ의 모든 것".
17) 구현 점검표
- 통합 정규화 체계 및 PSP/방법/계정 디렉토리
- 키 트리 매핑 (txid → 가맹점 _ ref → 퍼지)
- 코스 소스 정책 금액/시간 허용/FX
- Idempotent 섭취, DLQ, retrai, 경고
- 은행 화해, 서스펜스 계정 정책
- 대시 보드 KPI, 재무/감사보고
- 플레이 북 및 SLA 파싱 디프 케이스
요약
조정은 정규화, 신뢰할 수있는 키, 공차, 자동 일치 및 투명한 수정과 같은 엔지니어링 분야입니다. 이러한 윤곽을 사용하면 수익과 수수료를 안정화하고 "블랙홀" 을 최소화하고 기간 종료를 가속화하며 고통없이 감사를받을 수 있습니다: Auto-match Doctor, Mismatch 겠습니다.