# 臻选计划 - 合作方接口文档

文档说明:本文档描述宜享花(我方)与合作方之间关于"臻选计划"权益产品的接口交互规范。该接口兼容先享后付(BNPL)、直接支付、续订、退款、行权、取消续订等各种特殊业务场景。


# 目录


# 1. 通用约定

# 1.1 宜享花调用合作方(主动调用)

通信协议:HTTP POST,Content-Type: application/json

统一请求地址/api/gateway(通过 apiCode 参数区分不同接口,Header 需传 ApiCode

完整URLhttps://xxxx.com/api/gateway

公共请求参数

参数名 类型 必填 说明
appId String 合作方应用号,由合作方分配
version String 版本号,固定 1.0
apiCode String 接口编码,见各接口说明
timestamp Long 时间戳,毫秒
signType String 签名类型,固定 MD5
sign String MD5签名值(大写),详见签名算法
业务参数 - - 各接口特有参数

签名算法(MD5)

  1. 获取所有请求参数,不包括字节类型参数(如文件、字节流或base64),剔除 sign 字段剔除值为空的参数
  2. 按字段名 ASCII 码递增排序(字母升序),相同则按第二个字符排序,以此类推
  3. 拼接为 key1=value1&key2=value2&...&keyN=valueN,用 & 连接
  4. 最后拼接 &key=APP_SECRET
  5. 对拼接字符串做 MD5,转大写
签名示例:
appId=APP001&apiCode=AP101&openId=12345&timestamp=1700000000000&version=1.0&key=YOUR_APP_SECRET
→ MD5 → ABCDEF1234567890ABCDEF1234567890
1
2
3

Java 代码示例

import java.security.MessageDigest;
import java.util.Map;
import java.util.TreeMap;

public class SignUtil {

    /**
     * 生成签名
     *
     * @param params    所有请求参数(不含sign)
     * @param appSecret 签名密钥
     * @return MD5签名值(大写)
     */
    public static String generateSign(Map<String, Object> params, String appSecret) {
        // 1. 按字段名ASCII码递增排序
        TreeMap<String, Object> sortedMap = new TreeMap<>(params);

        // 2. 拼接参数(跳过null和空字符串,跳过fileContent)
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<String, Object> entry : sortedMap.entrySet()) {
            if (entry.getValue() == null) {
                continue;
            }
            String value = entry.getValue().toString();
            if (value.isEmpty() || "fileContent".equals(entry.getKey())) {
                continue;
            }
            sb.append(entry.getKey()).append("=").append(value).append("&");
        }

        // 3. 拼接key=APP_SECRET
        sb.append("key=").append(appSecret);

        // 4. MD5转大写
        return md5(sb.toString()).toUpperCase();
    }

    private static String md5(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digest = md.digest(input.getBytes("UTF-8"));
            StringBuilder hex = new StringBuilder();
            for (byte b : digest) {
                hex.append(String.format("%02x", b));
            }
            return hex.toString();
        } catch (Exception e) {
            throw new RuntimeException("MD5计算失败", e);
        }
    }

    // 使用示例
    public static void main(String[] args) {
        TreeMap<String, Object> params = new TreeMap<>();
        params.put("appId", "APP001");
        params.put("version", "1.0");
        params.put("apiCode", "AP101");
        params.put("timestamp", System.currentTimeMillis());
        params.put("signType", "MD5");
        params.put("couponPackageId", "mbp1443320037241782272");
        params.put("openId", "123456");
        params.put("payWay", "EXTERNAL");
        params.put("externalOrderNum", "LD202507171001");
        params.put("orderAmount", "29.90");
        params.put("shareFlag", "N");

        String sign = generateSign(params, "YOUR_APP_SECRET");
        params.put("sign", sign);

        System.out.println("签名结果: " + sign);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

通用应答报文

参数名 类型 必填 说明
apiCode String 请求码,同请求报文
rspCode String 应答码,0000=成功,其他视为失败
rspMsg String 应答描述
data Object 业务数据

应答报文示例

{
  "apiCode": "AP101",
  "rspCode": "0000",
  "rspMsg": "成功",
  "data": {
    "code": "1",
    "msg": "处理成功",
    "data": {
      // 业务数据
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12

成功判断rspCode == "0000"data.code == "1"

响应码

应答码 说明
0000 成功
9998 失败
9999 系统繁忙,请稍后重试

配置参数

配置项 说明
appId 应用ID,由合作方分配
appSecret 签名密钥(APP_SECRET)
baseUrl 合作方接口基础URL
couponPackId 臻选计划券包号
aesKey AES解密密钥(Base64编码)


# 1.2 加密机制

# 1.2.1 宜享花调用合作方 - 签名加密

使用 MD5 签名,详见 1.1 签名算法

# 1.2.2 合作方返回数据 - AES解密

合作方返回的行权URL(AP002接口)为 AES 加密的 Base64 字符串:

项目
算法 AES/ECB/PKCS5Padding
密钥 lidai.aesKey(Base64编码)
数据 Base64编码的密文

# 1.2.3 合作方调用宜享花 - AES加密

合作方调用宜享花的查询/试算接口使用 SecretTextBO 传输密文:

{
  "text": "AES加密后的Base64密文"
}
1
2
3
项目
算法 AES/ECB/PKCS5Padding
密钥 固定密钥(双方约定)
明文 JSON格式业务数据
密文 Base64编码

退款回调接口使用 encryptOrder 字段传递加密的退款信息,同样使用 AES 解密。


# 2. 宜享花 → 合作方 接口

# 2.1 AP101 权益订单购买(先享后付/直接购买)

接口编码AP101

业务场景

  • 先享后付(BNPL):用户先享权益,后续划扣还款。payWay=EXTERNAL,不传 paymentNo
  • 直接支付:支付成功后创建订单。payWay=实际支付通道,必传 paymentNo
  • 续订:月卡续费场景,同直接支付

请求参数

参数名 类型 必填 说明
couponPackageId String 券包号,由合作方提供
openId String 宜享花userId
payWay String 支付方式,先享后付传 EXTERNAL
paymentNo String 条件必填 支付流水号,payWay!=EXTERNAL 时必填
payTime String 支付时间,格式 yyyy-MM-dd HH:mm:ss,不传默认当前时间
externalOrderNum String 宜享花订单号(user_coupon_pack.order_id)
orderAmount String 订单金额,单位元,如 1.00
merId String 扣款商户号,不填使用默认配置
note String 订单备注,透传字段
shareFlag String 是否分账,N-不分账 / Y-分账
shareInfoList Array 条件必填 分账信息列表,shareFlag=Y 时必填

shareInfoList 分账信息

参数名 类型 必填 说明
merId String 收款商户号
shareMerId String 分账商户号
shareType Integer 分账类型,1-金额分账 / 2-比例分账
amount String 条件必填 shareType=1 时必填,分账金额(元),如 1.00
ratio String 条件必填 shareType=2 时必填,分账比例,如 0.10 表示10%

请求示例

{
  "appId": "APP001",
  "version": "2.0",
  "apiCode": "AP101",
  "timestamp": 1700000000000,
  "signType": "MD5",
  "couponPackageId": "mbp1443320037241782272",
  "openId": "123456",
  "payWay": "EXTERNAL",
  "externalOrderNum": "LD202507171001",
  "orderAmount": "29.90",
  "shareFlag": "N",
  "sign": "ABCDEF1234567890ABCDEF1234567890"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

响应参数

参数名 类型 说明
orderDetail Object 订单信息对象(见 4.8 orderDetail 对象

响应示例

{
  "rspCode": "0000",
  "rspMsg": "成功",
  "data": {
    "code": "1",
    "msg": "处理成功",
    "data": {
      "orderDetail": {
        "orderNum": "LD20250717100001",
        "orderStatus": "CREATE_SUCCESS"
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

关键返回字段data.data.orderDetail.orderNum — 合作方订单号,后续行权/退款使用


# 2.2 AP002 行权H5入口

接口编码AP002

业务场景:获取合作方行权页面URL,可引导客户跳转至该行权页进行行权操作

请求参数

参数名 类型 必填 说明
openId String 宜享花客户号唯一标识
orderNum String 合作方订单号
returnUrl String 返回链接,行权完成后跳转

响应参数

参数名 类型 说明
url String 行权H5链接,AES加密的Base64字符串,需使用 aesKey 解密后使用

响应示例

{
  "rspCode": "0000",
  "data": {
    "code": "1",
    "data": {
      "url": "AES加密的Base64行权URL"
    }
  }
}
1
2
3
4
5
6
7
8
9

# 2.3 AP108 权益订单退款申请

接口编码AP108

业务场景

  • 由合作方发起申请,由权益平台向支付通道发起退款,退款结果以异步通知或订单结果查询查回
  • 取消先享后付订单:BNPL订单取消时通知合作方退款
  • 全额/部分退款申请

请求参数

参数名 类型 必填 说明
orderNum String 合作方权益平台订单号
refundAmount String 退款金额,单位元
externalRefundNum String 合作方退款申请单号
oriPaymentNo String 原渠道交易流水号
description String 退款原因
shareFlag String 是否分账,N/Y,默认 N
shareInfoList Array 条件必填 分账信息列表,shareFlag=Y 时必填

响应参数

参数名 类型 说明
orderDetail Object 订单信息对象(见 4.8 orderDetail 对象

# 2.4 AP106 权益包订单退款通知

接口编码AP106

业务场景:由合作方向支付通道发起退款,退款成功后通知权益平台方(带原交易流水号)

请求参数

参数名 类型 必填 说明
externalOrderNum String 宜享花订单号
paymentNo String 渠道退款单号
oriPaymentNo String 原渠道交易流水号
orderAmount String 退款金额,单位元
description String 退款描述,默认"用户退款"
shareFlag String 是否分账
merId String 条件必填 扣款商户号,不分账时必填
shareInfoList Array 条件必填 分账信息列表,分账时必填

响应参数

参数名 类型 说明
orderDetail Object 订单信息对象(见 4.8 orderDetail 对象

# 2.5 AP104 还款结果通知

接口编码AP104

业务场景

  • 先享后付划扣成功:BNPL订单后续划扣还款成功后通知合作方
  • 续订划扣成功:月卡续费划扣成功后通知合作方

请求参数

参数名 类型 必填 说明
externalOrderNum String 宜享花订单号
repayAmt String 还款金额,单位元,如 29.90
paymentNo String 支付单号(渠道交易流水号)
payWay String 支付方式
shareFlag String 是否分账,N/Y
merId String 条件必填 收款商户号,shareFlag=N 时必填
shareInfoList Array 条件必填 分账信息列表,shareFlag=Y 时必填

请求示例

{
  "appId": "APP001",
  "version": "1.0",
  "apiCode": "AP104",
  "timestamp": 1700000000000,
  "signType": "MD5",
  "externalOrderNum": "LD202507171001",
  "repayAmt": "29.90",
  "paymentNo": "TXN20250717001",
  "payWay": "TONGLIAN_PAY",
  "shareFlag": "N",
  "merId": "660584060122MHW",
  "sign": "ABCDEF1234567890ABCDEF1234567890"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

响应参数:无额外业务数据,仅返回通用应答报文(rspCode/rspMsg


# 2.6 AP003 权益列表查询

接口编码AP003

业务场景:查询合作方权益明细列表(含有效期、领取次数等)

请求参数

参数名 类型 必填 说明
openId String 宜享花客户号唯一标识
orderNum String 合作方订单号

响应参数

参数名 类型 说明
expireTime String 权益过期时间,格式 yyyy-MM-dd
validTime String 权益生效时间,格式 yyyy-MM-dd
pageCode String 权益编码
detailList Array 权益明细列表

detailList 权益明细对象

参数名 类型 说明
totalPeriod Integer 可领取总次数
usedPeriod Integer 已领次数
availablePeriod Integer 剩余领取次数
detailTitle String 明细标题
skus Array 明细商品列表,结构同 3.1 rightDetailSku

# 2.7 AP103 权益订单退款申请

接口编码AP103

业务场景:由宜享花发起退款申请,由合作方向支付通道发起退款,退款结果以异步通知或订单结果查询查回。适用于取消先享后付订单、全额/部分退款等场景。

请求参数

参数名 类型 必填 说明
orderNum String 合作方权益平台订单号
externalOrderNum String 宜享花订单号
refundAmount String 退款金额,单位元
externalRefundNum String 宜享花退款申请单号
oriPaymentNo String 原渠道交易流水号
description String 退款原因
shareFlag String 是否分账,N/Y,默认 N
shareInfoList Array 条件必填 分账信息列表,shareFlag=Y 时必填

响应参数

参数名 类型 说明
orderNum String 合作方权益平台订单号
externalOrderNum String 宜享花订单号
refundAmount BigDecimal 退款金额,单位元
orderAmount BigDecimal 订单金额,单位元
openId String 合作方客户号
payWay String 支付方式
orderStatus String 订单状态:PAY_ING-支付中 / PAY_SUCCESS-支付成功 / REFUND_ING-退款中 / REFUND_SUCCESS-退款成功 / REFUND_FAIL-退款失败
refundList Array 退款信息集合

refundList 退款信息对象

参数名 类型 说明
refundNo String 合作方权益平台退款单号
refundAmount BigDecimal 退款金额,单位元
paymentNo String 合作方权益平台支付单号
shareInfoList Array 分账信息列表

# 3. 合作方 → 宜享花 接口

# 3.1 行权结果回调通知

接口路径POST /api/v1/couponPartner/right/callback

业务场景:用户在合作方侧行权成功后,合作方回调通知宜享花行权结果

请求参数(明文JSON):

参数名 类型 必填 说明
appId String 合作方应用号
version String 版本号
timestamp Long 时间戳,毫秒
externalOrderNum String 宜享花订单号
orderNum String 合作方订单号
openId String 合作方客户ID
rightDetail Object 权益明细对象
rightDetailSku Object 本次行权的权益商品对象
entity String 主体标识,DNQY01=带恩,空/LD03=合作方

rightDetail 权益明细对象

参数名 类型 必填 说明
couponPackageId String 券包号
couponPackageName String 券包名
totalPeriod Integer 可领取总次数
usedPeriod Integer 已领次数
availablePeriod Integer 剩余领取次数
detailTitle String 明细标题

rightDetailSku 权益商品对象

参数名 类型 必填 说明
chargeType String 充值类型,RECHARGE-直充 / COUPON-卡密
rightCode String 权益商品编码
rightName String 权益商品名称
rightDesc String 权益描述
rightImg String 权益商品图片
rightPrice String 权益价格(市场价)
salesPrice String 支付价格
useRightsTime String 商品行权时间,格式 yyyy-MM-dd HH:mm:ss

请求示例

{
  "appId": "APP001",
  "version": "2.0",
  "timestamp": 1700000000000,
  "externalOrderNum": "LD202507171001",
  "orderNum": "LD20250717100001",
  "openId": "123456",
  "rightDetail": {
    "couponPackageId": "mbp1443320037241782272",
    "couponPackageName": "臻选计划会员月卡",
    "totalPeriod": 1,
    "usedPeriod": 1,
    "availablePeriod": 0,
    "detailTitle": "月卡权益"
  },
  "rightDetailSku": {
    "chargeType": "RECHARGE",
    "rightCode": "RIGHT_001",
    "rightName": "30元话费充值",
    "salesPrice": "29.90",
    "useRightsTime": "2025-07-17 10:00:00"
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

响应:纯文本

返回值 说明
SUCCESS 处理成功
FAILED 处理失败

防重机制:基于 externalOrderNum + rightCode 加 Redis 分布式锁(5秒),不允许重复提交


# 3.2 异步通知(购买结果推送 / 退款结果推送)

⚠️ 回调地址须向合作方报备。以下两个场景合作方将会给宜享花推送结果通知,通知报文需使用 AESKey 解密。

接口路径POST /api/v1/couponPartner/refund/notify?entity={entity}

通知场景

  • 权益购买结果推送:订单状态为 PAY_SUCCESS(支付成功)
  • 权益退款结果推送:订单状态为 REFUND_SUCCESS / REFUND_FAIL / PARTIAL_REFUND

请求参数(JSON,含加密字段):

{
  "encryptOrder": "AES加密的Base64退款信息密文"
}
1
2
3

解密后的明文JSON结构如下(LiDaiRefundCallbackForm):

参数名 类型 说明
appId String 应用号
version String 版本号
timestamp String 时间戳,毫秒
signType String 签名类型
sign String 签名
orderNum String 合作方订单号
externalOrderNum String 宜享花订单号
orderStatus String 订单状态,见下表
orderAmount BigDecimal 订单金额,单位元
paymentNo String 支付单号
openId String 宜享花客户号
userMobile String 宜享花客户手机号(AES加密)
userName String 宜享花客户姓名
payWay String 支付方式
couponPackageId String 券包号
couponPackageName String 券包名
createTime String 下单时间 yyyy-MM-dd HH:mm:ss
payTime String 支付完成时间
expireTime String 权益失效时间
refundable String 可退状态,true/false
refundAmount BigDecimal 退款金额,单位元
negotiatedAmount BigDecimal 协商金额,单位元
refundTime String 退款时间
refundNo String 合作方退款单号
externalRefundNum String 宜享花退款申请单号
refundReason String 退款原因
refundFailMsg String 退款失败原因
shareList Array 分账信息列表
refundShareList Array 退款分账信息列表
specialRefundFlag String 特殊退款标识,false-原路退回 / true-线下退款
scenario String 场景,refund-退款 / cancel-取消订单

orderStatus 订单状态

状态值 说明
PAY_SUCCESS 支付成功
REFUND_SUCCESS 退款成功
REFUND_FAIL 退款失败
PARTIAL_REFUND 部分退款成功

响应:纯文本

返回值 说明
SUCCESS 处理成功
FAILED 处理失败

防重机制:基于 externalOrderNum 加 Redis 锁(300秒),防止连续退两次;基于 refundNo 判断重复退款


# 3.3 退款金额试算

接口路径POST /api/v1/couponPartner/partner/refundEstimate

业务场景:合作方发起退款前,调用宜享花预估可退金额

请求参数

{
  "text": "AES加密后的Base64密文"
}
1
2
3

解密后明文

参数名 类型 必填 说明
externalOrderNum String 宜享花订单号

响应参数

参数名 类型 说明
text String AES加密的退款试算结果密文(Base64)

响应示例

{
  "status": "0000",
  "msg": "成功",
  "data": {
    "text": "AES加密的退款试算结果密文"
  }
}
1
2
3
4
5
6
7

解密后返回参数

参数名 类型 说明
refundAmount String 可退金额,单位元
negotiatedAmount String 协商金额,单位元

# 3.4 合作方查询宜享花订单信息(含详细信息)

接口路径POST /api/v1/couponPartner/order/detail/query?entity={entity}

业务场景:合作方通过手机号查询宜享花订单信息(含详细信息),支持多主体

URL参数

参数名 类型 必填 说明
entity String 主体标识,DNQY01=带恩,空/LD03=合作方

请求参数(AES加密,SecretTextBO):

{
  "text": "AES加密后的Base64密文"
}
1
2
3

解密后明文:包含手机号等查询条件

响应参数R<SecretTextBO>):

参数名 类型 说明
text String AES加密的订单详细信息密文(Base64),解密后为订单列表JSON

响应示例

{
  "status": "0000",
  "msg": "成功",
  "data": {
    "text": "AES加密的订单详细信息密文"
  }
}
1
2
3
4
5
6
7

# 3.5 合作方调用宜享花取消续订会员月卡

接口路径POST /api/v1/vipMonthCardPack/partner/cancelRenew

通信协议:HTTP POST,Content-Type: application/json

业务场景:合作方调用宜享花取消会员月卡续订,支持按订单号或用户信息查询并取消续订中的订单。

请求参数(AES加密,SecretTextBO):

{
  "text": "AES加密后的Base64密文"
}
1
2
3

解密后明文

参数名 类型 必填 说明
partnerCode String 合作方标识,由宜享花约定
yxOrderNo String 条件必填 宜享花订单号,优先使用。与用户信息字段二选一
phone String 条件必填 手机号,yxOrderNo 为空时按用户信息查询
userId Long 条件必填 宜享花用户ID
idNumber String 条件必填 身份证号
cardNo String 条件必填 银行卡号
operateType String 操作类型,默认 11-发起退款+取消未来期续订;2-本单不退款,取消未来期续订(仅主订单);3-取消先享后付(仅限先享后付未扣款状态)
startDate String 开始时间
endDate String 结束时间
yxAmount Long 宜享花权益成本(单位:分)
ldAmount Long 合作方行权成本(单位:分)
refundAmount Long 总退款金额(单位:分)

响应参数:无额外业务数据,仅返回通用 R 结构(status/msg

响应示例

{
  "status": "0000",
  "msg": "成功",
  "data": null
}
1
2
3
4
5

取消续订规则

  • 当日购买不可取消
  • 划扣中状态不可取消
  • 已退订状态无需处理
  • 已续订完成状态不可取消

加密说明:请求参数需使用双方约定的 AES 密钥加密为 Base64 字符串,放入 text 字段。详见 1.2 加密机制


# 4. 枚举定义

# 4.1 支付方式 (payWay)

合作方payWay 说明
BFN 宝付协议支付
TLTN 通联协议支付(默认)
CBN 京东
YPN 易宝
HFN 汇付
NPN 新生
YFBN 苏宁
ZJN 中金
EXTERNAL 先享后付(BNPL场景固定值)

# 4.2 订单状态 (orderStatus)

异步通知及 orderDetail 中的订单状态:

状态值 说明
PAY_SUCCESS 支付成功
REFUND_ING 退款中
REFUND_SUCCESS 退款成功
REFUND_FAIL 退款失败
PARTIAL_REFUND 部分退款成功

# 4.3 分账类型 (shareType)

说明
1 金额分账
2 比例分账

# 4.4 是否分账 (shareFlag)

说明
N 不分账
Y 分账

# 4.5 主体标识 (entity)

  • 线下约定

# 4.6 充值类型 (chargeType)

说明
RECHARGE 直充
COUPON 卡密

# 4.7 退款场景 (scenario)

说明
refund 退款
cancel 取消订单

# 4.8 orderDetail 订单信息对象

AP101/AP102/AP108/AP106 等接口响应中的 orderDetail 对象:

字段名 类型 必填 说明
orderNum String 合作方权益平台订单号
externalOrderNum String 宜享花订单号
orderStatus String 订单状态,见 4.2 订单状态
orderAmount Number 订单金额,单位元
paymentNo String 支付单号
openId String 合作方客户号
payWay String 支付方式
couponPackageId String 券包号
couponPackageName String 券包名
createTime String 下单时间 yyyy-MM-dd HH:mm:ss
payTime String 支付完成时间
expireTime String 权益失效时间
refundable String 可退状态,true/false
refundAmount Number 退款金额,单位元
refundTime String 退款时间
refundNo String 合作方退款单号
externalRefundNum String 宜享花退款申请单号
refundReason String 退款原因
refundFailMsg String 退款失败原因
shareList Array 分账信息列表
refundShareList Array 退款分账信息列表
specialRefundFlag String 特殊退款标识,false-原路退回 / true-线下退款

# 4.9 UsedRight 使用权益对象

AP105 查询已使用权益接口返回的 usedRightList 中的对象:

字段名 类型 必填 说明
rightId String 权益流水号
rightName String 权益名称
rightPrice String 权益价格
payAmount String 支付价格
useDate String 生效时间 yyyy-MM-dd HH:mm:ss

# 4.10 shareList 分账信息列表(嵌套结构)

异步通知中的 shareList / refundShareList 采用嵌套结构:

字段名 类型 必填 说明
paymentNo String 合作方权益平台支付单号
shareInfoList List 分账信息列表,结构同 2.1 shareInfoList

上次更新: 2 分钟前