# 在线支付(企业)
# 支付鉴权
接口名称:/trade/company/authentication
请求参数:
序号 | 层级 | 英文名称 | 中文名称 | 类型 | 长度 | 是否必填 | 说明 |
---|---|---|---|---|---|---|---|
1 | 1 | payPlans | 支付单明细 | List<PayPlan> | 是 | ||
2 | 2 | transportBillNumber | 运单号 | String | 20 | 是 | 长度20 |
3 | 2 | payType | 支付类型 | Integer | 64 | 是 | 20100-油卡付 20200-预付 20300-到付 20400-回单付 20500-信息费 |
返回结果:
序号 | 英文名称 | 中文名称 | 类型 | 说明 |
---|---|---|---|---|
1 | authTradeNo | 鉴权编号 | String | |
2 | authResult | 鉴权结果 | Integer | 鉴权结果: 3 - 鉴权成功 4 - 鉴权失败 |
3 | failReason | 失败原因 | String | |
4 | authMode | 鉴权方式 | Integer | 鉴权方式 1-短信验证码 3-密钥签名 |
5 | totalCost | 支付总金额 | Long | 支付计划如果是运单的最后一笔,支付总金额会包含服务费,单位分 |
mock 数据示例
{
"code":"00000",
"data":{
"authTradeNo":"2301101343565230169094380000000",
"failReason":null,
"authMode":1,
"authResult":3,
"totalCost":50000
},
"message":"请求成功",
"traceId":"da4edcdb0660445b908afd1ecddc4833"
}
# 在线支付(企业)
接口名称:/trade/company/payOnline
请求参数
序号 | 层级 | 英文名称 | 中文名称 | 类型 | 长度 | 是否必填 | 说明 |
---|---|---|---|---|---|---|---|
1 | 1 | payPlans | 支付计划明细 | List<ApiPayPlanDTO> | 是 | ||
2 | 2 | transportBillNumber | 运单号 | String | 64 | 是 | 长度64 |
3 | 2 | payType | 支付类型 | Integer | 5 | 是 | 20100-油卡付 20200-预付 20300-到付 20400-回单付 20500-信息费 |
4 | 1 | totalCost | 支付金额 | Long | 20 | 是 | 支付计划如果是运单的最后一笔,支付总金额会包含服务费,单位分 |
5 | 1 | authTradeNo | 鉴权编号 | String | 64 | 是 | |
6 | 1 | authCode | 鉴权验证码 | String | 20 | 是 | 当支付鉴权返回的鉴权方式是1,传短信验证码;当支付鉴权返回的鉴权方式是3,传私钥 |
返回参数
序号 | 英文名称 | 中文名称 | 类型 | 说明 |
---|---|---|---|---|
1 | authTradeNo | 鉴权编号 | String | |
2 | accept | 鉴权结果 | Boolean | 是否接收支付请求 |
3 | rejectComment | 失败原因 | String |
/**
* 获取authCode方法,仅供参考
* @param authTradeNo 鉴权编号
* @param totalCost 支付金额
* @param encodedPrivateKey 私钥
* @return
*/
public static final String SIGN_ALGORITHM = "SHA256withRSA";
public static final String KEY_ALGORITHM = "RSA";
public static String sha256withRSA(String authTradeNo, Long totalCost, String encodedPrivateKey) throws
NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, SignatureException {
String authContent = authTradeNo + totalCost;
encodedPrivateKey = encodedPrivateKey.replaceAll("(-+BEGIN (RSA )?PRIVATE KEY-+\\r?\\n|-+END (RSA )?PRIVATE KEY-+\\r?\\n?|\\n)", "");
byte[] privateKeyBytes = Base64.getDecoder().decode(encodedPrivateKey);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
KeyFactory kf = KeyFactory.getInstance(KEY_ALGORITHM);
PrivateKey privateKey = kf.generatePrivate(keySpec);
Signature signObj = Signature.getInstance(SIGN_ALGORITHM);
signObj.initSign(privateKey);
signObj.update(authContent.getBytes(StandardCharsets.UTF_8));
byte[] signBytes = signObj.sign();
return new String(Base64.getEncoder().encode(signBytes), StandardCharsets.UTF_8);
}
mock 数据示例
{
"code":"00000",
"data":{
"accept":true,
"rejectComment":null,
"batchNo":"23011013461973901690943800000"
},
"message":"请求成功",
"traceId":"1fa5d7952f1b4c61a712a764643860ed"
}
# 查询支付单
接口名称:/trade/company/queryPayDetails
请求参数:
序号 | 层级 | 英文名称 | 中文名称 | 类型 | 长度 | 是否必填 | 说明 |
---|---|---|---|---|---|---|---|
1 | 1 | payPlans | 支付单明细 | List<PayPlan> | 是 | ||
2 | 2 | transportBillNumber | 运单号 | String | 20 | 是 | 长度20 |
3 | 2 | payType | 支付类型 | Integer | 64 | 是 | 20100-油卡付 20200-预付 20300-到付 20400-回单付 20500-信息费 90100-运费差额 |
返回结果:
序号 | 英文名称 | 中文名称 | 类型 | 说明 |
---|---|---|---|---|
1 | transportBillNumber | 运单号 | String | |
2 | payType | 支付类型 | Integer | 支付计划 20100-油卡付 20200-预付 20300-到付 20400-回单付 20500-信息费 90100-运费差额 |
3 | orderNo | 订单号 | String | 支付单唯一标识 |
4 | payTime | 支付时间 | Long | 时间毫秒 |
5 | transactionNo | 交易流水号 | String | |
6 | state | 支付状态 | Integer | 0-待支付 1-成功 2-失败 3-支付中 |
7 | payCost | 金额 | Long | 单位为“分” |
8 | returnMsg | 结果文案 | String | 可能为空 |
9 | carrierReceiptDownloadUrl | 支付回单 | String | 可能为空 |
mock 数据示例
{
"code": "00000",
"data": [{
"transportBillNumber":"202208010210015714",
"payType":20100,
"orderNo":"1-202208010210015714-90100",
"payTime":10000001231,
"transactionNo":"202208010210015714",
"state": 1,
"payCost": 10000
}],
"message": "请求成功"
}
# 在线支付回调通知
1.请求头会携带sign参数,用于鉴权
serviceName : payOnlineForCompany
接口名称:由接入方提供回调地址
请求参数
序号 | 层级 | 英文****名称 | 中文名称 | 类型 | 长度 | 是否必填 | 说明 |
---|---|---|---|---|---|---|---|
1 | 1 | serviceName | 服务名 | String | 是 | ||
2 | 1 | apiId | 接入appId | String | 是 | ||
3 | 1 | results | 支付计划明细 | List<PayResult> | 是 | ||
4 | 2 | transportBillNumber | 运单号 | String | 20 | 是 | 长度20 |
5 | 2 | orderNo | 支付单号 | String | 64 | 是 | 长度64 |
6 | 2 | state | 支付状态 | Integer | 5 | 是 | -1:不可支付 0:待支付 1:成功 2:失败 3:支付中 |
7 | 2 | payType | 支付类型 | Integer | 5 | 是 | 20100-油卡付 20200-预付 20300-到付 20400-回单付 20500-信息费 90100-服务费 |
8 | 2 | payCost | 支付金额 | Long | 20 | 是 | 整数长度8,支付给承运人的金额,货币单位为人民币(分) |
9 | 2 | tradeNo | 交易流水号 | String | 64 | 否 | 可能为空 |
10 | 2 | returnMsg | 结果文案 | String | 64 | 否 | 可能为空 |
mock 数据示例
{
"apiId":"9fa5c1643b454f7ab2e026082d610e6b",
"results":[
{
"orderNo":"55-202208030041000894-20400",
"payCost":1500,
"payType":20400,
"state":2,
"tradeNo":"TRADE202208040041000000018",
"transportBillNumber":"202208030041000894",
"returnMsg": "余额不足"
}
],
"serviceName":"payOnline"
}
返回参数
序号 | 英文名称 | 中文名称 | 类型 | 说明 |
---|---|---|---|---|
1 | code | 结果码 | String | 1-成功 2-失败 |
3 | message | 结果文本 | String | 结果文本 |
mock 数据示例
{
"code": "1",
"message": "请求成功"
}
# 修改支付单收款人
接口名称:/trade/company/updatePaymentOrderPayee
请求参数:
序号 | 层级 | 英文名称 | 中文名称 | 类型 | 长度 | 是否必填 | 说明 |
---|---|---|---|---|---|---|---|
1 | 1 | transportBillNumber | 运单号 | String | 是 | ||
2 | 1 | payType | 支付类型 | Integer | 是 | 20100-油卡付 20200-预付 20300-到付 20400-回单付 | |
3 | 1 | payeeIdCard | 收款人身份证 | String | 是 | ||
1 | 1 | payeeName | 收款人姓名 | String | 是 | ||
2 | 1 | payeeBankCardNumber | 收款人银行卡号 | String | 是 | ||
3 | 1 | payeeBankDeposit | 收款人开户银行 | String | 是 | ||
1 | 1 | type | 收款人账户类型 | String | 是 | 1-银行账户 2-在线账户 4-支付宝 5-微信 6-第三方 7-其他 |
mock 数据示例
{
"transportBillNumber": "",
"payType": 20100,
"payeeIdCard": "",
"payeeName": "",
"payeeBankCardNumber": "",
"payeeBankDeposit": "",
"type" : 1
}
返回结果:
成功or失败
# 服务费支付
接口名称:/trade/company/payServiceCost
请求参数:
序号 | 层级 | 英文名称 | 中文名称 | 类型 | 长度 | 是否必填 | 说明 |
---|---|---|---|---|---|---|---|
1 | 1 | transportBillNumber | 运单号 | String | 是 | ||
2 | 1 | authTradeNo | 鉴权编号 | String | 条件必传 | 企业直接支付运费给承运人时,必传 (鉴权编号由'支付鉴权'接口返回) | |
3 | 1 | authCode | 鉴权验证码 | String | 条件必传 | 企业直接支付运费给承运人时,必传 |
/**
* 获取authCode方法,仅供参考
* @param authTradeNo 鉴权编号
* @param totalCost 支付金额
* @param encodedPrivateKey 私钥
* @return
*/
public static final String SIGN_ALGORITHM = "SHA256withRSA";
public static final String KEY_ALGORITHM = "RSA";
public static String sha256withRSA(String authTradeNo, Long totalCost, String encodedPrivateKey) throws
NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, SignatureException {
String authContent = authTradeNo + totalCost;
encodedPrivateKey = encodedPrivateKey.replaceAll("(-+BEGIN (RSA )?PRIVATE KEY-+\\r?\\n|-+END (RSA )?PRIVATE KEY-+\\r?\\n?|\\n)", "");
byte[] privateKeyBytes = Base64.getDecoder().decode(encodedPrivateKey);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
KeyFactory kf = KeyFactory.getInstance(KEY_ALGORITHM);
PrivateKey privateKey = kf.generatePrivate(keySpec);
Signature signObj = Signature.getInstance(SIGN_ALGORITHM);
signObj.initSign(privateKey);
signObj.update(authContent.getBytes(StandardCharsets.UTF_8));
byte[] signBytes = signObj.sign();
return new String(Base64.getEncoder().encode(signBytes), StandardCharsets.UTF_8);
}
返回结果:
平台鉴权支付不会返回任何值
企业秘钥鉴权将返回以下参数
序号 | 英文名称 | 中文名称 | 类型 | 说明 |
---|---|---|---|---|
1 | batchNo | 支付批次号 | String | |
2 | accept | 鉴权结果 | Boolean | 是否接收支付请求 |
3 | rejectComment | 失败原因 | String |
mock 数据示例
{
"code":"00000",
"data":{
"accept":true,
"rejectComment":null,
"batchNo":"23011013461973901690943800000"
},
"message":"请求成功"
}