mcpField
C
create-merchant-platform

create-merchant-platform

github.com/payroc其他048 次安装3 周前更新
代码仓库

关于 create-merchant-platform

create-merchant-platform 是指导开发者通过 Payroc API 提交新商户入驻资料的技能。它说明身份验证、请求字段、幂等键及响应和错误处理。

主要功能

  1. 01获取 Bearer 令牌
  2. 02构建商户及处理账户请求
  3. 03使用幂等键提交
  4. 04保存返回的标识符
  5. 05处理验证错误和 API 响应

适用场景

  1. 01提交新商户入驻申请
  2. 02为商户配置处理账户
  3. 03排查请求验证问题

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/payroc/skills --skill create-merchant-platform

安装后在 Claude Code 中输入/create-merchant-platform确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
_sources.md
api-schema.md
error-response-format.md
identity-call.md

详细介绍

创建商户平台

版本检查(先运行此步骤)

在发布任何消息或启动流程之前,请确认此技能为最新版本:

  1. 从上方 frontmatter 中的 metadata.version 字段读取此技能的版本。
  2. 获取已发布版本并读取其 metadata.version: https://raw.githubusercontent.com/payroc/skills/main/plugins/payroc/boarding/skills/create-merchant-platform/SKILL.md
  3. 将两者按语义化版本进行比较:
    • 此版本 >= 已发布版本 → 静默继续,不发送消息。(开发者使用尚未发布的较新版本是正常且可接受的。)

    • 此版本 < 已发布版本 → 告知开发者:

      ⚠️ 此技能有较新版本(v<published>)已发布 — 你当前使用的是 v<current>。建议升级以获得最佳效果。

      然后询问他们是要继续使用当前版本,还是停止并先升级,并遵从他们的选择。

    • 无法获取(离线、网络错误、404)→ 简要说明无法验证版本,然后继续。


POST https://api.payroc.com/v1/merchant-platforms 会启动新商户的入驻流程。Payroc 会审核提交内容并分配 merchantPlatformId 和 processingAccountId — 请保存这两个 ID,因为订购终端和后续所有入驻操作都需要它们。

如需完整的字段参考和附注示例请求,请阅读 references/api-schema.md(需要枚举值、嵌套字段详情或完整示例时加载)。


快速参考

POST  https://api.payroc.com/v1/merchant-platforms
Authorization:   Bearer <token>
Idempotency-Key: <uuid-v4>
Content-Type:    application/json

步骤 1 — 获取 bearer token

在输出任何身份验证代码之前,请先阅读 references/identity-call.md。不要猜测端点 URL、标头名称或响应格式 — 只能使用参考文档中的信息。

令牌约 1 小时后过期。请在每个会话开始前使用 API 密钥换取令牌(或主动刷新)。

# Test / sandbox
curl -X POST https://identity.uat.payroc.com/authorize \
  -H "x-api-key: YOUR_API_KEY"

# Production
curl -X POST https://identity.payroc.com/authorize \
  -H "x-api-key: YOUR_API_KEY"

响应:

{
  "access_token": "eyJhbGc....",
  "expires_in": 3600,
  "token_type": "Bearer"
}

在后续每个请求中使用 Authorization: Bearer <access_token>。


步骤 2 — 构建请求正文

正文包含两个必需的顶层键:

{
  "business": { ... },
  "processingAccounts": [ { ... } ],
  "metadata": {}
}

metadata 为可选项 — 可用它附加你自己的键值对(例如内部客户 ID),Payroc 会在响应中原样返回。

企业对象

描述法人实体。必需字段:

字段类型说明
namestring企业法定名称
taxIdstringEIN(美国)
organizationTypeenum取值请参阅架构参考
countryOfOperationstring"US"
addressesarray必须包含一个 "type": "legalAddress" 条目
contactMethodsarray必须至少包含一个 "type": "email" 条目
处理账户

每个元素都会开通一个 MID。数组中至少要有一项。每个账户必填的关键字段:

字段说明
doingBusinessAs商号/DBA 名称
merchandiseOrServiceSold通俗易懂的商品或服务说明
businessStartDateYYYY-MM-DD
timezone例如 "America/New_York" — 完整列表请参阅架构参考
address企业的实际地址
contactMethods必须提供电子邮箱
owners请参阅下方的所有权规则
processing交易量和银行卡受理情况
funding银行账户和结算计划
pricing定价意向 ID 或完整定价协议
signature商户签署合同的方式
addendums数组 — 如果不适用任何特殊表格,则填写 [];请参阅下方的附加条款

businessType(retail、restaurant、internet、moto、lodging、notForProfit)和 categoryCode(4 位 MCC 整数)为可选字段 — 已知时请提供,因为下游开户审核仍会使用这些字段。processor(tsys | fiserv,默认值为 tsys)也为可选字段;请明确提供,而不要依赖默认值。

附加条款 — 询问商户是否需要随协议一并发送以下任何表格: 分期付款、货币服务、远程医疗、枪支、药房无卡交易合规、CBD、 烟草无卡交易、捐赠、Clover 设备或 Roc Giving。请求中必须包含 addendums,若都不适用,填写 [] 即可。各类型的负载结构请参阅 references/api-schema.md#addendums(Clover 和 Roc Giving 包含实际字段;其余仅需确认声明)。

所有权规则 — 每个处理账户都需要:

  • 恰好一位所有者设置 relationship.isControlProng: true(只能有一位控制权所有者)
  • 至少一位所有者设置 relationship.isAuthorizedSignatory: true

同一位所有者不能兼具这两种身份 — API 会拒绝同时设置了这两个标志的所有者(“必须二选一,或都不选”),因此至少需要两位所有者(一位控制权所有者,另一位授权签字人)。每位所有者还需要提供 firstName、lastName、dateOfBirth(YYYY-MM-DD)、address、identifiers(国家身份证件/SSN),以及 contactMethods 中的电子邮箱。

定价快捷方式 — 如果有定价模板,请使用:

{ "type": "intent", "pricingIntentId": "<id>" }

否则,请提供完整的 agreement 对象(结构请参阅架构参考)。

签名 — 通过电子邮件发送签署链接:

{ "type": "requestedViaEmail" }

如果要自行管理重定向,也可以使用 "requestedViaDirectLink" 和 HATEOAS 链接对象。

交易量明细 — processing.volumeBreakdown.cardPresent + mailOrTelephone + ecommerce 的总和必须恰好为 100。

金额单位为美分 — transactionAmounts.average: 5000 表示 50.00 美元。


第 3 步 — 发送请求

始终为 Idempotency-Key 生成全新的 UUID v4。该键与请求正文绑定,因此只有在重试字节级完全相同的提交时,才能复用同一个键 — 此时 API 会返回原始响应,而不是创建重复记录。提交全新请求时,或修正 400 错误后重新提交时(修正后的正文已不再匹配旧键),请生成新的 UUID — 如果正文已更改却复用旧键,将返回 409。

curl -X POST https://api.payroc.com/v1/merchant-platforms \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Idempotency-Key: $(uuidgen | tr '[:upper:]' '[:lower:]')" \
  -H "Content-Type: application/json" \
  -d @merchant-payload.json

第 4 步 — 处理响应

201 Created — 开户申请已受理:

{
  "merchantPlatformId": "MP-XXXX",
  "processingAccounts": [
    {
      "processingAccountId": "PA-XXXX",
      "status": "entered"   // may also be "pending" depending on timing
    }
  ],
  "links": [ ... ]
}

立即保存 merchantPlatformId 和每个 processingAccountId。初始 status 通常为 "entered"(已收到,尚未审核),但也可能因处理时机而显示为 "pending" — 请通过轮询或使用 Webhook 检测状态变化,而不要依赖创建响应中的状态值。

ID 为不透明字符串。 示例中的 MP-XXXX / PA-XXXX / PI-XXXX 形式仅为便于阅读。请将每个 ID 都视为不透明字符串,其格式没有保证,且会因环境而异 — 在 UAT 中,它们会以普通整数的形式返回(例如 9815)。不要根据 PREFIX-XXXX 模式验证或解析这些 ID。


步骤 5 — 处理错误

错误遵循 RFC 7807,包含一个指向 Payroc 文档的 type URL,以及一个用于验证失败的 errors 数组。

状态场景操作
400 validation字段问题修正 errors[].parameter 中指出的每个字段;使用新的幂等键重新提交(修正后的请求体需要使用新键)
400 idempotencyKeyMissing缺少标头在请求中添加 Idempotency-Key: <uuid-v4>
400 addendum/processor validationaddendums[].type 无法识别或重复、附录缺少必填字段,或 processor 无法识别这不是致命错误或意外错误——请参阅 references/api-schema.md 中的附录/处理方错误表;修正被标记的字段并重新提交
401令牌已过期或无效重新进行身份验证并获取新的 bearer 令牌
403权限不足检查 API 密钥的作用范围;联系 Payroc 支持
409 resourceAlreadyExists商户重复检查商户是否已完成入驻;检索现有记录
409 idempotencyKeyInUse使用不同的载荷重复使用密钥为新提交生成新的 UUID
409 taxIdInUse已存在具有该 Tax ID 的商户改为检索现有商户平台
500服务器错误使用指数退避重试;如果存在 errors 数组,则显示该数组

读取验证错误 — 响应使用 RFC 7807 问题详情封装(type、 title、status、detail、instance);Payroc 在此基础上扩展了 RFC 7807 未定义的 errors 数组。每个 errors[] 项都包含 parameter(失败字段的 JSON 路径)、detail(简短原因——与顶层的 detail 不同)和 message(面向用户的说明)。封装结构和规范错误 type 目录请参阅 references/error-response-format.md。来自 UAT 的实际 400 响应(空请求体):

{
  "type": "https://docs.payroc.com/api/errors#bad-request",
  "title": "Bad request",
  "status": 400,
  "detail": "One or more validation errors occurred, see error section for more info",
  "instance": "https://api.uat.payroc.com/v1/merchant-platforms",
  "errors": [
    {
      "parameter": "merchantPlatform.business",
      "detail": "Invalid value",
      "message": "'business' must not be empty."
    },
    {
      "parameter": "merchantPlatform.processingAccounts",
      "detail": "Required field not populated",
      "message": "'processingAccounts' must not be empty."
    }
  ]
}

每个 parameter 路径都映射到请求体中失败的字段——使用它来定位并修正每个问题。在单个修正后的载荷中修正所有被标记的字段,然后重新提交。(已发布的 OpenAPI 规范仅列出每个项目的 message,但实际 API 还会返回 parameter 和 detail——已根据 UAT 验证,2026-06-16。)


常见问题

  • 没有控制人 / 授权签字人:每个处理账户的 owners 数组中都必须包含这两种角色——但同一所有人不能同时担任两种角色(API 会拒绝),因此至少需要两位所有人(一位控制人,另一位授权签字人)
  • 电话/传真 value 中包含非数字字符:phone/mobile/fax 的 value 只能包含数字——不能有 +、空格或标点符号(例如 5125550199,不能是 +1 512 555 0199)
  • 交易量明细总和不等于 100:cardPresent + mailOrTelephone + ecommerce 必须恰好等于 100;如果 ecommerce > 0,则账户必须填写 website
  • 金额以美分为单位:所有货币值(transactionAmounts、monthlyAmounts、acceleratedFundingFee)都以美分为单位,且必须为整数
  • 日期格式:dateOfBirth 和 businessStartDate 必须采用 YYYY-MM-DD 格式
  • 缺少幂等键:所有 POST 请求都必须包含 Idempotency-Key,否则会收到 400 错误
  • 对不同载荷重复使用同一密钥:每次不同的提交都需要使用各自的 UUID

完整字段参考

请阅读 references/api-schema.md,了解:

  • 所有枚举值(organizationType、businessType、timezone、fundingSchedule 等)
  • 完整的嵌套对象架构(owners、processing、funding、pricing、signature)
  • 附带注释的端到端请求体示例

评论

支持 Markdown