概述
API代收,也叫快捷代收,是指交易过程中,需要商家单独开发页面封装请求参数,引导用户完成付款,实现商家充值到EPAY账号里。
支付流程
商家可以参考如下流程图,完成代收对接。
流程说明
用户访问您的页面发起快捷收款(充值)交易。
您的后台服务封装请求参数发送调用payinApi/sendTransaction交易接口到EPAY网关后台服务。
EPAY网关后台服务收到请求,创建交易订单,开始处理,此时订单状态为处理中(status=0)。
EPAY网关后台服务创建交易订单完成后,返回第三方银行付款Url地址给您的后台服务。
您的后台服务收到第三方银行付款Url地址后,重定向到第三方银行收银台页面。
用户在第三方银行收银台页面进行确认支付。
第三方银行AcquireerBank回调结果发送到EPAY网关后台服务。
EPAY网关后台服务处理结果,更新订单状态为成功(status=7)。
EPAY网关后台服务发送回调结果给您的后台服务,通知交易订单已完成。
您的后台服务可以选择调用queryTransaction接口进行信息确认。
EPAY网关后台服务响应queryTransaction接口数据。
您的后台服务更新交易数据,完成订单状态。
您的后台服务通知用户订单完成状态。
创建订单
商家后台请求 sendTransaction 的API接口,传入商家订单号、订单金额、币种及收款账号等参数(具体可查看如下入参说明),创建EPAY代收订单。
注意:此时订单状态为处理中(status=1),可通过查询交易接口 queryTransaction 查看订单详情。
示例代码
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n \"param\": {\n \"epayAccount\": \"test2020@epay.com\",\n \"version\": \"V2.0.0\",\n \"merchantName\": \"epay\",\n \"merchantOrderNo\": \"lx083031\",\n \"receiveAmount\": \"\",\n \"receiveCurrency\": \"USD\",\n \"paymentAmount\": \"100\",\n \"paymentCurrency\": \"BRL\",\n \"paymentCountry\": \"BR\",\n \"payerAccount \":\"\",\n \"channelCode\": \"46\",\n \"notifyUrl\": \"http://localhost/paymentApi/channel/send.do\",\n \"remark\": \"\"\n },\n \"sign\": \"\"\n}");
Request request = new Request.Builder()
.url("http://29597375fx.epaydev.xyz/capi/openapi/payinApi/sendTransaction")
.method("POST", body)
.addHeader("Content-Type", "application/json")
.build();
Response response = client.newCall(request).execute();
java
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n \"param\": {\n \"epayAccount\": \"test2020@epay.com\",\n \"version\": \"V2.0.0\",\n \"merchantName\": \"epay\",\n \"merchantOrderNo\": \"lx083031\",\n \"receiveAmount\": \"\",\n \"receiveCurrency\": \"USD\",\n \"paymentAmount\": \"100\",\n \"paymentCurrency\": \"BRL\",\n \"paymentCountry\": \"BR\",\n \"payerAccount \":\"\",\n \"channelCode\": \"46\",\n \"notifyUrl\": \"http://localhost/paymentApi/channel/send.do\",\n \"remark\": \"\"\n },\n \"sign\": \"\"\n}");
Request request = new Request.Builder()
.url("http://29597375fx.epaydev.xyz/capi/openapi/payinApi/sendTransaction")
.method("POST", body)
.addHeader("Content-Type", "application/json")
.build();
Response response = client.newCall(request).execute();
python
import requests
import json
url = "http://29597375fx.epaydev.xyz/capi/openapi/payinApi/sendTransaction"
payload = json.dumps({
"param": {
"epayAccount": "test2020@epay.com",
"version": "V2.0.0",
"merchantName": "Mera",
"merchantOrderNo": "lx083031",
"receiveAmount": "",
"receiveCurrency": "USD",
"paymentAmount": "100",
"paymentCurrency": "BRL",
"paymentCountry": "BR",
"payerAccount ": "",
"channelCode": "46",
"notifyUrl": "http://localhost/paymentApi/channel/send.do",
"remark": ""
},
"sign": ""
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
go
package main
import (
"fmt"
"strings"
"net/http"
"io/ioutil"
)
func main() {
url := "http://29597375fx.epaydev.xyz/capi/openapi/payinApi/sendTransaction"
method := "POST"
payload := strings.NewReader(`{
"param": {
"epayAccount": "test2020@epay.com",
"version": "V2.0.0",
"merchantName": "Mera",
"merchantOrderNo": "lx083031",
"receiveAmount": "",
"receiveCurrency": "USD",
"paymentAmount": "100",
"paymentCurrency": "BRL",
"paymentCountry": "BR",
"payerAccount ":"",
"channelCode": "46",
"notifyUrl": "http://localhost/paymentApi/channel/send.do",
"remark": ""
},
"sign": ""
}`)
client := &http.Client {
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Content-Type", "application/json")
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
shell
printf '{
"param": {
"epayAccount": "test2020@epay.com",
"version": "V2.0.0",
"merchantName": "epay",
"merchantOrderNo": "lx083031",
"receiveAmount": "",
"receiveCurrency": "USD",
"paymentAmount": "100",
"paymentCurrency": "BRL",
"paymentCountry": "BR",
"payerAccount ":"",
"channelCode": "46",
"notifyUrl": "http://localhost/paymentApi/channel/send.do",
"remark": ""
},
"sign": ""
}'| http --follow --timeout 3600 POST 'http://29597375fx.epaydev.xyz/capi/openapi/payinApi/sendTransaction' \
Content-Type:'application/json'
入参说明
参数名称 | 参数说明 |
---|---|
epayAccount | 商家开通的EPAY账号 |
merchantName | 商家名称 |
merchantOrderNo | 商家订单号,需保证在商家系统中唯一,最大长度不能超过50个字符 |
payerAccount | 付款人账号 |
paymentAmount | 支付金额 |
paymentCurrency | 支付币种 |
paymentCountry | 支付国家 |
receiveAmount | 收款金额 |
receiveCurrency | 收款币种 |
version | 版本号,当前版本号为V2.0.0,兼容版本V1.0.0 |
notifyUrl | 回调地址,用于接收EPAY后台通知的订单结果:成功或失败 |
remark | 订单备注,最大长度不能超过200个字符 |
category | 类型:银行BANK,现金CASH |
extendFields | 商户扩展字段,要求JSON格式 |
senderInfo | 付款人信息,要求JSON格式,具体入参字段需要根据 查询接口 获取 |
以上为业务参数说明,参数封装结构及sign签名请查看 开发指引>接入指南>接口规则>接口规范 和 开发指引>接口签名 。
查询交易
示例代码
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n \"param\": {\n \"epayAccount\": \"test2020@epay.com\",\n \"version\": \"V2.0.0\",\n \"merchantOrderNo\": \"b48916e1-91fb-4ff9-9002-17e8431a5a15\"\n },\n \"sign\": \"\"\n}");
Request request = new Request.Builder()
.url("http://29597375fx.epaydev.xyz/capi/openapi/payoutApi/queryTransaction")
.method("POST", body)
.addHeader("Content-Type", "application/json")
.build();
Response response = client.newCall(request).execute();
java
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n \"param\": {\n \"epayAccount\": \"test2020@epay.com\",\n \"version\": \"V2.0.0\",\n \"merchantOrderNo\": \"b48916e1-91fb-4ff9-9002-17e8431a5a15\"\n },\n \"sign\": \"\"\n}");
Request request = new Request.Builder()
.url("http://29597375fx.epaydev.xyz/capi/openapi/payoutApi/queryTransaction")
.method("POST", body)
.addHeader("Content-Type", "application/json")
.build();
Response response = client.newCall(request).execute();
python
import requests
import json
url = "http://29597375fx.epaydev.xyz/capi/openapi/payoutApi/queryTransaction"
payload = json.dumps({
"param": {
"epayAccount": "test2020@epay.com",
"version": "V2.0.0",
"merchantOrderNo": "b48916e1-91fb-4ff9-9002-17e8431a5a15"
},
"sign": ""
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
go
package main
import (
"fmt"
"strings"
"net/http"
"io/ioutil"
)
func main() {
url := "http://29597375fx.epaydev.xyz/capi/openapi/payoutApi/queryTransaction"
method := "POST"
payload := strings.NewReader(`{
"param": {
"epayAccount": "test2020@epay.com",
"version": "V2.0.0",
"merchantOrderNo": "b48916e1-91fb-4ff9-9002-17e8431a5a15"
},
"sign": ""
}`)
client := &http.Client {
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Content-Type", "application/json")
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer res.Body.Close()
body, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
shell
printf '{
"param": {
"epayAccount": "test2020@epay.com",
"version": "V2.0.0",
"merchantOrderNo": "b48916e1-91fb-4ff9-9002-17e8431a5a15"
},
"sign": ""
}'| http --follow --timeout 3600 POST 'http://29597375fx.epaydev.xyz/capi/openapi/payoutApi/queryTransaction' \
Content-Type:'application/json'
入参说明
参数名称 | 参数说明 |
---|---|
epayAccount | 商家开通的EPAY账号 |
merchantName | 商家名称 |
merchantOrderNo | 商家订单号,需保证在商家系统中唯一,最大长度不能超过50个字符 |
version | 版本号,当前版本号为V2.0.0,兼容版本V1.0.0 |
以上为业务参数说明,参数封装结构及sign签名请查看 开发指引>接入指南>接口规则>接口规范 和 开发指引>接口签名
异步通知
EPAY通过POST 请求的方式(也可以通过创建订单时传入的successUrlMethod或者failUrlMethod字段来设置回调的请求方式)将支付结果作为参数通知到notifyUrl(创建订单时设置的地址),商家收到异步通知后可以对sign签名值做安全性校验,判断消息来源是EPAY后再对自身业务做逻辑处理。具体sign签名方法请查看 开发指引>接口签名。
异步通知示例,请查看 开发指引>异步通知>回调示例
订单状态图
API列表
API名称 | API描述 | 操作 |
---|---|---|
sendTransaction | 创建交易 | 查看文档 |
queryTransaction | 查询交易 | 查看文档 |