Direct API Integration Step - 中文
本指南面向开发者,详细说明如何通过 Direct API 集成线上支付功能,支持Payment、Retrieve、Capture、Refund、Cancel 及 Recurring 场景。
以下步骤和字段说明旨在帮助您清晰理解整个支付流程,确保顺利集成。
一、展示支付方式
在收银台页面展示可用的支付方式。用户选择支付方式后,输入支付信息(如卡号、有效期等),提交至后端。
二、发起支付请求
后端通过 POST /payment 接口提交支付请求,需包含 KeyID、密钥 Key 和幂等性密钥。
请求示例:
curl --location --request POST 'https://sandbox.evonetonline.com/payment' \
--header 'Authorization: sk_sandbox_3bf8181129cb4c9aa3d62cd113b6518a' \
--header 'DateTime: 2025-07-09T11:18:00+08:00' \
--header 'KeyID: kid_55209b3968f748609dbe3a9dde87fdd3' \
--header 'SignType: Key-based' \
--header 'Content-type: application/json' \
--header 'Idempotency-Key: order_202507091032_001' \
--data '{
"merchantTransInfo": {
"merchantTransID": "pay_250709135509000153215434"
"merchantTransTime": "2025-07-09T11:18:00+08:00"
},
"transAmount": {
"currency": "HKD",
"value": "100"
},
"paymentMethod": {
"type": "card",
"card": {
"cardInfo": {
"cardNumber": "4761360072118507",
"expiryDate": "0529",
"holderName": "Paulette Homenick"
}
}
},
"captureAfterHours": "0",
"allowAuthentication": true,
"returnURL":"https://www.cardinfolink.com",
"webhook": "https://webhook.merchant.com"
}关键字段:
| 字段名 | 类型 | 描述 | 注意事项 |
|---|---|---|---|
| merchantTransInfo.merchantTransID | string | 商户交易 ID,需唯一 | 用于查询、退款等操作 |
| paymentMethod.type | string | 支付方式(如 card) | 需匹配对应结构体,可参考下方举例 |
| captureAfterHours | string | 自动捕获延迟小时数 | “0” 表示立即捕获 |
| allowAuthentication | boolean | 是否启用 3DS 认证 | 建议 true |
| returnURL | string | 支付完成后页面重定向地址 | 若上送了 "allowAuthentication": true,则必需 |
| webhook | string | 异步通知地址 | 接收支付结果 |
paymentMethod.type 举例:(此为 e-wallet),不同的 type 下结构体不同,具体参数请参考 paymentMethod.type Values。
"paymentMethod": {
"type": "e-wallet",
"e-wallet": {
"paymentBrand": "Merpay"
}
}
Note请求超时处理建议:接口支持幂等性,超时后使用相同的报文和
Idempotency-Key重试,确保响应一致,避免重复发起交易。
三、处理支付相应
根据响应中的 action 对象做后续处理,根据 result.code 和 payment.status 判断交易结果:
-
result.code以S开头(如S0000):检查payment.status- 成功状态:
authorized、captured、verified、identified - 处理中:
verify_pending、auth_pending、identify_pending- 需根据
action.type处理,例如跳转至threeDSData.url
- 需根据
- 成功状态:
-
非 S 开头:交易失败,检查
result.message
响应示例:
{
"action": {
"threeDSData": {
"method": "GET",
"url": "https://counter-uat.everonet.com/3ds?dGhyZWVEU1BzcD1ISVRSVVNUJmluc0NvZGU9OTA0NTE5MDAmb3JkZXJOdW09cGF5XzI1MDcxMDE2MDczMDAwMDEwMDAwMDQzODg1NDEmc3RvcmVOdW09UzAwNTIyOCZ0aHJlZWRzSW50ZWdyYXRvck9pZD0xMzY4MjE5MCZ0aHJlZURTQXV0aFVSTD1hSFIwY0hNNkx5OXphWFF0TTJSemN5MWpjSGg1TG1ocGRISjFjM1J3WVhrdVkyOXRMblIzTDNSb2NtVmxaSE10YVc1MFpXZHlZWFJ2Y2k5aGRYUm9Mekl1TVM0d0wyOTJWRlJaWTJ0V1NGbGtjbVp1ZFRKUFVVNWthamxKU1V4S1VXVnNXbVJqYUU1dlowODRPRlZxUTBrPSZyZXR1cm5Vcmw9YUhSMGNITTZMeTkzZDNjdVkyRnlaR2x1Wm05c2FXNXJMbU52YlE9PQ=="
},
"type": "threeDSRedirect"
},
"authentication": {
"liabilityShift": false,
"type": "threeDSPage"
},
"payment": {
"evoTransInfo": {
"evoTransID": "pay_250709135509000153215434",
"evoTransTime": "2025-07-10T08:07:30Z",
"retrievalReferenceNum": "519116015325",
"traceNum": "015325"
},
"merchantTransInfo": {
"merchantOrderReference": "mc-250528",
"merchantTransID": "pay_250709135509000153215434",
"merchantTransTime": "2025-07-09T11:18:00+08:00"
},
"pspTransInfo": {
"retrievalReferenceNum": "519116015325"
},
"status": "verify_pending",
"transAmount": {
"currency": "HKD",
"value": "100.00"
}
},
"paymentMethod": {
"card": {
"first6No": "476136",
"fundingType": "credit",
"holderName": "Paulette Homenick",
"issuingCountry": "IND",
"last4No": "8507",
"paymentBrand": "Visa"
},
"isNetworkToken": false
},
"result": {
"code": "S0000",
"message": "Success"
}
}关键字段:
| 字段名 | 类型 | 描述 | 注意事项 |
|---|---|---|---|
| action.type | string | 操作类型(如 threeDSRedirect) | 决定后续处理流程,可参考下方举例 |
| payment.status | string | 支付状态 | 如 captured 表示成功,verify_pending 表示需认证 |
| result.code | string | 状态码 | S 开头表示成功,非 S 开头表示失败 |
| refund.message | string | 状态描述 | 如 “Success” 或错误信息 |
action.type 举例:(此为 redirectUser),不同的 type 需按指定流程处理,相关数据(如 action.url)在 action 对象中提供,具体请参考 paymentMethod & action Flow。
"action": {
"redirectData": {
"method": "GET",
"url": "https://stg.openapi.mul-pay.jp/wallet/startSession?p=eyJhY2Nlc3NJZCI6IjBjYWE4M2ZmMzA0NjVhODhhOWE1NjEzZDc3NzMyMzdiIn0"
},
"type": "redirectUser"
}
Note
- 若
“payment.status = authorized”且未上送“captureAfterHours”字段,需调用 Cpature 接口手动捕获。- 兜底机制:通过
GET/payment接口轮询最终状态。
更多参数详见:API Explorer Payment API 接口。
四、处理异步通知
Evonet 通过 POST 请求向 webhook 地址发送支付结果通知,仅包含已完成的状态,不包含处理中的状态。
通知示例:
{
"eventCode": "Payment",
"payment": {
"evoTransInfo": {
"evoTransID": "pay_2507091522550001000000860156",
"evoTransTime": "2025-07-09T15:22:55+08:00"
},
"merchantTransInfo": {
"merchantOrderReference": "mc-250709",
"merchantTransID": "pay_2507091522550001000000860156",
"merchantTransTime": "2025-07-09T11:18:00+08:00"
},
"status": "captured",
"transAmount": {
"currency": "HKD",
"value": "100.00"
}
},
"paymentMethod": {
"card": {
"first6No": "476136",
"last4No": "8507",
"paymentBrand": "Visa"
}
}
}响应:
SUCCESS关键字段:
| 字段名 | 类型 | 描述 | 注意事项 |
|---|---|---|---|
| eventCode | string | 通知类型(如 Payment) | |
| payment.status | string | 支付状态 | 如 captured 表示成功,declined 表示失败,详见 payment.status 处理逻辑 |
| capture.status | string | 捕获状态 | capture_successed 表示成功,capture_declined 表示失败 |
| refund.status | string | 退款状态 | refund_successed 表示成功,refund_declined 表示失败 |
| cancel.status | string | 取消状态 | cancel_successed 表示成功,cancel_declined 表示失败 |
处理逻辑
首先检查 eventCode 确定通知类型,然后再检查不同通知类型的 status。
-
Payment - payment.status:
-
卡支付(paymentMethod.type = card):
captured:交易成功verified:3DS 认证完成,等待captured通知,出现后表示交易成功authorized:授权完成,等待captured通知,出现后表示交易成功- 若请求中没有上送
captureAfterHours = 0,需调用 Capture 接口进行捕获
- 若请求中没有上送
identified:身份验证完成,可根据业务需求继续支付流程declined:交易失败,检查failureCode和failureReason,并向用户展示以便排查verify_declined:3DS 认证失败- 若 POST/payment 请求参数中
allowAuthentication = true且authentication.preference = "preferred",可能会收到payment.status为authorized(需等待captured)或declined的通知 - 若请求参数非上述情况,收到
verify_declined时即将交易置为失败处理
- 若 POST/payment 请求参数中
identifiy_declined:身份验证失败
-
非卡支付:
captured:交易成功declined:交易失败,检查failureCode和failureReason,并向用户展示以便排查
-
-
Capture - capture.status:
capture_successed:捕获成功capture_declined:捕获失败
-
Refund - refund.status:
refund_successed:退款成功refund_declined:退款失败
-
Cancel - cancel.status:
cancel_successed:取消成功cancel_declined:取消失败
Note收到通知后,需返回纯文本 SUCCESS 表示接收成功。若未收到响应信息,系统会按照规定的频率(15/15/30/180/1800/1800/1800/1800/3600. 单位:秒)定期重新发送异步通知,直到成功收到 SUCCESS 或通知次数达到上限。
更多参数详见:API Explorer Payment Notification 。
五、展示支付结果
根据响应或异步通知,向用户展示支付结果。失败时建议显示 result.message 或 failureReason,便于用户采取后续操作。
六、代扣、一键支付与订阅
支持代扣、一键支付和订阅,通过 token 实现无需重复输入卡信息。首次需完成绑卡并扣款,后续使用 token 发起扣款。
首次支付
通过 POST /payment 发起支付,需设置以下字段生成 token:
{
"paymentMethod": {
"card": {
"tokenize": true,
"userReference": "your-user-reference"
}
}
}请求示例(以订阅为例):
{
"merchantTransInfo": {
"merchantTransTime": "2025-05-28T09:55:57Z"
},
"transAmount": {
"currency": "HKD",
"value": "100"
},
"paymentMethod": {
"type": "card",
"card": {
"cardInfo": {
"cardNumber": "4895330111111119",
"expiryDate": "1231"
},
"tokenize": true,
"userReference": "fill in buyer id in your system"
},
"recurringProcessingModel": "Subscription"
},
"captureAfterHours": "0",
"allowAuthentication": true,
"returnURL":"https://www.cardinfolink.com",
"webhook": "https://webhook.merchant.com"
}响应示例:
{
"action": {
"threeDSData": {
"method": "GET",
"url": "https://counter-uat.everonet.com/3ds?dGhyZWVEU1BzcD1ISVRSVVNUJmluc0NvZGU9OTA0NTE5MDAmb3JkZXJOdW09cGF5XzI1MDcxNDA5NDczNTAwMDEwMDAwOTU2MjkwNjQmc3RvcmVOdW09UzAwNTIyOCZ0aHJlZWRzSW50ZWdyYXRvck9pZD0xMzY5MDYxNSZ0aHJlZURTQXV0aFVSTD1hSFIwY0hNNkx5OXphWFF0TTJSemN5MWpjSGg1TG1ocGRISjFjM1J3WVhrdVkyOXRMblIzTDNSb2NtVmxaSE10YVc1MFpXZHlZWFJ2Y2k5aGRYUm9Mekl1TVM0d0wwWjJhMUpPTVRsRmRXTm9TekJxVDBwWWJWaGZRamMxUWpad1pEa3RSbWxQWWpFMlNrazRhekJSUVRBPSZyZXR1cm5Vcmw9YUhSMGNITTZMeTkzZDNjdVkyRnlaR2x1Wm05c2FXNXJMbU52YlE9PQ=="
},
"type": "threeDSRedirect"
},
"authentication": {
"liabilityShift": false,
"type": "threeDSPage"
},
"payment": {
"evoTransInfo": {
"evoTransID": "pay_2507140947350001000095629064",
"evoTransTime": "2025-07-14T01:47:35Z",
"retrievalReferenceNum": "519509794653",
"traceNum": "794653"
},
"merchantTransInfo": {
"merchantTransID": "pay_2507140947350001000095629064",
"merchantTransTime": "2025-05-28T09:55:57Z"
},
"pspTransInfo": {
"retrievalReferenceNum": "519509794653"
},
"status": "verify_pending",
"transAmount": {
"currency": "USD",
"value": "39.51"
}
},
"paymentMethod": {
"card": {
"first6No": "222242",
"fundingType": "debit",
"issuingBank": "JACK HENRY & ASSOCIATES",
"issuingCountry": "BEL",
"last4No": "0000",
"paymentBrand": "Mastercard"
},
"isNetworkToken": false,
"paymentMethodVariant": "Recurring",
"recurringReference": "recurring_064f9279eb3547ac840484f19c286773"
},
"result": {
"code": "S0000",
"message": "Success"
}
}关键字段:
| 字段名 | 类型 | 描述 | 注意事项 |
|---|---|---|---|
| paymentMethod.card.tokenize | boolean | 是否生成 token | 首次订阅设为 true |
| paymentMethod.card.userReference | string | 用户唯一标识 | 关联 token 和系统用户 |
| paymentMethod.recurringProcessingModel | string | 交易类型 | Subscription(订阅)、Unscheduled(代扣)、COF(一键支付) |
| paymentMethod.recurringReference | string | 定期扣款协议 ID | 用于后续扣款 |
| paymentMethod.token.value | string | Token 值 | 用于后续扣款 |
后续(MIT 交易)
使用保存的 token.value 发起后续扣款,设置 paymentMethod.type 为 token。
请求示例:
{
"merchantTransInfo": {
"merchantTransTime": "{{merchantTransTime}}"
},
"transAmount": {
"currency": "HKD",
"value": "100"
},
"paymentMethod": {
"type": "token",
"token":{
"value":"pmt_938ed7ae0fc5415d937e400040ddbce0"
},
"recurringProcessingModel": "Subscription"
},
"captureAfterHours": "0",
"allowAuthentication": true,
"returnURL": "https://www.cardinfolink.com",
"webhook": "https://webhook.merchant.com"
}响应示例:
{
"action": {
"threeDSData": {
"method": "GET",
"url": "https://counter-uat.everonet.com/3ds?dGhyZWVEU1BzcD1ISVRSVVNUJmluc0NvZGU9OTA0NTE5MDAmb3JkZXJOdW09cGF5XzI1MDcxNDA5NTYwNjAwMDEwMDAwMTY5MTI1MzUmc3RvcmVOdW09UzAwNTIyOCZ0aHJlZWRzSW50ZWdyYXRvck9pZD0xMzY5MDYzOSZ0aHJlZURTQXV0aFVSTD1hSFIwY0hNNkx5OXphWFF0TTJSemN5MWpjSGg1TG1ocGRISjFjM1J3WVhrdVkyOXRMblIzTDNSb2NtVmxaSE10YVc1MFpXZHlZWFJ2Y2k5aGRYUm9Mekl1TVM0d0wyRjJUMUpRWTFsV2VGcE1kek5vUm01S2FGcHlPVlZJWmpWaFFsVTFjVVpmWlZreFUxVkhWV1ZUY0dzPSZyZXR1cm5Vcmw9YUhSMGNITTZMeTkzZDNjdVkyRnlaR2x1Wm05c2FXNXJMbU52YlE9PQ=="
},
"type": "threeDSRedirect"
},
"authentication": {
"liabilityShift": false,
"type": "threeDSPage"
},
"payment": {
"evoTransInfo": {
"evoTransID": "pay_2507140956060001000016912535",
"evoTransTime": "2025-07-14T01:56:06Z",
"retrievalReferenceNum": "519509795840",
"traceNum": "795840"
},
"merchantTransInfo": {
"merchantTransID": "pay_2507140956060001000016912535",
"merchantTransTime": "2025-07-14T09:56:05+08:00"
},
"pspTransInfo": {
"retrievalReferenceNum": "519509795840"
},
"status": "verify_pending",
"transAmount": {
"currency": "HKD",
"value": "100.00"
}
},
"paymentMethod": {
"card": {
"first6No": "489533",
"fundingType": "credit",
"issuingCountry": "USA",
"last4No": "1119",
"paymentBrand": "Visa"
},
"isNetworkToken": false,
"paymentMethodVariant": "Recurring",
"recurringReference": "recurring_83e9b74c15024820a0445378772c68d2",
"token": {
"createTime": "2025-07-11T16:32:17+08:00",
"fingerprint": "6fae07340096b1dc087f52ddbf69e577",
"status": "enabled",
"updateTime": "2025-07-11T16:32:33+08:00",
"userReference": "fill in buyer id in your system",
"value": "pmt_938ed7ae0fc5415d937e400040ddbce0"
}
},
"result": {
"code": "S0000",
"message": "Success"
}
}九、可选接口
通过 GET /payment/{merchantTransID} 接口查询支付状态。merchantTransID 需从支付响应或异步通知中的 payment.merchantTransInfo.merchantTransID 中获取。
对于 authorized 状态的交易,可通过 POST /payment/{merchantTransID}/capture 完成最终扣款。
通过 POST /payment/{merchantTransID}/refund 接口对已经完成支付的订单发起全额或者部分退款。
通过 POST /payment/{merchantTransID}/cancel 接口取消未捕获的 authorized 或 pending 交易。
Updated 2 months ago
