# 在线支付(企业)

# 支付鉴权

接口名称:/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":"请求成功"
}