系统描述
本文档规定了接入支付系统使用的报文接口,包括业务处理流程、接口的通信方式、交易报文格式说明等。本文档是面向具有一定开发能力,了解相关计算机语言的接口对接开发、维护和管理人员。
相关术语
平台
平台是指提供支付能力的我司系统。
商户
商户是指接入平台的使用者。
商户号
商户号是商户在交易平台的唯一标识,是用来判断商户在平台合法性的唯一条件。
商户私钥
商户私钥是商户在进行交易请求前,对数据做加密验签使用的密钥。是平台验证商户交易请求合法性的唯一判断条件,商户应当妥善保管加密密钥,如有泄露,应及时联系平台进行处理,避免不必要的损失。
后台异步回调
系统在接收到交易数据处理完成后,交易系统主动发起通知给商户的网站,同时携带处理完成的结果信息反馈给商户网站
币种
币种是平台用来区分货币类型的字段,具体描述见接口描述。
支付类型
支付类型是平台用来区分支付产品类别的字段,具体描述见接口描述
商户订单号
商户订单号是有商户系统每生成一笔订单会产生的一个唯一标识该笔订单的号码,商户必须保证订单号的唯一性
协议规范与规则
传输方式:采用HTTPS传输
提交方式:POST
内容类型:application/json
字符编码:UTF-8
下行签名校验:HMAC(sha256,json_str, secretKey) == header(PAY-SIGN) ;用于校验平台返回的数据签名
上行鉴权校验: HMAC(sha256,json_str, secretKey) == header(PAY-ACCESS-SIGN)
交易金额:默认印尼盾,入参(请求)两位小数
时间参数:均使用精确到毫秒的13位时间戳,如:1622016572190。时间戳具体是指从格林尼治时间1970年01月01日00时00分00秒起至现在的毫秒数。
回调与接口响应
- 接口正常交互时,接口会在header返回
PAY-SIGN - 通知回调地址时,会在header传递
PAY-SIGN
签名对json对象原始字符串进行hmacSHA256签名,无排序
举例:
- 接口正常响应时,只对data的json对象签名
- 返回示例:
{"code":200,"msg":"SUCCESS","data":{"certImgUrl":"","createdAt":1730785433449,"mchTradeNo":"TEST_ORDER_1234567877884466","state":"SUCCESS","tradeNo":"O1853674577155104768"}} - 以上述返回为例,只对这一部分签名
{"certImgUrl":"","createdAt":1730785433449,"mchTradeNo":"TEST_ORDER_1234567877884466","state":"SUCCESS","tradeNo":"O1853674577155104768"}
- 返回示例:
- 回调通知时,对请求body中整个json字符串进行hmacSHA256签名,无排序
- 校验hmac(sha256, jsonString , secretKey) == header(PAY-SIGN)
接口鉴权
签名说明
使用参数签名调用接口示例:
curl --request POST \
--url ${HOST}/api/v1/account/balance \
--header 'PAY-ACCESS-MCHNO: YourMchNo' \
--header 'PAY-ACCESS-TIMESTAMP: 1733712250562' \
--header 'PAY-ACCESS-SIGN: 22582bd0cff14c41edbf1ab98506286d' \
--header 'accept: application/json' \
--header 'content-type: application/json' \
--data '{"currency":"IDR","reqTime":1733712250562}'
发起请求:
所有REST私有请求头都必须包含以下内容:
PAY-ACCESS-MCHNO 字符串类型的mchNo商户号。
PAY-ACCESS-TIMESTAMP 发起请求的毫秒时间戳(UTC时区),如: 1733712250562
PAY-ACCESS-SIGN 使用HMAC SHA256哈希函数获得哈希值,字母都小写。
所有请求都应该含有application/json类型内容,并且是有效的JSON。
签名:
PAY-ACCESS-SIGN 的请求头是对timestamp + body字符串(+表示字符串连接),以及SecretKey,使用HMAC SHA256方法加密而得到的(签名字符串的字母都小写)。
如:sign=CryptoJS.HmacSHA256(timestamp + '{"currency":"IDR","amount":"1.23","reqTime":1733712250562}', SecretKey)
注意:json字符串排不排序由商户自行定义,body传什么就拼接签名什么
其中,timestamp的值与PAY-ACCESS-TIMESTAMP请求头相同,为毫秒时间戳格式,如: 1733712250562
body是指请求主体的字符串(body不需要排序,body传什么就拼接签名什么),如果请求没有主体则body可省略。如: {"currency":"IDR","amount":"1.23","reqTime":1733712250562}
银行代码
支付银行代码
二维码:
| 名称 | BankCode 代码 |
|---|---|
| QRIS | QRIS |
电子钱包:
| 名称 | BankCode 代码 |
|---|---|
| DANA | DANA |
| OVO | OVO |
| LINKAJA | LINKAJA |
| SHOPEEPAY | SHOPEEPAY |
| GOPAY | GOPAY |
银行代码:
| 名称 | BankCode 代码 |
|---|---|
| Bank Negara Indonesia (BNI) | BNI |
| Bank Rakyat Indonesia (BRI) | BRI |
| Bank Mandiri | MANDIRI |
| Bank CIMB Niaga | CIMB |
| Bank Permata | PERMATA |
代付银行代码
电子钱包:
| 名称 | BankCode 代码 |
|---|---|
| DANA | DANA |
| OVO | OVO |
| LINKAJA | LINKAJA |
| SHOPEEPAY | SHOPEEPAY |
| GOPAY | GOPAY |
银行代码:
| 银行名称 | BankCode 代码 |
|---|---|
| Anglomas International Bank | ANGLOMAS |
| Bangkok Bank | BANGKOK |
| Bank Agris | AGRIS |
| Bank Agroniaga | AGRONIAGA |
| Bank Amar Indonesia (formerly Anglomas International Bank) | AMAR |
| Bank Andara | ANDARA |
| Bank ANZ Indonesia | ANZ |
| Bank Arta Niaga Kencana | ARTA_NIAGA_KENCANA |
| Bank Artha Graha International | ARTHA |
| BANK JAGO (Ex Bank Artos Indonesia ) | ARTOS |
| Bank Bisnis Internasional | BISNIS_INTERNASIONAL |
| Bank BJB | BJB |
| Bank BJB Syariah | BJB_SYR |
| Bank BNI Syariah | BNI_SYR |
| Bank BNP Paribas | BNP_PARIBAS |
| Bank Bukopin | BUKOPIN |
| Bank Bumi Arta | BUMI_ARTA |
| Bank Capital Indonesia | CAPITAL |
| Bank Central Asia (BCA) | BCA |
| Bank Central Asia (BCA) Syariah | BCA_SYR |
| Bank Chinatrust Indonesia | CHINATRUST |
| Bank CIMB Niaga | CIMB |
| Bank CIMB Niaga UUS | CIMB_UUS |
| Bank Commonwealth | COMMONWEALTH |
| Bank Danamon | DANAMON |
| Bank Danamon UUS | DANAMON_UUS |
| Bank DBS Indonesia | DBS |
| Bank Dinar Indonesia | DINAR_INDONESIA |
| Bank DKI | DKI |
| Bank DKI UUS | DKI_UUS |
| Bank Fama International | FAMA |
| Bank Ganesha | GANESHA |
| Bank Hana | HANA |
| Bank Harda Internasional | HARDA_INTERNASIONAL |
| Bank Himpunan Saudara 1906 | HIMPUNAN_SAUDARA |
| Bank ICBC Indonesia | ICBC |
| Bank Ina Perdania | INA_PERDANA |
| Bank Index Selindo | INDEX_SELINDO |
| Bank Jasa Jakarta | JASA_JAKARTA |
| Bank JTrust Indonesia (formerly Bank Mutiara) | JTRUST |
| BANK SEABANK INDONESIA (Ex Bank Kesejahteraan Ekonomi) | KESEJAHTERAAN_EKONOMI |
| Bank Mandiri | MANDIRI |
| Bank Maspion Indonesia | MASPION |
| Bank Mayapada International | MAYAPADA |
| Bank Maybank | MAYBANK |
| Bank Maybank Syariah Indonesia | MAYBANK_SYR |
| Bank Mayora | MAYORA |
| Bank Mega | MEGA |
| Bank Mestika Dharma | MESTIKA_DHARMA |
| Bank Mitra Niaga | MITRA_NIAGA |
| Bank Mizuho Indonesia | MIZUHO |
| Bank MNC Internasional | MNC_INTERNASIONAL |
| Bank Muamalat Indonesia | MUAMALAT |
| Bank Multi Arta Sentosa | MULTI_ARTA_SENTOSA |
| Bank Nationalnobu | NATIONALNOBU |
| Bank Negara Indonesia (BNI) | BNI |
| Bank Nusantara Parahyangan | NUSANTARA_PARAHYANGAN |
| Bank OCBC NISP | OCBC |
| Bank OCBC NISP UUS | OCBC_UUS |
| Bank of America Merill-Lynch | BAML |
| Bank of China (BOC) | BOC |
| Bank of India Indonesia | INDIA |
| Bank of Tokyo Mitsubishi UFJ | TOKYO |
| Bank Oke Indonesia (formerly Bank Andara) | OKE |
| Bank Panin | PANIN |
| Bank Panin Syariah | PANIN_SYR |
| Bank Permata | PERMATA |
| Bank Permata UUS | PERMATA_UUS |
| Bank QNB Indonesia (formerly Bank QNB Kesawan) | QNB_INDONESIA |
| Bank Rabobank International Indonesia | RABOBANK |
| Bank Rakyat Indonesia (BRI) | BRI |
| Bank Resona Perdania | RESONA |
| Bank Royal Indonesia | ROYAL |
| Bank Sahabat Sampoerna | SAHABAT_SAMPOERNA |
| Bank SBI Indonesia | SBI_INDONESIA |
| Bank Shinhan Indonesia (formerly Bank Metro Express) | SHINHAN |
| Bank Sinarmas | SINARMAS |
| Bank Sinarmas UUS | SINARMAS_UUS |
| Bank Sumitomo Mitsui Indonesia | MITSUI |
| Bank Syariah BRI | BRI_SYR |
| Bank Syariah Bukopin | BUKOPIN_SYR |
| Bank Syariah Mandiri | MANDIRI_SYR |
| Bank Syariah Mega | MEGA_SYR |
| Bank Tabungan Negara (BTN) | BTN |
| Bank Tabungan Negara (BTN) UUS | BTN_UUS |
| Bank Tabungan Pensiunan Nasional | TABUNGAN_PENSIUNAN_NASIONAL |
| Bank UOB Indonesia | UOB |
| Bank Victoria Internasional | VICTORIA_INTERNASIONAL |
| Bank Victoria Syariah | VICTORIA_SYR |
| Bank Woori Indonesia | WOORI |
| Bank Woori Saudara Indonesia 1906 (formerly Bank Himpunan Saudara and Bank Woori Indonesia) | WOORI_SAUDARA |
| Bank Yudha Bhakti | YUDHA_BHAKTI |
| BPD Aceh | ACEH |
| BPD Aceh UUS | ACEH_UUS |
| BPD Banten (formerly Bank Pundi Indonesia) | BANTEN |
| BPD Bengkulu | BENGKULU |
| BPD Daerah Istimewa Yogyakarta (DIY) | DAERAH_ISTIMEWA_UUS |
| BPD Jambi | JAMBI |
| BPD Jambi UUS | JAMBI_UUS |
| BANK JATENG(Ex BPD Jawa Tengah) | JAWA_TENGAH |
| BPD Jawa Tengah UUS | JAWA_TENGAH_UUS |
| BANK JATIM (Ex BPD Jawa Timur) | JAWA_TIMUR |
| BPD Jawa Timur UUS | JAWA_TIMUR_UUS |
| BPD Kalimantan Barat | KALIMANTAN_BARAT |
| BPD Kalimantan Barat UUS | KALIMANTAN_BARAT_UUS |
| BPD Kalimantan Selatan | KALIMANTAN_SELATAN |
| BPD Kalimantan Selatan UUS | KALIMANTAN_SELATAN_UUS |
| BPD Kalimantan Tengah | KALIMANTAN_TENGAH |
| BPD Kalimantan Timur | KALIMANTAN_TIMUR |
| BPD Kalimantan Timur UUS | KALIMANTAN_TIMUR_UUS |
| BPD Lampung | LAMPUNG |
| BPD Maluku | MALUKU |
| BPD Nusa Tenggara Barat | NUSA_TENGGARA_BARAT |
| BPD Nusa Tenggara Barat UUS | NUSA_TENGGARA_BARAT_UUS |
| BPD Nusa Tenggara Timur | NUSA_TENGGARA_TIMUR |
| BPD Papua | PAPUA |
| BPD Riau Dan Kepri | RIAU_DAN_KEPRI |
| BPD Riau Dan Kepri UUS | RIAU_DAN_KEPRI_UUS |
| BPD Sulawesi Tengah | SULAWESI |
| BPD Sulawesi Tenggara | SULAWESI_TENGGARA |
| BPD Sulselbar | SULSELBAR |
| BPD Sulselbar UUS | SULSELBAR_UUS |
| BPD Sulut | SULUT |
| BPD Sumatera Barat | SUMATERA_BARAT |
| BPD Sumatera Barat UUS | SUMATERA_BARAT_UUS |
| BPD Sumsel Dan Babel | SUMSEL_DAN_BABEL |
| BPD Sumsel Dan Babel UUS | SUMSEL_DAN_BABEL_UUS |
| BPD Sumut | SUMUT |
| BPD Sumut UUS | SUMUT_UUS |
| BTPN Syariah (formerly BTPN UUS and Bank Sahabat Purba Danarta) | BTPN_SYARIAH |
| Centratama Nasional Bank | CENTRATAMA |
| China Construction Bank Indonesia (formerly Bank Antar Daerah and Bank Windu Kentjana International) | CCB |
| Citibank | CITIBANK |
| Deutsche Bank | DEUTSCHE |
| Hongkong and Shanghai Bank Corporation (HSBC) UUS | HSBC_UUS |
| HSBC Indonesia (formerly Bank Ekonomi Raharja) | HSBC |
| Indonesia Eximbank (formerly Bank Ekspor Indonesia) | EXIMBANK |
| JP Morgan Chase Bank | JPMORGAN |
| Mandiri Taspen Pos (formerly Bank Sinar Harapan Bali) | MANDIRI_TASPEN |
| Prima Master Bank | PRIMA_MASTER |
| Royal Bank of Scotland (RBS) | RBS |
| Standard Chartered Bank | STANDARD_CHARTERED |
| Bank Syariah Indonesia | BSI |
| Bank Neo Commerce | BNC |
| Bank Nagari | BANK_NAGARI |
| Bank Pembangunan Daerah Bali | BANK_BPD_BALI |
| Bank Jabar Banten Syariah | BANK_JABAR_BANTEN_SYARIAH |
| PT Bank Mantap Sejahtera | BANK_MANTAP |
| Bank Pembangunan Daerah Kepulauan Selayar | BPR_KS |
| Bank IFI | IBK |
| Bank Aladin Syariah | BANK_ALADIN_SYARIAH |
账户接口
查询账户余额
请求URL:/api/v1/account/balance
请求方式:POST
请求类型:application/json
请求示例
{
"currency": "IDR",
"reqTime": 1726306060918
}
请求参数
| 参数名 | 类型 | 必传 | 描述 |
|---|---|---|---|
| currency | String | 是 | 仅支持IDR |
| reqTime | long | 是 | 请求接口时间,13位时间戳 |
返回示例
{
"code": 200,
"msg": "SUCCESS",
"data": {
"balance": "12345.67",
"currency": "IDR",
"frozenBalance": "0",
"settlementBalance": "0"
}
}
返回参数
| 参数名 | 类型 | 必传 | 描述 |
|---|---|---|---|
| balance | String | 是 | 余额 |
| frozenBalance | String | 是 | 冻结余额 |
| settlementBalance | String | 是 | 结算中余额,在支付完成、代付退款完成后一分钟内同步到余额帐户"balance" |
| currency | String | 是 | 仅支持IDR |
支付接口
支付下单
请求URL:/api/v1/charge
请求方式:POST
请求类型:application/json
请求示例
{
"mchTradeNo": "111111111111",
"originalCurrency": "CNY",
"originalAmount": "100",
"payType": "QRIS",
"bankCode": "QRIS",
"subject": "tempor",
"body": "eiusmod",
"notifyUrl": "https://timely-validity.com/",
"debtorName": "cen",
"phoneNumber": "628157123123",
"email": "fake@gmail.com",
"reqTime": 1738567036974
}
请求参数
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| mchTradeNo | String | 是 | 商户生成的订单号,请确保唯一性, 长度64位以内 |
| originalCurrency | String | 是 | 原始货币代码(仅支持IDR/USD/CNY) |
| originalAmount | String | 是 | 原始货币金额(IDR 0位小数,其他币种2位小数) |
| subject | String | 是 | 标题,长度50位以内,禁止出现标点符号,特殊符号,可能影响商户交易成功率 |
| body | String | 是 | 内容描述,长度128位以内,禁止出现标点符号,特殊符号,可能影响商户交易成功率 |
| payType | String | 是 | 支付类型,QRIS:二维码,VA:虚拟账户支付,EWALLET:电子钱包 |
| bankCode | String | 是 | 银行代码,指定特定银行,payType=QRIS时该值也为QRIS |
| notifyUrl | String | 否 | 我方通知商户接收交易结果地址,长度200位以内.需返回SUCCESS确定接收成功,传值才会发起回调 |
| debtorName | String | 是 | 付款人姓名,长度128位以内 |
| phoneNumber | String | 是 | 付款人手机号码,长度64位以内 |
| String | 是 | 付款人邮箱地址,长度150位以内 | |
| reqTime | long | 是 | 请求接口时间,13位时间戳 |
返回示例
{
"code": 200,
"msg": "SUCCESS",
"data": {
"currency": "IDR",
"totalAmount": "235264",
"currencyRate": "2352.64",
"originalAmount": "100",
"originalCurrency": "CNY",
"tradeNo": "DS25110619864114140042158096670",
"mchTradeNo": "39ff1385-e1bd-438d-b91e-082e0411caa4",
"payUrl": "https://payurltest.zft1818.com?data=MDloTDhsVFB5QTdlTGRjcFBpMk02UHV2cG9tWnB2S1hMNzBPZWN1ZjR3RUFhSTBrYUVsRi9ZbUF6MTJpUU52K3dLZ296cHhRdmJzUDR0NTJYdXlzK0Y4cTJZVXBOc3U3M3g3alNMOGVjamF5YnJXSHBWM3NrRkVJTWt6bHRCaUNlekpoZnVQaTZNbm9QMVJjcjYxSHBpYUhlaWpyNWhWbmtqbzRidjgra2gxbXZ3djhwS1RZVzNQeTNQQXdvVmlrUE9POE1DQ0tsODdwMnJrR3VOTEExalRXWVEvNzJILy95N0FLaG1MQjVTZXV0WE5FQXZ4b2FLRDhEZkdWbEZFQkZWSWphTjhBVlhCUDh5UndHRVlwU0JjSTFRVTZ6bTNyTmlaWG1oNEVXMFJxVnNLS2ZvZGo2ZjJhRHQzMXJxKzZiVkFQNzFzWnZNbzVYb2ZUZm9WRTBtOEpaU2RlS2t5SXg5V2lKaWJlU2NoSFFNeC82V0laSVlUdGt1bkxVQzRzZmUvVVRZMnd6UnJWMkhNZG9rRTFDVGdqazRSaCtFMlNFeUt2RGdKRFRMYkQ4L2NWdUlCR2E4TzNvMktPcGJLNG1QRHBoNEszZDFFektzMlVHZEFzK2xVWlBGTkQrQkZkdUQ2Z2ErYnM4elB1NWFQenk1QXdWL3lIK1FXRGFkWVFLYkkrVkVubjAxeWdBTERhQ2N0bFBBPT0=",
"qrcode": "00020101021226530012COM.DOKU.WWW0117936008990000140520205140520303URE51440014ID.CO.QRIS.WWW0215ID10221466140520303URE520454995303360540833304.005802ID5915YesChat Sandbox6009Indonesia6104109562330704109550211762432361924cb0b73056304D6C9",
"state": "PENDING",
"ext": ""
}
}
返回参数
| 参数名 | 类型 | 必传 | 描述 |
|---|---|---|---|
| tradeNo | String | 是 | 平台支付订单号 |
| mchTradeNo | String | 是 | 商户传入的订单号 |
| state | String | 是 | 订单状态 |
| payUrl | String | 否 | 支付页,用于用户扫码支付的中间页 |
| qrcode | String | 否 | 二维码文本内容或二维码图片url或支付url,部分银行不支持 |
| currency | String | 是 | 仅支持IDR |
| totalAmount | String | 是 | 结算货币金额(IDR,不包含手续费) |
| currencyRate | String | 是 | 货币汇率 |
| originalCurrency | String | 是 | 原始货币代码(下单时的货币) |
| originalAmount | String | 是 | 原始货币金额(下单时的货币金额) |
| ext | String | 否 | 冗余扩展字段,根据不同业务解释,暂时未用上 |
查询支付订单
请求URL:/api/v1/charge/detail
请求方式:POST
请求类型:application/json
请求示例
{
"tradeNo": "I1726294720789M1726283265RJ27G",
"mchTradeNo": "TEST_ORDER_123456789000004",
"reqTime": 1726295520933
}
请求参数
| 参数名 | 类型 | 必传 | 描述 |
|---|---|---|---|
| tradeNo | String | 是 | 平台生成的订单号,与mchTradeNo二者传一即可,两者都传只认平台订单号 |
| mchTradeNo | String | 是 | 商户生成的订单号,与tradeNo二者传一即可 |
| reqTime | long | 是 | 请求接口时间,13位时间戳 |
返回示例
{
"code": 200,
"msg": "SUCCESS",
"data": {
"body": "eiusmod",
"createdAt": 1762548729917,
"currency": "IDR",
"totalAmount": "235264",
"currencyRate": "2352.64",
"ext": "{}",
"mchNo": "ZmWEdXj1yEr86xn3",
"mchTradeNo": "2eb1c0c4-cc43-469d-9e3f-f61c45e8cfb6",
"tradeNo": "DS25110719867787054222336004553",
"originalCurrency": "CNY",
"originalAmount": "100",
"payAmount": "0",
"refund": null,
"state": "PENDING",
"subject": "tempor",
"successTime": 0
}
}
返回参数
| 参数名 | 类型 | 必传 | 描述 |
|---|---|---|---|
| tradeNo | String | 是 | 平台支付订单号 |
| mchTradeNo | String | 是 | 商户传入的订单号 |
| subject | String | 是 | 商品标题 |
| body | String | 是 | 商品描述 |
| currency | String | 是 | 仅支持IDR |
| totalAmount | String | 是 | 结算货币金额(IDR,不包含手续费) |
| currencyRate | String | 是 | 货币汇率 |
| originalCurrency | String | 是 | 原始货币代码(下单时的货币) |
| originalAmount | String | 是 | 原始货币金额(下单时的货币金额) |
| state | String | 是 | 订单状态 |
| createdAt | long | 是 | 订单创建时间,13位时间戳 |
| successTime | long | 否 | 订单支付成功时间,13位时间戳 |
| refund | array | 否 | 退款记录 |
| ext | String | 是 | 根据业务单独解释 |
| mchNo | String | 是 | 商户号 |
| payAmount | String | 是 | 系统结算金额(印尼币) |
refund内容
| 参数名 | 类型 | 必传 | 描述 |
|---|---|---|---|
| refundNo | String | 是 | 退款单号 |
| refundOutNo | String | 是 | 商户退款单号 |
| refundAmount | String | 是 | 退款金额(IDR) |
| refundTime | long | 是 | 13位时间戳 |
state字段说明:
| state | 描述 |
|---|---|
| SUCCESS | 支付成功 |
| PENDING | 交易创建,等待付款 |
| REFUND | 退款 |
支付通知
请求URL:该链接是通过统一下单接口提交的参数notifyUrl设置,如果无法访问链接,商户系统将无法接收到支付中心的通知。
请求方式:POST
请求类型:application/json
签名: header : PAY-SIGN
推送及时性: 默认及时,200 QPS
通知示例
{
"body": "eiusmod",
"createdAt": 1762548729917,
"currency": "IDR",
"totalAmount": "235264",
"currencyRate": "2352.64",
"originalAmount": "100",
"originalCurrency": "CNY",
"mchNo": "ZmWEdXj1yEr86xn3",
"mchTradeNo": "2eb1c0c4-cc43-469d-9e3f-f61c45e8cfb6",
"payAmount": "235264",
"state": "SUCCESS",
"subject": "tempor",
"successTime": 0,
"tradeNo": "DS25110719867787054222336004553",
"ext": "{}",
"refund": [
{
"refundNo": "",
"refundOutOo": "",
"refundAmount": "",
"refundTime": ""
}
]
}
通知参数
| 参数名 | 类型 | 必传 | 描述 |
|---|---|---|---|
| tradeNo | String | 是 | 平台支付订单号 |
| mchTradeNo | String | 是 | 商户传入的订单号 |
| subject | String | 是 | 商品标题 |
| body | String | 是 | 商品描述 |
| currency | String | 是 | 仅支持IDR |
| totalAmount | String | 是 | 结算货币金额(IDR,不包含手续费) |
| currencyRate | String | 是 | 货币汇率 |
| originalCurrency | String | 是 | 原始货币代码(下单时的货币) |
| originalAmount | String | 是 | 原始货币金额(下单时的货币金额) |
| state | String | 是 | 订单状态 |
| createdAt | long | 是 | 订单创建时间,13位时间戳 |
| successTime | long | 否 | 订单支付成功时间,13位时间戳 |
| refund | array | 否 | 退款记录 |
| ext | String | 是 | 根据业务单独解释 |
| mchNo | String | 是 | 商户号 |
| payAmount | String | 是 | 系统结算金额(印尼币) |
商户返回结果
需要对这整个 JSON 字符串进行签名验签 hmac(sha256, jsonString , secretKey) == header("PAY-SIGN")
state字段说明:
| state | 描述 |
|---|---|
| SUCCESS | 支付成功 |
| PENDING | 交易创建,等待付款 |
| REFUND | 退款 |
代付接口
代付下单
商户业务系统通过转账接口发起转账申请。
请求URL:/api/v1/transfer
请求方式:POST
请求类型:application/json
请求示例
{
"mchTradeNo": "TEST_ORDER_12345678677285346",
"originalCurrency": "CNY",
"originalAmount": "100",
"payType": "VA",
"bankCode": "BNI",
"accountNo": "23504509880",
"phoneNumber": "6217300498201",
"email": "fake@gmail.com",
"recipientName": "Yenny",
"transferDesc": "test",
"notifyUrl": "http://xxx/success",
"reqTime": 1726306060918
}
请求参数
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| mchTradeNo | String | 是 | 商户生成的订单号,请确保唯一性,长度64位以内 |
| originalCurrency | String | 是 | 原始货币代码(仅支持IDR/USD/CNY) |
| originalAmount | String | 是 | 原始货币金额(IDR不支持小数,其他2位小数)即对方收款金额,实际扣款金额(商户IDR余额)包含手续费可能大于此金额 |
| payType | String | 是 | 支付类型,VA:虚拟账户支付,EWALLET:电子钱包 |
| bankCode | String | 是 | 银行代码,指定特定银行 |
| accountNo | String | 是 | 收款账号,长度64位以内 |
| phoneNumber | String | 是 | 付款人手机号码,长度64位以内 |
| String | 是 | 付款人邮箱地址,长度150位以内 | |
| recipientName | String | 是 | 收款人姓名,长度255位以内 |
| transferDesc | String | 否 | 转账描述信息,长度255位以内 |
| notifyUrl | String | 否 | 异步通知地址,长度200位以内 |
| reqTime | long | 是 | 请求接口时间,13位时间戳 |
返回示例
{
"code": 200,
"msg": "SUCCESS",
"data": {
"accountNo": "23504509880",
"mchTradeNo": "TEST_ORDER_123456789000008",
"state": "PENDING",
"tradeNo": "DF251107198670290890055270536252",
"currency": "IDR",
"totalAmount": "235264",
"originalCurrency": "CNY",
"originalAmount": "100",
"currencyRate": "2352.64"
}
}
返回参数
| 参数名 | 类型 | 必传 | 描述 |
|---|---|---|---|
| mchTradeNo | String | 是 | 商户生成的转账订单号 |
| tradeNo | String | 是 | 平台生成的转账单号 |
| state | String | 是 | 转账状态 |
| accountNo | String | 是 | 收款账号 |
| currency | String | 是 | 仅支持IDR |
| totalAmount | String | 是 | 结算货币金额(IDR,不包含手续费) |
| originalCurrency | String | 是 | 原始货币代码(下单时的货币) |
| originalAmount | String | 是 | 原始货币金额(下单时的货币金额) |
| currencyRate | String | 是 | 货币汇率 |
查询代付订单
请求URL:/api/v1/transfer/detail
请求方式:POST
请求类型:application/json
请求示例
{
"reqTime": 1726298455397,
"tradeNo": "DF251107198670290890055270536252",
"mchTradeNo": ""
}
请求参数
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| tradeNo | String | 是 | 平台生成的代付单号,与mchTradeNo二者传一即可,都传时只认tradeNo |
| mchTradeNo | String | 是 | 商户生成的代付单号,与tradeNo二者传一即可 |
| reqTime | long | 是 | 请求接口时间,13位时间戳 |
返回示例
{
"code": 200,
"msg": "SUCCESS",
"data": {
"accountNo": "23504509880",
"createdAt": 1762530741948,
"currency": "IDR",
"totalAmount": "235264",
"currencyRate": "2352.64",
"originalAmount": "100",
"originalCurrency": "CNY",
"ext": "",
"failDesc": "",
"mchNo": "pmQpJyYMz9RrZwOA",
"mchTradeNo": "TEST_ORDER_12345678677285342",
"tradeNo": "DF2511071986703258168635393117780",
"recipientName": "Yenny",
"refund": null,
"state": "PENDING",
"successTime": 0,
"transferDesc": "test"
}
}
返回参数
| 参数名 | 类型 | 必传 | 描述 |
|---|---|---|---|
| mchTradeNo | String | 是 | 商户生成的代付订单号 |
| tradeNo | String | 是 | 平台生成的代付订单号 |
| accountNo | String | 是 | 收款账号 |
| currency | String | 是 | 仅支持IDR |
| totalAmount | String | 是 | 结算货币金额(IDR,不包含手续费) |
| originalCurrency | String | 是 | 原始货币代码(下单时的货币) |
| originalAmount | String | 是 | 原始货币金额(下单时的货币金额) |
| currencyRate | String | 是 | 货币汇率 |
| state | String | 是 | 转账状态 |
| createdAt | long | 是 | 订单创建时间,13位时间戳 |
| successTime | long | 否 | 转账成功时间,13位时间戳 |
| refund | array | 否 | 退款记录 |
| failDesc | String | 否 | 错误描述 |
| ext | String | 否 | 扩展字段 |
| mchNo | String | 是 | 商户号 |
| recipientName | String | 否 | 收款人姓名 |
| transferDesc | String | 否 | 转账描述信息 |
refund数据格式:
| 参数名 | 类型 | 必传 | 描述 |
|---|---|---|---|
| refundAmount | String | 否 | 退款金额(IDR) |
| refundNo | String | 否 | 系统退款单号 |
| refundTime | long | 否 | 退款时间,毫秒时间戳 |
state字段说明:
| state | 描述 |
|---|---|
| SUCCESS | 交易完成 |
| PENDING | 下单成功等待结算转账 |
| FAIL | 转账执行失败(余额不足、账号无效等) |
| REFUND | 退款 |
代付通知
请求URL:该链接是通过转账申请接口提交的参数notifyUrl设置,如果无法访问链接,商户系统将无法接收到支付中心的通知。
请求方式:POST
请求类型:application/json
签名: header: PAY-SIGN
推送及时性: 默认及时,200 QPS
通知示例数据
{
"accountNo": "23504509880",
"createdAt": 1762530741948,
"currency": "IDR",
"totalAmount": "235264",
"currencyRate": "2352.64",
"originalAmount": "100",
"originalCurrency": "CNY",
"mchNo": "pmQpJyYMz9RrZwOA",
"mchTradeNo": "TEST_ORDER_12345678677285342",
"tradeNo": "DF2511071986703258168635393117780",
"recipientName": "Yenny",
"state": "PENDING",
"successTime": 0,
"failDesc": "",
"ext": "",
"refund": [
{
"refundNo": "",
"refundAmount": "",
"refundTime": "0"
}
]
}
通知参数
| 参数名 | 类型 | 必传 | 描述 |
|---|---|---|---|
| mchTradeNo | String | 是 | 商户生成的代付订单号 |
| tradeNo | String | 是 | 平台生成的代付订单号 |
| accountNo | String | 是 | 收款账号 |
| currency | String | 是 | 仅支持IDR |
| totalAmount | String | 是 | 结算货币金额(IDR,不包含手续费) |
| originalCurrency | String | 是 | 原始货币代码(下单时的货币) |
| originalAmount | String | 是 | 原始货币金额(下单时的货币金额) |
| currencyRate | String | 是 | 货币汇率 |
| state | String | 是 | 转账状态 |
| createdAt | long | 是 | 订单创建时间,13位时间戳 |
| successTime | long | 否 | 转账成功时间,13位时间戳 |
| refund | array | 否 | 退款记录 |
| failDesc | String | 否 | 错误描述 |
| ext | String | 否 | 扩展字段 |
| mchNo | String | 是 | 商户号 |
| recipientName | String | 否 | 收款人姓名 |
商户返回结果
需要对这整个 JSON 字符串进行签名验签 hmac(sha256, jsonString, secretKey) == header("PAY-SIGN")
state字段说明:
| state | 描述 |
|---|---|
| SUCCESS | 交易完成 |
| PENDING | 下单成功等待结算转账 |
| FAIL | 转账执行失败(余额不足、账号无效等) |
| REFUND | 退款 |
refund数据格式:
| 参数名 | 类型 | 必传 | 描述 |
|---|---|---|---|
| refundAmount | String | 否 | 退款金额(IDR) |
| refundNo | String | 否 | 系统退款单号 |
| refundTime | String | 否 | 退款时间,毫秒时间戳 |
沙箱支付
代收模拟支付
请求URL:/api/v1/sandbox/charge/simulatePayment
请求方式:POST、GET
请求类型:application/json
请求示例
{
"tradeNo": "TEST_ORDER_1727222488355072"
}
请求参数
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| tradeNo | String | 是 | 系统订单号 |
返回示例
{
"code": 200,
"msg": "SUCCESS",
"data": null
}
代付模拟成功
请求URL:/api/v1/sandbox/transfer/simulatePayment
请求方式:POST、GET
请求类型:application/json
请求示例
{
"tradeNo": "TEST_ORDER_1727222488355072"
}
请求参数
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| tradeNo | String | 是 | 系统订单号 |
返回示例
{
"code": 200,
"msg": "SUCCESS",
"data": null
}
代付模拟失败
请求URL:/api/v1/sandbox/transfer/simulatePaymentFail
请求方式:POST、GET
请求类型:application/json
请求示例
{
"tradeNo": "TEST_ORDER_1727222488355072"
}
请求参数
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| tradeNo | String | 是 | 系统订单号 |
返回示例
{
"code": 200,
"msg": "SUCCESS",
"data": null
}
接口状态码
The API uses the following error codes:
| Code | 提示 | 说明 |
|---|---|---|
| 200 | SUCCESS | 业务调用成功 |
| 400 | Params error | 参数异常 |
| 405 | Invalid order no | 业务条件不满足 |
| 429 | Too many requests | 请求过快 |
| 500 | Internal service error | 内部服务错误 |
| 1000 | Merchant not exist or disabled | 商户不存在或被禁用 |
| 1001 | Invalid secret key | 密钥错误 |
| 1002 | IP is not on the whitelist | ip不在白名单 |
| 1003 | Order repeat | 商户订单号重复 |
| 1004 | Create order failed | 订单创建失败 |
| 1005 | Order not exist | 订单不存在 |
| 1006 | Insufficient Balance | 余额不足 |
| 1007 | The order is non refundable | 订单不可退款 |
| 1008 | The refund amount is not correct | 退款金额不正确 |
| 1011 | Invalid notify url | 无效回调通知url |
| 1012 | No notify URL whitelist configured | 没有配置通知url白名单 |
| 1013 | Wallet is less or disabled | 钱包被禁或不存在 |
| 1014 | The account triggers the risk control rule | 该账户触发风控规则 |
| 1015 | Invalid document number | 无效debtorDocumentNumber 或debtorDocumentNumber与debtorName不匹配 |
| 1016 | Invalid amount | 无效金额 |
| 1100 | Invalid timestamp | 请求头PAY-ACCESS-TIMESTAMP时间戳过期或为空,请传入当前UTC时区的13位毫秒时间戳数字,且该值要参与签名 |
| 1101 | Invalid mchNo | 请求头PAY-ACCESS-MCHNO无效商户号 |
| 1102 | Invalid Content-Type | 请求头Content-Type 请使用“application/JSON”格式 |
| 1103 | Invalid signature | 请求头PAY-ACCESS-SIGN无效签名 |
| 2004 | System error, please contact customer service | 系统错误,请联系客服 |