记得上下班打卡 | git大法好,push需谨慎

Commit 12f38f38 authored by jiangxiulong's avatar jiangxiulong

Merge remote-tracking branch 'origin/dev' into dev

parents 6690db6a 9dbae15e
......@@ -56,9 +56,8 @@ public class DragonConstant {
public enum PayStatusEnum{
STATUS_UNPAID("0","未支付,或支付中"),
STATUS_PAID("1","已支付"),
STATUS_SUCCESS("2","已支付,通知成功,交易结束"),
STATUS_FAIL("3","已支付,通知失败,交易结束"),
STATUS_EXPIRE("4","已支付,通知超时,交易结束");
STATUS_PAY_FAIL("2","支付失败");
private String code;
private String message;
......@@ -82,6 +81,36 @@ public class DragonConstant {
}
}
/**
* 支付商户通知状态
*/
public enum PayNotifyStatusEnum{
NOTIFY_INIT("0","初始化"),
NOTIFY_SUCCESS("1","已支付,通知成功,交易结束"),
NOTIFY_FAIL("2","已支付,通知失败,交易结束"),
NOTIFY_EXPIRE("3","已支付,通知超时,交易结束");
private String code;
private String message;
PayNotifyStatusEnum(String code, String message) {
this.code = code;
this.message = message;
}
public PayNotifyStatusEnum getEnumByCode(String code){
PayNotifyStatusEnum[] arry = PayNotifyStatusEnum.values();
for (int i = 0; i < arry.length; i++) {
if (arry[i].getCode().equals(code)) {
return arry[i];
}
}
return null;
}
public String getCode() {
return code;
}
}
/**
* 退款状态
*/
......@@ -222,11 +251,14 @@ public class DragonConstant {
DRAGON_REFUND_KEY ("dragon:stream:dragon-refund","同步数据-退款"),
DRAGON_PAY_GROUP("dragon-pay-group","同步数据-支付-组"),
DRAGON_REFUND_GROUP ("dragon-refund-group","同步数据-退款-组"),
//商户通知相关队列
DRAGON_PAY_NOTIFY_KEY("dragon:stream:dragon-pay-notify-key","支付异步通知"),
//三方异步通知相关队列
DRAGON_PAY_NOTIFY_KEY("dragon-pay-notify-key","支付异步通知"),
DRAGON_PAY_NOTIFY_GROUP ("dragon-pay-notify-group","支付异步通知-组"),
PAY_MCH_NOTIFY_ERROR_KEY("dragon:stream:pay-mch-notify-error-key","商户异步通知失败"),
PAY_MCH_NOTIFY_ERROR_GROUP ("pay-mch-notify-error-group","商户异步通知失败");
//商户通知相关队列
PAY_MCH_NOTIFY_KEY("pay-mch-notify-key","商户异步通知"),
PAY_MCH_NOTIFY_GROUP ("pay-mch-notify-group","商户异步通知-组"),
PAY_MCH_NOTIFY_ERROR_KEY("pay-mch-notify-error-key","商户异步通知失败"),
PAY_MCH_NOTIFY_ERROR_GROUP ("pay-mch-notify-error-group","商户异步通知失败-组");
private String code;
private String message;
MysqlRedisQueueEnum(String code, String message) {
......
......@@ -75,7 +75,8 @@ public class RestControllerAdviceHandler {
return new ResponseEntity<Error>(new Error(errorCode, message), HttpStatus.OK);
} else {
logger.error("Unprocessed exception", rex);
return new ResponseEntity<Error>(new Error(ErrorCode.HTTP_SYSTEM_ERROR.getCode(), ErrorCode.HTTP_SYSTEM_ERROR.getMessage()), HttpStatus.OK);
// return new ResponseEntity<Error>(new Error(ErrorCode.HTTP_SYSTEM_ERROR.getCode(), ErrorCode.HTTP_SYSTEM_ERROR.getMessage()), HttpStatus.OK);
return new ResponseEntity<Error>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
package com.liquidnet.service.consumer.dragon.service.config;
import com.liquidnet.service.consumer.dragon.service.receiver.RedisPayReceiver;
import com.liquidnet.service.consumer.dragon.service.receiver.RedisRefundReceiver;
import com.liquidnet.service.consumer.dragon.service.receiver.*;
import com.liquidnet.service.dragon.constant.DragonConstant;
import lombok.var;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -23,6 +22,12 @@ public class RedisStreamConfig {
private RedisPayReceiver redisPayReceiver;
@Autowired
private RedisRefundReceiver redisRefundReceiver;
@Autowired
private RedisPayNotifyReceiver redisPayNotifyReceiver;
@Autowired
private RedisMchNotifyReceiver redisMchNotifyReceiver;
@Autowired
private RedisMchNotifyFailReceiver redisMchNotifyFailReceiver;
@Bean
public Subscription subscriptionPay0(RedisConnectionFactory factory) {
......@@ -79,4 +84,86 @@ public class RedisStreamConfig {
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionPayNotify0(RedisConnectionFactory factory) {
var options = StreamMessageListenerContainer
.StreamMessageListenerContainerOptions
.builder()
.pollTimeout(Duration.ofMillis(1))
.build();
var listenerContainer = StreamMessageListenerContainer.create(factory, options);
var subscription = listenerContainer.receiveAutoAck(Consumer.from(DragonConstant.MysqlRedisQueueEnum.DRAGON_PAY_NOTIFY_GROUP.getCode(), "dragon-pay-notify-0"),
StreamOffset.create(DragonConstant.MysqlRedisQueueEnum.DRAGON_PAY_NOTIFY_KEY.getCode(), ReadOffset.lastConsumed()), redisPayNotifyReceiver);
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionPayNotify1(RedisConnectionFactory factory) {
var options = StreamMessageListenerContainer
.StreamMessageListenerContainerOptions
.builder()
.pollTimeout(Duration.ofMillis(1))
.build();
var listenerContainer = StreamMessageListenerContainer.create(factory, options);
var subscription = listenerContainer.receiveAutoAck(Consumer.from(DragonConstant.MysqlRedisQueueEnum.DRAGON_PAY_NOTIFY_GROUP.getCode(), "dragon-pay-notify-1"),
StreamOffset.create(DragonConstant.MysqlRedisQueueEnum.DRAGON_PAY_NOTIFY_KEY.getCode(), ReadOffset.lastConsumed()), redisPayNotifyReceiver);
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionMchNotify0(RedisConnectionFactory factory) {
var options = StreamMessageListenerContainer
.StreamMessageListenerContainerOptions
.builder()
.pollTimeout(Duration.ofMillis(1))
.build();
var listenerContainer = StreamMessageListenerContainer.create(factory, options);
var subscription = listenerContainer.receiveAutoAck(Consumer.from(DragonConstant.MysqlRedisQueueEnum.PAY_MCH_NOTIFY_GROUP.getCode(), "pay-mch-notify-0"),
StreamOffset.create(DragonConstant.MysqlRedisQueueEnum.PAY_MCH_NOTIFY_KEY.getCode(), ReadOffset.lastConsumed()), redisMchNotifyReceiver);
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionMchNotify1(RedisConnectionFactory factory) {
var options = StreamMessageListenerContainer
.StreamMessageListenerContainerOptions
.builder()
.pollTimeout(Duration.ofMillis(1))
.build();
var listenerContainer = StreamMessageListenerContainer.create(factory, options);
var subscription = listenerContainer.receiveAutoAck(Consumer.from(DragonConstant.MysqlRedisQueueEnum.PAY_MCH_NOTIFY_GROUP.getCode(), "pay-mch-notify-1"),
StreamOffset.create(DragonConstant.MysqlRedisQueueEnum.PAY_MCH_NOTIFY_KEY.getCode(), ReadOffset.lastConsumed()), redisMchNotifyReceiver);
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionPayNotifyFail0(RedisConnectionFactory factory) {
var options = StreamMessageListenerContainer
.StreamMessageListenerContainerOptions
.builder()
.pollTimeout(Duration.ofMillis(1))
.build();
var listenerContainer = StreamMessageListenerContainer.create(factory, options);
var subscription = listenerContainer.receiveAutoAck(Consumer.from(DragonConstant.MysqlRedisQueueEnum.PAY_MCH_NOTIFY_ERROR_GROUP.getCode(), "pay-mch-notify-fail-0"),
StreamOffset.create(DragonConstant.MysqlRedisQueueEnum.PAY_MCH_NOTIFY_ERROR_KEY.getCode(), ReadOffset.lastConsumed()), redisMchNotifyFailReceiver);
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionPayNotifyFail1(RedisConnectionFactory factory) {
var options = StreamMessageListenerContainer
.StreamMessageListenerContainerOptions
.builder()
.pollTimeout(Duration.ofMillis(1))
.build();
var listenerContainer = StreamMessageListenerContainer.create(factory, options);
var subscription = listenerContainer.receiveAutoAck(Consumer.from(DragonConstant.MysqlRedisQueueEnum.PAY_MCH_NOTIFY_ERROR_GROUP.getCode(), "pay-mch-notify-fail-1"),
StreamOffset.create(DragonConstant.MysqlRedisQueueEnum.PAY_MCH_NOTIFY_ERROR_KEY.getCode(), ReadOffset.lastConsumed()), redisMchNotifyFailReceiver);
listenerContainer.start();
return subscription;
}
}
package com.liquidnet.service.consumer.dragon.service.receiver;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.consumer.dragon.service.IBaseDao;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.stream.MapRecord;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.stream.StreamListener;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 支付商户通知消费
*/
@Slf4j
@Component
public class RedisMchNotifyFailReceiver implements StreamListener<String, MapRecord<String, String, String>> {
@Resource
IBaseDao baseDao;
@Autowired
StringRedisTemplate stringRedisTemplate;
@Override
public void onMessage(MapRecord<String, String, String> message) {
log.info("接受到来自redis pay notify 的消息");
System.out.println("message id " + message.getId());
System.out.println("stream " + message.getStream());
System.out.println("body " + message.getValue());
consumerSqlDaoHandler(message.getValue().get("message"));
}
private void consumerSqlDaoHandler(String msg) {
try {
SqlMapping.SqlMessage sqlMessage = JsonUtils.fromJson(msg, SqlMapping.SqlMessage.class);
log.debug("CONSUMER SQL ==> Preparing:{}", JsonUtils.toJson(sqlMessage.getSqls()));
log.debug("CONSUMER SQL ==> Parameters:{}", JsonUtils.toJson(sqlMessage.getArgs()));
Boolean rstBatchSqls = baseDao.batchSqls(sqlMessage.getSqls(), sqlMessage.getArgs());
log.debug("CONSUMER SQL result of execution:{}", rstBatchSqls);
if (rstBatchSqls) {
//应答
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.liquidnet.service.consumer.dragon.service.receiver;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.consumer.dragon.service.IBaseDao;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.stream.MapRecord;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.stream.StreamListener;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 支付商户通知消费
*/
@Slf4j
@Component
public class RedisMchNotifyReceiver implements StreamListener<String, MapRecord<String, String, String>> {
@Resource
IBaseDao baseDao;
@Autowired
StringRedisTemplate stringRedisTemplate;
@Override
public void onMessage(MapRecord<String, String, String> message) {
log.info("接受到来自redis pay notify 的消息");
System.out.println("message id " + message.getId());
System.out.println("stream " + message.getStream());
System.out.println("body " + message.getValue());
consumerSqlDaoHandler(message.getValue().get("message"));
}
private void consumerSqlDaoHandler(String msg) {
try {
SqlMapping.SqlMessage sqlMessage = JsonUtils.fromJson(msg, SqlMapping.SqlMessage.class);
log.debug("CONSUMER SQL ==> Preparing:{}", JsonUtils.toJson(sqlMessage.getSqls()));
log.debug("CONSUMER SQL ==> Parameters:{}", JsonUtils.toJson(sqlMessage.getArgs()));
Boolean rstBatchSqls = baseDao.batchSqls(sqlMessage.getSqls(), sqlMessage.getArgs());
log.debug("CONSUMER SQL result of execution:{}", rstBatchSqls);
if (rstBatchSqls) {
//应答
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.liquidnet.service.consumer.dragon.service.receiver;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.consumer.dragon.service.IBaseDao;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.stream.MapRecord;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.stream.StreamListener;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 支付商户通知消费
*/
@Slf4j
@Component
public class RedisPayNotifyReceiver implements StreamListener<String, MapRecord<String, String, String>> {
@Resource
IBaseDao baseDao;
@Autowired
StringRedisTemplate stringRedisTemplate;
@Override
public void onMessage(MapRecord<String, String, String> message) {
log.info("接受到来自redis pay notify 的消息");
System.out.println("message id " + message.getId());
System.out.println("stream " + message.getStream());
System.out.println("body " + message.getValue());
consumerSqlDaoHandler(message.getValue().get("message"));
}
private void consumerSqlDaoHandler(String msg) {
try {
SqlMapping.SqlMessage sqlMessage = JsonUtils.fromJson(msg, SqlMapping.SqlMessage.class);
log.debug("CONSUMER SQL ==> Preparing:{}", JsonUtils.toJson(sqlMessage.getSqls()));
log.debug("CONSUMER SQL ==> Parameters:{}", JsonUtils.toJson(sqlMessage.getArgs()));
Boolean rstBatchSqls = baseDao.batchSqls(sqlMessage.getSqls(), sqlMessage.getArgs());
log.debug("CONSUMER SQL result of execution:{}", rstBatchSqls);
if (rstBatchSqls) {
//应答
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
......@@ -40,7 +40,7 @@ drop TABLE if exists `dragon_order_logs`;
CREATE TABLE `dragon_order_logs`
(
`mid` bigint unsigned NOT NULL AUTO_INCREMENT,
`order_id` bigint NOT NULL COMMENT '订单id',
`code` varchar(200) NOT NULL COMMENT 'pay编码',
`payment_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '支付类型',
`content` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '支付通知内容',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
......@@ -59,7 +59,7 @@ CREATE TABLE `dragon_order_refunds`
(
`mid` bigint unsigned NOT NULL AUTO_INCREMENT,
`order_refund_id` varchar(200) NOT NULL DEFAULT '0' COMMENT 'order_refund_id',
`order_id` bigint NULL COMMENT '订单id',
`order_id` varchar(200) NULL COMMENT '订单id',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '订单退款状态',
`code` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '订单退款编号',
`order_refund_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '调用端订单退款编号',
......@@ -88,9 +88,9 @@ drop TABLE if exists `dragon_order_refund_logs`;
CREATE TABLE `dragon_order_refund_logs`
(
`mid` bigint unsigned NOT NULL AUTO_INCREMENT,
`order_id` bigint NULL COMMENT '订单id',
`order_refund_id` bigint NULL COMMENT '退款订单id',
`refund_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '退款类型',
`order_id` varchar(200) NULL COMMENT '订单id',
`order_refund_id` varchar(200) NULL COMMENT '退款订单id',
`refund_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL COMMENT '退款类型',
`content` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '退款通知内容',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
......
DROP TABLE IF EXISTS `dragon_order_logs`;
CREATE TABLE `dragon_order_logs` (
`mid` bigint unsigned NOT NULL AUTO_INCREMENT,
`code` varchar(200) COLLATE utf8_unicode_ci NOT NULL COMMENT '订单id',
`payment_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '支付类型',
`content` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '支付通知内容',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted_at` timestamp NULL DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`mid`),
KEY `order_logs_order_id_index` (`code`)
) ENGINE=InnoDB AUTO_INCREMENT=62 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='支付订单日志表';
DROP TABLE IF EXISTS `dragon_order_refund_logs`;
CREATE TABLE `dragon_order_refund_logs` (
`mid` bigint unsigned NOT NULL AUTO_INCREMENT,
`order_id` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '订单id',
`order_refund_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '退款订单id',
`refund_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '退款类型',
`content` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '退款通知内容',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted_at` timestamp NULL DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`mid`),
KEY `order_refund_logs_order_id_index` (`order_id`),
KEY `order_refund_logs_order_refund_id_index` (`order_refund_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='退款订单信息表';
DROP TABLE IF EXISTS `dragon_order_refunds`;
CREATE TABLE `dragon_order_refunds` (
`mid` bigint unsigned NOT NULL AUTO_INCREMENT,
`order_refund_id` varchar(200) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0' COMMENT 'order_refund_id',
`order_id` bigint DEFAULT NULL COMMENT '订单id',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '订单退款状态',
`code` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '订单退款编号',
`order_refund_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '调用端订单退款编号',
`price` decimal(10,2) NOT NULL COMMENT '退款价格',
`reason` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '退款原因',
`notify_url` varchar(150) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '退款完成通知回调地址',
`refund_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '退款类型',
`refund_id` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '退款的订单号',
`refund_error` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '退款失败原因',
`refund_at` timestamp NULL DEFAULT NULL COMMENT '退款时间',
`finished_at` timestamp NULL DEFAULT NULL COMMENT '退款结束时间',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted_at` timestamp NULL DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`mid`),
UNIQUE KEY `order_refunds_code_unique` (`code`),
UNIQUE KEY `order_refunds_order_id_order_refund_code_unique` (`order_id`,`order_refund_code`),
KEY `order_refunds_order_id_index` (`order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='退款订单表';
DROP TABLE IF EXISTS `dragon_orders`;
CREATE TABLE `dragon_orders` (
`mid` bigint unsigned NOT NULL AUTO_INCREMENT,
`order_id` varchar(200) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0' COMMENT 'order_id',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '订单状态(0未支付 1支付成功 2支付失败)',
`code` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '订单支付编号',
`type` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '订单类型',
`price` decimal(10,2) NOT NULL COMMENT '总价格',
`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '类别或名称',
`detail` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '详情或描述',
`order_code` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '调用端订单编号',
`client_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '用户客户端ip地址',
`notify_url` varchar(150) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '支付完成通知回调地址',
`notify_status` tinyint DEFAULT '0' COMMENT '通知状态(0初始化 1通知成功 2 通知失败 3通知超时)',
`payment_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '支付类型',
`payment_id` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '支付的订单号',
`payment_at` timestamp NULL DEFAULT NULL COMMENT '支付时间',
`finished_at` timestamp NULL DEFAULT NULL COMMENT '结束时间',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted_at` timestamp NULL DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`mid`),
UNIQUE KEY `orders_code_unique` (`code`),
UNIQUE KEY `orders_payment_id_unique` (`payment_id`),
KEY `orders_payment_type_index` (`payment_type`),
KEY `orders_status_index` (`status`),
KEY `orders_type_index` (`type`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='支付订单表';
DROP TABLE IF EXISTS `dragon_pay_notify`;
CREATE TABLE `dragon_pay_notify` (
`mid` bigint unsigned NOT NULL AUTO_INCREMENT,
`code` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT '订单支付编号',
`order_code` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT '订单编号',
`notify_url` varchar(150) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '通知url',
`notify_data` text COLLATE utf8_unicode_ci COMMENT '通知参数',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`mid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='支付通知成功';
DROP TABLE IF EXISTS `dragon_pay_notify_fail`;
CREATE TABLE `dragon_pay_notify_fail` (
`mid` bigint unsigned NOT NULL AUTO_INCREMENT,
`code` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT '订单支付编号',
`order_code` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT '订单编号',
`notify_url` varchar(150) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '通知url',
`notify_data` text COLLATE utf8_unicode_ci COMMENT '通知参数',
`fail_desc` varchar(500) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '失败描述',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`mid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='支付通知失败记录';
-- pay
XADD dragon:stream:dragon-pay * 0 0
XADD dragon-pay-notify-key * 0 0
XADD pay-mch-notify-key * 0 0
XADD pay-mch-notify-error-key * 0 0
XGROUP CREATE dragon:stream:dragon-pay dragon-pay-group 0
XGROUP CREATE dragon-pay-notify-key dragon-pay-notify-group 0
XGROUP CREATE pay-mch-notify-key pay-mch-notify-group 0
XGROUP CREATE pay-mch-notify-error-key pay-mch-notify-error-group 0
-- refund
XADD dragon:stream:dragon-refund * 0 0
XGROUP CREATE dragon:stream:dragon-refund dragon-refund-group 0
-- delete
XGROUP DESTROY dragon:stream:dragon-pay dragon-pay-group 0
XGROUP DESTROY dragon-pay-notify-key dragon-pay-notify-group 0
XGROUP DESTROY pay-mch-notify-key pay-mch-notify-group 0
XGROUP DESTROY pay-mch-notify-error-key pay-mch-notify-error-group 0
-- delete refund
XGROUP DESTROY dragon:stream:dragon-refund dragon-refund-group 0
\ No newline at end of file
......@@ -30,7 +30,7 @@ import java.util.*;
*/
@Slf4j
@Component
public class AlipayBiz extends DragonPayBiz {
public class AlipayBiz{
/**
* 支付宝支付
* @param alipayTradePayReq
......
......@@ -6,6 +6,7 @@ import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.dragon.channel.alipay.biz.AlipayBiz;
import com.liquidnet.service.dragon.channel.alipay.req.AlipayTradePayReq;
import com.liquidnet.service.dragon.channel.alipay.strategy.IAlipayStrategy;
import com.liquidnet.service.dragon.channel.strategy.biz.DragonPayBiz;
import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto;
import lombok.extern.slf4j.Slf4j;
......@@ -27,6 +28,9 @@ public abstract class AbstractAlipayStrategy implements IAlipayStrategy {
@Autowired
private AlipayBiz alipayBiz;
@Autowired
private DragonPayBiz dragonPayBiz;
protected String productCode = "QUICK_WAP_PAY";
@Override
......@@ -55,7 +59,7 @@ public abstract class AbstractAlipayStrategy implements IAlipayStrategy {
respDto = this.buildResponseDto(respDto,result);
//支付订单持久化
alipayBiz.buildPayOrders(dragonPayBaseReqDto,respDto);
dragonPayBiz.buildPayOrders(dragonPayBaseReqDto,respDto);
return ResponseDto.success(respDto);
}
......
package com.liquidnet.service.dragon.channel.strategy.biz;
import com.alibaba.fastjson.JSON;
import com.liquidnet.commons.lang.util.BeanUtil;
import com.liquidnet.commons.lang.util.HttpUtil;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.dragon.bo.PayNotifyReqBo;
......@@ -14,11 +14,23 @@ import com.liquidnet.service.dragon.entity.DragonOrders;
import com.liquidnet.service.dragon.utils.DataUtils;
import com.liquidnet.service.dragon.utils.MqHandleUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
/**
* @author AnJiabin <anjiabin@zhengzai.tv>
......@@ -30,7 +42,8 @@ import java.time.LocalDateTime;
* @date 2021/7/14 14:12
*/
@Slf4j
public abstract class DragonPayBiz {
@Component
public class DragonPayBiz {
@Autowired
private MqHandleUtil mqHandleUtil;
......@@ -77,6 +90,52 @@ public abstract class DragonPayBiz {
return orders;
}
/**
* 更新支付状态
* @param code
* @param paymentId
* @return
*/
public boolean updateOrderStatus(String code,Integer status,String paymentId){
try {
LocalDateTime finishedAt = LocalDateTime.now();
LocalDateTime updateAt = LocalDateTime.now();
//t.status = ? ,t.payment_id = ?,t.finished_at = ?,t.updated_at =? where t.code = ?
boolean insertResult = mqHandleUtil.sendMySqlRedis(
SqlMapping.get("dragon_orders.updateOrderStatus"),
new Object[]{status,paymentId,finishedAt, updateAt,code}
,DragonConstant.MysqlRedisQueueEnum.DRAGON_PAY_KEY.getCode()
);
if(insertResult) return true;
} catch (Exception e) {
log.error("dragon:updateDragonOrderStatus:error msg:{}",e);
e.printStackTrace();
}
return false;
}
/**
* 更新支付通知状态
* @param code
* @return
*/
public boolean updateNotifyStatus(String code,Integer status){
try {
LocalDateTime updateAt = LocalDateTime.now();
//update dragon_orders t set t.notify_status = ? ,t.updated_at =? where t.code = ?
boolean insertResult = mqHandleUtil.sendMySqlRedis(
SqlMapping.get("dragon_orders.updateNotifyStatus"),
new Object[]{status,updateAt,code}
,DragonConstant.MysqlRedisQueueEnum.DRAGON_PAY_KEY.getCode()
);
if(insertResult) return true;
} catch (Exception e) {
log.error("dragon:updateNotifyStatus:error msg:{}",e);
e.printStackTrace();
}
return false;
}
public PayNotifyReqBo buildPayNotifyReqBo(DragonOrdersDto dragonOrdersDto){
PayNotifyReqBo payNotifyReqBo = new PayNotifyReqBo();
payNotifyReqBo.setNotifyUrl(dragonOrdersDto.getNotifyUrl());
......@@ -92,7 +151,12 @@ public abstract class DragonPayBiz {
return payNotifyReqBo;
}
public void createDragonOrderLogs(String paymentType,String content){
/**
* 三方异步通知入库
* @param paymentType
* @param content
*/
public void createDragonOrderLogs(String code,String paymentType,String content){
try {
String orderId = IDGenerator.nextTimeId();
LocalDateTime createAt = LocalDateTime.now();
......@@ -100,7 +164,7 @@ public abstract class DragonPayBiz {
LocalDateTime deleteAt = null;
boolean insertResult = mqHandleUtil.sendMySqlRedis(
SqlMapping.get("dragon_order_logs.insert"),
new Object[]{orderId,paymentType,content, createAt, updateAt,deleteAt}
new Object[]{code,paymentType,content, createAt, updateAt,deleteAt}
,DragonConstant.MysqlRedisQueueEnum.DRAGON_PAY_NOTIFY_KEY.getCode()
);
} catch (Exception e) {
......@@ -109,26 +173,159 @@ public abstract class DragonPayBiz {
}
}
/**
* 商户异步通知入库
* @param payNotifyReqBo
* @param notifyParam
*/
public void createDragonPayNotify(PayNotifyReqBo payNotifyReqBo,String notifyParam){
PayNotifyDto payNotifyDto = payNotifyReqBo.getPayNotifyDto();
try {
String code = payNotifyDto.getCode();
String orderCode = payNotifyDto.getOrderCode();
String notifyUrl = payNotifyReqBo.getNotifyUrl();
String notifyData = notifyParam;
LocalDateTime createAt = LocalDateTime.now();
LocalDateTime updateAt = LocalDateTime.now();
boolean insertResult = mqHandleUtil.sendMySqlRedis(
SqlMapping.get("dragon_pay_notify.insert"),
new Object[]{code,orderCode,notifyUrl,notifyData, createAt, updateAt}
,DragonConstant.MysqlRedisQueueEnum.PAY_MCH_NOTIFY_KEY.getCode()
);
log.info("dragon:createDragonPayNotify:success code:{}",code);
} catch (Exception e) {
log.error("dragon:createDragonPayNotify:error msg:{}",e);
e.printStackTrace();
}
}
/**
* 商户异步通知失败入库
* @param payNotifyReqBo
* @param notifyParam
*/
public void createDragonPayNotifyFail(PayNotifyReqBo payNotifyReqBo,String notifyParam){
PayNotifyDto payNotifyDto = payNotifyReqBo.getPayNotifyDto();
try {
String code = payNotifyDto.getCode();
String orderCode = payNotifyDto.getOrderCode();
String notifyUrl = payNotifyReqBo.getNotifyUrl();
String notifyData = notifyParam;
String failDesc = "通知失败";
LocalDateTime createAt = LocalDateTime.now();
LocalDateTime updateAt = LocalDateTime.now();
boolean insertResult = mqHandleUtil.sendMySqlRedis(
SqlMapping.get("dragon_pay_notify_fail.insert"),
new Object[]{code,orderCode,notifyUrl,notifyData,failDesc,createAt, updateAt}
,DragonConstant.MysqlRedisQueueEnum.PAY_MCH_NOTIFY_ERROR_KEY.getCode()
);
log.info("dragon:createDragonPayNotifyFail:success code:{}",code);
} catch (Exception e) {
log.error("dragon:createDragonPayNotifyFail:error msg:{}",e);
e.printStackTrace();
}
}
// public void sendNotifyBackup(PayNotifyReqBo payNotifyReqBo){
// PayNotifyDto payNotifyDto = payNotifyReqBo.getPayNotifyDto();
// LocalDateTime nowTime = LocalDateTime.now();
// MultiValueMap<String, String> params = new LinkedMultiValueMap();
// params.add("status", payNotifyDto.getStatus().toString());
// params.add("type", payNotifyDto.getType());
// params.add("code", payNotifyDto.getCode());
// params.add("paymentId", payNotifyDto.getPaymentId());
// params.add("orderCode", payNotifyDto.getOrderCode());
// params.add("price", payNotifyDto.getPrice().toString());
// params.add("paymentType", payNotifyDto.getPaymentType());
// String jsonData = JSON.toJSONString(params);
// log.info("dragon:notify:post url:{}",payNotifyReqBo.getNotifyUrl());
// log.info("dragon:notify:post data:{}",jsonData);
// try {
// String response = HttpUtil.post(payNotifyReqBo.getNotifyUrl(), params);
// log.debug("PAY RESPONSE=" + response);
// if (response.equals("success")) {
// this.createDragonPayNotify(payNotifyReqBo,jsonData);
// //更新通知状态-通知成功
// this.updateNotifyStatus(payNotifyDto.getCode(),Integer.valueOf(DragonConstant.PayStatusEnum.STATUS_SUCCESS.getCode()));
// } else {
// this.createDragonPayNotifyFail(payNotifyReqBo,jsonData);
// //更新通知状态-通知失败
// this.updateNotifyStatus(payNotifyDto.getCode(),Integer.valueOf(DragonConstant.PayStatusEnum.STATUS_FAIL.getCode()));
// }
//
// if(true){
// throw new ConnectTimeoutException();
// }
// } catch (ConnectTimeoutException e) {
// System.out.println("请求超时");
//
// }catch (Exception e){
// e.printStackTrace();
// }
// }
public void sendNotify(PayNotifyReqBo payNotifyReqBo){
PayNotifyDto payNotifyDto = payNotifyReqBo.getPayNotifyDto();
LocalDateTime nowTime = LocalDateTime.now();
MultiValueMap<String, String> params = new LinkedMultiValueMap();
params.add("status", payNotifyDto.getStatus().toString());
params.add("type", payNotifyDto.getType());
params.add("code", payNotifyDto.getCode());
params.add("paymentId", payNotifyDto.getPaymentId());
params.add("orderCode", payNotifyDto.getOrderCode());
params.add("price", payNotifyDto.getPrice().toString());
params.add("paymentType", payNotifyDto.getPaymentType());
String response = HttpUtil.post(payNotifyReqBo.getNotifyUrl(), params);
log.debug("PAY RESPONSE=" + response);
if (response.equals("success")) {
} else {
// sendMySqlRedis(
// SqlMapping.get("dragon_order_pay.update"),
// new Object[]{nowTime, DateUtil.Formatter.yyyyMMddHHmmss.format(nowTime), DragonConstant.RefundStatusEnum.STATUS_FAIL.getCode(), notifyUrlDto.getRefundCode()}
// );
CloseableHttpClient httpclient = HttpClients.createDefault();
String jsonData = "";
try {
HttpPost httpPost = new HttpPost(payNotifyReqBo.getNotifyUrl());
//配置超时
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(5000).setConnectionRequestTimeout(5000)
.setSocketTimeout(5000).build();
httpPost.setConfig(requestConfig);
//设置post请求参数
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("status", payNotifyDto.getStatus().toString()));
nvps.add(new BasicNameValuePair("type", payNotifyDto.getType()));
nvps.add(new BasicNameValuePair("code", payNotifyDto.getCode()));
nvps.add(new BasicNameValuePair("paymentId", payNotifyDto.getPaymentId()));
nvps.add(new BasicNameValuePair("orderCode", payNotifyDto.getOrderCode()));
nvps.add(new BasicNameValuePair("price", payNotifyDto.getPrice().toString()));
nvps.add(new BasicNameValuePair("paymentType", payNotifyDto.getPaymentType()));
jsonData = JSON.toJSONString(nvps);
log.info("dragon:notify:post url:{}",payNotifyReqBo.getNotifyUrl());
log.info("dragon:notify:post data:{}",jsonData);
httpPost.setEntity(new UrlEncodedFormEntity(nvps));
//执行post请求
CloseableHttpResponse responseObj = httpclient.execute(httpPost);
String response = EntityUtils.toString(responseObj.getEntity(), "utf-8");
log.debug("PAY RESPONSE=" + response);
if (response.equals("success")) {
this.createDragonPayNotify(payNotifyReqBo,jsonData);
//更新通知状态-通知成功
this.updateNotifyStatus(payNotifyDto.getCode(),Integer.valueOf(DragonConstant.PayNotifyStatusEnum.NOTIFY_SUCCESS.getCode()));
} else {
this.createDragonPayNotifyFail(payNotifyReqBo,jsonData);
//更新通知状态-通知失败
this.updateNotifyStatus(payNotifyDto.getCode(),Integer.valueOf(DragonConstant.PayNotifyStatusEnum.NOTIFY_FAIL.getCode()));
}
} catch (ConnectTimeoutException e) {
log.error("dragon:sendNotify 请求超时",e);
this.createDragonPayNotifyFail(payNotifyReqBo,jsonData);
//更新通知状态-通知失败
this.updateNotifyStatus(payNotifyDto.getCode(),Integer.valueOf(DragonConstant.PayNotifyStatusEnum.NOTIFY_EXPIRE.getCode()));
} catch (Exception e) {
log.error("dragon:sendNotify 请求失败",e);
this.createDragonPayNotifyFail(payNotifyReqBo,jsonData);
//更新通知状态-通知失败
this.updateNotifyStatus(payNotifyDto.getCode(),Integer.valueOf(DragonConstant.PayNotifyStatusEnum.NOTIFY_FAIL.getCode()));
}finally {
//释放连接
try {
if (httpclient != null) {
httpclient.close();
}
} catch (IOException e) {
log.error("连接无法关闭",e);
}
}
}
......
package com.liquidnet.service.dragon.channel.strategy.impl;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.dragon.channel.strategy.IPayChannelStrategy;
import com.liquidnet.service.dragon.channel.strategy.biz.DragonPayBiz;
import com.liquidnet.service.dragon.constant.DragonConstant;
import com.liquidnet.service.dragon.dto.DragonOrdersDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto;
import com.liquidnet.service.dragon.dto.DragonPayBaseRespDto;
import com.liquidnet.service.dragon.dto.DragonPayOrderQueryRespDto;
import com.liquidnet.service.dragon.utils.DataUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
/**
* @author AnJiabin <anjiabin@zhengzai.tv>
* @version V1.0
* @Description: TODO
* @class: AbstractPayChannelStrategyImpl
* @Package com.liquidnet.service.dragon.channel.strategy.impl
* @Copyright: LightNet @ Copyright (c) 2021
* @date 2021/7/16 13:04
*/
@Slf4j
public abstract class AbstractPayChannelStrategyImpl implements IPayChannelStrategy {
@Autowired
private DragonPayBiz dragonPayBiz;
@Autowired
private DataUtils dataUtils;
@Override
public abstract ResponseDto<DragonPayBaseRespDto> dragonPay(DragonPayBaseReqDto dragonPayBaseReqDto);
@Override
public abstract String dragonNotify(HttpServletRequest request, String payType, String deviceFrom);
@Override
public abstract DragonPayOrderQueryRespDto checkOrderStatus(String code);
/**
* 支付成功方法
* @param dragonOrdersDto
* @param bankTrxNo
* @param timeEnd
* @param bankReturnMsg
*/
@Transactional(rollbackFor = Exception.class)
protected void completeSuccessOrder(DragonOrdersDto dragonOrdersDto, String bankTrxNo, LocalDateTime timeEnd, String bankReturnMsg) {
log.info("订单支付成功!");
dragonOrdersDto.setPaymentAt(timeEnd);
dragonOrdersDto.setPaymentId(bankTrxNo);// 设置银行流水号
dragonOrdersDto.setStatus(Integer.parseInt(DragonConstant.PayStatusEnum.STATUS_PAID.getCode()));
//更新缓存
dataUtils.updateOrderStatus(dragonOrdersDto.getCode(),dragonOrdersDto);
//修改订单状态
dragonPayBiz.updateOrderStatus(dragonOrdersDto.getCode(),dragonOrdersDto.getStatus(),bankTrxNo);
//通知商户
dragonPayBiz.sendNotify(dragonPayBiz.buildPayNotifyReqBo(dragonOrdersDto));
}
/**
* 支付失败方法
* @param dragonOrdersDto
* @param bankReturnMsg
*/
protected void completeFailOrder(DragonOrdersDto dragonOrdersDto, String bankReturnMsg) {
log.info("订单支付失败!");
// dragonOrdersDto.setPaymentAt(timeEnd);
// dragonOrdersDto.setPaymentId(bankTrxNo);// 设置银行流水号
dragonOrdersDto.setStatus(Integer.parseInt(DragonConstant.PayStatusEnum.STATUS_PAY_FAIL.getCode()));
//更新缓存
dataUtils.updateOrderStatus(dragonOrdersDto.getCode(),dragonOrdersDto);
//修改订单状态
//修改订单状态
dragonPayBiz.updateOrderStatus(dragonOrdersDto.getCode(),dragonOrdersDto.getStatus(),null);
//通知商户
dragonPayBiz.sendNotify(dragonPayBiz.buildPayNotifyReqBo(dragonOrdersDto));
}
}
......@@ -10,8 +10,8 @@ import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.dragon.channel.alipay.biz.AlipayBiz;
import com.liquidnet.service.dragon.channel.alipay.constant.AlipayConstant;
import com.liquidnet.service.dragon.channel.alipay.strategy.AlipayStrategyContext;
import com.liquidnet.service.dragon.channel.strategy.IPayChannelStrategy;
import com.liquidnet.service.dragon.channel.strategy.annotation.StrategyPayChannelHandler;
import com.liquidnet.service.dragon.channel.strategy.biz.DragonPayBiz;
import com.liquidnet.service.dragon.constant.DragonConstant;
import com.liquidnet.service.dragon.constant.DragonErrorCodeEnum;
import com.liquidnet.service.dragon.dto.DragonOrdersDto;
......@@ -25,7 +25,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
......@@ -44,7 +43,7 @@ import java.util.Map;
@Slf4j
@Component
@StrategyPayChannelHandler(DragonConstant.PayChannelEnum.ALIPAY)
public class PayChannelStrategyAlipayImpl implements IPayChannelStrategy {
public class PayChannelStrategyAlipayImpl extends AbstractPayChannelStrategyImpl {
@Autowired
private AlipayStrategyContext alipayStrategyContext;
......@@ -54,6 +53,9 @@ public class PayChannelStrategyAlipayImpl implements IPayChannelStrategy {
@Autowired
private AlipayBiz alipayBiz;
@Autowired
private DragonPayBiz dragonPayBiz;
@Autowired
private MqHandleUtil mqHandleUtil;
......@@ -84,12 +86,14 @@ public class PayChannelStrategyAlipayImpl implements IPayChannelStrategy {
notifyMap = alipayBiz.parseNotifyMsg(requestParams);
log.info("dragonNotify-->alipay json : {}", JSON.toJSONString(notifyMap));
log.info("接收到{}支付结果{}", payType, notifyMap);
//持久化通知记录
alipayBiz.createDragonOrderLogs(alipayBiz.getPaymentType(payType,deviceFrom),JSON.toJSONString(notifyMap));
String returnStr = null;
String code = notifyMap.get("out_trade_no");
//持久化通知记录
dragonPayBiz.createDragonOrderLogs(code,dragonPayBiz.getPaymentType(payType,deviceFrom),JSON.toJSONString(notifyMap));
//退款
if(notifyMap.containsKey("refund_fee") || notifyMap.containsKey("gmt_refund") || notifyMap.containsKey("out_biz_no")) {
returnStr = dragonOrderRefundsService.aliPayRefundCallBack(JSON.toJSONString(notifyMap));
......@@ -109,25 +113,18 @@ public class PayChannelStrategyAlipayImpl implements IPayChannelStrategy {
if (AlipaySignature.rsaCheckV1(notifyMap, merchantPubKey, "UTF-8", "RSA2")){
String tradeStatus = notifyMap.get("trade_status");
if (AlipayConstant.AlipayTradeStateEnum.TRADE_FINISHED.name().equals(tradeStatus)) {
// 判断该笔订单是否在商户网站中已经做过处理
// 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
// 请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
// 如果有做过处理,不执行商户的业务程序
// 注意:
// 退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
} else if (AlipayConstant.AlipayTradeStateEnum.TRADE_SUCCESS.name().equals(tradeStatus)) {
if (AlipayConstant.AlipayTradeStateEnum.TRADE_SUCCESS.name().equals(tradeStatus)
||AlipayConstant.AlipayTradeStateEnum.TRADE_FINISHED.name().equals(tradeStatus)) {
String gmtPaymentStr = notifyMap.get("gmt_payment");// 付款时间
LocalDateTime timeEnd = null;
if (!StringUtil.isEmpty(gmtPaymentStr)) {
timeEnd = DateUtil.Formatter.yyyyMMddHHmmss.parse(gmtPaymentStr);
}
completeSuccessOrder(dragonOrdersDto, notifyMap.get("trade_no"), timeEnd, notifyMap.toString());
this.completeSuccessOrder(dragonOrdersDto, notifyMap.get("trade_no"), timeEnd, notifyMap.toString());
returnStr = "success";
} else {
// completeFailOrder(dragonOrdersDto, notifyMap.toString());
this.completeFailOrder(dragonOrdersDto, notifyMap.toString());
returnStr = "fail";
}
} else {// 验证失败
......@@ -154,38 +151,4 @@ public class PayChannelStrategyAlipayImpl implements IPayChannelStrategy {
}
return respDto;
}
/**
* 支付成功方法
* @param dragonOrdersDto
* @param bankTrxNo
* @param timeEnd
* @param bankReturnMsg
*/
@Transactional(rollbackFor = Exception.class)
void completeSuccessOrder(DragonOrdersDto dragonOrdersDto, String bankTrxNo, LocalDateTime timeEnd, String bankReturnMsg) {
log.info("订单支付成功!");
dragonOrdersDto.setPaymentAt(timeEnd);
dragonOrdersDto.setPaymentId(bankTrxNo);// 设置银行流水号
dragonOrdersDto.setStatus(Integer.parseInt(DragonConstant.PayStatusEnum.STATUS_PAID.getCode()));
dataUtils.updateOrderStatus(dragonOrdersDto.getCode(),dragonOrdersDto);
//通知商户
alipayBiz.sendNotify(alipayBiz.buildPayNotifyReqBo(dragonOrdersDto));
}
/**
* 支付失败方法
*
* @param DragonOrdersDto
*/
// private void completeFailOrder(DragonOrdersDto dragonOrdersDto, String bankReturnMsg) {
// log.info("订单支付失败!");
//// DragonOrdersDto.(bankReturnMsg);
// dragonOrdersDto.setStatus(Integer.parseInt(DragonConstant.PayStatusEnum.STATUS_PAID.getCode()));
// dataUtils.updateOrderStatus(dragonOrdersDto.getCode(),dragonOrdersDto);
//
// String notifyUrl = dragonOrdersDto.getNotifyUrl();
// }
}
package com.liquidnet.service.dragon.channel.strategy.impl;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.dragon.channel.strategy.IPayChannelStrategy;
import com.liquidnet.service.dragon.channel.strategy.annotation.StrategyPayChannelHandler;
import com.liquidnet.service.dragon.constant.DragonConstant;
import com.liquidnet.service.dragon.dto.DragonPayBaseReqDto;
......@@ -24,7 +23,7 @@ import javax.servlet.http.HttpServletRequest;
@Slf4j
@Component
@StrategyPayChannelHandler(DragonConstant.PayChannelEnum.APPLEPAY)
public class PayChannelStrategyApplepayImpl implements IPayChannelStrategy {
public class PayChannelStrategyApplepayImpl extends AbstractPayChannelStrategyImpl {
@Override
public ResponseDto<DragonPayBaseRespDto> dragonPay(DragonPayBaseReqDto dragonPayBaseReqDto) {
......
......@@ -5,8 +5,8 @@ import com.liquidnet.common.exception.LiquidnetServiceException;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.StringUtil;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.dragon.channel.strategy.IPayChannelStrategy;
import com.liquidnet.service.dragon.channel.strategy.annotation.StrategyPayChannelHandler;
import com.liquidnet.service.dragon.channel.strategy.biz.DragonPayBiz;
import com.liquidnet.service.dragon.channel.wepay.biz.WepayBiz;
import com.liquidnet.service.dragon.channel.wepay.constant.WepayConstant;
import com.liquidnet.service.dragon.channel.wepay.strategy.WepayStrategyContext;
......@@ -22,7 +22,6 @@ import com.liquidnet.service.dragon.utils.PayWepayUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
......@@ -43,7 +42,7 @@ import java.util.Map;
@Slf4j
@Component
@StrategyPayChannelHandler(DragonConstant.PayChannelEnum.WEPAY)
public class PayChannelStrategyWepayImpl implements IPayChannelStrategy {
public class PayChannelStrategyWepayImpl extends AbstractPayChannelStrategyImpl {
@Autowired
private WepayStrategyContext wepayStrategyContext;
......@@ -56,6 +55,9 @@ public class PayChannelStrategyWepayImpl implements IPayChannelStrategy {
@Autowired
private WepayBiz wepayBiz;
@Autowired
private DragonPayBiz dragonPayBiz;
@Override
public ResponseDto<DragonPayBaseRespDto> dragonPay(DragonPayBaseReqDto dragonPayBaseReqDto) {
return wepayStrategyContext.getStrategy(dragonPayBaseReqDto.getDeviceFrom()).dragonPay(dragonPayBaseReqDto);
......@@ -74,6 +76,10 @@ public class PayChannelStrategyWepayImpl implements IPayChannelStrategy {
log.info("接收到{}支付结果{}", payType, notifyMap);
String code = notifyMap.get("out_trade_no");
//持久化通知记录
dragonPayBiz.createDragonOrderLogs(code,dragonPayBiz.getPaymentType(payType,deviceFrom),JSON.toJSONString(notifyMap));
// 根据银行订单号获取支付信息
DragonOrdersDto dragonOrdersDto = dataUtils.getPayOrderByCode(code);
if (dragonOrdersDto == null) {
......@@ -84,21 +90,19 @@ public class PayChannelStrategyWepayImpl implements IPayChannelStrategy {
throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_ERROR_HAS_PAID.getCode(),DragonErrorCodeEnum.TRADE_ERROR_HAS_PAID.getMessage());
}
String partnerKey = "";
String sign = notifyMap.remove("sign");
if (PayWepayUtils.notifySign(notifyMap, sign, partnerKey)) {// 根据配置信息验证签名
if (PayWepayUtils.getInstance().notifySign(notifyMap, sign)) {// 根据配置信息验证签名
if (WepayConstant.WeixinTradeStateEnum.SUCCESS.getCode().equals(notifyMap.get("result_code"))) {// 业务结果
// 成功
String timeEndStr = notifyMap.get("time_end");
LocalDateTime timeEnd = null;
if (!StringUtil.isEmpty(timeEndStr)) {
timeEnd = DateUtil.Formatter.yyyyMMddHHmmss.parse(timeEndStr);
timeEnd = DateUtil.Formatter.yyyyMMddHHmmssTrim.parse(timeEndStr);
}
completeSuccessOrder(dragonOrdersDto, notifyMap.get("transaction_id"), timeEnd, notifyMap.toString());
this.completeSuccessOrder(dragonOrdersDto, notifyMap.get("transaction_id"), timeEnd, notifyMap.toString());
returnStr = "<xml>\n" + " <return_code><![CDATA[SUCCESS]]></return_code>\n" + " <return_msg><![CDATA[OK]]></return_msg>\n" + "</xml>";
} else {
// completeFailOrder(dragonOrdersDto, notifyMap.toString());
this.completeFailOrder(dragonOrdersDto, notifyMap.toString());
}
} else {
throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_WEPAY_SIGN_ERROR.getCode(),DragonErrorCodeEnum.TRADE_WEPAY_SIGN_ERROR.getMessage());
......@@ -118,15 +122,4 @@ public class PayChannelStrategyWepayImpl implements IPayChannelStrategy {
DragonPayOrderQueryRespDto respDto = wepayStrategyContext.getStrategy(DragonConstant.PayTypeEnum.getEnumByCode(ordersDto.getPaymentType()).getDeviceFrom()).checkOrderStatus(code);
return respDto;
}
@Transactional(rollbackFor = Exception.class)
void completeSuccessOrder(DragonOrdersDto dragonOrdersDto, String bankTrxNo, LocalDateTime timeEnd, String bankReturnMsg) {
log.info("订单支付成功!");
dragonOrdersDto.setPaymentAt(timeEnd);
dragonOrdersDto.setPaymentId(bankTrxNo);// 设置银行流水号
dragonOrdersDto.setStatus(Integer.parseInt(DragonConstant.PayStatusEnum.STATUS_PAID.getCode()));
dataUtils.updateOrderStatus(dragonOrdersDto.getCode(),dragonOrdersDto);
wepayBiz.sendNotify(wepayBiz.buildPayNotifyReqBo(dragonOrdersDto));
}
}
package com.liquidnet.service.dragon.channel.wepay.biz;
import com.liquidnet.service.dragon.channel.strategy.biz.DragonPayBiz;
import com.liquidnet.service.dragon.channel.wepay.resp.WepayOrderQueryRespDto;
import com.liquidnet.service.dragon.utils.PayWepayUtils;
import com.liquidnet.service.dragon.utils.XmlUtil;
......@@ -28,7 +27,7 @@ import java.util.TreeMap;
*/
@Slf4j
@Component
public class WepayBiz extends DragonPayBiz{
public class WepayBiz{
@Value("${liquidnet.dragon.wepay.merchantId}")
private String merchantId;
......
......@@ -3,6 +3,7 @@ package com.liquidnet.service.dragon.channel.wepay.strategy.impl;
import com.liquidnet.common.exception.LiquidnetServiceException;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.dragon.channel.strategy.biz.DragonPayBiz;
import com.liquidnet.service.dragon.channel.wepay.biz.WepayBiz;
import com.liquidnet.service.dragon.channel.wepay.constant.WepayConstant;
import com.liquidnet.service.dragon.channel.wepay.resp.WepayOrderQueryRespDto;
......@@ -42,6 +43,9 @@ public abstract class AbstractWepayStrategy implements IWepayStrategy {
@Autowired
private WepayBiz wepayBiz;
@Autowired
private DragonPayBiz dragonPayBiz;
@Override
public ResponseDto<DragonPayBaseRespDto> dragonPay(DragonPayBaseReqDto dragonPayBaseReqDto) {
......@@ -74,7 +78,7 @@ public abstract class AbstractWepayStrategy implements IWepayStrategy {
this.buildResponseDto(respPayDto,respWepayDto);
//支付订单持久化
wepayBiz.buildPayOrders(dragonPayBaseReqDto,respPayDto);
dragonPayBiz.buildPayOrders(dragonPayBaseReqDto,respPayDto);
return ResponseDto.success(respPayDto);
}else{
throw new LiquidnetServiceException(DragonErrorCodeEnum.TRADE_PARAM_ERROR.getCode(),DragonErrorCodeEnum.TRADE_PARAM_ERROR.getMessage());
......
package com.liquidnet.service.dragon.config;
import com.liquidnet.service.dragon.constant.DragonConstant;
import com.liquidnet.service.dragon.receiver.RedisPayNotifyReceiver;
import lombok.var;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.stream.Consumer;
import org.springframework.data.redis.connection.stream.ReadOffset;
import org.springframework.data.redis.connection.stream.StreamOffset;
import org.springframework.data.redis.stream.StreamMessageListenerContainer;
import org.springframework.data.redis.stream.Subscription;
import java.time.Duration;
@Configuration
public class RedisStreamConfig {
@Autowired
private RedisPayNotifyReceiver redisPayNotifyReceiver;
@Bean
public Subscription subscriptionAlipayNotify0(RedisConnectionFactory factory) {
var options = StreamMessageListenerContainer
.StreamMessageListenerContainerOptions
.builder()
.pollTimeout(Duration.ofMillis(1))
.build();
var listenerContainer = StreamMessageListenerContainer.create(factory, options);
var subscription = listenerContainer.receiveAutoAck(Consumer.from(DragonConstant.ChannelRedisQueueEnum.ALIPAY_PAY_GROUP.getCode(), "alipay-pay-notify-0"),
StreamOffset.create(DragonConstant.ChannelRedisQueueEnum.ALIPAY_PAY_KEY.getCode(), ReadOffset.lastConsumed()), redisPayNotifyReceiver);
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionAlipayNotify1(RedisConnectionFactory factory) {
var options = StreamMessageListenerContainer
.StreamMessageListenerContainerOptions
.builder()
.pollTimeout(Duration.ofMillis(1))
.build();
var listenerContainer = StreamMessageListenerContainer.create(factory, options);
var subscription = listenerContainer.receiveAutoAck(Consumer.from(DragonConstant.ChannelRedisQueueEnum.ALIPAY_PAY_GROUP.getCode(), "alipay-pay-notify-1"),
StreamOffset.create(DragonConstant.ChannelRedisQueueEnum.ALIPAY_PAY_KEY.getCode(), ReadOffset.lastConsumed()), redisPayNotifyReceiver);
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionWepayNotify0(RedisConnectionFactory factory) {
var options = StreamMessageListenerContainer
.StreamMessageListenerContainerOptions
.builder()
.pollTimeout(Duration.ofMillis(1))
.build();
var listenerContainer = StreamMessageListenerContainer.create(factory, options);
var subscription = listenerContainer.receiveAutoAck(Consumer.from(DragonConstant.ChannelRedisQueueEnum.WECHAT_PAY_GROUP.getCode(), "wepay-pay-notify-0"),
StreamOffset.create(DragonConstant.ChannelRedisQueueEnum.WECHAT_PAY_KEY.getCode(), ReadOffset.lastConsumed()), redisPayNotifyReceiver);
listenerContainer.start();
return subscription;
}
// @Autowired
// private RedisPayNotifyReceiver redisPayNotifyReceiver;
@Bean
public Subscription subscriptionWepayNotify1(RedisConnectionFactory factory) {
var options = StreamMessageListenerContainer
.StreamMessageListenerContainerOptions
.builder()
.pollTimeout(Duration.ofMillis(1))
.build();
var listenerContainer = StreamMessageListenerContainer.create(factory, options);
var subscription = listenerContainer.receiveAutoAck(Consumer.from(DragonConstant.ChannelRedisQueueEnum.WECHAT_PAY_GROUP.getCode(), "wepay-pay-notify-1"),
StreamOffset.create(DragonConstant.ChannelRedisQueueEnum.WECHAT_PAY_KEY.getCode(), ReadOffset.lastConsumed()), redisPayNotifyReceiver);
listenerContainer.start();
return subscription;
}
// @Bean
// public Subscription subscriptionAlipayNotify0(RedisConnectionFactory factory) {
// var options = StreamMessageListenerContainer
// .StreamMessageListenerContainerOptions
// .builder()
// .pollTimeout(Duration.ofMillis(1))
// .build();
// var listenerContainer = StreamMessageListenerContainer.create(factory, options);
// var subscription = listenerContainer.receiveAutoAck(Consumer.from(DragonConstant.ChannelRedisQueueEnum.ALIPAY_PAY_GROUP.getCode(), "alipay-pay-notify-0"),
// StreamOffset.create(DragonConstant.ChannelRedisQueueEnum.ALIPAY_PAY_KEY.getCode(), ReadOffset.lastConsumed()), redisPayNotifyReceiver);
// listenerContainer.start();
// return subscription;
// }
//
// @Bean
// public Subscription subscriptionAlipayNotify1(RedisConnectionFactory factory) {
// var options = StreamMessageListenerContainer
// .StreamMessageListenerContainerOptions
// .builder()
// .pollTimeout(Duration.ofMillis(1))
// .build();
// var listenerContainer = StreamMessageListenerContainer.create(factory, options);
// var subscription = listenerContainer.receiveAutoAck(Consumer.from(DragonConstant.ChannelRedisQueueEnum.ALIPAY_PAY_GROUP.getCode(), "alipay-pay-notify-1"),
// StreamOffset.create(DragonConstant.ChannelRedisQueueEnum.ALIPAY_PAY_KEY.getCode(), ReadOffset.lastConsumed()), redisPayNotifyReceiver);
// listenerContainer.start();
// return subscription;
// }
//
// @Bean
// public Subscription subscriptionWepayNotify0(RedisConnectionFactory factory) {
// var options = StreamMessageListenerContainer
// .StreamMessageListenerContainerOptions
// .builder()
// .pollTimeout(Duration.ofMillis(1))
// .build();
// var listenerContainer = StreamMessageListenerContainer.create(factory, options);
// var subscription = listenerContainer.receiveAutoAck(Consumer.from(DragonConstant.ChannelRedisQueueEnum.WECHAT_PAY_GROUP.getCode(), "wepay-pay-notify-0"),
// StreamOffset.create(DragonConstant.ChannelRedisQueueEnum.WECHAT_PAY_KEY.getCode(), ReadOffset.lastConsumed()), redisPayNotifyReceiver);
// listenerContainer.start();
// return subscription;
// }
//
// @Bean
// public Subscription subscriptionWepayNotify1(RedisConnectionFactory factory) {
// var options = StreamMessageListenerContainer
// .StreamMessageListenerContainerOptions
// .builder()
// .pollTimeout(Duration.ofMillis(1))
// .build();
// var listenerContainer = StreamMessageListenerContainer.create(factory, options);
// var subscription = listenerContainer.receiveAutoAck(Consumer.from(DragonConstant.ChannelRedisQueueEnum.WECHAT_PAY_GROUP.getCode(), "wepay-pay-notify-1"),
// StreamOffset.create(DragonConstant.ChannelRedisQueueEnum.WECHAT_PAY_KEY.getCode(), ReadOffset.lastConsumed()), redisPayNotifyReceiver);
// listenerContainer.start();
// return subscription;
// }
}
package com.liquidnet.service.dragon.receiver;
import com.liquidnet.commons.lang.util.HttpUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.dragon.bo.PayNotifyReqBo;
import com.liquidnet.service.dragon.dto.PayNotifyDto;
import com.liquidnet.service.dragon.utils.MqHandleUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.stream.MapRecord;
import org.springframework.data.redis.stream.StreamListener;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import java.time.LocalDateTime;
/**
* 支付回调通知商户
*/
@Slf4j
@Component
public class RedisPayNotifyReceiver implements StreamListener<String, MapRecord<String, String, String>> {
@Autowired
private MqHandleUtil mqHandleUtil;
@Override
public void onMessage(MapRecord<String, String, String> message) {
log.info("接受到来自redis notify 的消息");
log.info("message id "+message.getId());
log.info("stream "+message.getStream());
log.info("body "+message.getValue());
this.sendNotify(message.getValue().get("message"));
}
private void sendNotify(String message){
PayNotifyReqBo payNotifyReqBo = JsonUtils.fromJson(message, PayNotifyReqBo.class);
PayNotifyDto payNotifyDto = payNotifyReqBo.getPayNotifyDto();
LocalDateTime nowTime = LocalDateTime.now();
MultiValueMap<String, String> params = new LinkedMultiValueMap();
params.add("status", payNotifyDto.getStatus().toString());
params.add("type", payNotifyDto.getType());
params.add("code", payNotifyDto.getCode());
params.add("paymentId", payNotifyDto.getPaymentId());
params.add("orderCode", payNotifyDto.getOrderCode());
params.add("price", payNotifyDto.getPrice().toString());
params.add("paymentType", payNotifyDto.getPaymentType());
String response = HttpUtil.post(payNotifyReqBo.getNotifyUrl(), params);
log.debug("PAY RESPONSE=" + response);
if (response.equals("success")) {
// MqHandleUtilsendMySqlRedis(
// SqlMapping.get("dragon_order_pay.update"),
// new Object[]{nowTime, DateUtil.Formatter.yyyyMMddHHmmss.format(nowTime), DragonConstant.RefundStatusEnum.STATUS_SUCCESS.getCode(), notifyUrlDto.getRefundCode()}
// );
} else {
// sendMySqlRedis(
// SqlMapping.get("dragon_order_pay.update"),
// new Object[]{nowTime, DateUtil.Formatter.yyyyMMddHHmmss.format(nowTime), DragonConstant.RefundStatusEnum.STATUS_FAIL.getCode(), notifyUrlDto.getRefundCode()}
// );
}
}
}
//package com.liquidnet.service.dragon.receiver;
//
//import com.liquidnet.commons.lang.util.HttpUtil;
//import com.liquidnet.commons.lang.util.JsonUtils;
//import com.liquidnet.service.dragon.bo.PayNotifyReqBo;
//import com.liquidnet.service.dragon.dto.PayNotifyDto;
//import com.liquidnet.service.dragon.utils.MqHandleUtil;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.connection.stream.MapRecord;
//import org.springframework.data.redis.stream.StreamListener;
//import org.springframework.stereotype.Component;
//import org.springframework.util.LinkedMultiValueMap;
//import org.springframework.util.MultiValueMap;
//
//import java.time.LocalDateTime;
//
///**
// * 支付回调通知商户
// */
//@Slf4j
//@Component
//public class RedisPayNotifyReceiver implements StreamListener<String, MapRecord<String, String, String>> {
//
// @Autowired
// private MqHandleUtil mqHandleUtil;
// @Override
// public void onMessage(MapRecord<String, String, String> message) {
// log.info("接受到来自redis notify 的消息");
// log.info("message id "+message.getId());
// log.info("stream "+message.getStream());
// log.info("body "+message.getValue());
// this.sendNotify(message.getValue().get("message"));
// }
//
// private void sendNotify(String message){
// PayNotifyReqBo payNotifyReqBo = JsonUtils.fromJson(message, PayNotifyReqBo.class);
// PayNotifyDto payNotifyDto = payNotifyReqBo.getPayNotifyDto();
// LocalDateTime nowTime = LocalDateTime.now();
// MultiValueMap<String, String> params = new LinkedMultiValueMap();
// params.add("status", payNotifyDto.getStatus().toString());
// params.add("type", payNotifyDto.getType());
// params.add("code", payNotifyDto.getCode());
// params.add("paymentId", payNotifyDto.getPaymentId());
// params.add("orderCode", payNotifyDto.getOrderCode());
// params.add("price", payNotifyDto.getPrice().toString());
// params.add("paymentType", payNotifyDto.getPaymentType());
// String response = HttpUtil.post(payNotifyReqBo.getNotifyUrl(), params);
// log.debug("PAY RESPONSE=" + response);
// if (response.equals("success")) {
//// MqHandleUtilsendMySqlRedis(
//// SqlMapping.get("dragon_order_pay.update"),
//// new Object[]{nowTime, DateUtil.Formatter.yyyyMMddHHmmss.format(nowTime), DragonConstant.RefundStatusEnum.STATUS_SUCCESS.getCode(), notifyUrlDto.getRefundCode()}
//// );
// } else {
//// sendMySqlRedis(
//// SqlMapping.get("dragon_order_pay.update"),
//// new Object[]{nowTime, DateUtil.Formatter.yyyyMMddHHmmss.format(nowTime), DragonConstant.RefundStatusEnum.STATUS_FAIL.getCode(), notifyUrlDto.getRefundCode()}
//// );
// }
// }
//}
......@@ -298,7 +298,7 @@ public class DragonOrderRefundsServiceImpl implements IDragonOrderRefundsService
// 创建退款日志
mqHandleUtil.sendMySqlRedis(
SqlMapping.get("dragon_order_refund_log.insert"),
new Object[]{orderRefundId, paymentType, JSON.toJSONString(response.getBody()), nowTime, nowTime},
new Object[]{orderRefundId, paymentType, response.getBody(), nowTime, nowTime},
DragonConstant.MysqlRedisQueueEnum.DRAGON_REFUND_KEY.getCode()
);
try {
......@@ -376,6 +376,7 @@ public class DragonOrderRefundsServiceImpl implements IDragonOrderRefundsService
dto.setRefundPrice(info.getRefundFee());
dto.setRefundAt(refundAt);
dto.setRefundError(callBackDto.getReturnMsg());
log.debug("SEND WEPAY NOTIFTURL = "+ JSON.toJSONString(dto));
sendNotifyUrl(dto);
mqHandleUtil.sendMySqlRedis(
......@@ -431,12 +432,12 @@ public class DragonOrderRefundsServiceImpl implements IDragonOrderRefundsService
dto.setRefundAt(callBackDto.getGmtRefund());
dto.setRefundPrice(response.getRefundAmount());
dto.setRefundError("");
log.debug("SEND NOTIFTURL = "+ JSON.toJSONString(dto));
log.debug("SEND ALIPAY NOTIFTURL = "+ JSON.toJSONString(dto));
sendNotifyUrl(dto);
mqHandleUtil.sendMySqlRedis(
SqlMapping.get("dragon_order_refund_log.insert"),
new Object[]{response.getOutRequestNo(), response.getRefundReason(), jsonStr, nowTime, nowTime},
new Object[]{callBackDto.getOutBizNo(), "ALIPAY", jsonStr, nowTime, nowTime},
DragonConstant.MysqlRedisQueueEnum.DRAGON_REFUND_KEY.getCode()
);
log.debug("SEND MQ INSERT");
......
......@@ -190,8 +190,8 @@ public class PayWepayUtils {
return this.partnerKey;
}
public static boolean notifySign(Map<String, String> result, String sign, String partnerKey) {
String argNotifySign = getStringByStringMap(result) + "&key=" + partnerKey;
public boolean notifySign(Map<String, String> result, String sign) {
String argNotifySign = getStringByStringMap(result) + "&key=" + this.partnerKey;
String notifySign = MD5Utils.md5(argNotifySign).toUpperCase();
if (notifySign.equals(sign)) {
return true;
......
......@@ -8,7 +8,11 @@ dragon_order_refund_call_back.update=UPDATE `dragon_order_refunds` SET updated_a
dragon_order_refund_log.insert=INSERT INTO `dragon_order_refund_logs`(`order_refund_id` ,`refund_type` ,`content`,`created_at`,`updated_at`)VALUES(?,?,?,?,?);
dragon_orders.insert=insert into dragon_orders(order_id, status, code, type, price, name, detail, order_code, client_ip, notify_url, payment_type, payment_id, payment_at, finished_at, created_at, updated_at, deleted_at) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
dragon_orders.insert=insert into dragon_orders(order_id, status, code, type, price, name, detail, order_code, client_ip, notify_url,notify_status, payment_type, payment_id, payment_at, finished_at, created_at, updated_at, deleted_at) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
dragon_order_logs.insert=insert into dragon_order_logs(code, payment_type, content, created_at, updated_at, deleted_at) values(?,?,?,?,?,?)
dragon_pay_notify.insert=insert into dragon_pay_notify (code, order_code, notify_url, notify_data, created_at, updated_at) values(?,?,?,?,?,?)
dragon_pay_notify_fail.insert=insert into dragon_pay_notify_fail (code, order_code, notify_url, notify_data, fail_desc, created_at, updated_at) values(?,?,?,?,?,?,?)
dragon_order_logs.insert=insert into dragon_order_logs(order_id, payment_type, content, created_at, updated_at, deleted_at) values(?,?,?,?,?,?)
dragon_orders.updateOrderStatus=update dragon_orders t set t.status = ? ,t.payment_id = ?,t.finished_at = ?,t.updated_at =? where t.code = ?
dragon_orders.updateNotifyStatus=update dragon_orders t set t.notify_status = ? ,t.updated_at =? where t.code = ?
......@@ -560,6 +560,7 @@ public class KylinOrderTicketsServiceImpl implements IKylinOrderTicketsOrderServ
currentTime = System.currentTimeMillis() - currentTime;
log.debug("调用 PHP 支付 -> time:" + (currentTime) + "毫秒");
PayResultVo payResultVo = JsonUtils.fromJson(returnData, PayResultVo.class);
log.debug("调用 PHP 支付 结果 -> " +JSON.toJSONString(payResultVo));
payResultVo.getData().setOrderId(orderTicketId);
payResultVo.getData().setPrice(orderTickets.getPriceActual());
orderTickets.setPayCode(payResultVo.getData().getCode());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment