直连支付接口开发
直连支付接口请求
接口说明
- 测试连接本系统接口,则所有的交易都不会产生费用,不能划款。
- 请参照按照举例的格式,填写相关信息。
- 请商户按照下表中的字段名称提交字段,参数名称区分大小写。
- 发送本系统网关的指令均以 POST 方式发送,并且使用 UTF8 编码格式。
- 支付参数提交前一定要把每一个参数值先去除前后空格后,再组合签名和传值。
支付流程
该接口支付采用的服务器端对接,即 Server-To-Server 模式(非浏览器表单传值)。所以在整个支付过程中,浏览器中的 URL 地址不会发生改变。具体流程如下:
- 网店下订单
- 网店填信用卡信息
- 把订单信息(包括信用卡信息)提交到火蚁直连接口
- 火蚁提交给银行,然后把支付结果返回
- 网店处理返回的支付结果
其中:第 3 步 — 第 4 步为服务器提交数据,浏览器 URL 不会改变。具体编程语言采用的方式可能会有些差异,支付提交示例。
支付网关地址
表单参数格式说明
| 变量命名 | 类型 | 最大长度 | 是否必填 | 描述 |
|---|---|---|---|---|
| 订单信息 | ||||
| merNo | String | 5 | 是 | 商户编号 说明:支付平台分配给商户的唯一标识 |
| gatewayNo | String | 8 | 是 | 商户网关接入号 说明:支付平台分配给商户接入支付平台的唯一标识 |
| orderNo | String | 50 | 是 | 网店订单编号 规则:商户订单号。唯一标识,同一网店系统订单号不要重复 |
| orderCurrency | String | 3 | 是 | 支付币种 说明:3位国际货币通用码,货币代码见附件。 |
| orderAmount | String | 10 | 是 | 订单总金额 规则:小数点后保留2位,若超过2位则自动四舍五入 |
| shipFee | String | 100 | 否 | 运费 规则:只能为数字,并且只限小数点后2位小数 |
| discount | String | 100 | 否 | 折扣 规则:折扣默认为负值,只能为数字,并且只限小数点后2位小数. |
| goodsInfo | String | 5000 | 否 | 货物详细信息,实体商品必传 规则:包括货物名称,ID,单价,数量,具体格式详见附录:货物信息 |
| 信用卡信息 | ||||
| cardNo | String | 20 | 是 | 信用卡卡号 |
| cardExpireMonth | String | 2 | 是 | 信用卡有效月份。示例:05 |
| cardExpireYear | String | 4 | 是 | 信用卡有效年份。示例:2026 |
| cardSecurityCode | String | 4 | 是 | 信用卡背面签名条一串数字的后3位 |
| issuingBank | String | 200 | 否 | 发卡银行 |
| 持卡人信息 | ||||
| firstName | String | 100 | 是 | 持卡人名 |
| lastName | String | 50 | 是 | 持卡人姓 |
| String | 200 | 是 | 持卡人电子邮件 | |
| ip | String | 50 | 是 | 持卡人IP |
| phone | String | 50 | 是 | 持卡人电话 |
| country | String | 100 | 是 | 持卡人国家,ISO 3166-1两位国家代码,如:US. |
| state | String | 100 | 否 | 持卡人所在州 |
| city | String | 100 | 是 | 持卡人城市 |
| address | String | 500 | 是 | 持卡人详细联系地址 |
| zip | String | 100 | 是 | 持卡人邮政编码 |
| 收货人信息 | ||||
| shipFirstName | String | 100 | 否 | 收货人姓 |
| shipLastName | String | 100 | 否 | 收货人名 |
| shipEmail | String | 100 | 否 | 收货人邮箱 |
| shipPhone | String | 100 | 否 | 收货人电话 |
| shipCountry | String | 100 | 否 | 收货人国家,ISO 3166-1两位国家代码,如:US. |
| shipState | String | 100 | 否 | 收货人省份 |
| shipCity | String | 100 | 否 | 收货人城市 |
| shipAddress | String | 100 | 否 | 收货人详细地址 |
| shipZip | String | 100 | 否 | 收货人邮编 |
| 浏览器信息 | ||||
| os | String | 50 | 是 | 持卡人电脑操作系统 |
| browser | String | 50 | 是 | 浏览器类型 |
| browserLang | String | 50 | 是 | 浏览器语言,通过 navigator.language 获取. |
| timeZone | String | 50 | 是 | 时区,用户本地时间和UTC(协调世界时)的时间差,以小时为单位,如东八区为8 |
| resolution | String | 50 | 是 | 屏幕分辨率,像素宽x高,如1920x1080 |
| acceptHeader | String | 100 | 是 | 浏览器Accept请求头,指定客户端能够接收的内容类型 |
| javaEnabled | String | 50 | 是 | 持卡人浏览器是否支持并启用了Java ,可通过navigator.javaEnabled() 获取. |
| colorDepth | String | 50 | 是 | 屏幕调色板的深度,以每像素位数为单位,如24。可通过 screen.colorDepth 获取. |
| userAgent | String | 1000 | 是 | 浏览器user-Agent请求头 |
| isCopyCard | String | 50 | 是 | 卡号输入是否为:复制粘贴(0:否,1:是。) |
| deviceNo | String | 100 | 否 | 设备指纹,配合前端JS使用 |
| uniqueId | String | 100 | 否 | 唯一Id,配合前端JS使用 |
| interfaceMode | String | 100 | 是 | 接口类型 格式:网店类型_网店版本 如果是自建的系统,则可以通语言代替网店类型,而不用写版本类型 例如:ZENCART_1.3.9 或者PHP |
| 其他信息 | ||||
| webSite | String | 200 | 是 | 来源网址(即购物的网站域名) |
| notifyUrl | String | 200 | 是 | 异步通知地址,支付完成以后,会延时把支付结果通过服务器端Post方式返回到此地址,该异步地址收到请求返回OK即可,否则,在一段时间内最多会返回3次。 |
| signInfo | String | 32 | 是 | 加密签名信息 对支付提交参数进行组合,然后再进行sha256方法签名,具体参数组合顺序如下,顺序不能改变:merNo + gatewayNo +orderNo + orderCurrency +orderAmount + cardNo + cardExpireYear + cardExpireMonth+ cardSecurityCode + merKey(密钥,在商户后台可以查询到),这些参数顺序不能修改,中间不要出现任何空格和+号. 具体详见附录:sha256签名方式 |
| remark | String | 500 | 否 | 说明:存放商户自己的信息,随订单传送到支付平台,当订单返回时原封不动的返回给商户. |
| returnUrl | String | 500 | 否 | 当发生3D重定向时,支付结束后浏览器通过此URL返回商户网店. |
支付提交示例
java
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
RequestBody body = RequestBody.create
(mediaType, "merNo=80000
&gatewayNo=80000001
&orderNo=12345678
&orderCurrency=USD
&orderAmount=100.00
&goodsInfo=Smart watch#,#123#,#50.00#,#2
&cardNo=4414444444444444&
cardExpireMonth=01
&cardExpireYear=2027
&cardSecurityCode=123
&firstName=Doe
&lastName=John
&email=test@test.com
&ip=12.150.22.41
&phone=0123456
&country=US
&city=New York&address=456 7th Street
&zip=10001
&returnUrl=https://xxx.com/returnUrl&webSite=https://xxx.com
¬ifyUrl=https://xxx.com/notifyurl
&signInfo=61be55a8e2f6b4e172338b");
Request request = new Request.Builder()
.url("https://sandbox.fireantspay.com/TPInterface")
.method("POST", body)
.addHeader("Content-Type", "application/x-www-form-urlencoded")
.build();
Response response = client.newCall(request).execute();php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'sandbox.fireantspay.com/TPInterface',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => 'merNo=80000&gatewayNo=80000001
&orderNo=12345678&orderCurrency=USD&orderAmount=100.00&
goodsInfo=Smart%20watch%23%2C%23123%23%2C%2350.00%23%2C%232&
cardNo=4414444444444444&cardExpireMonth=01&cardExpireYear=2027&
cardSecurityCode=123&firstName=Doe&lastName=John&
email=test%40test.com&ip=12.150.22.41&phone=0123456&country=US&
city=New%20York&address=456%207th%20Street&zip=10001&
returnUrl=https%3A%2F%2Fxxx.com%2FreturnUrl&
webSite=https%3A%2F%2Fxxx.com&
notifyUrl=https%3A%2F%2Fxxx.com%2Fnotifyurl
&signInfo=61be55a8e2f6b4e172338b',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/x-www-form-urlencoded'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;js
var request = require('request')
var options = {
method: 'POST',
url: 'sandbox.fireantspay.com/TPInterface',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
form: {
merNo: '80000',
gatewayNo: '80000001',
orderNo: '12345678',
orderCurrency: 'USD',
orderAmount: '100.00',
goodsInfo: 'Smart watch#,#123#,#50.00#,#2',
cardNo: '4414444444444444',
cardExpireMonth: '01',
cardExpireYear: '2027',
cardSecurityCode: '123',
firstName: 'Doe',
lastName: 'John',
email: 'test@test.com',
ip: '12.150.22.41',
phone: '0123456',
country: 'US',
city: 'New York',
address: '456 7th Street',
zip: '10001',
returnUrl: 'https://xxx.com/returnUrl',
webSite: 'https://xxx.com',
notifyUrl: 'https://xxx.com/notifyurl',
signInfo: '61be55a8e2f6b4e172338b'
}
}
request(options, function (error, response) {
if (error) throw new Error(error)
console.log(response.body)
})js
var settings = {
url: 'https://sandbox.fireantspay.com/TPInterface',
method: 'POST',
timeout: 0,
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: {
merNo: '80000',
gatewayNo: '80000001',
orderNo: '12345678',
orderCurrency: 'USD',
orderAmount: '100.00',
goodsInfo: 'Smart watch#,#123#,#50.00#,#2',
cardNo: '4414444444444444',
cardExpireMonth: '01',
cardExpireYear: '2027',
cardSecurityCode: '123',
firstName: 'Doe',
lastName: 'John',
email: 'test@test.com',
ip: '12.150.22.41',
phone: '0123456',
country: 'US',
city: 'New York',
address: '456 7th Street',
zip: '10001',
returnUrl: 'https://xxx.com/returnUrl',
webSite: 'https://xxx.com',
notifyUrl: 'https://xxx.com/notifyurl',
signInfo: '61be55a8e2f6b4e172338b'
}
}
$.ajax(settings).done(function (response) {
console.log(response)
})perl
curl --location 'sandbox.fireantspay.com/TPInterface' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'merNo=80000' \
--data-urlencode 'gatewayNo=80000001' \
--data-urlencode 'orderNo=12345678' \
--data-urlencode 'orderCurrency=USD' \
--data-urlencode 'orderAmount=100.00' \
--data-urlencode 'goodsInfo=Smart watch#,#123#,#50.00#,#2' \
--data-urlencode 'cardNo=4414444444444444' \
--data-urlencode 'cardExpireMonth=01' \
--data-urlencode 'cardExpireYear=2027' \
--data-urlencode 'cardSecurityCode=123' \
--data-urlencode 'firstName=Doe' \
--data-urlencode 'lastName=John' \
--data-urlencode 'email=test@test.com' \
--data-urlencode 'ip=12.150.22.41' \
--data-urlencode 'phone=0123456' \
--data-urlencode 'country=US' \
--data-urlencode 'city=New York' \
--data-urlencode 'address=456 7th Street' \
--data-urlencode 'zip=10001' \
--data-urlencode 'returnUrl=https://xxx.com/returnUrl' \
--data-urlencode 'webSite=https://xxx.com' \
--data-urlencode 'notifyUrl=https://xxx.com/notifyurl' \
--data-urlencode 'signInfo=61be55a8e2f6b4e172338b'直连支付接口响应
接口说明
本网关系统接收商户发来的订单后按照客户支付请求进行支付处理,处理完成后在本系统网关将实时把支付结果用 XML 格式进行返回,返回编码格式为 UTF-8。
返回数据说明
该支付返回数据为 XML 格式,需要先把 XML 进行解析,然后再判断订单的支付结果,具体的 XML 参数如:支付返回示例。
表单参数格式说明
| 参数名称 | 类型 | 最大长度 | 描述 |
|---|---|---|---|
| merNo | String | 5 | 商户编号 说明:平台分配给商户的唯一标识 |
| gatewayNo | String | 8 | 商户网关接入号 说明:平台分配给商户接入支付平台的唯一标识 |
| tradeNo | String | 50 | 流水订单号 本支付网关处理的交易流水号,唯一标识 |
| orderNo | String | 50 | 网店订单编号 对应订单支付接口的 orderNo 参数 |
| orderCurrency | String | 3 | 订单币种 说明:3 位国际货币通用码 |
| orderAmount | String | 10 | 订单金额 |
| orderStatus | String | 1 | 订单交易状态: 返回数字:-1/0/1/2 -1: 待处理 0: 失败 1: 成功 2:预授权批准金额 |
| orderInfo | String | 50 | 返回交易信息 交易结束后给予的支付结果提示 |
| billAddress | String | 100 | 账单地址 支付成功返回交易的账单地址(账单描述符) 支付失败则返回空值 |
| returnType | String | 1 | 返回类型 1:浏览器实时返回 2:服务器实时返回 3:服务器异步返回 服务器实时返回为 xml,服务器异步返回及浏览器返回均为键值对表单。 |
| orderErrorCode | String | 50 | 失败码 各种失败原因对应的失败码 |
| paymentMethod | String | 50 | 支付方式,信用卡:Credit Card |
| signInfo | String | 32 | 加密签名信息 对支付结果的参数进行组合,然后再进行 sha256 方法签名,具体参数组合顺序如下, 顺序不能改变。 merNo + gatewayNo +tradeNo+orderNo + orderCurrency +orderAmount + orderStatus+orderInfo+merKey 具体详见附录:sha256 签名方式 |
| remark | String | 500 | 备注 |
| redirectUrl | String | 500 | 3D 重定向 url,返回此参数则需要客户端重定向 url 发起 3D 验证. |
支付返回示例
xml
<?xm1 version="1.0" encoding="UTE-8"?>
<respon>
<merNo>10000</merNo>
<gatewayNo>10000001</gatewayNo>
<tradeNo>T2016081117245925449077</tradeNo>
<orderNo>Test-938788</orderNo>
<orderAmount>32.50</orderAmount>
<orderCurrency>USD</orderCurrency>
<orderStatus>1</orderStatus>
<orderErrorCode>00</orderErrorCode>
<orderInfo>Transaction succeeded</orderInfo>
<paymentMethod>Credit Card</paymentMethod>
<returnType>2</returnType>
<billAddress>Gadent.ltd</billAddress>
<signInfo>C6EB2353B92CFEA3698CE2F5332CB882C0379A5E58A7069534B944F046c26F8r</signInfo>
<remark></remark>
</respon>