公开技术资料

支付 API 结构样例

用于技术评估和联调清单准备,覆盖订单、签名、回调、查询、补单、错误与对账。它不代表任一实际供应商固定支持这里的字段、状态、算法或服务能力。

字段/URL 均为结构示例,不是可用生产凭据。 示例域名、商户号、订单号、签名和密钥占位值不可用于真实交易;生产参数必须来自尽调完成后的书面技术文件和安全凭证交付流程。

1. 接入前置:无需证件

基础咨询和技术需求登记无需身份证、护照、营业执照或证件照片,只需说明以下业务与技术信息:

  • 业务类型、用户与交易场景
  • 经营地区与目标市场
  • 预计日/月笔数、金额区间、峰值与币种
  • 收款、退款、代付、结算和对账需求
  • 技术架构、回调域名与接口需求
  • 技术联系人、生产变更与应急安排

无需证件不代表生产通道、额度或结算条件已经批准;这些条件仍以业务与通道评估后的书面确认为准。

2. 创建订单:请求与响应

金额建议使用十进制定点字符串,商户订单号在商户范围内保持唯一。不要根据本页推断实际接口必然包含某字段。

示例请求

POST https://api.example-processor.test/v1/orders
Content-Type: application/json
X-Merchant-Id: merchant_demo_001
X-Timestamp: 1784851200
X-Nonce: nonce_7f3a9c
X-Signature: SIGNATURE_PLACEHOLDER

{
  "merchant_order_id": "ORDER_20260724_0001",
  "amount": "1250.00",
  "currency": "PHP",
  "payment_method": "WALLET_OR_QR_EXAMPLE",
  "callback_url": "https://merchant.example.test/webhooks/payments",
  "return_url": "https://merchant.example.test/orders/ORDER_20260724_0001",
  "description": "Example order"
}

示例响应

{
  "request_id": "req_demo_a81f",
  "processor_order_id": "pay_demo_92831",
  "merchant_order_id": "ORDER_20260724_0001",
  "status": "PENDING",
  "amount": "1250.00",
  "currency": "PHP",
  "payment_url": "https://checkout.example-processor.test/pay/pay_demo_92831",
  "expires_at": "2026-07-24T16:30:00Z"
}
概念字段用途实现注意
merchant_order_id商户侧订单标识用于幂等、查询和对账,唯一性规则需书面确认
processor_order_id处理方订单标识与商户订单号同时保存,不互相覆盖
payment_url示例收银台地址仅允许跳转到书面确认的域名,并校验有效期

3. 签名串、回调验签与幂等

以下伪代码只展示“规范化请求后签名”的结构。实际算法可能不同,必须确认原始 body、字符编码、换行符、字段顺序、摘要格式、时间窗口和密钥版本。

canonicalBody = SHA256(rawRequestBody)
canonicalString = HTTP_METHOD + "\n"
  + REQUEST_PATH + "\n"
  + TIMESTAMP + "\n"
  + NONCE + "\n"
  + canonicalBody

signature = HEX(HMAC_SHA256(secret, canonicalString))

// 算法、字段顺序、编码、大小写与空值规则均以实际文档为准。

回调 payload 示例

{
  "event_id": "evt_demo_4012",
  "event_type": "payment.status_changed",
  "created_at": "2026-07-24T16:12:03Z",
  "data": {
    "processor_order_id": "pay_demo_92831",
    "merchant_order_id": "ORDER_20260724_0001",
    "status": "SUCCEEDED",
    "amount": "1250.00",
    "currency": "PHP",
    "paid_at": "2026-07-24T16:12:01Z"
  }
}
  1. 先验签:使用接收到的原始请求体和约定 header,校验时间戳及 nonce,拒绝过期或签名不符请求。
  2. 再幂等:以已确认唯一的 event_id 或“订单号 + 状态版本”原子落库;重复事件返回约定成功响应,不重复记账。
  3. 后更新:锁定订单并验证金额、币种和允许的状态迁移。回调仅触发状态同步,账务变更应在同一事务或可恢复流程中完成。
  4. 留审计:保存请求 ID、事件 ID、验签结果、原状态、新状态和处理时间;日志中不得记录密钥或完整敏感信息。

4. 订单状态机与主动查询/补单

PENDING

等待付款或处理

PROCESSING

结果尚未最终确定

SUCCEEDED

终态示例:支付成功

FAILED / EXPIRED

终态示例:失败或过期

状态名称和终态定义均为示例。只有书面文档明确允许时才能进行状态迁移;不要让迟到的处理中回调覆盖成功终态。

查询与补单建议

  • 回调超时、验签失败或订单长期处理中时,按约定查询接口核对,不凭前端跳转结果入账。
  • 查询采用退避、抖动和频率上限;保存每次 request ID,避免集中轮询。
  • “补单”应是受审计的状态核对流程,不是无条件重新创建订单或重复支付。
  • 人工修正必须双人复核,并记录证据、操作者、时间和原始/目标状态。

5. 错误响应与对账字段

HTTP/1.1 422 Unprocessable Entity
Content-Type: application/json

{
  "request_id": "req_demo_f018",
  "error": {
    "code": "INVALID_PARAMETER_EXAMPLE",
    "message": "Request validation failed",
    "field": "amount"
  }
}

按 HTTP 状态、业务错误码和 request ID 分类处理。仅对书面标记为可重试的超时或服务端错误退避重试;参数错误、鉴权失败和余额/额度类结果不应盲目重试。

建议核对的对账概念字段

分组结构示例核对目的
订单merchant_order_id, processor_order_id建立双方订单映射
金额gross_amount, fee_amount, net_amount, currency核对订单、费用和净额定义
状态status, paid_at, completed_at核对终态及业务日期边界
结算settlement_id, settlement_date, settlement_status关联批次与书面结算规则

处理方是否提供这些字段、字段名称及费用口径均不作预设;联调前应取得对账文件样例和字段字典。

6. 上线测试矩阵与密钥安全

测试面至少覆盖验收证据
订单结果成功、失败、过期、处理中、用户取消订单记录、回调、查询结果一致
通知异常重复、乱序、延迟、签名错误、超时重试幂等记录与状态迁移日志
金额边界最小/最大、小数位、币种、金额不一致拒绝规则和对账结果
查询补单回调缺失、长期处理中、终态查询退避策略与审计记录
结算对账跨日、费用、净额、差异单、批次双方签字或书面验收结论

密钥安全基线

  • 测试与生产密钥分离,通过受控秘密管理系统注入,不写入源码、聊天、工单截图或前端包。
  • 按最小权限限制凭证用途和环境;记录创建、查看、轮换、吊销和异常访问。
  • 支持密钥版本与重叠轮换窗口;泄露时立即吊销,并复核日志、订单和回调。
  • 回调端启用 TLS、请求大小限制和速率限制;IP allowlist 只能作为附加控制,不能替代验签。

接入前还应核对实际服务边界,并向相关方取得当前版本号、生产域名、凭证交付方式、结算规则和异常联系人书面确认。

查看服务边界
联系支付客服