托管结账的工作原理
RMT.GG保持为记录商户。您的合作商店发送锁定金额和货币。买家在我们的托管页面上付款。付款后,您在商店中交付。订单自动完成,以便钱包结算可以进行。
- 买家支付的金额和货币与您发送的完全一致。我们不会增加金额。
- 您的卖家费用是该锁定金额的4%。市场列表保持在通常的5%。
- 卡、PayPal和加密货币处理费用由平台承担。
需要白名单
在设置中申请,托管结账,然后等待管理员批准。未批准的API密钥将收到CHECKOUT_PARTNER_NOT_APPROVED。
申请并获得批准
获得批准后,在托管结账设置页面创建一个带有 checkout:write 权限的 API 密钥和一个用于 checkout.completed 的 JSON webhook。在获得批准之前,托管结账 API 将保持被阻止状态。
- 1打开设置 → 托管结账并提交您的商店URL以及关于您将如何使用结账的简短说明。
- 2等待管理员批准。在此之前,您将看到一个待处理的徽章。
- 3获得批准后,在设置 → 托管结账中创建一个 API 密钥和一个用于 checkout.completed 的 JSON webhook。
卖家API
从任何商店或您自己的服务器使用此功能。使用POST /api/v1/checkout/sessions创建一个会话。发送checkout:write和一个Idempotency-Key。将买家重定向到hosted_url。监听order.paid,然后在您的商店中履行。
创建一个托管结账会话
curl -X POST -H "Authorization: Bearer rmt_sk_live_…" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: inv-12345" \
https://rmt.gg/api/v1/checkout/sessions \
-d @session.jsonsession.json
{
amount: 10, // required when items is omitted
currency: "USD", // optional; defaults to USD
itemName: "Gold pack", // required when items is omitted; alias title
description: "1000 gold for account example", // optional
imageUrl: "https://cdn.shop.example/gold.png", // optional, HTTPS only
categorySlug: "games", // send with offering, or omit both
offering: "Mods", // send with categorySlug
email: "[email protected]", // optional
returnUrl: "https://your-shop.example/thanks", // optional
cancelUrl: "https://your-shop.example/cancel", // optional
invoiceId: "12345" // optional
}多个锁定行,带可选交付(session.json)
{
currency: "USD",
invoiceId: "12345", // optional
items: [ // required when amount is omitted
{
name: "Gold pack", // required per line
description: "1000 gold", // optional
amount: 10, // required per line
quantity: 1, // optional, default 1
imageUrl: "https://cdn.shop.example/gold.png", // optional, HTTPS only
delivery: [ // optional
{ name: "Code", type: "text", value: "XXXX-YYYY" } // name and value required; type is optional
]
}
]
}- 发送金额加上 itemName(或标题)用于单个物品,或非空的 items[] 数组。货币默认为美元。可选字段:描述、HTTPS 图片链接、电子邮件(预填支付页面)、返回链接、取消链接、发票 ID、类别标识符以及产品(发送两者或都不发送),以及元数据。itemName 是支付页面的标题;描述是下面的详细说明。买家必须在付款前确认有效的电子邮件。付款后,买家将停留在 RMT.GG 确认页面,以便他们可以复制交付字段。如果您设置了返回链接并且有交付字段,他们将从该页面继续到您的商店。如果没有,我们将在短暂倒计时后将他们送回。如果您省略了返回链接或取消链接,买家在付款、取消或过期后将停留在 RMT.GG 支付页面上。
- 成功后,我们将订单 uid 附加到 returnUrl,格式为 ?order=,当该 URL 是 HTTPS(或 localhost)时。
- 重复的Idempotency-Key或invoiceId值将重用相同的会话,而不是创建重复项。
- itemName 和描述仅在 RMT 支付页面上显示。卡、PayPal 和加密货币结账使用类似 Games · Add-ons 的目录编码标签,而不是你的商店标题。在设置中设置默认值,或在会话中发送 categorySlug 和 offering。
- 会话持续24小时。之后支付页面无法完成,进行中的Stripe和PayPal会话将关闭,我们将POST checkout.canceled,原因是过期。
- items[] 是单个金额加上 itemName 的多行替代方案。每行需要名称和金额。使用 items 时,可以省略金额,并从行中计算,或者如果您发送它,则必须与总和匹配。数量在 rmt.gg 上是锁定的:买家无法添加、删除或更改行。imageUrl 必须是 HTTPS;我们不会获取它。可选的交付字段(文本、密码或文本区域)需要名称和数值。它们在付款后的确认页面和购买中显示。公共会话 GET 仅在付款后包含交付值。卖家 GET 和网络钩子从不包含它们。
检查支付状态
首先监听 checkout.completed。如果 webhook 延迟,请获取会话。买家支付时 paid 为 true。您可以通过会话 uid 或您发送的 invoiceId 查找。
- 使用创建会话时返回的 uid 进行 GET /api/v1/checkout/sessions/{uid}。
- 如果您存储了自己的发票 ID,请使用 GET /api/v1/checkout/sessions?invoiceId=YOUR_INVOICE_ID。
通过发票 ID 查找
curl -H "Authorization: Bearer rmt_sk_live_…" \
https://rmt.gg/api/v1/checkout/sessions?invoiceId=inv-12345Digiseller 和类似商店
如果您使用卖家 API 创建结账,请跳过此步骤。当您的商店(例如 Digiseller)通过自定义支付方式将买家发送到此处时使用。Digiseller 发送到我们的支付 URL,我们处理付款,然后 Digiseller 检查状态 URL。
- 1从设置 → 托管结账中复制支付 URL、状态 URL 和支付密钥。
- 2将它们粘贴到 Digiseller 作为自定义支付方式。保持密钥私密。
- 3然后 Digiseller 将买家发送给我们付款,并检查状态 URL 以确认是否已付款。
- item_name(或标题)是支付页面的标题。description 是下面的详细说明。如果两个名称都被省略,则使用 description 作为标题。
Digiseller 发送的示例请求
{
"invoice_id": "12345",
"amount": "10.00",
"currency": "美元",
"item_name": "金币包",
"description": "1000金币用于账户示例",
"signature": "…"
}更喜欢 JSON webhook
状态 URL 是为 Digiseller 准备的。如果您从自己的服务器进行履行,请添加 JSON webhook 并监听 checkout.completed。您也可以作为备份获取会话。
JSON 网络钩子
托管结账不使用单独的网络钩子 API。在开发者部分,将 JSON HTTPS 端点指向与市场销售相同的事件。付款后我们 POST order.paid。退款后我们 POST order.refunded。通过 externalInvoiceId(你的 invoiceId)或 partnerSessionUid 匹配销售。
order.paid 负载(托管结账字段)
{
"id": "whd_…",
"type": "order.paid",
"created": "2026-08-14T12:00:00.000Z",
"data": {
"order": {
"uid": "ord_…",
"status": "已付款",
"partnerSessionUid": "…",
"externalInvoiceId": "inv-12345",
"partnerSource": "api"
}
}
}- source 是卖家 API 会话的 API。
- 可选签名使用 X-RMT-Timestamp 和 X-RMT-Signature。以与其他卖家网络钩子相同的方式验证 HMAC。
- checkout.canceled 包含 reason buyer_canceled,当买家在未付款的情况下离开支付页面,或 reason expired,当 24 小时会话 TTL 过期未付款时。
- checkout.items 列出锁定行(名称、描述、金额、数量、imageUrl)。交付值从不包含在网络钩子中。
不要重复履行
Digiseller 也会获得自己的支付回调。如果您也监听 checkout.completed,请仅在一次履行订单。卖家 API 会话从不发送 Digiseller 回调。
访客电子邮件和收据
买家必须在支付页面输入电子邮件,以便我们可以发送收据和税务发票。匹配的 RMT 账户会在不登录买家的情况下附加。
- 如果电子邮件已经属于RMT账户,则订单将出现在该账户的购买中。支付页面上不会设置登录cookie。
- 新电子邮件会创建一个轻量级用户,因此收据和后续登录仍然有效。
- 完成付款需要电子邮件。您的商店仍应监听 checkout.completed。
货币和限制
使用支持的ISO货币,如美元(USD)或欧元(EUR)。卡片结账在美元或欧元中效果最佳。加密货币和PayPal在提供商接受的其他货币中仍然可以使用。
在此版本中不可用
托管支付页面上没有iframe SDK、自定义支付页面域或钱包余额。买家使用卡、PayPal或加密货币重定向结账。
上线前
阶段检查清单
单元测试涵盖费用、HMAC和重用。在您发送真实买家之前,请在阶段中逐步检查此列表。
- 申请,确认待处理徽章,然后让管理员批准。凭证仅在获得批准时出现。未批准的密钥在POST /api/v1/checkout/sessions上返回403。
- 创建一个包含itemName、描述和categorySlug的会话,以及提供的产品(或保存的默认值)。打开hosted_url。标题是物品名称;描述在下面。支付页面没有顶部导航或侧边栏。使用美元或欧元的卡片支付。卡片、PayPal和加密货币页面应显示类似于“游戏 · 附加内容”的目录标签,而不是您的商店标题。
- 确认 checkout.completed 包含 invoiceId、checkout.uid 和 source,然后在你的商店中完成。取消支付页面并确认 checkout.canceled,原因是 buyer_canceled。让会话超过 24 小时,并确认 checkout.canceled,原因是 expired 不能再付款。
- 对于 Digiseller,将支付 URL、状态 URL 和支付密钥粘贴到自定义支付方式中。确认 Digiseller 可以看到已付款状态,并且您仅履行一次订单。
- 使用现有的 RMT 电子邮件付款:订单将进入购买记录,并发送收据,无需登录 cookie。新的电子邮件会创建一个轻量级用户。支付页面上需要电子邮件。
- 隐藏的合成报价不得出现在市场搜索中。在等待列表限制的主机上,/pay/:uid和适配器路由仍然有效。
- 如果需要产品图片或多个锁定行,请发送可选的 imageUrl 和 items[]。确认支付页面没有数量控制。付款后,交付字段会出现在购买和订单页面上。仅支持 HTTPS 图片 URL。
相关指南
申请托管结账
打开设置 → 托管结账进行申请,或在获得批准后跳转到API参考。