돈은 당신의 시스템이 지킵니다. 산수는 우리 것이 지킵니다.
플랫폼은 하나의 계산이자 하나의 기록입니다. 당신의 시스템에서 일어난 일을 받아, 얼마가 지급될지 계산하고, 지시를 돌려보냅니다. 결코 자금 경로에 앉지 않습니다.
공개된 명세와, 그것을 보고 쓴 두 개의 클라이언트.
저장소 안의 OpenAPI 문서, TypeScript 클라이언트, Dart 클라이언트. 누가 미팅을 잡기 전에 당신의 엔지니어가 인터페이스 전체를 읽어 볼 수 있습니다.
OpenAPI
api/openapi.yaml
TypeScript 클라이언트
sdk/typescript
Dart 클라이언트
sdk/dart
도착을 믿을 수 있는 이벤트.
열한 가지 이벤트 타입이, 그것을 만든 상태 변경과 같은 트랜잭션에서 큐에 들어갑니다.
- 01
던지고 잊는 POST가 아니라 트랜잭셔널 아웃박스
이벤트는 그것을 일으킨 트랜잭션 안에서 기록되고, 이후 리스 기반 큐에서 발송됩니다. 원장이 롤백한 일을 당신의 시스템이 통보받는 구간도, 원장은 커밋했는데 아무도 통보받지 못하는 구간도 없습니다.internal/outbox
- 02
서명되며, 키 id는 교체 가능
모든 전달에 키 id와 타임스탬프가 붙은 HMAC-SHA256 서명이 실립니다. 교체는 겹칩니다. 전환하는 동안 예전 키가 유효하므로, 시크릿 교체는 일정을 잡아야 하는 중단이 아닙니다.internal/outbox/sign.go
- 03
정산 이벤트가 먼저 갑니다
청구 지시는 알림 더미 뒤에 줄 서지 않습니다. 전달 등급은 별도의 차선이고, 정산은 자금 지시를 실은 차선입니다.internal/events
- 04
결정론적 id, 그래서 재실행은 아무 일도 하지 않습니다
핸들러를 다시 돌리면 같은 이벤트 id가 다시 큐에 들어가고 아웃박스가 중복을 제거합니다. 조심조심 다뤄야 하는 최소 1회 전달이 아니라, 실제로 재시도할 수 있는 최소 1회 전달입니다.internal/events · internal/outbox
- 05
당신의 URL에 걸리는 아웃바운드 가드
목적지는 운영자가 설정하며, 그것만으로 이미 구조적인 SSRF 통로입니다. 디스패처는 요청 전에 URL을 검사하고, 당연히 막아야 할 주소들을 막습니다.internal/outbox/ssrf.go
- 06
백오프, 파킹, 그리고 대사기
실패는 간격을 늘려 재시도하다 결국 파킹되며, 내려간 목적지를 두들기지 않습니다. 큐가 완벽하리라 믿는 대신, 시스템 간 대사기가 정말로 사라진 이벤트를 잡아냅니다.internal/outbox · internal/reconciler
당신의 레코드 id를 키로, 정확히 한 번 실행되는 커맨드.
구매가 일어났다, 환불이 있었다, 회원이 확인되었다고 플랫폼에 알려 주세요. 키가 당신 것이므로 재시도는 공짜입니다.
모든 인바운드 커맨드는 워크스페이스와 참조번호 단위로 멱등하고 응답은 캐시됩니다. 같은 구매를 두 번 보내면 두 번째 호출은 첫 호출의 답을 돌려줍니다 — 두 번째 구매를 만들지도, 첫 구매에 대해 커미션을 한 번 더 지급하지도 않습니다.
오류 계약은 명시적입니다. 클라이언트 연동이 실제로 답해야 하는 질문은 “재시도할까 말까”이기 때문입니다. 반환된 오류는 영수를 풀어 주므로 재시도할 수 있습니다. 4xx 코드의 거절은 종결이며 캐시됩니다. 그 커맨드는 내용을 근거로 거절되었고, 다시 보내도 다시 거절됩니다.
internal/commands · internal/command
지금 정산하던 방식 그대로 정산하세요.
플랫폼은 정확한 원장 라인을 선점하고 지시합니다. 지급을 집행하는 것은 당신입니다.
정산 시스템이 있다면 청구 지시를 정산 등급 이벤트로 받고, 정산 또는 실패로 콜백합니다. 없다면 지급 콘솔이 미지급 목록을 보여 주고, 당신이 자기 지갑에서 지급한 뒤 체결 가격과 자신의 거래 참조번호를 기록합니다. 참조번호 없이 기록된 지급은 거부됩니다 — 당신의 지갑과 결코 대사할 수 없으므로, 받아 준다는 것은 대사가 더 늦게, 더 멀리서 깨진다는 뜻일 뿐입니다.
internal/claims · internal/httpapi/payouts.go
당신의 도메인, 프로비저닝 전에 증명합니다.
호스트명을 등록하고, 플랫폼이 만들어 주는 TXT 레코드를 게시하면, 조회되는 즉시 프로비저닝됩니다.
순서가 중요하고, 그것이 요점 전부입니다. 통제 증명 전에 호스트명을 연결하거나 도메인을 아이디 제공자의 승인 목록에 넣으면, 그 이름의 실제 소유자가 당신에게 갈 로그인을 받게 됩니다. 그래서 레코드가 조회될 때까지 아무것도 프로비저닝하지 않고, 로그인 허용 목록에도 아무것도 넣지 않습니다. 백그라운드 프로비저너가 1분 안에 집어 갑니다.
internal/domains