# 在线支付(企业)
# 支付鉴权
接口名称:/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":"请求成功"
}
