2.1.6 接口说明
1. 商户的商户号由翼支付统一分配,商户需与翼支付的运营人员对接,提供商户资料,申请
正式的商户号。
2. 商户要保证订单号的唯一性。
3. 订单请求流水号不能重复,建议以日期时间(yyyyMMDDhhmmss格式)加一固定长度(不
小于6位)流水号组成,如: 20061012132425 + 0000001等。
4. 订单流水号和订单号可以相同。(使用翼支付提供的“流程测试”商户时除外,如果相同
会提示订单或流水号重复的错误)
5. MAC校验,保证了交易信息到翼支付网关平台的完整性,参与MAC运算的字符及其顺序
如下: a) 顺序
MERCHANTID=123456789&ORDERNO=123456&ORDERREQNO=1234567&ORDERDATE=200603141210&BARCODE=111111&ORDERAMT=1&KEY=123456
b) 此处的KEY为商户的数据KEY,可以通过翼支付的统一运行地址生成。此数据KEY
对本文档其它接口进行
MAC
校验时同样适用。
https://managerwg.bestpay.com.cn/login.jsp
c) 要求:将上述固定顺序组织的字符串,参数名均为大写,使用标准md5算法进行摘要,
然后将摘要果转成16进制字符串,字符串建议使用大写,就是校验域MAC的值,并在提交订单时,将MAC值和订单信息一起提交到翼支付网关翼支付网关平台。 d) 需保证MAC校验时中的各个参数,与下单请求时的参数完全一致。 6. 商户若需分账,则填写ledgerDetail字段,例如:
a) 规则:023101111:4|023102222:3|023103333:1
b) 说明:订单总金额4+3+1=8分,商户023101111分账4分,每组对应关系之间“|”
分隔
c) 分账权限与一般支付权限不同。商户分账支付的权限需要额外申请,并且在结算时翼
支付将形成各个分账商户的对账文件。
7. 下单支付接口返回的success值并不是最终支付结果。支付结果在下单成功情况下,result
的transStatus字段代表支付结果。
8. 返回结果中的翼支付网关流水号ourTransNo,当用户完成支付后才会生成。对于有密支
付情况,由于用户未实际支付,返回的流水号为空字符串。商户可在查询接口获得该流水号。
9. 接口响应中的sign值是网关根据返回结果进行的前面,保证收到结果的完整性,商户可以根据需要进行验签,目前签名默认为MAC形式,参与MAC运算的字符及其顺序如下:
顺
序
:
MERCHANTID=0018888888&ORDERNO=1234567890&
ORDERREQNO=20141001&ORDERDATE=null&OURTRANSNO=201508080808&TRANSAMT=10&TRANSSTATUS=B&ENCODETYPE=1&KEY=123456 ORDERDATE在下单接口返回时暂未使用,目前始终为null。
2.1.7 客户端测试用例
注:此用例仅供参考
import com.bestpay.paycenter.commons.util.CryptTool; import org.apache.http.Consts; import org.apache.http.HttpEntity; import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import javax.net.ssl.SSLContext; import javax.xml.namespace.QName;
import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.SSLContextBuilder; import org.apache.http.conn.ssl.TrustStrategy;
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;
public class TestClient {
public static void main(String[] args) throws Exception{ String merchantId = \ String orderNo = \
String orderReqNo = \ String orderDate = \ String barcode = \
String orderAmt = \
StringBuilder sb = new StringBuilder();//组装mac加密明文串 sb.append(\ sb.append(\
sb.append(\ sb.append(\TE=\ sb.append(\ sb.append(\
sb.append(\此处是商户的key
String mac = CryptTool.md5Digest(sb.toString());//进行md5加密(商户自己封装MD5加密工具类,此处只提供参考)
Map
param.put(\merchantId); param.put(\merchantId); param.put(\barcode); param.put(\orderNo);
param.put(\orderReqNo); param.put(\orderDate); param.put(\\ param.put(\\ param.put(\\
param.put(\orderAmt); param.put(\\ param.put(\\
param.put(\\条码支付\ param.put(\\
param.put(\\ param.put(\\ param.put(\\ param.put(\mac);
//创建信任证书 CloseableHttpClient httpClient = createSSLClientDefault(); HttpPost httpPost = null;
CloseableHttpResponse response = null; try {
httpPost = new HttpPost(\\
List
paramList.add(new BasicNameValuePair(key, param.get(key))); }
httpPost.setEntity(new UrlEncodedFormEntity(paramList, Consts.UTF_8));
httpPost.setConfig(RequestConfig.custom().setConnectTimeout(30000).setSocketTimeout(30000).build());
response = httpClient.execute(httpPost); HttpEntity entity = response.getEntity();
int statusCode = response.getStatusLine().getStatusCode(); if(HttpStatus.SC_OK == statusCode)//如果响应码是200 System.out.println(EntityUtils.toString(entity));; } finally {
if (response != null) { response.close(); }
if (httpPost != null) {
httpPost.releaseConnection(); }
httpClient.close(); } } }
//创建链接 public static CloseableHttpClient createSSLClientDefault() throws Exception {
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new AllTrustStrategy()).build();
SSLConnectionSocketFactory sslSf = new SSLConnectionSocketFactory(sslContext); return HttpClients.custom().setSSLSocketFactory(sslSf).build(); } //加载证书 private static class AllTrustStrategy implements TrustStrategy {
public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { return true; } } }
说明
当使用org.apache.http.client之外的第三方类封装HTTP请求时,需要注意
1. 2.
HTTP请求中的字符串,需要经过URL编码,其中的中文字符使用UTF-8。 HTTP
请求中的
Content-Type
使用
application/x-www-form-urlencoded;
charset=UTF-8,请求方法为POST。
2.1.8 错误码
错误码 BE199999 BARCODE_VALIDATE_ERROR 849 5146 4008 -301 -302 -304 1001 1002 1003 -3061 -3062 -3063 -3064 -3065
卡信息解密失败 查询绑卡信息出错 绑卡信息不存在 订单MAC域验证失败 校验订单出错 商户未配置此交易权限 商户未注册 商户未配置密钥信息 商户未开通银行 分账商户不存在 分账金额有误
分账金额总和不等于订单金额 分账商户父商户有误 分账信息不允许有两个相同商户
BARCODE_STORE_CODE_IS_EMPTY
BE999999
描述
请求参数有误 条形码验证异常
备注
检查HTTP请求相关代码
用户信息异常 用户信息异常 用户信息异常
检查订单金额
检查数据KEY是否申请
条码门店号不能为空
系统繁忙,请稍后再试 系统原因,联系技术支协查