PAYWISE
zh

API 参考

PAYWISE 公开 API — v1

通过一个 REST API 接收 QRIS 和 USDT 支付。交易创建时为 pending,只有经服务端核验确认付款后才会变为 paid。沙盒支付不会真实扣款,结果由您自行选择。

基础地址 https://paywise.asia/api/v1

快速开始

  1. 1

    获取 API 密钥

    在 API 密钥页面创建沙盒密钥(pw_test_…),并以 Bearer 令牌发送。

  2. 2

    创建支付

    使用您的订单号和金额调用 POST /api/v1/transactions,然后展示二维码或打开 checkout_url。

  3. 3

    通过 Webhook 确认

    当带签名的 payment.paid Webhook 到达您的服务器时再履行订单。

认证

除服务商 Webhook 接口外,每个请求都需要 API 密钥,可在仪表盘的 API 密钥 中生成。

HTTP header
Authorization: Bearer pw_test_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  • 完整密钥仅在创建时显示一次,PAYWISE 只保存其哈希值。每个 API 密钥的速率限制为每分钟 60 次请求,超出时返回 429 RATE_LIMITED。每个响应(无论成功或失败)都带有 X-Request-Id 请求头,也会显示在 API 日志的对应行中。
  • 您可以在 API 密钥页面将每个密钥限制为您服务器的 IP 地址或 CIDR 网段。来自其他地址的请求将返回 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 正式环境:服务商未能及时响应;交易已标记为失败

支付

创建交易

POST /api/v1/transactions
字段 说明
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(默认值)。
请求 · QRIS
{
    "merchant_reference": "ORDER-1042",
    "amount": 250000,
    "currency": "IDR",
    "payment_method": "QRIS",
    "customer_id": "user-1042",
    "customer_name": "Budi Santoso"
}
请求 · USDT
{
    "merchant_reference": "ORDER-1043",
    "amount": 100,
    "currency": "USDT",
    "payment_method": "USDT",
    "network": "BEP20",
    "customer_id": "user-1043"
}
显示完整响应 (响应 — 201 Created)
响应 — 201 Created
{
    "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 会在其后附加结果:

Return URL
https://shop.example.com/thanks?reference=PW20260921143022AB3F&merchant_reference=ORDER-1042&status=paid
该 URL 中的 status 仅用于您页面上的提示。任何人都可以手动输入它,因此切勿据此发货:请等待 payment.paid webhook,或使用 GET /api/v1/transactions/{reference} 查询。

查询交易

GET /api/v1/transactions/{reference}

{reference} 是创建交易时 PAYWISE 返回的参考号,而不是您自己的 merchant_reference。

您只能查询自己的交易。查询其他商户的参考号会返回 404 NOT_FOUND 而不是 403,以免暴露该参考号的存在。

交易列表

GET /api/v1/transactions?status=paid&date_from=2026-09-01&date_to=2026-09-30

该密钥所属环境中的交易,按时间倒序:每页 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。
响应 — 200 OK
{
    "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、商户仪表盘和管理员仪表盘使用完全一致的状态值。

提现

提现

POST /api/v1/withdrawals

从您的服务器申请提取已结算资金:与控制台 → 提现相同,最低额、最高额、手续费、可用资金和自动出款规则都相同。只有正式密钥可以申请(沙盒密钥会收到 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。
银行代码(124)
  • 002 BRI
  • 008 MANDIRI
  • 009 BNI
  • 011 DANAMON
  • 013 PERMATABANK
  • 014 BCA
  • 016 MAYBANK
  • 019 PANIN BANK
  • 022 CIMB NIAGA
  • 023 UOB
  • 028 OCBC
  • 031 CITIBANK
  • 032 JPMORGAN
  • 033 BANK OF AMERICA
  • 036 PT. BANK WINDU KENTJANA INT,TBK
  • 037 ARTHA GRAHA
  • 040 BANGKOK BANK
  • 041 HSBC
  • 042 MUFG
  • 046 DBS
  • 047 PT. BANK RESONA PERDANIA
  • 048 MIZUHO
  • 050 STANDARD CHARTERED
  • 052 ROYAL BANK OF SCOTLAND N.V.
  • 054 BANK CAPITAL
  • 057 BNP PARIBAS
  • 059 PT. BANK KEB INDONESIA
  • 061 ANZ
  • 067 DEUTSCHE BANK
  • 068 WOORI
  • 069 BANK OF CHINA
  • 076 BANK BUMI ARTA
  • 087 BANK EKONOMI
  • 088 PT. BANK ANTARDAERAH
  • 089 PT. BANK INTERIM INDONESIA
  • 095 J TRUST BANK
  • 097 MAYAPADA
  • 110 BJB
  • 111 BANK DKI
  • 112 BANK BPD DIY
  • 113 BANK JATENG
  • 114 BANK JATIM
  • 115 BANK JAMBI
  • 116 BANK ACEH
  • 117 BANK SUMUT
  • 118 BANK NAGARI
  • 119 BANK RIAU KEPRI
  • 120 BANK SUMSEL BABEL
  • 121 BANK LAMPUNG
  • 122 BANK KALSEL
  • 123 BANK KALBAR
  • 124 BANK KALTIMTARA
  • 125 BANK KALTENG
  • 126 BANK SULSELBAR
  • 127 BANK SULUTGO
  • 128 BANK NTB
  • 129 BANK BPD BALI
  • 130 BANK NTT
  • 131 BANK MALUKU
  • 132 BANK PAPUA
  • 133 BANK BENGKULU
  • 134 BANK SULTENG
  • 135 BANK SULTRA
  • 145 PT. BANK NUSANTARA PARAHYANGAN
  • 146 BANK OF INDIA
  • 147 BANK MUAMALAT
  • 151 BANK MESTIKA
  • 152 PT. BANK METRO EXPRESS
  • 153 BANK SINARMAS
  • 157 BANK MASPION
  • 161 BANK GANESHA
  • 164 ICBC
  • 167 QNB
  • 200 BTN
  • 212 PT. BANK HIMPUNAN SAUDARA 1906, TBK.
  • 213 BTPN
  • 405 BANK VICTORIA SYARIAH
  • 422 PT. BANK SYARIAH BRI
  • 425 BJB SYARIAH
  • 426 BANK MEGA
  • 427 PT. BANK BNI SYARIAH
  • 441 KB BANK
  • 451 BSI
  • 459 PT. BANK BISNIS INTERNASIONAL
  • 466 PT. BANK ANDARA
  • 472 BANK SAQU
  • 484 HANA BANK
  • 485 PT. BANK ICB BUMIPUTERA, TBK.
  • 490 BNC
  • 491 PT. BANK MITRA NIAGA
  • 494 BANK RAYA
  • 498 SBI INDONESIA
  • 501 BLU BCA DIGITAL
  • 503 NOBU BANK
  • 506 PT. BANK SYARIAH MEGA INDONESIA
  • 513 BANK INA
  • 517 PANIN DUBAI SYARIAH
  • 520 PT. PRIMA MASTER BANK
  • 521 KB BANK SYARIAH
  • 523 BANK SAMPOERNA
  • 526 PT. LIMAN INTERNASIONAL BANK
  • 531 PT. ANGLOMAS INTERNATIONAL BANK
  • 535 SEABANK
  • 536 BCA SYARIAH
  • 542 BANK JAGO
  • 547 BTPN SYARIAH
  • 548 BANK MAS
  • 553 BANK MAYORA
  • 555 BANK INDEX
  • 558 PT. BANK PUNDI INDONESIA, TBK.
  • 559 PT. CENTRATAMA NASIONAL BANK
  • 562 SUPERBANK
  • 564 PT. BANK SINAR HARAPAN BALI
  • 566 BANK VICTORIA
  • 567 ALLO BANK
  • 945 IBK
  • 947 MAYBANK SYARIAH
  • 949 PT. BANK CHINATRUST INDONESIA
  • 950 COMMONWEALTH BANK
  • 911 LINKAJA
  • DANA DANA
  • OVO OVO
  • GOPAY GOPAY
  • SHOPEEPAY SHOPEEPAY
Idempotency-Key 请求头(必填):8 至 64 个字符,每笔提现一个(例如您的出款 ID)。以相同的键和相同的信息再次发送会以 200 返回原提现,因此超时的请求可以安全重试。相同的键但金额、方式或收款目标不同会返回 409 DUPLICATE_REQUEST。
请求 · cURL
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"}'
显示完整响应 (响应 — 201 Created)
响应 — 201 Created
{
    "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 或下方接口跟踪。

GET /api/v1/withdrawals

密钥所属环境中的提现,按时间倒序,分页和 meta 与交易列表相同。筛选(均可选):status(requested、approved、processing、completed、failed、rejected)、payment_method、date_from 和 date_to(YYYY-MM-DD,UTC+7)。

GET /api/v1/withdrawals/{reference}

{reference} 是申请提现时返回的 PWD… 编号。其他商户的提现或另一环境的提现返回 404 NOT_FOUND。

可用资金

GET /api/v1/balance

密钥所属环境中每种支付方式的资金,与提现页面一致:当前可提现、等待下一批结算的金额、当前单笔提现的最大到账金额(max_withdrawal)以及每笔提现的限额和手续费。

响应 — 200 OK
{
    "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

PAYWISE → 您

在 仪表盘 → 网站与 Webhook 中配置 Webhook 地址和事件。当交易状态变更为已订阅的事件时,PAYWISE 会发送:

HTTP
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。

显示完整响应 (withdrawal.completed)
withdrawal.completed
{
    "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 · 内部:供 PAYWISE 支付网络使用
POST /api/v1/webhooks/provider/{provider}

供 PAYWISE 支付网络内部使用,而非商户。每条入站支付通知都会先经过身份验证(密钥令牌或 HMAC 签名),匹配到唯一一笔正式交易,再经服务端核验;通知中的状态本身绝不会把支付标记为已支付。尚不可用的通道返回 503 PROVIDER_NOT_CONNECTED。