巴西&墨西哥对接文档
更新时间:2026-05-10
巴西&墨西哥对接文档
Owner: A Alex Tags: Guides and Processes 更新时间:2026-05-10
商户支付对接文档
本文档仅说明商户通过 API Key 接入支付网关时需要使用的接口与回调规范,覆盖创建订单、查询订单、关闭订单和异步通知。
💡 对接建议
- 创建订单成功后请保存
payment_id,后续详情查询、关闭、取消都使用该字段- 验签时务必使用原始请求体,避免因 JSON 重排导致签名不一致
- 若接入环境配置了 IP 白名单,请确认商户服务出口 IP 已提前登记
- 联调通过沙盒进行
- 注意金额为分,举个栗子:100分=1元,10分=0.1元
1. 基础信息
Base URL
https://api.x2pay.eu.org
鉴权请求头(必填)
X-API-Key:平台分配的应用 API KeyX-Signature:请求签名,HMAC-SHA256小写十六进制X-Timestamp:Unix 时间戳,支持秒或毫秒X-Nonce:一次性随机串,建议长度不少于 16
可选请求头
X-Request-ID:商户请求流水号,便于排查问题
签名算法
1. 收集参与签名的参数
2. 按参数名升序排序
3. 拼接为 key1=value1&key2=value2...
4. signature = hex(hmac_sha256(api_secret, canonical_string))
参与签名的字段
- 所有 URL Query 参数
- 固定字段:
api_key:请求头X-API-Keytimestamp:请求头X-Timestampnonce:请求头X-Noncemethod:大写 HTTP 方法,如POST、GET、PUTpath:请求路径,不含域名,如/api/v1/payin
- 当请求方法为
POST或PUT时,额外加入:content_type:请求的Content-Type,例如application/json
- 当请求体非空时,额外加入:
body_sha256:原始请求体的SHA256小写十六进制
拼接规则
- 所有参与字段按参数名升序排序
- 空值字段不参与拼接
- 使用
key=value形式拼接,并以&连接
签名示例:创建收款订单
请求:
POST /api/v1/payinContent-Type: application/json
若请求头和请求体如下:
X-API-Key = {api_key}X-Timestamp = 1710000000000X-Nonce = abcdef1234567890body = {"app_id":"app_456","merchant_tx_id":"order_789","amount":10000,"currency":"BRL","subject":"商品购买"}
则先计算:
body_sha256 = sha256(body)
参与签名的参数排序后拼接为:
api_key={api_key}&body_sha256={body_sha256}&content_type=application/json&method=POST&nonce=abcdef1234567890&path=/api/v1/payin×tamp=1710000000000
最终签名:
signature = hex(hmac_sha256(api_secret, canonical_string))
签名示例:查询支付订单
请求:
GET /api/v1/payments/pay_abc123
若无 Query 参数,则参与签名的参数排序后拼接为:
api_key={api_key}&method=GET&nonce=abcdef1234567890&path=/api/v1/payments/pay_abc123×tamp=1710000000000
若 URL 上带 Query 参数,则 Query 参数也需要一并加入后再排序拼接。
时效与防重放
X-Timestamp与服务器时间允许偏差为 ±5 分钟- 同一
X-API-Key下,X-Nonce不可重复使用
2. 响应结构
成功响应:
{
"code": "0",
"message": "success",
"request_id": "req_123456",
"data": {}
}
失败响应:
{
"code": "1001",
"message": "无效的请求",
"request_id": "req_123456",
"data": "..."
}
说明:
- 成功时返回
HTTP 200 - 失败时会返回对应的 HTTP 错误状态(如
400、401、403、404、429、500),并在响应体中携带业务错误码
常见错误码
1001无效请求1002未授权1003禁止访问1004资源不存在1005超过限流1006签名无效1007时间戳过期1008IP 不在白名单2002重复订单(同一merchant_tx_id提交了不同金额)2007无效状态5001内部错误
订单状态
PENDINGPROCESSINGSUCCESSFAILEDCANCELLEDCLOSEDREFUNDED
时间字段统一使用 RFC3339,例如 2026-03-03T12:00:00Z。
3. 创建收款订单
POST /api/v1/payin
请求体
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
app_id | string | 是 | 平台分配的应用 ID,必须与当前 API Key 绑定应用一致 |
merchant_tx_id | string | 是 | 商户订单号,同一应用内唯一 |
amount | int64 | 是 | 金额,最小货币单位,必须大于 0 |
currency | string | 是 | 巴西 BRL |
payment_method | string | 否 | 支付方式:巴西 pix |
notify_url | string | 否 | 异步通知地址 |
return_url | string | 否 | 同步跳转地址 |
subject | string | 否 | 订单标题 |
extra | string | 否 | 扩展字段,建议传 JSON 字符串 |
expire_minutes | int | 否 | 订单过期时间,1-1440,默认 30 |
account_number | string | 建议填写 | 巴西:用户CPF/CNPJ |
account_name | string | 建议填写 | 巴西:用户 name |
墨西哥专用:创建收款订单
以下字段仅在接入墨西哥渠道时使用;其它国家或渠道无需传入。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
currency | string | 是 | 墨西哥固定传 MXN |
payment_method | string | 建议填写 | 墨西哥支持 va & spei |
account_name | string | 建议填写 | 墨西哥:付款人真实姓名 |
extra.email | string | 建议填写 | 墨西哥:付款人邮箱 |
extra.phone | string | 否 | 墨西哥:付款人手机号 |
extra.payment_type | string | 否 | 墨西哥渠道支付类型覆盖项。普通 VA/SPEI 接入无需传 |
墨西哥 VA/SPEI 收款示例:
{
"app_id": "app_456",
"merchant_tx_id": "mx_order_001",
"amount": 10000,
"currency": "MXN",
"payment_method": "va",
"notify_url": "https://merchant.example.com/payments/notify",
"return_url": "https://merchant.example.com/payments/return",
"subject": "Mexico VA order",
"account_name": "Juan Perez",
"extra": "{\"email\":\"juan@example.com\",\"phone\":\"+525512345678\"}"
}
墨西哥专用说明:
amount仍使用最小货币单位。例如10000表示100.00 MXN。extra是 JSON 字符串;请确保转义后仍是合法 JSON。- 普通 VA/SPEI 接入只需要传
payment_method。extra.payment_type是渠道侧覆盖项,不需要和payment_method同时配置。 - 若使用墨西哥 VA,用户实际还款金额和次数可能与订单期望金额不同,详见本文 Webhook 章节的“墨西哥 VA 多次回款”说明。
幂等规则
- 同一
app_id + merchant_tx_id重复提交,且金额相同:返回首次创建的订单 - 同一
app_id + merchant_tx_id重复提交,但金额不同:返回2002
响应 data
| 字段 | 类型 | 说明 |
|---|---|---|
payment_id | string | 系统支付订单号 |
merchant_tx_id | string | 商户订单号 |
status | string | 当前订单状态 |
amount | int64 | 金额 |
currency | string | 币种 |
transaction_type | string | 固定为 PAY_IN |
qr_code | string | 原始支付码(有值时返回) |
qr_code_base64 | string | 二维码图片 Base64(有值时返回) |
created_at | string | 创建时间 |
expired_at | string | 过期时间 |
process_error | string | 同步处理失败提示(有值时返回) |
示例
curl -X POST "https://{HOST}/api/v1/payin" \
-H "Content-Type: application/json" \
-H "X-API-Key: {api_key}" \
-H "X-Signature: {signature}" \
-H "X-Timestamp: {timestamp}" \
-H "X-Nonce: {nonce}" \
-d '{
"app_id": "app_456",
"merchant_tx_id": "order_789",
"amount": 10000,
"currency": "BRL",
"subject": "商品购买"
}'
收银台链接
如需收银台页面(适用于 H5/网页支付),可在创建订单成功后调用创建收银会话接口获取链接。
POST /api/v1/cashier/sessions
请求体
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
app_id | string | 否 | 应用 ID;不传时默认使用当前 API Key 绑定应用,传入时必须与认证应用一致 |
payment_id | string | 否 | 支付订单号,与 merchant_tx_id 二选一 |
merchant_tx_id | string | 否 | 商户订单号,与 payment_id 二选一 |
expire_minutes | int | 否 | 收银会话过期分钟数,默认 15,最大 30 |
return_url | string | 否 | 同步跳转地址(需在白名单内) |
cancel_url | string | 否 | 取消地址 |
响应 data
| 字段 | 类型 | 说明 |
|---|---|---|
checkout_url | string | 收银台访问链接 |
payment_id | string | 支付订单号 |
expire_at | string | 收银会话过期时间 |
session_id | string | 收银会话 ID |
token | string | 收银会话 token(拼接到收银台 URL 使用) |
错误码说明
1001无效请求(参数缺失或格式错误)1002未授权(签名或 API Key 错误)1004资源不存在(payment_id/merchant_tx_id 未找到)2007无效状态(订单状态不允许创建收银会话)
常见错误
invalid return url:return_url不在白名单payment not found:订单不存在或不属于当前商户
示例
curl -X POST "https://{HOST}/api/v1/cashier/sessions" \
-H "Content-Type: application/json" \
-H "X-API-Key: {api_key}" \
-H "X-Signature: {signature}" \
-H "X-Timestamp: {timestamp}" \
-H "X-Nonce: {nonce}" \
-d '{
"app_id": "app_456",
"payment_id": "pay_abc123",
"return_url": "https://merchant.example.com/return"
}'
4. 创建付款订单
POST /api/v1/payout
app_id,merchant_tx_id,amount,currency基础字段外,付款订单还需要收款账户信息。
补充请求字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
account_bank | string | 是 | 银行标识,巴西:填 CPF/CNPJ |
account_name | string | 是 | 收款人姓名 |
account_type | string | 是 | 账户类型,巴西:填 0~4 |
account_number | string | 是 | 收款标识,巴西:填账户类型对应的 Pix |
对照关系(0-CPF,1-CNPJ,2-EMAIL,3-PHONE,4-EVP)
其余规则与“创建收款订单”一致,响应中的 transaction_type 固定为 PAY_OUT。
墨西哥专用:创建付款订单
以下字段仅在接入墨西哥渠道时使用;其它国家或渠道无需按此解释。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
currency | string | 是 | 墨西哥固定传 MXN |
account_bank | string | 是 | 墨西哥:收款银行代码,墨西哥银行编码表。例如 BBVA MEXICO 为 40012 |
account_name | string | 是 | 墨西哥:收款人真实姓名 |
account_type | string | 是 | 墨西哥:账户类型。CLABE 账户传 CLABE |
account_number | string | 是 | 墨西哥:收款银行账号,如 18 位 CLABE |
extra.bank_name | string | 建议填写 | 墨西哥:银行名称,如 BBVA MEXICO |
extra.id_card_number | string | 是 | 墨西哥:收款人证件号 |
墨西哥代付银行信息说明:
account_bank必须传银行编码,不是银行简称。商户应使用平台提供的墨西哥银行编码表。- CLABE 前 3 位通常需要与银行编码后 3 位匹配。例如 BBVA MEXICO 银行编码
40012,CLABE 示例以012开头。
墨西哥代付示例:
{
"app_id": "app_456",
"merchant_tx_id": "mx_payout_001",
"amount": 2500,
"currency": "MXN",
"payment_method": "spei",
"notify_url": "https://merchant.example.com/payouts/notify",
"subject": "Mexico payout",
"account_bank": "40012",
"account_name": "JUAN PEREZ",
"account_type": "CLABE",
"account_number": "012345678901234567",
"extra": "{\"bank_name\":\"BBVA MEXICO\",\"id_card_number\":\"GAPG00000000000000\"}"
}
5. 查询支付订单列表
GET /api/v1/payments
当前 API Key 仅能查询自身应用下的订单。
常用查询参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
app_id | string | 否 | 当前应用 ID;不传时默认查询当前应用 |
payment_id | string | 否 | 按支付订单号精确查询 |
merchant_tx_id | string | 否 | 按商户订单号精确查询 |
transaction_type | string | 否 | PAY_IN 或 PAY_OUT |
status | string | 否 | 订单状态 |
start_time | string | 否 | 开始时间(RFC3339) |
end_time | string | 否 | 结束时间(RFC3339) |
page | int | 否 | 页码,默认 1 |
page_size | int | 否 | 每页数量,默认 20,最大 100 |
响应 data
| 字段 | 类型 | 说明 |
|---|---|---|
total | int64 | 总数 |
page | int | 当前页 |
page_size | int | 每页数量 |
list | array | 订单列表 |
订单明细会返回当前商户可见字段;部分敏感字段可能按规则脱敏。
6. 查询支付订单详情
GET /api/v1/payments/{payment_id}
路径参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
payment_id | string | 是 | 系统支付订单号 |
返回当前商户可见的订单详情。若商户仅持有 merchant_tx_id,可先通过列表接口按 merchant_tx_id 过滤后获取对应 payment_id。
7. 查询应用余额
GET /api/v1/balance
该接口用于查询当前 API Key 所属应用的余额信息。默认读取认证上下文中的 app_id;如传 app_id 查询参数,必须与认证应用一致。
查询参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
app_id | string | 否 | 应用 ID(可选;传入时必须与当前 API Key 绑定应用一致) |
响应 data
| 字段 | 类型 | 说明 |
|---|---|---|
id | string | 余额记录 ID |
app_id | string | 应用 ID |
balance | int64 | 总余额(最小货币单位) |
frozen_amount | int64 | 冻结金额(最小货币单位) |
available_amount | int64 | 可用余额(最小货币单位) |
currency | string | 币种 |
updated_at | string | 更新时间(RFC3339) |
created_at | string | 创建时间(RFC3339) |
示例
curl -X GET "https://{HOST}/api/v1/balance?app_id=app_456" \
-H "X-API-Key: {api_key}" \
-H "X-Signature: {signature}" \
-H "X-Timestamp: {timestamp}" \
-H "X-Nonce: {nonce}"
8. Webhook 通知
当订单状态变化时,系统会向订单的 notify_url 发送 POST 请求。
请求头
Content-Type: application/jsonX-Signature:通知签名X-Event-Type:事件类型X-Notification-ID:通知唯一标识X-Timestamp:发送时间(Unix 秒级时间戳)
请求体示例
{
"event_type": "PAYMENT_SUCCESS",
"payment_id": "pay_123456",
"merchant_id": "merchant_001",
"app_id": "app_001",
"merchant_tx_id": "order_123",
"amount": 10000,
"currency": "BRL",
"status": "SUCCESS",
"end_to_end": "ch_789",
"qrCode": "000201010212...",
"errorCode": "",
"account": {
"bank": "001",
"name": "Maria Silva",
"number": "1234567890",
"accountType": "CACC"
},
"extra": {
"user_id": "123"
},
"timestamp": 1772491200
}
验签方式
signature = hex(hmac_sha256(api_secret, raw_body))
raw_body为通知请求的原始 JSON 字节api_secret为应用 API Secret(与请求签名使用同一密钥)- 以请求头
X-Signature为准
回调响应要求
- 商户处理成功后请返回
2xx - 返回非
2xx时,系统会按重试策略继续发送
墨西哥专用:VA 多次回款
墨西哥 VA 收款与普通一次性收款不同:当用户通过 VA 还款时,实际还款金额和还款次数由用户决定,可能出现以下情况:
- 单次回款金额小于订单期望金额
- 单次回款金额大于订单期望金额
- 同一商户订单发生多次回款
平台会根据累计回款结果更新订单状态。商户只需要按平台 Webhook 通知处理自身业务状态,并确保回调处理幂等。
商户处理建议:
- 商户收到的 Webhook 仍是平台订单状态通知;通知中的
amount为原订单金额,不代表墨西哥 VA 的某一笔实际回款金额。 - 不要假设用户只会还款一次,也不要假设实际累计回款一定等于原订单金额。
- 若业务需要精确核对 VA 多次回款,请以商户订单号
merchant_tx_id归集,并结合平台对账数据核对每笔回款。 - 商户回调接口必须幂等;同一通知重试时不应重复发货、重复记账或重复变更业务状态。
- 订单累计回款未达到期望金额前,平台订单可能仍保持处理中状态;累计达到或超过期望金额后,平台会将主订单推进到成功状态。