1. 迁移三方 PayClient 的代码
This commit is contained in:
@@ -1,105 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>pay</artifactId>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>pay-application</artifactId>
|
||||
|
||||
<dependencies>
|
||||
<!-- Mall 相关 -->
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<artifactId>common-framework</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<artifactId>mall-spring-boot</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<artifactId>pay-service-impl</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<artifactId>system-sdk</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<artifactId>user-sdk</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Web 相关 -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.springfox</groupId>
|
||||
<artifactId>springfox-swagger2</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.xiaoymin</groupId>
|
||||
<artifactId>swagger-bootstrap-ui</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 服务保障相关 -->
|
||||
<dependency>
|
||||
<groupId>com.alibaba.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 测试相关 -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- 监控相关 -->
|
||||
<dependency>
|
||||
<groupId>de.codecentric</groupId>
|
||||
<artifactId>spring-boot-admin-starter-client</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.micrometer</groupId>
|
||||
<artifactId>micrometer-registry-prometheus</artifactId>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<!-- 提供给 mapstruct 使用 -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
</plugin>
|
||||
|
||||
<!-- 打包 -->
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
@@ -1,6 +0,0 @@
|
||||
swagger:
|
||||
enable: true
|
||||
title: 支付子系统
|
||||
description: 支付子系统
|
||||
version: 1.0.0
|
||||
base-package: cn.iocoder.mall.pay.application.controller
|
||||
@@ -1,32 +0,0 @@
|
||||
spring:
|
||||
application:
|
||||
name: pay-application
|
||||
|
||||
# Spring Cloud 配置项
|
||||
cloud:
|
||||
# Spring Cloud Sentinel 配置项
|
||||
sentinel:
|
||||
transport:
|
||||
dashboard: s1.iocoder.cn:12088 # Sentinel Dashboard 服务地址
|
||||
eager: true # 项目启动时,直接连接到 Sentinel
|
||||
|
||||
# server
|
||||
server:
|
||||
port: 18084
|
||||
servlet:
|
||||
context-path: /pay-api/
|
||||
|
||||
swagger:
|
||||
enable: true
|
||||
title: 支付子系统
|
||||
description: 支付子系统
|
||||
version: 1.0.0
|
||||
base-package: cn.iocoder.mall.pay.application.controller
|
||||
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
exposure:
|
||||
include: health,info,env,metrics,prometheus
|
||||
metrics:
|
||||
enabled: true
|
||||
@@ -1,39 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>pay</artifactId>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>pay-service-api</artifactId>
|
||||
|
||||
<dependencies>
|
||||
<!-- Mall 相关 -->
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<artifactId>common-framework</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 工具类相关 -->
|
||||
<dependency>
|
||||
<groupId>org.mapstruct</groupId>
|
||||
<artifactId>mapstruct</artifactId> <!-- use mapstruct-jdk8 for Java 8 or higher -->
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mapstruct</groupId>
|
||||
<artifactId>mapstruct-jdk8</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
||||
</project>
|
||||
@@ -1,54 +0,0 @@
|
||||
package cn.iocoder.mall.pay.biz.client;
|
||||
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.mall.pay.biz.dataobject.PayRefundDO;
|
||||
import cn.iocoder.mall.pay.biz.dataobject.PayTransactionDO;
|
||||
import cn.iocoder.mall.pay.biz.dataobject.PayTransactionExtensionDO;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public abstract class AbstractPaySDK {
|
||||
|
||||
/**
|
||||
* 提交支付请求给支付平台,并返回请求结果
|
||||
*
|
||||
* @param transaction 支付交易数据
|
||||
* @param transactionExtension 交易扩展数据
|
||||
* @param extra 额外参数。用于支持不同支付平台的拓展字段。例如说,微信公众号支付,需要多传递一个 openid
|
||||
* @return 请求结果
|
||||
*/
|
||||
public abstract CommonResult<String> submitTransaction(PayTransactionDO transaction,
|
||||
PayTransactionExtensionDO transactionExtension,
|
||||
Map<String, Object> extra);
|
||||
|
||||
/**
|
||||
* 解析支付成功回调的参数,返回 TransactionSuccessBO 对象
|
||||
*
|
||||
* @param params 回调的参数
|
||||
* @return 解析结果
|
||||
*/
|
||||
// TODO 芋艿,理论来说不会出现解析失败的情况,先返回这个参数列。等后面封装支付宝和微信支付的时候,在看看。
|
||||
public abstract CommonResult<TransactionSuccessBO> parseTransactionSuccessParams(String params);
|
||||
|
||||
/**
|
||||
* 提交退款请求给支付平台,并返回请求结果
|
||||
*
|
||||
* @param refund 退款数据
|
||||
* @param transactionExtension 交易扩展数据
|
||||
* @param extra 额外参数。用于支持不同支付平台的拓展字段。
|
||||
* @return 请求结果
|
||||
*/
|
||||
public abstract CommonResult<String> submitRefund(PayRefundDO refund,
|
||||
PayTransactionExtensionDO transactionExtension,
|
||||
Map<String, Object> extra);
|
||||
|
||||
/**
|
||||
* 解析退款成功回调的参数,返回 RefundSuccessBO 对象
|
||||
*
|
||||
* @param params 回调的参数
|
||||
* @return 解析结果
|
||||
*/
|
||||
// TODO 芋艿,理论来说不会出现解析失败的情况,先返回这个参数列。等后面封装支付宝和微信支付的时候,在看看。
|
||||
public abstract CommonResult<RefundSuccessBO> parseRefundSuccessParams(String params);
|
||||
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
package cn.iocoder.mall.pay.biz.client;
|
||||
|
||||
import cn.iocoder.mall.pay.api.constant.PayChannelEnum;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class PaySDKFactory {
|
||||
|
||||
private static Map<Integer, AbstractPaySDK> SDKS = new HashMap<>();
|
||||
|
||||
static {
|
||||
SDKS.put(PayChannelEnum.PINGXX.getId(), new PingxxPaySDK());
|
||||
}
|
||||
|
||||
public static AbstractPaySDK getSDK(Integer payChannel) {
|
||||
AbstractPaySDK sdk = SDKS.get(payChannel);
|
||||
if (sdk == null) {
|
||||
throw new NullPointerException("找不到合适的 PaySDK :" + payChannel);
|
||||
}
|
||||
return sdk;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,147 +0,0 @@
|
||||
package cn.iocoder.mall.pay.biz.client;
|
||||
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.mall.pay.biz.dataobject.PayRefundDO;
|
||||
import cn.iocoder.mall.pay.biz.dataobject.PayTransactionDO;
|
||||
import cn.iocoder.mall.pay.biz.dataobject.PayTransactionExtensionDO;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.pingplusplus.Pingpp;
|
||||
import com.pingplusplus.exception.*;
|
||||
import com.pingplusplus.model.Charge;
|
||||
import com.pingplusplus.model.Refund;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
// TODO 代码略乱,后面重构下
|
||||
public class PingxxPaySDK extends AbstractPaySDK {
|
||||
|
||||
static {
|
||||
Pingpp.privateKeyPath = "/Users/yunai/Downloads/pingxx.pem";
|
||||
Pingpp.apiKey = "sk_test_8a9SGSXLKqX1ennjX9DenvbT";
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResult<String> submitTransaction(PayTransactionDO transaction,
|
||||
PayTransactionExtensionDO transactionExtension,
|
||||
Map<String, Object> extra) {
|
||||
Map<String, Object> reqObj = createChargeRequest(transaction, transactionExtension, extra);
|
||||
// 请求ping++
|
||||
try {
|
||||
Charge charge = Charge.create(reqObj);
|
||||
System.out.println(charge.toString());
|
||||
return CommonResult.success(charge.toString());
|
||||
} catch (AuthenticationException | InvalidRequestException |
|
||||
APIConnectionException | APIException |
|
||||
ChannelException | RateLimitException e) {
|
||||
e.printStackTrace();
|
||||
throw new RuntimeException(e); // TODO 芋艿,后续优化
|
||||
}
|
||||
}
|
||||
|
||||
private static Map<String, Object> createChargeRequest(PayTransactionDO transaction,
|
||||
PayTransactionExtensionDO transactionExtension,
|
||||
Map<String, Object> extra) {
|
||||
// 计算支付渠道和支付额外参数
|
||||
String channel = "wx_pub"; // 因为 ping++ 是用来做模拟支付的渠道,所以这里强制就选择了 wx_pub 微信公众号支付
|
||||
extra = new HashMap<>(); // TODO 临时,后面用 extra
|
||||
extra.put("open_id", "just_for_test");
|
||||
// 生成支付对象
|
||||
Map<String, Object> reqObj = new HashMap<>();
|
||||
reqObj.put("subject", transaction.getOrderSubject());
|
||||
reqObj.put("body", transaction.getOrderDescription());
|
||||
reqObj.put("description", transaction.getOrderMemo());
|
||||
reqObj.put("amount", transaction.getPrice());
|
||||
reqObj.put("order_no", transactionExtension.getTransactionCode());
|
||||
reqObj.put("channel", channel);
|
||||
reqObj.put("currency", "cny");
|
||||
reqObj.put("client_ip", transactionExtension.getCreateIp());
|
||||
reqObj.put("app", ImmutableMap.of("id", "app_aTyfXDjrvzDSbLuz")); // TODO 写死先
|
||||
reqObj.put("extra", extra);
|
||||
return reqObj;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResult<TransactionSuccessBO> parseTransactionSuccessParams(String params) {
|
||||
JSONObject paramsObj = JSON.parseObject(params);
|
||||
JSONObject chargeObj = paramsObj.getJSONObject("data").getJSONObject("object");
|
||||
TransactionSuccessBO transactionPaySuccessBO = new TransactionSuccessBO()
|
||||
.setTransactionCode(chargeObj.getString("order_no"))
|
||||
.setPaymentTime(new Date(chargeObj.getLong("time_paid") * 1000))
|
||||
.setTradeNo(chargeObj.getString("transaction_no"));
|
||||
return CommonResult.success(transactionPaySuccessBO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResult<String> submitRefund(PayRefundDO refund,
|
||||
PayTransactionExtensionDO transactionExtension,
|
||||
Map<String, Object> extra) {
|
||||
// 解析出 chargeId
|
||||
JSONObject paramsObj = JSON.parseObject(transactionExtension.getExtensionData());
|
||||
JSONObject chargeObj = paramsObj.getJSONObject("data").getJSONObject("object");
|
||||
String chargeId = chargeObj.getString("id");
|
||||
// 请求ping++
|
||||
Map<String, Object> reqObj = createRefundRequest(refund, chargeId, refund.getOrderDescription(), refund.getPrice());
|
||||
try {
|
||||
Refund pingxxRefund = Refund.create(chargeId, reqObj);
|
||||
System.out.println(pingxxRefund.toString());
|
||||
return CommonResult.success(pingxxRefund.toString());
|
||||
} catch (AuthenticationException | InvalidRequestException |
|
||||
APIConnectionException | APIException |
|
||||
ChannelException | RateLimitException e) {
|
||||
e.printStackTrace();
|
||||
throw new RuntimeException(e); // TODO 芋艿,后续优化
|
||||
}
|
||||
}
|
||||
|
||||
// {"id":"evt_400190427005305341228202","created":1556297585,"livemode":false,"type":"refund.succeeded","data":{"object":{"id":"re_HO0m9GOGOi50KCmX104ufHe1","object":"refund","order_no":"HO0m9GOGOi50KCmX104ufHe1","amount":1,"created":1556297585,"succeed":true,"status":"succeeded","time_succeed":1556297585,"description":"测试下退款","failure_code":null,"failure_msg":null,"metadata":{},"charge":"ch_y1iXjLnDS4G4OO4uT4a5C4W1","charge_order_no":"20190427004410165545","transaction_no":"201904270053053608824","extra":{}}},"object":"event","request":"iar_Oa188KCiHC40iLibbHX5WrHC","pending_webhooks":0}
|
||||
@Override
|
||||
public CommonResult<RefundSuccessBO> parseRefundSuccessParams(String params) {
|
||||
JSONObject paramsObj = JSON.parseObject(params);
|
||||
JSONObject chargeObj = paramsObj.getJSONObject("data").getJSONObject("object");
|
||||
RefundSuccessBO refundSuccessBO = new RefundSuccessBO()
|
||||
.setRefundCode(chargeObj.getJSONObject("metadata").getString("refundCode"))
|
||||
.setRefundTime(new Date(chargeObj.getLong("time_succeed") * 1000))
|
||||
.setTradeNo(chargeObj.getString("transaction_no"))
|
||||
// TODO 芋艿,需要测试下,退款失败
|
||||
.setSuccess(chargeObj.containsValue("failure_code") || chargeObj.containsValue("failure_msg"));
|
||||
return CommonResult.success(refundSuccessBO);
|
||||
}
|
||||
|
||||
private Map<String, Object> createRefundRequest(PayRefundDO refund, String chargeId, String orderDescription, Integer price) {
|
||||
Map<String, Object> reqObj = new HashMap<>();
|
||||
// reqObj.put("CHARGE_ID", chargeId);
|
||||
reqObj.put("description", orderDescription);
|
||||
reqObj.put("amount", price);
|
||||
Map<String, Object> metadata = new HashMap<>();
|
||||
metadata.put("refundCode", refund.getRefundCode());
|
||||
reqObj.put("metadata", metadata);
|
||||
return reqObj;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
if (false) { // 测试支付请求
|
||||
PayTransactionDO transaction = new PayTransactionDO();
|
||||
transaction.setOrderSubject("测试商品");
|
||||
transaction.setOrderDescription("测试描述");
|
||||
transaction.setPrice(1);
|
||||
|
||||
PayTransactionExtensionDO extension = new PayTransactionExtensionDO();
|
||||
extension.setTransactionCode(System.currentTimeMillis() + "");
|
||||
extension.setCreateIp("127.0.0.1");
|
||||
|
||||
new PingxxPaySDK().submitTransaction(transaction, extension, null);
|
||||
}
|
||||
if (true) { // 测试退款请求
|
||||
PayRefundDO refund = new PayRefundDO().setPrice(9999999).setOrderDescription("测试描述");
|
||||
PayTransactionExtensionDO transactionExtension = new PayTransactionExtensionDO()
|
||||
.setExtensionData("{\"id\":\"evt_400190423100354205607502\",\"created\":1555985033,\"livemode\":false,\"type\":\"charge.succeeded\",\"data\":{\"object\":{\"id\":\"ch_DCGyXTmDGuHKb1C0yTzjPOGC\",\"object\":\"charge\",\"created\":1555985032,\"livemode\":false,\"paid\":true,\"refunded\":false,\"reversed\":false,\"app\":\"app_aTyfXDjrvzDSbLuz\",\"channel\":\"wx_pub\",\"order_no\":\"20190423100352158401\",\"client_ip\":\"114.87.158.59\",\"amount\":10,\"amount_settle\":10,\"currency\":\"cny\",\"subject\":\"kafka 实战\",\"body\":\"测试描述\",\"extra\":{\"open_id\":\"just_for_test\",\"bank_type\":\"your bank type\"},\"time_paid\":1555985033,\"time_expire\":1555992232,\"time_settle\":null,\"transaction_no\":\"1244341374201904238178164740\",\"refunds\":{\"object\":\"list\",\"url\":\"/v1/charges/ch_DCGyXTmDGuHKb1C0yTzjPOGC/refunds\",\"has_more\":false,\"data\":[]},\"amount_refunded\":0,\"failure_code\":null,\"failure_msg\":null,\"metadata\":{},\"credential\":{},\"description\":\"测试备注\"}},\"object\":\"event\",\"request\":\"iar_4e9mPODW5ujPqLen5OOmvL8S\",\"pending_webhooks\":0}");
|
||||
|
||||
new PingxxPaySDK().submitRefund(refund, transactionExtension, null);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
package cn.iocoder.mall.pay.biz.client;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 交易退款成功结果
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class RefundSuccessBO {
|
||||
|
||||
/**
|
||||
* 生成传输给第三方的订单号
|
||||
*
|
||||
* 唯一索引
|
||||
*/
|
||||
private String refundCode;
|
||||
/**
|
||||
* 第三方的流水号
|
||||
*/
|
||||
private String tradeNo;
|
||||
/**
|
||||
* 第三方退款成功的时间
|
||||
*/
|
||||
private Date refundTime;
|
||||
/**
|
||||
* 是否成功
|
||||
*/
|
||||
private Boolean success;
|
||||
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
package cn.iocoder.mall.pay.biz.client;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 交易支付成功结果
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class TransactionSuccessBO {
|
||||
|
||||
/**
|
||||
* 生成传输给第三方的订单号
|
||||
*
|
||||
* 唯一索引
|
||||
*/
|
||||
private String transactionCode;
|
||||
/**
|
||||
* 第三方的流水号
|
||||
*/
|
||||
private String tradeNo;
|
||||
/**
|
||||
* 第三方支付成功的时间
|
||||
*/
|
||||
private Date paymentTime;
|
||||
|
||||
}
|
||||
@@ -1,99 +0,0 @@
|
||||
package cn.iocoder.mall.pay.biz.dataobject;
|
||||
|
||||
import cn.iocoder.common.framework.dataobject.BaseDO;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 退款单 DO
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class PayRefundDO extends BaseDO {
|
||||
|
||||
/**
|
||||
* 编号,自增
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 支付交易编号
|
||||
*/
|
||||
private Integer transactionId;
|
||||
/**
|
||||
* 生成传输给第三方的退款号
|
||||
*
|
||||
* 唯一索引
|
||||
*/
|
||||
private String refundCode;
|
||||
/**
|
||||
* 应用编号
|
||||
*
|
||||
* 不同业务线分配不同的 appId
|
||||
* 举个例子,
|
||||
* 1. 电商系统的订单,appId = 1024
|
||||
* 2. 活动系统的订单,appId = 2048
|
||||
*/
|
||||
private String appId;
|
||||
/**
|
||||
* 业务线的订单编号
|
||||
*
|
||||
* 1. 使用 String 的原因是,业务线可能使用 String 做为编号
|
||||
* 2. 每个 appId 下,orderId 唯一
|
||||
*/
|
||||
private String orderId;
|
||||
/**
|
||||
* 发起交易的 IP
|
||||
*/
|
||||
private String createIp;
|
||||
/**
|
||||
* 业务退款描述
|
||||
*/
|
||||
private String orderDescription;
|
||||
/**
|
||||
* 退款金额,单位:分。
|
||||
*
|
||||
* TODO 暂时不考虑货币类型。
|
||||
*/
|
||||
private Integer price;
|
||||
/**
|
||||
* 退款状态
|
||||
*
|
||||
* @see cn.iocoder.mall.pay.api.constant.PayRefundStatus
|
||||
*/
|
||||
private Integer status;
|
||||
/**
|
||||
* 回调业务线完成时间
|
||||
*/
|
||||
private Date finishTime;
|
||||
/**
|
||||
* 异步通知地址
|
||||
*/
|
||||
private String notifyUrl;
|
||||
/**
|
||||
* 扩展内容
|
||||
*
|
||||
* 异步通知的时候填充回调的数据
|
||||
*/
|
||||
private String extensionData;
|
||||
/**
|
||||
* 退款渠道
|
||||
*/
|
||||
private Integer refundChannel;
|
||||
/**
|
||||
* 第三方退款成功的时间
|
||||
*/
|
||||
private Date refundTime;
|
||||
/**
|
||||
* 收到第三方系统通知的时间
|
||||
*
|
||||
* 一般情况下,即第三方系统的异步通知
|
||||
*/
|
||||
private Date notifyTime;
|
||||
/**
|
||||
* 第三方的流水号
|
||||
*/
|
||||
private String tradeNo;
|
||||
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
package cn.iocoder.mall.pay.biz.dataobject;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* TODO 重复支付的交易
|
||||
*
|
||||
* 可能不靠这个表,而是差错处理。
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
@Deprecated
|
||||
public class PayRepeatTransactionDO {
|
||||
}
|
||||
@@ -1,112 +0,0 @@
|
||||
package cn.iocoder.mall.pay.biz.dataobject;
|
||||
|
||||
import cn.iocoder.common.framework.dataobject.DeletableDO;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 支付交易 DO
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class PayTransactionDO extends DeletableDO {
|
||||
|
||||
/**
|
||||
* 编号,自增
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 应用编号
|
||||
*
|
||||
* 不同业务线分配不同的 appId
|
||||
* 举个例子,
|
||||
* 1. 电商系统的订单,appId = 1024
|
||||
* 2. 活动系统的订单,appId = 2048
|
||||
*/
|
||||
private String appId;
|
||||
/**
|
||||
* 业务线的订单编号
|
||||
*
|
||||
* 1. 使用 String 的原因是,业务线可能使用 String 做为编号
|
||||
* 2. 每个 appId 下,orderId 唯一
|
||||
*/
|
||||
private String orderId;
|
||||
/**
|
||||
* 发起交易的 IP
|
||||
*/
|
||||
private String createIp;
|
||||
/**
|
||||
* 订单商品名
|
||||
*/
|
||||
private String orderSubject;
|
||||
/**
|
||||
* 订单商品描述
|
||||
*/
|
||||
private String orderDescription;
|
||||
/**
|
||||
* 订单备注
|
||||
*/
|
||||
private String orderMemo;
|
||||
/**
|
||||
* 支付金额,单位:分。
|
||||
*
|
||||
* TODO 暂时不考虑货币类型。
|
||||
*/
|
||||
private Integer price;
|
||||
/**
|
||||
* 支付状态
|
||||
*
|
||||
* @see cn.iocoder.mall.pay.api.constant.PayTransactionStatusEnum
|
||||
*/
|
||||
private Integer status;
|
||||
/**
|
||||
* 交易过期时间
|
||||
*/
|
||||
private Date expireTime;
|
||||
/**
|
||||
* 回调业务线完成时间
|
||||
*/
|
||||
private Date finishTime;
|
||||
/**
|
||||
* 异步通知地址
|
||||
*/
|
||||
private String notifyUrl;
|
||||
// TODO return url
|
||||
|
||||
/**
|
||||
* 成功支付的交易拓展编号
|
||||
*
|
||||
* @see PayTransactionExtensionDO#getId()
|
||||
*/
|
||||
private Integer extensionId;
|
||||
/**
|
||||
* 支付成功的支付渠道
|
||||
*
|
||||
* @see cn.iocoder.mall.pay.api.constant.PayChannelEnum
|
||||
*/
|
||||
private Integer payChannel;
|
||||
/**
|
||||
* 第三方支付成功的时间
|
||||
*/
|
||||
private Date paymentTime;
|
||||
/**
|
||||
* 收到第三方系统通知的时间
|
||||
*
|
||||
* 一般情况下,即第三方系统的异步通知
|
||||
*/
|
||||
private Date notifyTime;
|
||||
/**
|
||||
* 第三方的流水号
|
||||
*/
|
||||
private String tradeNo;
|
||||
|
||||
// ========== 退款相关 ==========
|
||||
|
||||
/**
|
||||
* 退款总金额
|
||||
*/
|
||||
private Integer refundTotal;
|
||||
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
package cn.iocoder.mall.pay.biz.dataobject;
|
||||
|
||||
import cn.iocoder.common.framework.dataobject.DeletableDO;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* 交易扩展表
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class PayTransactionExtensionDO extends DeletableDO {
|
||||
|
||||
/**
|
||||
* 编号,自增
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 交易编号 {@link PayTransactionDO#getId()}
|
||||
*/
|
||||
private Integer transactionId;
|
||||
/**
|
||||
* 选择的支付渠道
|
||||
*/
|
||||
private Integer payChannel;
|
||||
/**
|
||||
* 生成传输给第三方的订单号
|
||||
*
|
||||
* 唯一索引
|
||||
*/
|
||||
private String transactionCode;
|
||||
/**
|
||||
* 扩展内容
|
||||
*
|
||||
* 异步通知的时候填充回调的数据
|
||||
*/
|
||||
private String extensionData;
|
||||
/**
|
||||
* 发起交易的 IP
|
||||
*/
|
||||
private String createIp;
|
||||
/**
|
||||
* 状态
|
||||
*
|
||||
* @see cn.iocoder.mall.pay.api.constant.PayTransactionStatusEnum
|
||||
* 注意,只包含上述枚举的 WAITING 和 SUCCESS
|
||||
*/
|
||||
private Integer status;
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user