본문으로 건너뛰기
연동

돈은 당신의 시스템이 지킵니다. 산수는 우리 것이 지킵니다.

플랫폼은 하나의 계산이자 하나의 기록입니다. 당신의 시스템에서 일어난 일을 받아, 얼마가 지급될지 계산하고, 지시를 돌려보냅니다. 결코 자금 경로에 앉지 않습니다.

수탁 경계굵은 선 하나로 갈라진 시스템 지도. 운영자 쪽에는 그들의 Stripe 계정, NOWPayments 계정, 은행, 지갑, 그리고 자체 백엔드가 있습니다. 플랫폼 쪽에는 원장, 실행, 명령, 청구, 발신함이 있습니다. 네 개의 선이 경계를 가로지르며 각각 명령, 영수증, 지시, 이벤트를 나릅니다. 그중 어느 것도 돈을 나르지 않으며, 원장과 실행은 경계를 전혀 넘지 않습니다.운영자XEX명령영수지시이벤트수탁 경계Stripe 계정NOWPayments 계정은행지갑귀사의 백엔드원장실행명령청구아웃박스여기서 돈을 나르는 선은 없습니다. XEX는 지시를 옮기고, 돈은 운영자가 옮깁니다.원장과 실행은 경계를 넘지 않음
경계를 넘는 것은 넷입니다. 영수, 커맨드, 지시, 이벤트. 그중 무엇도 돈이 아닙니다.
계약

공개된 명세와, 그것을 보고 쓴 두 개의 클라이언트.

저장소 안의 OpenAPI 문서, TypeScript 클라이언트, Dart 클라이언트. 누가 미팅을 잡기 전에 당신의 엔지니어가 인터페이스 전체를 읽어 볼 수 있습니다.

OpenAPI

공개 인터페이스 전체가 한 문서에: 회원 엔드포인트, 관리 엔드포인트, 커맨드 API, 이벤트 목록.

api/openapi.yaml

TypeScript 클라이언트

당신의 웹과 Node 서비스용. 같은 문서로 타입이 잡혀 있습니다.

sdk/typescript

Dart 클라이언트

Flutter 앱용입니다. 회원 대상 프로그램은 대개 앱이 있고, 두 번째 HTTP 계층을 손으로 짜는 지점이 바로 둘이 어긋나기 시작하는 곳이기 때문입니다.

sdk/dart

아웃바운드

도착을 믿을 수 있는 이벤트.

열한 가지 이벤트 타입이, 그것을 만든 상태 변경과 같은 트랜잭션에서 큐에 들어갑니다.

  1. 01

    던지고 잊는 POST가 아니라 트랜잭셔널 아웃박스

    이벤트는 그것을 일으킨 트랜잭션 안에서 기록되고, 이후 리스 기반 큐에서 발송됩니다. 원장이 롤백한 일을 당신의 시스템이 통보받는 구간도, 원장은 커밋했는데 아무도 통보받지 못하는 구간도 없습니다.

    internal/outbox

  2. 02

    서명되며, 키 id는 교체 가능

    모든 전달에 키 id와 타임스탬프가 붙은 HMAC-SHA256 서명이 실립니다. 교체는 겹칩니다. 전환하는 동안 예전 키가 유효하므로, 시크릿 교체는 일정을 잡아야 하는 중단이 아닙니다.

    internal/outbox/sign.go

  3. 03

    정산 이벤트가 먼저 갑니다

    청구 지시는 알림 더미 뒤에 줄 서지 않습니다. 전달 등급은 별도의 차선이고, 정산은 자금 지시를 실은 차선입니다.

    internal/events

  4. 04

    결정론적 id, 그래서 재실행은 아무 일도 하지 않습니다

    핸들러를 다시 돌리면 같은 이벤트 id가 다시 큐에 들어가고 아웃박스가 중복을 제거합니다. 조심조심 다뤄야 하는 최소 1회 전달이 아니라, 실제로 재시도할 수 있는 최소 1회 전달입니다.

    internal/events · internal/outbox

  5. 05

    당신의 URL에 걸리는 아웃바운드 가드

    목적지는 운영자가 설정하며, 그것만으로 이미 구조적인 SSRF 통로입니다. 디스패처는 요청 전에 URL을 검사하고, 당연히 막아야 할 주소들을 막습니다.

    internal/outbox/ssrf.go

  6. 06

    백오프, 파킹, 그리고 대사기

    실패는 간격을 늘려 재시도하다 결국 파킹되며, 내려간 목적지를 두들기지 않습니다. 큐가 완벽하리라 믿는 대신, 시스템 간 대사기가 정말로 사라진 이벤트를 잡아냅니다.

    internal/outbox · internal/reconciler

인바운드

당신의 레코드 id를 키로, 정확히 한 번 실행되는 커맨드.

구매가 일어났다, 환불이 있었다, 회원이 확인되었다고 플랫폼에 알려 주세요. 키가 당신 것이므로 재시도는 공짜입니다.

모든 인바운드 커맨드는 워크스페이스와 참조번호 단위로 멱등하고 응답은 캐시됩니다. 같은 구매를 두 번 보내면 두 번째 호출은 첫 호출의 답을 돌려줍니다 — 두 번째 구매를 만들지도, 첫 구매에 대해 커미션을 한 번 더 지급하지도 않습니다.

오류 계약은 명시적입니다. 클라이언트 연동이 실제로 답해야 하는 질문은 “재시도할까 말까”이기 때문입니다. 반환된 오류는 영수를 풀어 주므로 재시도할 수 있습니다. 4xx 코드의 거절은 종결이며 캐시됩니다. 그 커맨드는 내용을 근거로 거절되었고, 다시 보내도 다시 거절됩니다.

internal/commands · internal/command

나가는 돈

지금 정산하던 방식 그대로 정산하세요.

플랫폼은 정확한 원장 라인을 선점하고 지시합니다. 지급을 집행하는 것은 당신입니다.

정산 시스템이 있다면 청구 지시를 정산 등급 이벤트로 받고, 정산 또는 실패로 콜백합니다. 없다면 지급 콘솔이 미지급 목록을 보여 주고, 당신이 자기 지갑에서 지급한 뒤 체결 가격과 자신의 거래 참조번호를 기록합니다. 참조번호 없이 기록된 지급은 거부됩니다 — 당신의 지갑과 결코 대사할 수 없으므로, 받아 준다는 것은 대사가 더 늦게, 더 멀리서 깨진다는 뜻일 뿐입니다.

internal/claims · internal/httpapi/payouts.go

당신의 브랜드

당신의 도메인, 프로비저닝 전에 증명합니다.

호스트명을 등록하고, 플랫폼이 만들어 주는 TXT 레코드를 게시하면, 조회되는 즉시 프로비저닝됩니다.

순서가 중요하고, 그것이 요점 전부입니다. 통제 증명 전에 호스트명을 연결하거나 도메인을 아이디 제공자의 승인 목록에 넣으면, 그 이름의 실제 소유자가 당신에게 갈 로그인을 받게 됩니다. 그래서 레코드가 조회될 때까지 아무것도 프로비저닝하지 않고, 로그인 허용 목록에도 아무것도 넣지 않습니다. 백그라운드 프로비저너가 1분 안에 집어 갑니다.

internal/domains

다음

샌드박스를 받아 스테이징 시스템에 붙여 보세요.

모든 요금제에서 무료이며, 인터페이스도 이벤트도 서명도 프로덕션과 같습니다.