微信支付
支付流程
该接口支付采用的服务器端对接,即 Server-To-Server 模式(非浏览器表单传值)。所以在整个支付过程中,浏览器中的 URL 地址不会发生改变。具体流程如下:
- 小程序/公众号/APP/浏览器网站下单
- 网店把订单信息提交到火蚁微信接口
- 火蚁提交给微信服务器,然后将创建订单结果返回网店,用于创建下一步支付
- 网店根据不同交易类型,调起微信支付(不同场景调起支付方式不同)
- 用户完成支付后,火蚁通过 notifyUrl 将结果通知到网店
其中:第 2 步—第 3 步为服务器提交数据,浏览器 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,单价,数量,具体格式详见附录:货物信息 |
| 本地支付信息 | ||||
| appid | String | 50 | 否 | 商户在微信开放平台申请移动应用对应的appid.小程序支付时为小程序appid,公众号支付时为公众号appid. JSAPI支付时必需 |
| openid | String | 50 | 否 | 商户appid下用户唯一标识. JSAPI支付时必需 |
| paymentMethod | String | 50 | 是 | 支付方式,微信支付固定WechatPay. |
| tradeType | String | 50 | 是 | 交易类型 JSAPI: 小程序/公众号支付 NATIVE: PC端网站支付 APP: app支付 MWEB: H5支付(移动端网站支付) |
| limitPay | String | 50 | 否 | 限定支付方式 no_credit:指定不能使用信用卡支付 |
| ip | String | 50 | 否 | 用户IP MWEB支付时必需 |
| 收货人信息 | ||||
| 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 | 否 | 收货人邮编 |
| 其他信息 | ||||
| notifyUrl | String | 200 | 是 | 异步通知地址. 支付完成以后, 平台将支付结果以服务器端POST方式通知到此地址,该异步地址收到请求返回OK即可,否则,在一段时间内最多会返回3次. |
| signInfo | String | 32 | 是 | 加密签名信息 对支付提交参数进行组合,然后再进行sha256方法签名,具体参数组合顺序如下,顺序不能改变:merNo + gatewayNo + orderNo + orderCurrency + orderAmount + notifyUrl + merKey(密钥, 在商户后台可以查询到),这些参数顺序不能修改,中间不要出现任何空格和+号. 具体详见附录:sha256签名方式 |
| remark | String | 500 | 否 | 说明:存放商户自己的信息,随订单传送到支付平台,当订单返回时原封不动的返回给商户. |
支付提交示例
java
OkHttpClient client = new OkHttpClient().newBuilder().build();
MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
RequestBody body = RequestBody.create(mediaType, "merNo=30000&gatewayNo=30000001&orderNo=12345678&orderCurrency=USD&orderAmount=100.00&goodsInfo=image形象店-深圳腾大-QQ公仔#,#123#,#50.00#,#2&appid=wx8888888888888888&openid=oUpF8uMuAJO_M2pxb1Q9zNjWeS6o&paymentMethod=WechatPay&tradeType=JSAPI&limitPay=no_credit&ip=127.0.0.1¬ifyUrl=https://xxx.com/notifyurl&signInfo=61be55a8e2f6b4e172338b...");
Request request = new Request.Builder()
.url("https://sandbox.fireantspay.com/WxInterface")
.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 => 'https://sandbox.fireantspay.com/WxInterface',
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=30000&gatewayNo=30000001&orderNo=12345678&orderCurrency=USD&orderAmount=100.00&goodsInfo=image%E5%BD%A2%E8%B1%A1%E5%BA%97-%E6%B7%B1%E5%9C%B3%E8%85%BE%E5%A4%A7-QQ%E5%85%AC%E4%BB%94%23%2C%23123%23%2C%2350.00%23%2C%232&appid=wx8888888888888888&openid=oUpF8uMuAJO_M2pxb1Q9zNjWeS6o&paymentMethod=WechatPay&tradeType=JSAPI&limitPay=no_credit&ip=127.0.0.1¬ifyUrl=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: 'https://sandbox.fireantspay.com/WxInterface',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
form: {
merNo: '30000',
gatewayNo: '30000001',
orderNo: '12345678',
orderCurrency: 'USD',
orderAmount: '100.00',
goodsInfo: 'image形象店-深圳腾大-QQ公仔#,#123#,#50.00#,#2',
appid: 'wx8888888888888888',
openid: 'oUpF8uMuAJO_M2pxb1Q9zNjWeS6o',
paymentMethod: 'WechatPay',
tradeType: 'JSAPI',
limitPay: 'no_credit',
ip: '127.0.0.1',
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/WxInterface',
method: 'POST',
timeout: 0,
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: {
merNo: '30000',
gatewayNo: '30000001',
orderNo: '12345678',
orderCurrency: 'USD',
orderAmount: '100.00',
goodsInfo: 'image形象店-深圳腾大-QQ公仔#,#123#,#50.00#,#2',
appid: 'wx8888888888888888',
openid: 'oUpF8uMuAJO_M2pxb1Q9zNjWeS6o',
paymentMethod: 'WechatPay',
tradeType: 'JSAPI',
limitPay: 'no_credit',
ip: '127.0.0.1',
notifyUrl: 'https://xxx.com/notifyurl',
signInfo: '61be55a8e2f6b4e172338b...'
}
}
$.ajax(settings).done(function (response) {
console.log(response)
})perl
curl --location 'https://sandbox.fireantspay.com/WxInterface' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'merNo=30000' \
--data-urlencode 'gatewayNo=30000001' \
--data-urlencode 'orderNo=12345678' \
--data-urlencode 'orderCurrency=USD' \
--data-urlencode 'orderAmount=100.00' \
--data-urlencode 'goodsInfo=image形象店-深圳腾大-QQ公仔#,#123#,#50.00#,#2' \
--data-urlencode 'appid=wx8888888888888888' \
--data-urlencode 'openid=oUpF8uMuAJO_M2pxb1Q9zNjWeS6o' \
--data-urlencode 'paymentMethod=WechatPay' \
--data-urlencode 'tradeType=JSAPI' \
--data-urlencode 'limitPay=no_credit' \
--data-urlencode 'ip=127.0.0.1' \
--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 -1: 待处理 0: 失败 1: 成功 |
| orderInfo | String | 100 | 返回交易信息 交易结束后给予的支付结果提示 |
| billAddress | String | 100 | 账单地址 支付成功返回交易的账单地址(账单描述符) 支付失败则返回空值 |
| returnType | String | 1 | 返回类型 1:浏览器实时返回 2:服务器实时返回 3:服务器异步返回 服务器实时返回为 xml,服务器异步返回及浏览器返回为键值对表单. |
| orderErrorCode | String | 50 | 失败码 各种失败原因对应的失败码,成功一般为 00. |
| paymentMethod | String | 50 | 支付方式,微信支付:WechatPay |
| signInfo | String | 32 | 加密签名信息 对支付结果的参数进行 sha256 方法签名,具体参数组合顺序如下, 顺序不能改变。 sha256(merNo + gatewayNo +tradeNo+orderNo + orderCurrency + orderAmount + orderStatus+orderInfo + merKey) |
| remark | String | 500 | 备注 |
| redirectUrl | String | 500 | 重定向 url,仅当交易返回待处理时存在. 在微信支付不同交易类型下包含的内容有所不同: NATIVE: 返回二维码链接 JSAPI:返回小程序/公众号 JS 调起支付所需参数 APP: 返回 app 调起支付所需参数 MWEB: 返回支付跳转链接 具体见附录: redirectUrl 说明 |
支付返回示例
交易待处理(JSAPI),需要商户做下一步处理:
xml
<?xm1 version="1.0" encoding="UTE-8"?>
<respon>
<merNo>10000</merNo>
<gatewayNo>10000001</gatewayNo>
<tradeNo>HY024111317280195515514</tradeNo>
<orderNo>12345</orderNo>
<orderAmount>10.00</orderAmount>
<orderCurrency>USD</orderCurrency>
<orderStatus>-1</orderStatus>
<orderErrorCode>PENGDING</orderErrorCode>
<orderInfo></orderInfo>
<paymentMethod>WechatPay</paymentMethod>
<returnType>2</returnType>
<billAddress></billAddress>
<redirectUrl>timeStamp=1731546030&nonceStr=...</redirectUrl>
<signInfo>C6EB2353B92CFEA3698CE2F5332CB882...</signInfo>
<remark></remark>
</respon>交易失败(参数校验不通过):
xml
<?xm1 version="1.0" encoding="UTE-8"?>
<respon>
<merNo>10000</merNo>
<gatewayNo>10000001</gatewayNo>
<tradeNo>HY024111317280195515514</tradeNo>
<orderNo>12345</orderNo>
<orderAmount>10.00</orderAmount>
<orderCurrency>USD</orderCurrency>
<orderStatus>0</orderStatus>
<orderErrorCode>I0134</orderErrorCode>
<orderInfo>Appid不能为空</orderInfo>
<paymentMethod>WechatPay</paymentMethod>
<returnType>2</returnType>
<billAddress></billAddress>
<redirectUrl></redirectUrl>
<signInfo>C6EB2353B92CFEA3698CE2F5332CB882...</signInfo>
<remark></remark>
</respon>交易失败(微信服务端错误):
xml
<?xm1 version="1.0" encoding="UTE-8"?>
<respon>
<merNo>10000</merNo>
<gatewayNo>10000001</gatewayNo>
<tradeNo>HY024111317280195515514</tradeNo>
<orderNo>12345</orderNo>
<orderAmount>10.00</orderAmount>
<orderCurrency>USD</orderCurrency>
<orderStatus>0</orderStatus>
<orderErrorCode>APPID_NOT_EXIST</orderErrorCode>
<orderInfo>APPID不存在</orderInfo>
<paymentMethod>WechatPay</paymentMethod>
<returnType>2</returnType>
<billAddress></billAddress>
<redirectUrl></redirectUrl>
<signInfo>C6EB2353B92CFEA3698CE2F5332CB882...</signInfo>
<remark></remark>
</respon>异步通知(成功):
txt
orderErrorCode=00&signInfo=4EF256E175307636299F6559C3F89CD94585D3E42DA33985BE400DCBE5FFF779&orderNo=12345&gatewayNo=10000001&tradeNo=HY024111317280195515514&orderCurrency=USD&orderStatus=1&remark=备注&orderAmount=10.00&merNo=10000&billAddress=LARTIN&orderInfo=Approved&paymentMethod=WechatPay&returnType=3