Commit 86598dd177a6b3bdd95e73dccda80bd888416582

Authored by jason
1 parent 9095394f

转账 - 动态收款人字段修改

sql/mysql/pay_wallet.sql
@@ -5,18 +5,26 @@ DROP TABLE IF EXISTS `pay_transfer`; @@ -5,18 +5,26 @@ DROP TABLE IF EXISTS `pay_transfer`;
5 CREATE TABLE `pay_transfer` 5 CREATE TABLE `pay_transfer`
6 ( 6 (
7 `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', 7 `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
8 - `type` int NOT NULL COMMENT '类型', 8 + `no` varchar(64) NOT NULL COMMENT '转账单号',
9 `app_id` bigint NOT NULL COMMENT '应用编号', 9 `app_id` bigint NOT NULL COMMENT '应用编号',
  10 + `channel_id` bigint NOT NULL COMMENT '转账渠道编号',
  11 + `channel_code` varchar(32) NOT NULL COMMENT '转账渠道编码',
10 `merchant_order_id` varchar(64) NOT NULL COMMENT '商户订单编号', 12 `merchant_order_id` varchar(64) NOT NULL COMMENT '商户订单编号',
11 - `price` int NOT NULL COMMENT '转账金额,单位:分',  
12 - `subject` varchar(512) NOT NULL COMMENT '转账标题',  
13 - `payee_info` varchar(512) NOT NULL COMMENT '收款人信息,不同类型和渠道不同', 13 + `type` int NOT NULL COMMENT '类型',
14 `status` tinyint NOT NULL COMMENT '转账状态', 14 `status` tinyint NOT NULL COMMENT '转账状态',
15 `success_time` datetime NULL COMMENT '转账成功时间', 15 `success_time` datetime NULL COMMENT '转账成功时间',
16 - `extension_id` bigint NULL COMMENT '转账渠道编号',  
17 - `no` varchar(64) NULL COMMENT '转账单号',  
18 - `channel_id` bigint NULL COMMENT '转账渠道编号',  
19 - `channel_code` varchar(32) NULL COMMENT '转账渠道编码', 16 + `price` int NOT NULL COMMENT '转账金额,单位:分',
  17 + `subject` varchar(512) NOT NULL COMMENT '转账标题',
  18 + `alipay_logon_id` varchar(64) NULL COMMENT '支付宝登录号',
  19 + `alipay_account_name` varchar(64) NULL COMMENT '支付宝账号名称',
  20 + `openid` varchar(64) NULL COMMENT '微信 openId',
  21 + `wx_account_name` varchar(64) NULL COMMENT '微信账号名称',
  22 + `notify_url` varchar(64) NULL COMMENT '异步通知商户地址',
  23 + `channel_extras` varchar(512) NULL DEFAULT NULL COMMENT '渠道的额外参数',
  24 + `channel_transfer_no` varchar(64) NULL DEFAULT NULL COMMENT '渠道转账单号',
  25 + `channel_error_code` varchar(128) NULL DEFAULT NULL COMMENT '调用渠道的错误码',
  26 + `channel_error_msg` varchar(256) NULL DEFAULT NULL COMMENT '调用渠道的错误提示',
  27 + `channel_notify_data` varchar(4096) NULL DEFAULT NULL COMMENT '渠道的同步/异步通知的内容',
20 `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', 28 `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
21 `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', 29 `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
22 `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', 30 `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',
@@ -58,7 +66,10 @@ CREATE TABLE `pay_demo_transfer` ( @@ -58,7 +66,10 @@ CREATE TABLE `pay_demo_transfer` (
58 `user_id` bigint UNSIGNED NOT NULL COMMENT '用户编号', 66 `user_id` bigint UNSIGNED NOT NULL COMMENT '用户编号',
59 `price` int NOT NULL COMMENT '转账金额,单位:分', 67 `price` int NOT NULL COMMENT '转账金额,单位:分',
60 `type` int NOT NULL COMMENT '转账类型', 68 `type` int NOT NULL COMMENT '转账类型',
61 - `payee_info` varchar(512) NOT NULL COMMENT '收款人信息,不同类型和渠道不同', 69 + `alipay_logon_id` varchar(64) NULL COMMENT '支付宝登录号',
  70 + `alipay_account_name` varchar(64) NULL COMMENT '支付宝账号名称',
  71 + `openid` varchar(64) NULL COMMENT '微信 openId',
  72 + `wx_account_name` varchar(64) NULL COMMENT '微信账号名称',
62 `transfer_status` tinyint NOT NULL DEFAULT 0 COMMENT '转账状态', 73 `transfer_status` tinyint NOT NULL DEFAULT 0 COMMENT '转账状态',
63 `pay_transfer_id` bigint NULL DEFAULT NULL COMMENT '转账订单编号', 74 `pay_transfer_id` bigint NULL DEFAULT NULL COMMENT '转账订单编号',
64 `pay_channel_code` varchar(16) NULL DEFAULT NULL COMMENT '转账支付成功渠道', 75 `pay_channel_code` varchar(16) NULL DEFAULT NULL COMMENT '转账支付成功渠道',
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/dto/transfer/PayTransferUnifiedReqDTO.java
@@ -59,6 +59,26 @@ public class PayTransferUnifiedReqDTO { @@ -59,6 +59,26 @@ public class PayTransferUnifiedReqDTO {
59 private Map<String, String> payeeInfo; 59 private Map<String, String> payeeInfo;
60 60
61 /** 61 /**
  62 + * 支付宝登录号
  63 + */
  64 + private String alipayLogonId;
  65 +
  66 + /**
  67 + * 支付宝账号名称
  68 + */
  69 + private String alipayAccountName;
  70 +
  71 + /**
  72 + * 微信 openId
  73 + */
  74 + private String openid;
  75 +
  76 + /**
  77 + * 微信账号名称
  78 + */
  79 + private String wxAccountName;
  80 +
  81 + /**
62 * 支付渠道的额外参数 82 * 支付渠道的额外参数
63 */ 83 */
64 private Map<String, String> channelExtras; 84 private Map<String, String> channelExtras;
yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/enums/ErrorCodeConstants.java
@@ -65,15 +65,13 @@ public interface ErrorCodeConstants { @@ -65,15 +65,13 @@ public interface ErrorCodeConstants {
65 65
66 // ========== 转账模块 1-007-009-000 ========== 66 // ========== 转账模块 1-007-009-000 ==========
67 ErrorCode PAY_TRANSFER_SUBMIT_CHANNEL_ERROR = new ErrorCode(1_007_009_000, "发起转账报错,错误码:{},错误提示:{}"); 67 ErrorCode PAY_TRANSFER_SUBMIT_CHANNEL_ERROR = new ErrorCode(1_007_009_000, "发起转账报错,错误码:{},错误提示:{}");
68 - ErrorCode PAY_TRANSFER_ALIPAY_LOGIN_ID_IS_EMPTY = new ErrorCode(1_007_009_001, "支付宝登录 ID 不能为空");  
69 - ErrorCode PAY_TRANSFER_ALIPAY_ACCOUNT_NAME_IS_EMPTY = new ErrorCode(1_007_009_002, "支付宝账号名称不能为空");  
70 - ErrorCode PAY_TRANSFER_NOT_FOUND = new ErrorCode(1_007_009_003, "转账交易单不存在");  
71 - ErrorCode PAY_TRANSFER_STATUS_IS_SUCCESS = new ErrorCode(1_007_009_004, "转账单已成功转账");  
72 - ErrorCode PAY_TRANSFER_STATUS_IS_NOT_WAITING = new ErrorCode(1_007_009_005, "转账单不处于待转账");  
73 - ErrorCode PAY_TRANSFER_STATUS_IS_NOT_PENDING = new ErrorCode(1_007_009_006, "转账单不处于待转账或转账中");  
74 - ErrorCode PAY_TRANSFER_EXTENSION_NOT_FOUND = new ErrorCode(1_007_009_007, "转账交易拓展单不存在");  
75 - ErrorCode PAY_TRANSFER_TYPE_AND_CHANNEL_NOT_MATCH = new ErrorCode(1_007_009_008, "转账类型和转账渠道不匹配");  
76 - ErrorCode PAY_TRANSFER_EXTENSION_STATUS_IS_NOT_PENDING = new ErrorCode(1_007_009_009, "转账拓展单不处于待转账或转账中"); 68 + ErrorCode PAY_TRANSFER_NOT_FOUND = new ErrorCode(1_007_009_001, "转账交易单不存在");
  69 + ErrorCode PAY_TRANSFER_STATUS_IS_SUCCESS = new ErrorCode(1_007_009_002, "转账单已成功转账");
  70 + ErrorCode PAY_TRANSFER_STATUS_IS_NOT_WAITING = new ErrorCode(1_007_009_003, "转账单不处于待转账");
  71 + ErrorCode PAY_TRANSFER_STATUS_IS_NOT_PENDING = new ErrorCode(1_007_009_004, "转账单不处于待转账或转账中");
  72 + ErrorCode PAY_TRANSFER_EXTENSION_NOT_FOUND = new ErrorCode(1_007_009_005, "转账交易拓展单不存在");
  73 + ErrorCode PAY_TRANSFER_TYPE_AND_CHANNEL_NOT_MATCH = new ErrorCode(1_007_009_006, "转账类型和转账渠道不匹配");
  74 + ErrorCode PAY_TRANSFER_EXTENSION_STATUS_IS_NOT_PENDING = new ErrorCode(1_007_009_007, "转账拓展单不处于待转账或转账中");
77 75
78 // ========== 示例订单 1-007-900-000 ========== 76 // ========== 示例订单 1-007-900-000 ==========
79 ErrorCode DEMO_ORDER_NOT_FOUND = new ErrorCode(1_007_900_000, "示例订单不存在"); 77 ErrorCode DEMO_ORDER_NOT_FOUND = new ErrorCode(1_007_900_000, "示例订单不存在");
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/demo/vo/transfer/PayDemoTransferCreateReqVO.java
1 package cn.iocoder.yudao.module.pay.controller.admin.demo.vo.transfer; 1 package cn.iocoder.yudao.module.pay.controller.admin.demo.vo.transfer;
2 2
  3 +import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
3 import cn.iocoder.yudao.framework.common.validation.InEnum; 4 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 import cn.iocoder.yudao.framework.pay.core.enums.transfer.PayTransferTypeEnum; 5 import cn.iocoder.yudao.framework.pay.core.enums.transfer.PayTransferTypeEnum;
5 import io.swagger.v3.oas.annotations.media.Schema; 6 import io.swagger.v3.oas.annotations.media.Schema;
6 import lombok.Data; 7 import lombok.Data;
7 8
  9 +import javax.validation.Validator;
8 import javax.validation.constraints.Min; 10 import javax.validation.constraints.Min;
9 -import javax.validation.constraints.NotEmpty; 11 +import javax.validation.constraints.NotBlank;
10 import javax.validation.constraints.NotNull; 12 import javax.validation.constraints.NotNull;
11 -import java.util.Map;  
12 13
13 /** 14 /**
14 * @author jason 15 * @author jason
@@ -22,13 +23,50 @@ public class PayDemoTransferCreateReqVO { @@ -22,13 +23,50 @@ public class PayDemoTransferCreateReqVO {
22 @InEnum(PayTransferTypeEnum.class) 23 @InEnum(PayTransferTypeEnum.class)
23 private Integer type; 24 private Integer type;
24 25
  26 + @Schema(description = "转账金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
25 @NotNull(message = "转账金额不能为空") 27 @NotNull(message = "转账金额不能为空")
26 @Min(value = 1, message = "转账金额必须大于零") 28 @Min(value = 1, message = "转账金额必须大于零")
27 private Integer price; 29 private Integer price;
28 30
29 - // TODO @jason:感觉这个动态字段,晚点改;可能要讨论下怎么搞好;  
30 - @Schema(description = "收款方信息", requiredMode = Schema.RequiredMode.REQUIRED, example = "{'ALIPAY_LOGON_ID':'xxxx'}")  
31 - @NotEmpty(message = "收款方信息不能为空")  
32 - private Map<String, String> payeeInfo; 31 + // ========== 支付宝,微信转账相关字段 ==========
  32 + @Schema(description = "支付宝登录号,支持邮箱和手机号格式", example = "test1@@sandbox.com")
  33 + @NotBlank(message = "支付宝登录号不能为空", groups = {Alipay.class})
  34 + private String alipayLogonId;
  35 +
  36 + @Schema(description = "支付宝账号名称", example = "test1")
  37 + @NotBlank(message = "支付宝登录号不能为空", groups = {Alipay.class})
  38 + private String alipayAccountName;
  39 +
  40 + // ========== 微信转账相关字段 ==========
  41 + @Schema(description = "微信 openId", example = "oLefc4g5Gxx")
  42 + @NotBlank(message = "微信 openId 不能为空", groups = {WxPay.class})
  43 + private String openid;
  44 +
  45 + @Schema(description = "微信账号名称", example = "oLefc4g5Gjxxxxxx")
  46 + private String wxAccountName;
  47 +
  48 + // ========== 转账到银行卡和钱包相关字段 待补充 ==========
  49 + public interface WxPay {
  50 + }
  51 +
  52 + public interface Alipay {
  53 + }
  54 +
  55 + public void validate(Validator validator) {
  56 + PayTransferTypeEnum transferType = PayTransferTypeEnum.typeOf(type);
  57 + switch (transferType) {
  58 + case ALIPAY_BALANCE: {
  59 + ValidationUtils.validate(validator, this, Alipay.class);
  60 + break;
  61 + }
  62 + case WX_BALANCE: {
  63 + ValidationUtils.validate(validator, this, WxPay.class);
  64 + break;
  65 + }
  66 + default: {
  67 + throw new UnsupportedOperationException("待实现");
  68 + }
  69 + }
  70 + }
33 71
34 } 72 }
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/convert/demo/PayDemoTransferConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.module.pay.convert.demo;
  2 +
  3 +import cn.iocoder.yudao.module.pay.controller.admin.demo.vo.transfer.PayDemoTransferCreateReqVO;
  4 +import cn.iocoder.yudao.module.pay.dal.dataobject.demo.PayDemoTransferDO;
  5 +import org.mapstruct.Mapper;
  6 +import org.mapstruct.factory.Mappers;
  7 +
  8 +/**
  9 + * @author jason
  10 + */
  11 +@Mapper
  12 +public interface PayDemoTransferConvert {
  13 +
  14 + PayDemoTransferConvert INSTANCE = Mappers.getMapper(PayDemoTransferConvert.class);
  15 +
  16 + PayDemoTransferDO convert(PayDemoTransferCreateReqVO bean);
  17 +}
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/demo/PayDemoTransferDO.java
1 package cn.iocoder.yudao.module.pay.dal.dataobject.demo; 1 package cn.iocoder.yudao.module.pay.dal.dataobject.demo;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.framework.pay.core.enums.transfer.PayTransferTypeEnum;
4 import com.baomidou.mybatisplus.annotation.KeySequence; 5 import com.baomidou.mybatisplus.annotation.KeySequence;
5 -import com.baomidou.mybatisplus.annotation.TableField;  
6 import com.baomidou.mybatisplus.annotation.TableId; 6 import com.baomidou.mybatisplus.annotation.TableId;
7 import com.baomidou.mybatisplus.annotation.TableName; 7 import com.baomidou.mybatisplus.annotation.TableName;
8 -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;  
9 import lombok.Data; 8 import lombok.Data;
10 9
11 import java.time.LocalDateTime; 10 import java.time.LocalDateTime;
12 -import java.util.Map;  
13 11
14 /** 12 /**
15 * 示例转账订单 13 * 示例转账订单
@@ -39,15 +37,30 @@ public class PayDemoTransferDO extends BaseDO { @@ -39,15 +37,30 @@ public class PayDemoTransferDO extends BaseDO {
39 37
40 /** 38 /**
41 * 转账类型 39 * 转账类型
  40 + * <p>
  41 + * 枚举 {@link PayTransferTypeEnum}
42 */ 42 */
43 private Integer type; 43 private Integer type;
44 44
45 - // TODO @jason:要不字段还是弄成正确的平铺开?  
46 /** 45 /**
47 - * 收款人信息,不同类型和渠道不同 46 + * 支付宝登录号
48 */ 47 */
49 - @TableField(typeHandler = JacksonTypeHandler.class)  
50 - private Map<String, String> payeeInfo; 48 + private String alipayLogonId;
  49 +
  50 + /**
  51 + * 支付宝账号名称
  52 + */
  53 + private String alipayAccountName;
  54 +
  55 + /**
  56 + * 微信 openId
  57 + */
  58 + private String openid;
  59 +
  60 + /**
  61 + * 微信账号名称
  62 + */
  63 + private String wxAccountName;
51 64
52 /** 65 /**
53 * 转账状态 66 * 转账状态
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/transfer/PayTransferDO.java
@@ -31,33 +31,35 @@ public class PayTransferDO extends BaseDO { @@ -31,33 +31,35 @@ public class PayTransferDO extends BaseDO {
31 */ 31 */
32 @TableId 32 @TableId
33 private Long id; 33 private Long id;
  34 +
  35 + /**
  36 + * 转账单号
  37 + *
  38 + */
  39 + private String no;
  40 +
34 /** 41 /**
35 * 应用编号 42 * 应用编号
36 * 43 *
37 * 关联 {@link PayAppDO#getId()} 44 * 关联 {@link PayAppDO#getId()}
38 */ 45 */
39 private Long appId; 46 private Long appId;
  47 +
40 /** 48 /**
41 * 转账渠道编号 49 * 转账渠道编号
42 * 50 *
43 * 关联 {@link PayChannelDO#getId()} 51 * 关联 {@link PayChannelDO#getId()}
44 */ 52 */
45 private Long channelId; 53 private Long channelId;
  54 +
46 /** 55 /**
47 * 转账渠道编码 56 * 转账渠道编码
48 * 57 *
49 * 枚举 {@link PayChannelEnum} 58 * 枚举 {@link PayChannelEnum}
50 */ 59 */
51 private String channelCode; 60 private String channelCode;
52 - /**  
53 - * 类型  
54 - *  
55 - * 枚举 {@link PayTransferTypeEnum}  
56 - */  
57 - private Integer type;  
58 61
59 // ========== 商户相关字段 ========== 62 // ========== 商户相关字段 ==========
60 -  
61 /** 63 /**
62 * 商户订单编号 64 * 商户订单编号
63 * 65 *
@@ -65,12 +67,20 @@ public class PayTransferDO extends BaseDO { @@ -65,12 +67,20 @@ public class PayTransferDO extends BaseDO {
65 */ 67 */
66 private String merchantOrderId; 68 private String merchantOrderId;
67 69
  70 + // ========== 转账相关字段 ==========
  71 +
  72 + /**
  73 + * 类型
  74 + *
  75 + * 枚举 {@link PayTransferTypeEnum}
  76 + */
  77 + private Integer type;
  78 +
68 /** 79 /**
69 * 转账标题 80 * 转账标题
70 */ 81 */
71 private String subject; 82 private String subject;
72 83
73 - // ========== 转账相关字段 ==========  
74 /** 84 /**
75 * 转账金额,单位:分 85 * 转账金额,单位:分
76 */ 86 */
@@ -81,26 +91,70 @@ public class PayTransferDO extends BaseDO { @@ -81,26 +91,70 @@ public class PayTransferDO extends BaseDO {
81 * 枚举 {@link PayTransferStatusRespEnum} 91 * 枚举 {@link PayTransferStatusRespEnum}
82 */ 92 */
83 private Integer status; 93 private Integer status;
  94 +
84 /** 95 /**
85 * 订单转账成功时间 96 * 订单转账成功时间
86 */ 97 */
87 private LocalDateTime successTime; 98 private LocalDateTime successTime;
  99 +
  100 + // ========== 支付宝转账相关字段 ==========
88 /** 101 /**
89 - * 转账成功的转账拓展单编号  
90 - *  
91 - * 关联 {@link PayTransferExtensionDO#getId()} 102 + * 支付宝登录号
92 */ 103 */
93 - private Long extensionId; 104 + private String alipayLogonId;
  105 +
94 /** 106 /**
95 - * 转账成功的转账拓展单号  
96 - *  
97 - * 关联 {@link PayTransferExtensionDO#getNo()} 107 + * 支付宝账号名称
98 */ 108 */
99 - private String no; 109 + private String alipayAccountName;
  110 +
  111 + // ========== 微信转账相关字段 ==========
  112 + /**
  113 + * 微信 openId
  114 + */
  115 + private String openid;
  116 +
  117 + /**
  118 + * 微信账号名称
  119 + */
  120 + private String wxAccountName;
  121 +
  122 + // ========== 其它字段 ==========
  123 +
  124 + /**
  125 + * 异步通知地址
  126 + */
  127 + private String notifyUrl;
  128 +
  129 + /**
  130 + * 用户 IP
  131 + */
  132 + private String userIp;
  133 +
100 /** 134 /**
101 - * 收款人信息,不同类型和渠道不同 135 + * 渠道的额外参数
102 */ 136 */
103 @TableField(typeHandler = JacksonTypeHandler.class) 137 @TableField(typeHandler = JacksonTypeHandler.class)
104 - private Map<String, String> payeeInfo; 138 + private Map<String, String> channelExtras;
  139 +
  140 + /**
  141 + * 渠道转账单号
  142 + */
  143 + private String channelTransferNo;
  144 +
  145 + /**
  146 + * 调用渠道的错误码
  147 + */
  148 + private String channelErrorCode;
  149 + /**
  150 + * 调用渠道的错误提示
  151 + */
  152 + private String channelErrorMsg;
  153 +
  154 + /**
  155 + * 渠道的同步/异步通知的内容
  156 + *
  157 + */
  158 + private String channelNotifyData;
105 159
106 } 160 }
107 \ No newline at end of file 161 \ No newline at end of file
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/demo/PayDemoTransferServiceImpl.java
1 package cn.iocoder.yudao.module.pay.service.demo; 1 package cn.iocoder.yudao.module.pay.service.demo;
2 2
3 -import cn.hutool.core.map.MapUtil;  
4 -import cn.hutool.core.util.StrUtil;  
5 -import cn.iocoder.yudao.framework.pay.core.enums.transfer.PayTransferTypeEnum;  
6 import cn.iocoder.yudao.module.pay.controller.admin.demo.vo.transfer.PayDemoTransferCreateReqVO; 3 import cn.iocoder.yudao.module.pay.controller.admin.demo.vo.transfer.PayDemoTransferCreateReqVO;
7 -import cn.iocoder.yudao.module.pay.convert.transfer.PayTransferConvert; 4 +import cn.iocoder.yudao.module.pay.convert.demo.PayDemoTransferConvert;
8 import cn.iocoder.yudao.module.pay.dal.dataobject.demo.PayDemoTransferDO; 5 import cn.iocoder.yudao.module.pay.dal.dataobject.demo.PayDemoTransferDO;
9 import cn.iocoder.yudao.module.pay.dal.mysql.demo.PayDemoTransferMapper; 6 import cn.iocoder.yudao.module.pay.dal.mysql.demo.PayDemoTransferMapper;
10 import cn.iocoder.yudao.module.pay.service.transfer.PayTransferService; 7 import cn.iocoder.yudao.module.pay.service.transfer.PayTransferService;
@@ -14,12 +11,8 @@ import org.springframework.validation.annotation.Validated; @@ -14,12 +11,8 @@ import org.springframework.validation.annotation.Validated;
14 11
15 import javax.annotation.Resource; 12 import javax.annotation.Resource;
16 import javax.validation.Valid; 13 import javax.validation.Valid;
17 -import java.util.Map; 14 +import javax.validation.Validator;
18 15
19 -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;  
20 -import static cn.iocoder.yudao.framework.pay.core.enums.transfer.PayTransferTypeEnum.*;  
21 -import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.PAY_TRANSFER_ALIPAY_ACCOUNT_NAME_IS_EMPTY;  
22 -import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.PAY_TRANSFER_ALIPAY_LOGIN_ID_IS_EMPTY;  
23 import static cn.iocoder.yudao.module.pay.enums.transfer.PayTransferStatusEnum.WAITING; 16 import static cn.iocoder.yudao.module.pay.enums.transfer.PayTransferStatusEnum.WAITING;
24 17
25 /** 18 /**
@@ -41,49 +34,18 @@ public class PayDemoTransferServiceImpl implements PayDemoTransferService { @@ -41,49 +34,18 @@ public class PayDemoTransferServiceImpl implements PayDemoTransferService {
41 private PayDemoTransferMapper demoTransferMapper; 34 private PayDemoTransferMapper demoTransferMapper;
42 @Resource 35 @Resource
43 private PayTransferService transferService; 36 private PayTransferService transferService;
  37 + @Resource
  38 + private Validator validator;
44 39
45 @Override 40 @Override
46 @Transactional(rollbackFor = Exception.class) 41 @Transactional(rollbackFor = Exception.class)
47 public Long createDemoTransfer(Long userId, @Valid PayDemoTransferCreateReqVO vo) { 42 public Long createDemoTransfer(Long userId, @Valid PayDemoTransferCreateReqVO vo) {
48 - // 1 校验收款账号  
49 - validatePayeeInfo(vo.getType(), vo.getPayeeInfo());  
50 - 43 + // 1 校验参数
  44 + vo.validate(validator);
51 // 2 保存示例转账业务表 45 // 2 保存示例转账业务表
52 - PayDemoTransferDO demoTransfer = new PayDemoTransferDO().setUserId(userId).setType(vo.getType())  
53 - .setPrice(vo.getPrice()).setPayeeInfo(vo.getPayeeInfo())  
54 - .setTransferStatus(WAITING.getStatus()); 46 + PayDemoTransferDO demoTransfer = PayDemoTransferConvert.INSTANCE.convert(vo)
  47 + .setUserId(userId).setTransferStatus(WAITING.getStatus());
55 demoTransferMapper.insert(demoTransfer); 48 demoTransferMapper.insert(demoTransfer);
56 -  
57 - // 3.1 创建转账单  
58 - Long transferId = transferService.createTransfer(PayTransferConvert.INSTANCE.convert(vo)  
59 - .setAppId(TRANSFER_APP_ID).setTitle("示例转账")  
60 - .setMerchantOrderId(String.valueOf(demoTransfer.getId())));  
61 - // 3.2 更新转账单编号  
62 - demoTransferMapper.updateById(new PayDemoTransferDO().setId(demoTransfer.getId())  
63 - .setPayTransferId(transferId));  
64 return demoTransfer.getId(); 49 return demoTransfer.getId();
65 } 50 }
66 -  
67 - // TODO @jason:可以参考 AppBrokerageWithdrawCreateReqVO 搞下字段哈,进行校验  
68 - // @jason payeeinfo 字段确定改一下  
69 - private void validatePayeeInfo(Integer transferType, Map<String, String> payeeInfo) {  
70 - PayTransferTypeEnum transferTypeEnum = typeOf(transferType);  
71 - switch (transferTypeEnum) {  
72 - case ALIPAY_BALANCE: {  
73 - if (StrUtil.isEmpty(MapUtil.getStr(payeeInfo, ALIPAY_LOGON_ID))) {  
74 - throw exception(PAY_TRANSFER_ALIPAY_LOGIN_ID_IS_EMPTY);  
75 - }  
76 - if (StrUtil.isEmpty(MapUtil.getStr(payeeInfo, ALIPAY_ACCOUNT_NAME))) {  
77 - throw exception(PAY_TRANSFER_ALIPAY_ACCOUNT_NAME_IS_EMPTY);  
78 - }  
79 - break;  
80 - }  
81 - case WX_BALANCE:  
82 - case BANK_CARD:  
83 - case WALLET_BALANCE: {  
84 - throw new UnsupportedOperationException("待实现");  
85 - }  
86 - }  
87 - }  
88 -  
89 } 51 }
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/transfer/PayTransferServiceImpl.java
@@ -28,7 +28,6 @@ import org.springframework.stereotype.Service; @@ -28,7 +28,6 @@ import org.springframework.stereotype.Service;
28 import org.springframework.transaction.annotation.Transactional; 28 import org.springframework.transaction.annotation.Transactional;
29 29
30 import javax.annotation.Resource; 30 import javax.annotation.Resource;
31 -import java.util.Objects;  
32 31
33 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 32 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
34 import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*; 33 import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.*;
@@ -80,7 +79,7 @@ public class PayTransferServiceImpl implements PayTransferService { @@ -80,7 +79,7 @@ public class PayTransferServiceImpl implements PayTransferService {
80 PayTransferUnifiedReqDTO transferUnifiedReq = new PayTransferUnifiedReqDTO() 79 PayTransferUnifiedReqDTO transferUnifiedReq = new PayTransferUnifiedReqDTO()
81 .setOutTransferNo(transferExtension.getNo()).setPrice(transfer.getPrice()) 80 .setOutTransferNo(transferExtension.getNo()).setPrice(transfer.getPrice())
82 .setType(transfer.getType()).setTitle(transfer.getSubject()) 81 .setType(transfer.getType()).setTitle(transfer.getSubject())
83 - .setPayeeInfo(transfer.getPayeeInfo()).setUserIp(userIp) 82 + .setUserIp(userIp)
84 .setChannelExtras(reqVO.getChannelExtras()); 83 .setChannelExtras(reqVO.getChannelExtras());
85 PayTransferRespDTO unifiedTransferResp = client.unifiedTransfer(transferUnifiedReq); 84 PayTransferRespDTO unifiedTransferResp = client.unifiedTransfer(transferUnifiedReq);
86 85
@@ -139,10 +138,7 @@ public class PayTransferServiceImpl implements PayTransferService { @@ -139,10 +138,7 @@ public class PayTransferServiceImpl implements PayTransferService {
139 if (transfer == null) { 138 if (transfer == null) {
140 throw exception(PAY_TRANSFER_NOT_FOUND); 139 throw exception(PAY_TRANSFER_NOT_FOUND);
141 } 140 }
142 - if (isSuccess(transfer.getStatus()) && Objects.equals(transfer.getExtensionId(), transferExtension.getId())) {  
143 - log.info("[updateTransferSuccess][transfer({}) 已经是已转账,无需更新]", transfer.getId());  
144 - return true;  
145 - } 141 +
146 if (!isPendingStatus(transfer.getStatus())) { 142 if (!isPendingStatus(transfer.getStatus())) {
147 throw exception(PAY_TRANSFER_STATUS_IS_NOT_PENDING); 143 throw exception(PAY_TRANSFER_STATUS_IS_NOT_PENDING);
148 } 144 }
@@ -151,7 +147,7 @@ public class PayTransferServiceImpl implements PayTransferService { @@ -151,7 +147,7 @@ public class PayTransferServiceImpl implements PayTransferService {
151 CollUtil.newArrayList(WAITING.getStatus(), IN_PROGRESS.getStatus()), 147 CollUtil.newArrayList(WAITING.getStatus(), IN_PROGRESS.getStatus()),
152 new PayTransferDO().setStatus(SUCCESS.getStatus()).setSuccessTime(notify.getSuccessTime()) 148 new PayTransferDO().setStatus(SUCCESS.getStatus()).setSuccessTime(notify.getSuccessTime())
153 .setChannelId(channel.getId()).setChannelCode(channel.getCode()) 149 .setChannelId(channel.getId()).setChannelCode(channel.getCode())
154 - .setExtensionId(transferExtension.getId()).setNo(transferExtension.getNo())); 150 + .setNo(transferExtension.getNo()));
155 if (updateCounts == 0) { 151 if (updateCounts == 0) {
156 throw exception(PAY_TRANSFER_STATUS_IS_NOT_PENDING); 152 throw exception(PAY_TRANSFER_STATUS_IS_NOT_PENDING);
157 } 153 }