支付表
1. 概述
支付表是梵医云系统中支付模块的扩展表,用于管理微信子商户、银行信息、OCR识别、媒体文件、分账接收方激活、示例订单等辅助功能。这些表与核心支付关系表配合使用,提供完整的支付生态支持。
2. 表结构
2.1 微信子商户表 (pay_wx_sub_merchant)
微信子商户表用于管理微信支付的子商户信息。
2.1.1 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| business_code | varchar | 64 | 是 | NULL | 业务编码 |
| company_name | varchar | 128 | 是 | NULL | 公司名称 |
| pay_app_id | bigint | 20 | 是 | NULL | 支付应用ID |
| pay_channel_id | bigint | 20 | 是 | NULL | 支付渠道ID |
| applyment_id | varchar | 64 | 是 | NULL | 申请单号 |
| sub_mchid | varchar | 64 | 是 | NULL | 子商户号 |
| sign_url | varchar | 512 | 是 | NULL | 签约链接 |
| applyment_state | tinyint | 4 | 是 | NULL | 申请状态 |
| pay_merchant_id | bigint | 20 | 是 | NULL | 支付商户ID |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'0' | 是否删除 |
2.1.2 索引
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
| idx_business_code | 普通 | business_code | 业务编码索引 |
2.1.3 Java 实体类
java
@TableName(value = "pay_wx_sub_merchant")
@Data
public class PayWxSubMerchantDO {
private Long id;
private String businessCode;
private String companyName;
private Long payAppId;
private Long payChannelId;
private String applymentId;
private String subMchid;
private String signUrl;
private SubMerchantApplymentStateEnum applymentState;
private Long payMerchantId;
}2.1.4 申请状态枚举
java
public enum SubMerchantApplymentStateEnum {
APPLYING(0, "申请中"),
APPLY_SUCCESS(1, "申请成功"),
APPLY_FAIL(2, "申请失败"),
CANCEL(3, "已取消");
}2.2 微信结算规则表 (pay_wx_settlement_rule)
微信结算规则表用于管理微信支付的结算规则信息。
2.2.1 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| settlement_id | int | 11 | 否 | - | 结算ID |
| subject_type | varchar | 64 | 是 | NULL | 主体类型 |
| settlement_desc | varchar | 512 | 是 | NULL | 结算描述 |
| applicable_industries_overview | varchar | 512 | 是 | NULL | 适用行业概述 |
| industry_id | int | 11 | 是 | NULL | 行业ID |
| industry_name | varchar | 128 | 是 | NULL | 行业名称 |
| special_qualification_required | varchar | 512 | 是 | NULL | 特殊资质要求 |
| special_qualification | varchar | 512 | 是 | NULL | 特殊资质 |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'0' | 是否删除 |
2.2.2 索引
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
| idx_settlement_id | 普通 | settlement_id | 结算ID索引 |
2.2.3 Java 实体类
java
@TableName(value = "pay_wx_settlement_rule")
@Data
public class PayWxSettlementRuleDO {
private Long id;
private Integer settlementId;
private String subjectType;
private String settlementDesc;
private String applicableIndustriesOverview;
private Integer industryId;
private String industryName;
private String specialQualificationRequired;
private String specialQualification;
}2.3 OCR识别表 (pay_ocr)
OCR识别表用于存储OCR识别结果,主要用于身份证识别等场景。
2.3.1 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| file_sha256 | varchar | 64 | 是 | NULL | 文件SHA256值 |
| ocr_type | int | 11 | 是 | NULL | OCR类型(1-身份证) |
| ocr_res | text | - | 是 | NULL | OCR识别结果(JSON格式) |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'0' | 是否删除 |
2.3.2 索引
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
| idx_file_sha256 | 普通 | file_sha256 | 文件SHA256索引 |
2.3.3 Java 实体类
java
@TableName(value = "pay_ocr")
@Data
public class PayOcrDO {
private Long id;
private String fileSha256;
private Integer ocrType;
private String ocrRes;
public IdcardRes toIdcardRes() {
try {
ObjectMapper om = new ObjectMapper();
JsonNode root = om.readTree(ocrRes).get("idcard_res");
IdcardRes res = new IdcardRes();
res.type = root.get("type").asInt();
if (res.type == 0) {
res.name = root.get("name").get("text").asText();
res.id = root.get("id").get("text").asText();
res.address = root.get("address").get("text").asText();
res.gender = root.get("gender").get("text").asText();
res.nationality = root.get("nationality").get("text").asText();
} else {
res.validDate = root.get("valid_date").get("text").asText();
}
return res;
} catch (JsonProcessingException ex) {
throw new RuntimeException(ex);
}
}
@ToString
public static class IdcardRes {
public int type;
public String name;
public String id;
public String address;
public String gender;
public String nationality;
public String validDate;
}
}2.4 银行信息表 (pay_bank_info)
银行信息表用于管理银行的基本信息。
2.4.1 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| bank_alias | varchar | 64 | 否 | - | 银行别名 |
| bank_alias_code | varchar | 32 | 否 | - | 银行别名编码 |
| account_bank | varchar | 128 | 否 | - | 开户银行 |
| account_bank_code | int | 11 | 否 | - | 开户银行编码 |
| need_bank_branch | bit | 1 | 否 | b'0' | 是否需要填写支行 |
| is_corporate | bit | 1 | 否 | b'0' | 是否支持对公业务 |
| is_personal | bit | 1 | 否 | b'0' | 是否支持个人业务 |
| sort | int | 11 | 否 | 0 | 排序 |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'0' | 是否删除 |
2.4.2 索引
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
| idx_bank_alias_code | 普通 | bank_alias_code | 银行别名编码索引 |
2.4.3 Java 实体类
java
@TableName(value = "pay_bank_info")
@Data
public class PayBankInfoDO {
private Long id;
private String bankAlias;
private String bankAliasCode;
private String accountBank;
private Integer accountBankCode;
private Boolean needBankBranch;
private Boolean isCorporate;
private Boolean isPersonal;
private Integer sort;
}2.5 银行支行表 (pay_bank_branches)
银行支行表用于管理银行的支行信息。
2.5.1 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | int | 11 | 否 | - | 编号(主键) |
| bank_code | varchar | 32 | 否 | - | 银行编码 |
| bank_name | varchar | 128 | 否 | - | 银行名称 |
| province_name | varchar | 64 | 否 | - | 省份名称 |
| province_code | int | 11 | 否 | - | 省份编码 |
| city_name | varchar | 64 | 否 | - | 城市名称 |
| city_code | int | 11 | 否 | - | 城市编码 |
| bank_branch_name | varchar | 128 | 否 | - | 银行支行名称 |
| bank_branch_id | varchar | 64 | 否 | - | 银行支行ID |
2.5.2 索引
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
| idx_bank_code | 普通 | bank_code | 银行编码索引 |
| idx_province_code | 普通 | province_code | 省份编码索引 |
| idx_city_code | 普通 | city_code | 城市编码索引 |
2.5.3 Java 实体类
java
@TableName(value = "pay_bank_branches")
@Data
public class PayBankBranchesDO {
private Integer id;
private String bankCode;
private String bankName;
private String provinceName;
private Integer provinceCode;
private String cityName;
private Integer cityCode;
private String bankBranchName;
private String bankBranchId;
}2.6 银行地区表 (pay_bank_area)
银行地区表用于管理银行支持的地区信息。
2.6.1 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | int | 11 | 否 | - | 编号(主键) |
| pid | int | 11 | 否 | - | 父级ID |
| code | int | 11 | 否 | - | 地区编码 |
| name | varchar | 64 | 否 | - | 地区名称 |
2.6.2 索引
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
| idx_pid | 普通 | pid | 父级ID索引 |
2.6.3 Java 实体类
java
@TableName(value = "pay_bank_area")
@Data
public class PayBankAreaDO {
private Integer id;
private Integer pid;
private Integer code;
private String name;
@TableField(exist = false)
private List<PayBankAreaDO> children;
}2.7 支付媒体表 (pay_media)
支付媒体表用于管理支付相关的媒体文件。
2.7.1 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| type | varchar | 32 | 是 | NULL | 文件类型 |
| file_sha256 | varchar | 64 | 是 | NULL | 文件SHA256值 |
| url | varchar | 512 | 是 | NULL | 文件URL |
| extension | varchar | 16 | 是 | NULL | 文件扩展名 |
| size | int | 11 | 是 | NULL | 文件大小(字节) |
| wx_media_id | varchar | 128 | 是 | NULL | 微信媒体ID |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'0' | 是否删除 |
2.7.2 索引
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
| idx_file_sha256 | 普通 | file_sha256 | 文件SHA256索引 |
2.7.3 Java 实体类
java
@TableName(value = "pay_media")
@Data
public class PayMediaDO {
private Long id;
private String type;
private String fileSha256;
private String url;
private String extension;
private Integer size;
private String wxMediaId;
}2.8 分账接收方激活表 (pay_profit_sharing_receiver_activated)
分账接收方激活表用于管理已激活的分账接收方信息。
2.8.1 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 编号(主键) |
| receiver_group_no | varchar | 64 | 是 | NULL | 接收方分组号 |
| receiver_account | varchar | 128 | 是 | NULL | 分账接收方账号 |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'0' | 是否删除 |
2.8.2 索引
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
| idx_receiver_group_no | 普通 | receiver_group_no | 接收方分组号索引 |
2.8.3 Java 实体类
java
@TableName("pay_profit_sharing_receiver_activated")
@Data
public class PayProfitSharingReceiverActivatedDO {
private Long id;
private String receiverGroupNo;
private String receiverAccount;
}2.9 示例转账订单表 (pay_demo_transfer)
示例转账订单表用于演示转账业务。
2.9.1 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 订单编号(主键) |
| app_id | bigint | 20 | 否 | - | 应用编号 |
| type | tinyint | 4 | 否 | - | 转账类型 |
| price | int | 11 | 否 | - | 转账金额(单位:分) |
| user_name | varchar | 64 | 是 | NULL | 收款人姓名 |
| alipay_logon_id | varchar | 128 | 是 | NULL | 支付宝登录号 |
| openid | varchar | 128 | 是 | NULL | 微信openId |
| transfer_status | tinyint | 4 | 是 | NULL | 转账状态 |
| pay_transfer_id | bigint | 20 | 是 | NULL | 转账单编号 |
| pay_channel_code | varchar | 32 | 是 | NULL | 转账支付成功渠道 |
| transfer_time | datetime | - | 是 | NULL | 转账支付时间 |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'0' | 是否删除 |
2.9.2 索引
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
| idx_pay_transfer_id | 普通 | pay_transfer_id | 转账单编号索引 |
2.9.3 Java 实体类
java
@TableName(value = "pay_demo_transfer", autoResultMap = true)
@KeySequence("pay_demo_transfer_seq")
@Data
public class PayDemoTransferDO extends BaseDO {
@TableId
private Long id;
private Long appId;
private Integer type;
private Integer price;
private String userName;
private String alipayLogonId;
private String openid;
private Integer transferStatus;
private Long payTransferId;
private String payChannelCode;
private LocalDateTime transferTime;
}2.10 示例订单表 (pay_demo_order)
示例订单表用于演示业务系统的订单如何接入支付系统的支付与退款。
2.10.1 表结构
| 字段名 | 类型 | 长度 | 允许空 | 默认值 | 说明 |
|---|---|---|---|---|---|
| id | bigint | 20 | 否 | - | 订单编号(主键) |
| user_id | bigint | 20 | 否 | - | 用户编号 |
| spu_id | bigint | 20 | 否 | - | 商品编号 |
| spu_name | varchar | 128 | 否 | - | 商品名称 |
| price | int | 11 | 否 | - | 价格(单位:分) |
| pay_status | bit | 1 | 否 | b'0' | 是否支付 |
| pay_order_id | bigint | 20 | 是 | NULL | 支付订单编号 |
| pay_time | datetime | - | 是 | NULL | 付款时间 |
| pay_channel_code | varchar | 32 | 是 | NULL | 支付渠道 |
| pay_refund_id | bigint | 20 | 是 | NULL | 支付退款单号 |
| refund_price | int | 11 | 是 | NULL | 退款金额(单位:分) |
| refund_time | datetime | - | 是 | NULL | 退款完成时间 |
| creator | varchar | 64 | 是 | '' | 创建者 |
| create_time | datetime | - | 否 | CURRENT_TIMESTAMP | 创建时间 |
| updater | varchar | 64 | 是 | '' | 更新者 |
| update_time | datetime | - | 否 | CURRENT_TIMESTAMP | 更新时间 |
| deleted | bit | 1 | 否 | b'0' | 是否删除 |
2.10.2 索引
| 索引名 | 类型 | 字段 | 说明 |
|---|---|---|---|
| PRIMARY | 主键 | id | 主键索引 |
| idx_pay_order_id | 普通 | pay_order_id | 支付订单编号索引 |
| idx_pay_refund_id | 普通 | pay_refund_id | 支付退款单号索引 |
2.10.3 Java 实体类
java
@TableName("pay_demo_order")
@KeySequence("pay_demo_order_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PayDemoOrderDO extends BaseDO {
@TableId
private Long id;
private Long userId;
private Long spuId;
private String spuName;
private Integer price;
private Boolean payStatus;
private Long payOrderId;
private LocalDateTime payTime;
private String payChannelCode;
private Long payRefundId;
private Integer refundPrice;
private LocalDateTime refundTime;
}3. 表关系图
pay_wx_sub_merchant (微信子商户表)
├── pay_app (支付应用表) - 通过 pay_app_id 关联
└── pay_channel (支付渠道表) - 通过 pay_channel_id 关联
pay_wx_settlement_rule (微信结算规则表)
└── 无直接关联
pay_ocr (OCR识别表)
└── 无直接关联
pay_bank_info (银行信息表)
└── 无直接关联
pay_bank_branches (银行支行表)
├── pay_bank_info (银行信息表) - 通过 bank_code 关联
└── pay_bank_area (银行地区表) - 通过 province_code 和 city_code 关联
pay_bank_area (银行地区表)
└── 自关联 - 通过 pid 关联父级
pay_media (支付媒体表)
└── 无直接关联
pay_profit_sharing_receiver_activated (分账接收方激活表)
└── pay_profit_sharing_receiver (分账接收方表) - 通过 receiver_account 关联
pay_demo_transfer (示例转账订单表)
├── pay_app (支付应用表) - 通过 app_id 关联
└── pay_transfer (支付转账单表) - 通过 pay_transfer_id 关联
pay_demo_order (示例订单表)
├── pay_order (支付订单表) - 通过 pay_order_id 关联
└── pay_refund (支付退款单表) - 通过 pay_refund_id 关联4. 使用示例
4.1 创建微信子商户
java
@Service
public class PayWxSubMerchantServiceImpl implements PayWxSubMerchantService {
@Resource
private PayWxSubMerchantMapper payWxSubMerchantMapper;
public Long createSubMerchant(PayWxSubMerchantCreateReqVO createReqVO) {
PayWxSubMerchantDO subMerchant = new PayWxSubMerchantDO();
subMerchant.setBusinessCode(generateBusinessCode());
subMerchant.setCompanyName(createReqVO.getCompanyName());
subMerchant.setPayAppId(createReqVO.getPayAppId());
subMerchant.setPayChannelId(createReqVO.getPayChannelId());
subMerchant.setApplymentState(SubMerchantApplymentStateEnum.APPLYING);
subMerchant.setPayMerchantId(createReqVO.getPayMerchantId());
payWxSubMerchantMapper.insert(subMerchant);
return subMerchant.getId();
}
}4.2 OCR身份证识别
java
@Service
public class PayOcrServiceImpl implements PayOcrService {
@Resource
private PayOcrMapper payOcrMapper;
public PayOcrDO.IdcardRes idcardOcr(String fileSha256, String ocrRes) {
PayOcrDO ocr = new PayOcrDO();
ocr.setFileSha256(fileSha256);
ocr.setOcrType(1);
ocr.setOcrRes(ocrRes);
payOcrMapper.insert(ocr);
return ocr.toIdcardRes();
}
}4.3 查询银行支行
java
@Service
public class PayBankServiceImpl implements PayBankService {
@Resource
private PayBankBranchesMapper payBankBranchesMapper;
public List<PayBankBranchesDO> getBankBranches(String bankCode, Integer provinceCode, Integer cityCode) {
return payBankBranchesMapper.selectList(
new LambdaQueryWrapperX<PayBankBranchesDO>()
.eq(PayBankBranchesDO::getBankCode, bankCode)
.eq(PayBankBranchesDO::getProvinceCode, provinceCode)
.eq(PayBankBranchesDO::getCityCode, cityCode)
);
}
}4.4 示例订单支付
java
@Service
public class PayDemoOrderServiceImpl implements PayDemoOrderService {
@Resource
private PayDemoOrderMapper payDemoOrderMapper;
@Resource
private PayOrderService payOrderService;
@Transactional(rollbackFor = Exception.class)
public Long createOrder(PayDemoOrderCreateReqVO createReqVO) {
PayDemoOrderDO order = PayDemoOrderDO.builder()
.userId(createReqVO.getUserId())
.spuId(createReqVO.getSpuId())
.spuName(createReqVO.getSpuName())
.price(createReqVO.getPrice())
.payStatus(false)
.build();
payDemoOrderMapper.insert(order);
Long payOrderId = payOrderService.createOrder(
PayOrderCreateReqVO.builder()
.merchantOrderId(order.getId().toString())
.subject(order.getSpuName())
.price(order.getPrice())
.build()
);
order.setPayOrderId(payOrderId);
payDemoOrderMapper.updateById(order);
return order.getId();
}
}4.5 示例转账
java
@Service
public class PayDemoTransferServiceImpl implements PayDemoTransferService {
@Resource
private PayDemoTransferMapper payDemoTransferMapper;
@Resource
private PayTransferService payTransferService;
@Transactional(rollbackFor = Exception.class)
public Long createTransfer(PayDemoTransferCreateReqVO createReqVO) {
PayDemoTransferDO transfer = PayDemoTransferDO.builder()
.appId(createReqVO.getAppId())
.type(createReqVO.getType())
.price(createReqVO.getPrice())
.userName(createReqVO.getUserName())
.alipayLogonId(createReqVO.getAlipayLogonId())
.openid(createReqVO.getOpenid())
.transferStatus(0)
.build();
payDemoTransferMapper.insert(transfer);
Long payTransferId = payTransferService.createTransfer(
PayTransferCreateReqVO.builder()
.appId(transfer.getAppId())
.type(transfer.getType())
.price(transfer.getPrice())
.userName(transfer.getUserName())
.alipayLogonId(transfer.getAlipayLogonId())
.openid(transfer.getOpenid())
.build()
);
transfer.setPayTransferId(payTransferId);
payDemoTransferMapper.updateById(transfer);
return transfer.getId();
}
}5. 业务规则
5.1 微信子商户申请流程
- 提交申请信息
- 生成申请单号
- 等待微信审核
- 审核通过后获取子商户号
5.2 OCR识别规则
- 支持身份证正反面识别
- 使用文件SHA256作为唯一标识
- 识别结果以JSON格式存储
5.3 银行信息规则
- 银行信息按排序字段排序
- 支持对公和个人业务
- 部分银行需要填写支行信息
5.4 示例订单规则
- 订单支付前需要先创建支付订单
- 支付成功后更新订单状态
- 退款需要先创建退款订单
5.5 示例转账规则
- 转账前需要先创建转账订单
- 转账成功后更新转账状态
- 支持支付宝和微信转账
6. 注意事项
- 微信子商户申请需要通过微信审核
- OCR识别结果需要妥善保存
- 银行支行数据量大,建议使用缓存
- 示例订单和转账仅用于演示,实际业务需要根据需求调整
- 所有金额单位都是分
- 文件SHA256用于唯一标识文件,避免重复上传
- 分账接收方激活后才能参与分账
注意:本文档持续更新中,如有问题请及时反馈。
