ข้ามไปยังเนื้อหา
การเชื่อมต่อ

ระบบของคุณถือเงินไว้ ระบบของเราถือการคำนวณ

แพลตฟอร์มคือการคำนวณและบันทึกหนึ่งชุด มันรับสิ่งที่เกิดขึ้นในระบบของคุณ คำนวณว่าค้างจ่ายเท่าไร แล้วส่งคำสั่งกลับไป มันไม่เคยนั่งอยู่ในเส้นทางของเงิน

เส้นแบ่งการดูแลสินทรัพย์แผนผังระบบที่ถูกแบ่งด้วยเส้นหนาเส้นเดียว ฝั่งผู้ดำเนินการ: บัญชี 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

    ลงลายเซ็น พร้อมรหัสกุญแจที่หมุนได้

    ทุกการส่งพกลายเซ็น HMAC-SHA256 พร้อมรหัสกุญแจและเวลาประทับ การหมุนคาบเกี่ยวกัน: กุญแจเดิมยังใช้ได้ระหว่างที่คุณย้าย การหมุนความลับจึงไม่ใช่การหยุดระบบที่ต้องจัดตาราง

    internal/outbox/sign.go

  3. 03

    เหตุการณ์การจ่ายไปก่อน

    คำสั่งถอนไม่ได้ต่อคิวอยู่หลังกองแจ้งเตือน ชั้นการส่งเป็นเลนแยกกัน และการจ่ายคือเลนที่แบกคำสั่งเรื่องเงิน

    internal/events

  4. 04

    รหัสแบบกำหนดแน่ การรันซ้ำจึงไม่เกิดผลซ้อน

    การรันตัวจัดการซ้ำจะเข้าคิวรหัสเหตุการณ์เดิม ซึ่งเอาต์บ็อกซ์จะตัดซ้ำให้ นี่คือการส่งแบบอย่างน้อยหนึ่งครั้งที่คุณลองใหม่ได้จริง ไม่ใช่แบบที่คุณต้องคอยระวัง

    internal/events · internal/outbox

  5. 05

    ด่านขาออกบน URL ของคุณ

    ปลายทางตั้งค่าโดยผู้ดำเนินโปรแกรม ซึ่งทำให้มันเป็นช่องทาง SSRF โดยธรรมชาติ ตัวส่งจะตรวจ URL ก่อนยิงคำขอ และบล็อกที่อยู่ที่คุณคาดว่ามันควรบล็อก

    internal/outbox/ssrf.go

  6. 06

    ถอยรอ พักไว้ และตัวกระทบยอด

    ความล้มเหลวจะถอยรอถี่ห่างขึ้นเรื่อย ๆ แล้วพักไว้ แทนที่จะกระหน่ำยิงปลายทางที่ล่มอยู่ ตัวกระทบยอดข้ามระบบจะจับเหตุการณ์ที่หายไปจริง ๆ แทนที่จะเชื่อว่าคิวสมบูรณ์แบบ

    internal/outbox · internal/reconciler

ขาเข้า

คำสั่งที่ทำงานครั้งเดียวเป๊ะ โดยใช้รหัสรายการของคุณเป็นกุญแจ

คุณบอกแพลตฟอร์มว่ามีการซื้อ มีการคืนเงิน มีสมาชิกผ่านการยืนยันตัวตน การส่งซ้ำไม่มีต้นทุน เพราะกุญแจเป็นของคุณ

ทุกคำสั่งขาเข้าทำซ้ำได้โดยไม่เกิดผลซ้อนต่อพื้นที่ทำงานและรหัสอ้างอิงหนึ่ง ๆ และคำตอบถูกแคชไว้ ส่งการซื้อเดิมสองครั้ง การเรียกครั้งที่สองจะคืนคำตอบของครั้งแรก — ไม่สร้างการซื้อที่สอง และไม่จ่ายค่าคอมมิชชันรอบที่สองจากการซื้อแรก

สัญญาเรื่องข้อผิดพลาดระบุไว้ชัด เพราะ “จะลองใหม่หรือไม่” คือคำถามที่การเชื่อมต่อฝั่งไคลเอนต์ต้องตอบจริง ๆ ข้อผิดพลาดที่ส่งกลับจะปล่อยใบรับ และคุณลองใหม่ได้ ส่วนการปฏิเสธด้วยรหัส 4xx คือจุดจบและถูกแคช: คำสั่งนั้นถูกปฏิเสธด้วยเนื้อหาของมันเอง ส่งใหม่ก็จะถูกปฏิเสธอีก

internal/commands · internal/command

เงินขาออก

จ่ายด้วยวิธีที่คุณจ่ายอยู่แล้ว

แพลตฟอร์มจองรายการในบัญชีแยกประเภทอย่างเจาะจงแล้วสั่งการ ส่วนตัวที่ลงมือจ่ายเป็นของคุณ

ถ้าคุณมีระบบจ่ายเงิน มันจะได้รับคำสั่งถอนเป็นเหตุการณ์ชั้นการจ่าย แล้วเรียกกลับมาว่าจ่ายสำเร็จหรือล้มเหลว ถ้าไม่มี คอนโซลการจ่ายจะแสดงรายการที่ค้าง คุณจ่ายจากกระเป๋าเงินของตัวเอง แล้วบันทึกราคาที่ทำรายการจริงและรหัสธุรกรรมของคุณเอง การจ่ายที่บันทึกโดยไม่มีรหัสอ้างอิงจะถูกปฏิเสธ — มันกระทบยอดกับกระเป๋าเงินของคุณไม่ได้เลย การรับไว้จึงแปลว่าการกระทบยอดจะพังในภายหลังและไกลออกไปเท่านั้น

internal/claims · internal/httpapi/payouts.go

แบรนด์ของคุณ

โดเมนของคุณเอง พิสูจน์ก่อนจึงเปิดใช้

อ้างสิทธิ์ชื่อโฮสต์ เผยแพร่เรกคอร์ด TXT ที่แพลตฟอร์มสร้างให้ แล้วระบบจะเปิดใช้เมื่อเรกคอร์ดนั้นตอบกลับได้

ลำดับสำคัญ และนั่นคือประเด็นทั้งหมด การผูกชื่อโฮสต์ — หรือการเพิ่มโดเมนเข้ารายการที่อนุญาตของผู้ให้บริการยืนยันตัวตน — ก่อนพิสูจน์การควบคุม จะทำให้คนที่เป็นเจ้าของชื่อนั้นจริง ๆ ได้รับการเข้าสู่ระบบที่ควรเป็นของคุณ ดังนั้นจะไม่มีอะไรถูกเปิดใช้ และไม่มีอะไรถูกเพิ่มเข้ารายการอนุญาตให้เข้าสู่ระบบ จนกว่าเรกคอร์ดจะตอบกลับได้ ตัวเปิดใช้เบื้องหลังจะรับไปทำภายในหนึ่งนาที

internal/domains

ขั้นต่อไป

หยิบแซนด์บ็อกซ์ไปต่อกับระบบสเตจจิงของคุณ

ฟรีในทุกแพ็กเกจ ด้วยผิวสัมผัส API เดียวกัน เหตุการณ์เดียวกัน และลายเซ็นเดียวกันกับระบบจริง