API 参考
通过一个 REST API 接收 QRIS 和 USDT 支付。交易创建时为 pending,只有经服务端核验确认付款后才会变为 paid。沙盒支付不会真实扣款,结果由您自行选择。
除服务商 Webhook 接口外,每个请求都需要 API 密钥,可在仪表盘的 API 密钥 中生成。
Authorization: Bearer pw_test_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
429 RATE_LIMITED。每个响应(无论成功或失败)都带有 X-Request-Id 请求头,也会显示在 API 日志的对应行中。403 IP_NOT_ALLOWED,并会通知您。每个 API 密钥只属于一个环境,可以直接从前缀看出:
pw_test_…
使用沙盒密钥创建的交易会被标记为 sandbox,不会出现在正式报告或默认仪表盘视图中。要完成沙盒付款,请打开其 checkout_url 并选择已支付、失败或已过期:您的 Webhook 会收到与正式付款相同的事件。
pw_live_…
使用正式密钥创建的交易属于生产交易数据,会计入正式仪表盘统计、报告和结算记录。
每个响应都只会是以下两种结构之一。
{
"success": true,
"data": {
"…": "…"
}
}
{
"success": false,
"error": {
"code": "INVALID_API_KEY",
"message": "Invalid API credentials."
}
}
| HTTP | 代码 | 含义 |
|---|---|---|
| 401 | INVALID_API_KEY | API 密钥缺失、格式错误或无法识别 |
| 401 | API_KEY_REVOKED | 该密钥已在仪表盘中被撤销 |
| 403 | IP_NOT_ALLOWED | 该 API 密钥设置了允许的 IP 列表,而请求来自其他 IP |
| 403 | MERCHANT_INACTIVE | 商户账户已被暂停 |
| 404 | NOT_FOUND | 资源不存在,或属于其他商户 |
| 405 | METHOD_NOT_ALLOWED | 该端点不接受此 HTTP 方法 |
| 409 | DUPLICATE_REFERENCE | 相同的 merchant_reference 使用了不同的金额/支付方式 |
| 422 | VALIDATION_ERROR | 请求体校验失败 |
| 422 | RETURN_URL_NOT_ALLOWED | return_url 不是 https,或不在您任何一个已启用的网站上 |
| 422 | WEBSITE_NOT_FOUND | website 不是您已启用的网站 |
| 429 | RATE_LIMITED | 请求过于频繁 |
| 502 | PROVIDER_ERROR | QRIS 或 USDT 正式环境:服务商拒绝或返回无效响应;交易已标记为失败 |
| 503 | PROVIDER_NOT_CONNECTED | QRIS 或 USDT 正式环境:该通道的服务商未连接,无法创建支付 |
| 504 | PROVIDER_TIMEOUT | QRIS 或 USDT 正式环境:服务商未能及时响应;交易已标记为失败 |
支付
| 字段 | 说明 |
|---|---|
| merchant_reference string · 必填 | 您自己的订单号,同时用作幂等键。 |
| amount number · 必填 | QRIS:整数印尼盾,1,000–10,000,000 IDR。USDT:最低 1,最多 2 位小数 |
| payment_method string · 必填 | 仅限 QRIS(IDR)或 USDT(BEP20) |
| customer_id string · 必填 | 必填(最多 100)。您系统中的客户 ID:用户 ID、用户名或邮箱。会显示在控制台、导出文件、API 响应和 Webhook 中,便于您了解付款人。也会作为客户标识传给支付服务商,除非其中包含“@”(邮箱绝不会发送)。 |
| currency string · 可选 | 可选。必须与通道一致:QRIS 为 IDR,USDT 为 USDT。按原样保存,不做换算。 |
| network string · 可选 | 仅限 USDT,必填:BEP20。TRC20/ERC20 将被拒绝。QRIS 请勿传入。 |
| customer_name string · 可选 | 可选(最多 50),适用于所有支付方式。付款人姓名,显示在您的控制台中。当 customer_id 为邮箱时,改为将其传给服务商。 |
| return_url string · 可选 | 可选。为本次付款覆盖网站的返回 URL。必须是 https,并位于您已启用的网站之一(控制台 → 网站与 Webhook)。 |
| website string · 可选 | 可选。您某个网站的域名(例如 shop.example.com);使用该网站的返回 URL。两者都不传则使用默认网站。镜像域名视为其所属网站:返回 URL 以及位于该网站域名上的 Webhook URL 会迁移到该镜像域名。 |
| expires_in integer · 可选 | 可选,仅限 QRIS。二维码可支付的时长(秒):60 至 1,200(默认值)。 |
{
"merchant_reference": "ORDER-1042",
"amount": 250000,
"currency": "IDR",
"payment_method": "QRIS",
"customer_id": "user-1042",
"customer_name": "Budi Santoso"
}
{
"merchant_reference": "ORDER-1043",
"amount": 100,
"currency": "USDT",
"payment_method": "USDT",
"network": "BEP20",
"customer_id": "user-1043"
}
{
"success": true,
"data": {
"reference": "PW20260921143022AB3F",
"merchant_reference": "ORDER-1042",
"payment_method": "QRIS",
"environment": "sandbox",
"customer_id": "user-1042",
"customer_name": "Budi Santoso",
"amount": 250000,
"fee_bearer": "merchant",
"currency": "IDR",
"network": null,
"status": "pending",
"created_at": "2026-09-21T14:30:22+00:00",
"paid_at": null,
"qr_string": "SANDBOX-QRIS-PW20260921143022AB3F-NOT-PAYABLE",
"pay_address": null,
"pay_amount": 250000,
"expires_at": "2026-09-21T14:50:22+00:00",
"checkout_url": "https://checkout.paywise.asia/Xk7p2QaZ9mRt"
}
}
USDT:请向客户展示 pay_address(BEP20 地址)和 pay_amount,即需要转账的确切 USDT 数额。pay_amount 等于 amount 加上由客户承担的网络费和处理费,因此您将收到完整的 amount。地址有效期为 60 分钟(expires_at);之后到账的款项仍会被确认。少于 pay_amount 的付款不会被标记为已支付。
交易费用由谁承担按网站在 控制台 → 网站与 Webhook 中设置。当 fee_bearer 为 customer 时,客户支付 pay_amount(金额加费用:渲染 QR 字符串或显示此金额),您正好收到 amount;webhook 和您的控制台显示 amount。请告知客户价格已包含服务费。否则 QRIS 的 pay_amount 等于 amount。更改仅适用于新交易。
merchant_reference 以及相同的金额/支付方式重试时,将返回原交易并响应 200 OK,而不会创建重复交易。若使用相同参考号但金额或支付方式不同,将返回 409 DUPLICATE_REFERENCE。沙盒与真实环境的密钥相互独立:同一 merchant_reference 在两个环境中各可使用一次,密钥永远看不到另一环境的交易。在 控制台 → 网站与 Webhook 中为网站开启托管支付页面。该网站的交易(由 website 指定、与 return_url 匹配,或默认网站)会附带 checkout_url(否则为 null):由 PAYWISE 托管的页面,向客户展示二维码(QRIS)或充值地址及确切金额(USDT)、倒计时以及自动更新的支付状态。将客户跳转到该页面,或在新标签页中打开。您也可以继续自行展示 qr_string 或 pay_address。
付款成功、过期或失败后,页面会将客户送回您在 控制台 → 网站与 Webhook 中为网站设置的返回 URL(默认网站,或 website 指定的网站)。传入 return_url 可为单笔付款覆盖:必须是 https 且位于这些域名(或其子域名)上,否则返回 422 RETURN_URL_NOT_ALLOWED。PAYWISE 会在其后附加结果:
https://shop.example.com/thanks?reference=PW20260921143022AB3F&merchant_reference=ORDER-1042&status=paid
status 仅用于您页面上的提示。任何人都可以手动输入它,因此切勿据此发货:请等待 payment.paid webhook,或使用 GET /api/v1/transactions/{reference} 查询。{reference} 是创建交易时 PAYWISE 返回的参考号,而不是您自己的 merchant_reference。
404 NOT_FOUND 而不是 403,以免暴露该参考号的存在。该密钥所属环境中的交易,按时间倒序:每页 20 条,通过 per_page 最多 100 条。所有筛选条件均为可选,可组合使用。每一项与 GET /api/v1/transactions/{reference} 返回的对象相同。
| 字段 | 说明 |
|---|---|
| status | pending、paid、failed 或 expired。 |
| payment_method | QRIS 或 USDT。 |
| date_from | YYYY-MM-DD。交易创建的起始日期(UTC+7)。 |
| date_to | YYYY-MM-DD。结束日期(UTC+7),含当天。 |
| merchant_reference | 您的订单号,精确匹配。 |
| customer_id | 您的客户 ID,精确匹配。 |
| per_page | 1–100,默认 20。 |
| page | 页码,默认 1。 |
{
"success": true,
"data": [
{
"reference": "PW20260921143022AB3F",
"merchant_reference": "ORDER-1042",
"payment_method": "QRIS",
"status": "paid",
"amount": 250000,
"currency": "IDR",
"…": "…"
}
],
"meta": {
"page": 1,
"per_page": 20,
"total": 1,
"last_page": 1
}
}
meta 包含当前页码、每页数量、匹配交易总数和最后一页。
数据库、本 API、商户仪表盘和管理员仪表盘使用完全一致的状态值。
提现
从您的服务器申请提取已结算资金:与控制台 → 提现相同,最低额、最高额、手续费、可用资金和自动出款规则都相同。只有正式密钥可以申请(沙盒密钥会收到 403 LIVE_KEY_REQUIRED);没有邮件验证码,正式密钥本身即授权出款。请只在服务器上保存密钥,并考虑在 API 密钥页面设置允许的 IP 列表。
amount 是到账金额。提现手续费(QRIS Rp3.000,USDT 1.00 USDT)另外加收,从可用资金中扣除;响应中显示 amount(扣除额)、fee 和 payout_amount(到账额)。每笔限额:QRIS Rp25.000 – Rp20.000.000,USDT 10.00 USDT – 10,000.00 USDT。
| 字段 | 说明 |
|---|---|
| payment_method | 必填。提取哪类资金:QRIS(以 IDR 付至银行账户)或 USDT(发送至 BEP20 钱包)。 |
| amount | 必填。到账金额,使用该通道的币种(最多 2 位小数)。 |
| bank_code | 仅 QRIS,必填。下方列表中的代码:银行为 3 位数字,电子钱包为 DANA、OVO、GOPAY 或 SHOPEEPAY(此时 account_number 为 08… 手机号)。电子钱包每笔最多 IDR 10,000,000,且不核对户主姓名:号码错误也会照常付款。 |
| account_number | 仅 QRIS,必填。5 至 30 位数字。 |
| wallet_address | 仅 USDT,必填。BEP20 地址:0x 加 40 个十六进制字符。 |
| network | 仅 USDT,必填:BEP20。 |
200 返回原提现,因此超时的请求可以安全重试。相同的键但金额、方式或收款目标不同会返回 409 DUPLICATE_REQUEST。curl -X POST https://paywise.asia/api/v1/withdrawals \
-H "Authorization: Bearer pw_live_…" \
-H "Idempotency-Key: payout-2026-09-27-001" \
-H "Content-Type: application/json" \
-d '{"payment_method":"QRIS","amount":1500000,"bank_code":"014","account_number":"1234567890"}'
{
"success": true,
"data": {
"reference": "PWD20260927090112C4DQ",
"payment_method": "QRIS",
"environment": "live",
"payout_method": "bank_transfer",
"currency": "IDR",
"network": null,
"amount": 1503000,
"fee": 3000,
"payout_amount": 1500000,
"status": "requested",
"destination": {
"bank_code": "014",
"bank_name": "BCA",
"account_number": "1234567890"
},
"reason": null,
"requested_at": "2026-09-27T02:01:12+00:00",
"completed_at": null,
"closed_at": null
}
}
422 INSUFFICIENT_FUNDS 表示金额加手续费超过该方式已结算且未提取的资金;error.available 为当前可申请的最大金额。QRIS 资金每天分几批结算;USDT 资金付款即结算。
提现从 requested 开始,经过 approved 和 processing 到 completed,或以 failed 或 rejected 结束(附 reason)。可通过 withdrawal.* webhook 或下方接口跟踪。
密钥所属环境中的提现,按时间倒序,分页和 meta 与交易列表相同。筛选(均可选):status(requested、approved、processing、completed、failed、rejected)、payment_method、date_from 和 date_to(YYYY-MM-DD,UTC+7)。
{reference} 是申请提现时返回的 PWD… 编号。其他商户的提现或另一环境的提现返回 404 NOT_FOUND。
密钥所属环境中每种支付方式的资金,与提现页面一致:当前可提现、等待下一批结算的金额、当前单笔提现的最大到账金额(max_withdrawal)以及每笔提现的限额和手续费。
{
"success": true,
"data": {
"environment": "live",
"methods": {
"QRIS": {
"currency": "IDR",
"available": 1250000,
"awaiting_settlement": 480000,
"next_settlement_at": "2026-09-28T08:00:00+00:00",
"next_settlement_amount": 480000,
"max_withdrawal": 1245000,
"withdrawal": {
"min": 25000,
"max": 20000000,
"fee": 5000
}
},
"USDT": {
"…": "…"
}
}
}
}
Webhook
在 仪表盘 → 网站与 Webhook 中配置 Webhook 地址和事件。当交易状态变更为已订阅的事件时,PAYWISE 会发送:
POST <your webhook_url> Content-Type: application/json X-PAYWISE-Signature: <hex-encoded HMAC-SHA256>
HMAC-SHA256(raw_json_body, your_webhook_secret)(密钥显示在“网站与 Webhook”页面;所有 Webhook 共用一个密钥)并与 X-PAYWISE-Signature 请求头比对来校验签名。事件:payment.paid · payment.failed · payment.expired。
Webhook 从 217.217.253.90 · 2407:3640:2358:7339::1 发出。如果您的防火墙只接受已知地址,请允许这些地址;每次投递仍需验证签名。此列表如有变更会提前公告。
多个网站部署在不同服务器上?可在 控制台 → 网站与 Webhook 中为网站设置独立的 Webhook URL。该网站的付款(由 website 指定、与 return_url 匹配,或默认网站)将发送到那里;其余仍发送到您的主 Webhook URL。所有 Webhook 都使用同一个密钥签名。之前已有独立密钥的网站会继续使用它,直到您在该页面将其切换为主密钥。
每次投递尝试都会记录在“网站与 Webhook”页面:事件、尝试次数、您的接口实际返回的 HTTP 状态(超时则为空)以及最多 2 KB 的响应内容。投递失败会自动重试,您也可以在交易页面重新发送。
提现事件 withdrawal.completed · withdrawal.failed · withdrawal.rejected 会在您的提现完成、失败或被拒绝时发送到您的主 Webhook URL(失败或被拒绝的金额可再次提现)。请在“网站与 Webhook”页面订阅。reason 说明失败或被拒绝的原因,完成时为 null。
{
"event": "withdrawal.completed",
"data": {
"reference": "PWD20260925090112C4DQ",
"payment_method": "QRIS",
"environment": "live",
"payout_method": "bank_transfer",
"currency": "IDR",
"network": null,
"amount": 1500000,
"fee": 5000,
"payout_amount": 1495000,
"status": "completed",
"reason": null,
"requested_at": "2026-09-25T02:01:12+00:00",
"completed_at": "2026-09-25T02:03:40+00:00",
"closed_at": null
}
}
供 PAYWISE 支付网络内部使用,而非商户。每条入站支付通知都会先经过身份验证(密钥令牌或 HMAC 签名),匹配到唯一一笔正式交易,再经服务端核验;通知中的状态本身绝不会把支付标记为已支付。尚不可用的通道返回 503 PROVIDER_NOT_CONNECTED。
通常 1 分钟内回复