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

Commit 92e9c22a authored by jiangxiulong's avatar jiangxiulong

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

parents e4b9eea0 21cb3fba
......@@ -217,10 +217,16 @@ public class DragonConstant {
* MYSQL_REDIS_QUEUE
*/
public enum MysqlRedisQueueEnum{
//支付相关队列
DRAGON_PAY_KEY("dragon:stream:dragon-pay","同步数据-支付"),
DRAGON_REFUND_KEY ("dragon:stream:dragon-refund","同步数据-退款"),
DRAGON_PAY_GROUP("dragon-pay-group","同步数据-支付-组"),
DRAGON_REFUND_GROUP ("dragon-refund-group","同步数据-退款-组");
DRAGON_REFUND_GROUP ("dragon-refund-group","同步数据-退款-组"),
//商户通知相关队列
DRAGON_PAY_NOTIFY_KEY("dragon-pay-notify-key","支付异步通知"),
DRAGON_PAY_NOTIFY_GROUP ("dragon-pay-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) {
......@@ -237,6 +243,7 @@ public class DragonConstant {
* CHANNEL_REDIS_QUEUE
*/
public enum ChannelRedisQueueEnum{
//支付回调相关队列
WECHAT_PAY_KEY("wechat-pay","微信-支付-回调"),
WECHAT_REFUND_KEY("wechat-refund","微信-退款-回调"),
ALIPAY_PAY_KEY("alipay-pay","支付宝-支付-回调"),
......@@ -245,6 +252,7 @@ public class DragonConstant {
WECHAT_REFUND_GROUP("wechat-refund-group","微信-退款-回调-组"),
ALIPAY_PAY_GROUP("alipay-pay-group","支付宝-支付-回调-组"),
ALIPAY_REFUND_GROUP ("alipay-refund-group","支付宝-退款-回调-组");
private String code;
private String message;
ChannelRedisQueueEnum(String code, String message) {
......
......@@ -10,7 +10,7 @@ import javax.servlet.http.HttpServletRequest;
public interface IDragonOrdersService {
ResponseDto<DragonPayBaseRespDto> dragonPay(DragonPayBaseReqDto dragonPayBaseReqDto);
void dragonNotify(HttpServletRequest request,String payType,String deviceFrom);
String dragonNotify(HttpServletRequest request,String payType,String deviceFrom);
DragonPayOrderQueryRespDto checkOrderStatusByCode(String code);
......
package com.liquidnet.commons.lang.util;
import org.apache.commons.lang3.StringUtils;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
......@@ -67,7 +65,11 @@ public class IDGenerator {
}
public static void main(String[] args) {
System.out.println(IDGenerator.payCode());
System.out.println(IDGenerator.refundCode());
System.out.println(""+IDGenerator.payCode());
System.out.println(""+IDGenerator.refundCode());
System.out.println("nextTimeId==="+IDGenerator.nextTimeId());
System.out.println("nextMilliId==="+IDGenerator.nextMilliId());
System.out.println("nextSnowId==="+IDGenerator.nextSnowId());
System.out.println("get32UUID==="+IDGenerator.get32UUID());
}
}
......@@ -17,6 +17,10 @@ public class DragonOrders implements Serializable {
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* order_id
*/
private String orderId;
/**
* status
*/
......
......@@ -335,19 +335,20 @@ public class AdamLoginController {
@ApiOperation(value = "微信小程序登录凭证校验", notes = "这里仅用于获取OPENID使用。登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。更多使用方法详见 https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html")
@GetMapping(value = {"wxa/code2session"})
public ResponseDto<String> wxaCode2Session(@RequestParam String jsCode) {
String openId = null;
String openId = null, respJStr = null;
try {
String url = AdamWechatConst.API_URL_JS_CODE2SESSION.replace("APPID", AdamWechatConst.zhengzaiAppletAppid)
.replace("SECRET", AdamWechatConst.zhengzaiAppletSecret).replace("JSCODE", jsCode);
String respJStr = HttpUtil.get(url, null);
JsonNode respJNode = JsonUtils.fromJson(respJStr, JsonNode.class);
if (null == respJNode || !"0".equalsIgnoreCase(respJNode.get("errcode").asText())) {
log.debug("jsCode={},url={}", jsCode, url);
respJStr = HttpUtil.get(url, null);
JsonNode respJNode = JsonUtils.fromJson(respJStr, JsonNode.class), respErrcode;
if (null == respJNode || (((respErrcode = respJNode.get("errcode")) != null) && !"0".equalsIgnoreCase(respErrcode.asText()))) {
log.warn("WX.API调用失败[{}]", respJStr);
return ResponseDto.success(null);
}
openId = respJNode.get("openid").asText();
} catch (Exception e) {
log.error("WX.API调用异常[jsCode:{}]", jsCode, e);
log.error("WX.API调用异常[jsCode:{},respJStr={}]", jsCode, respJStr, e);
}
return ResponseDto.success(openId);
}
......@@ -356,19 +357,20 @@ public class AdamLoginController {
@ApiOperation(value = "微信网站应用登录", notes = "这里仅用于获取OPENID使用。方法详见 https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html")
@GetMapping(value = {"wx/oauth2/access_token"})
public ResponseDto<String> wxOauth2AccessToken(@RequestParam String code) {
String openId = null;
String openId = null, respJStr = null;
try {
String url = AdamWechatConst.API_URL_OAUTH2_ACCESS_TOKEN.replace("APPID", AdamWechatConst.zhengzaiServiceAppid)
.replace("SECRET", AdamWechatConst.zhengzaiServiceSecret).replace("CODE", code);
String respJStr = HttpUtil.get(url, null);
JsonNode respJNode = JsonUtils.fromJson(respJStr, JsonNode.class);
if (null == respJNode || !"0".equalsIgnoreCase(respJNode.get("errcode").asText())) {
log.debug("code={},url={}", code, url);
respJStr = HttpUtil.get(url, null);
JsonNode respJNode = JsonUtils.fromJson(respJStr, JsonNode.class), respErrcode;
if (null == respJNode || (((respErrcode = respJNode.get("errcode")) != null) && !"0".equalsIgnoreCase(respErrcode.asText()))) {
log.warn("WX.API调用失败[{}]", respJStr);
return ResponseDto.success(null);
}
openId = respJNode.get("openid").asText();
} catch (Exception e) {
log.error("WX.API调用异常[code:{}]", code, e);
log.error("WX.API调用异常[jsCode:{},respJStr={}]", code, respJStr, e);
}
return ResponseDto.success(openId);
}
......
......@@ -26,7 +26,7 @@ public class RedisPayReceiver implements StreamListener<String, MapRecord<String
@Override
public void onMessage(MapRecord<String, String, String> message) {
log.info("接受到来自redis REFUND 的消息");
log.info("接受到来自redis PAY 的消息");
System.out.println("message id " + message.getId());
System.out.println("stream " + message.getStream());
System.out.println("body " + message.getValue());
......@@ -42,8 +42,6 @@ public class RedisPayReceiver implements StreamListener<String, MapRecord<String
log.debug("CONSUMER SQL result of execution:{}", rstBatchSqls);
if (rstBatchSqls) {
//应答
} else {
sendMySqlRedis(msg);
}
} catch (Exception e) {
e.printStackTrace();
......@@ -60,7 +58,7 @@ public class RedisPayReceiver implements StreamListener<String, MapRecord<String
try {
HashMap<String, String> map = new HashMap<>();
map.put("message", msg);
MapRecord<String, String, String> record = StreamRecords.mapBacked(map).withStreamKey(DragonConstant.MysqlRedisQueueEnum.DRAGON_REFUND_KEY.getCode());
MapRecord<String, String, String> record = StreamRecords.mapBacked(map).withStreamKey(DragonConstant.MysqlRedisQueueEnum.DRAGON_PAY_KEY.getCode());
stringRedisTemplate.opsForStream().add(record);
return true;
} catch (Exception e) {
......
......@@ -16,6 +16,7 @@ import lombok.Data;
@Data
public class PayNotifyReqBo {
private String notifyUrl;
private String content;
private PayNotifyDto payNotifyDto;
@Override
......
......@@ -20,7 +20,7 @@ import javax.servlet.http.HttpServletRequest;
public interface IPayChannelStrategy {
ResponseDto<DragonPayBaseRespDto> dragonPay(DragonPayBaseReqDto dragonPayBaseReqDto);
void dragonNotify(HttpServletRequest request,String payType,String deviceFrom);
String dragonNotify(HttpServletRequest request,String payType,String deviceFrom);
DragonPayOrderQueryRespDto checkOrderStatus(String code);
}
package com.liquidnet.service.dragon.channel.strategy.biz;
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;
import com.liquidnet.service.dragon.constant.DragonConstant;
......@@ -11,7 +13,10 @@ import com.liquidnet.service.dragon.dto.PayNotifyDto;
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.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import java.time.LocalDateTime;
......@@ -24,6 +29,7 @@ import java.time.LocalDateTime;
* @Copyright: LightNet @ Copyright (c) 2021
* @date 2021/7/14 14:12
*/
@Slf4j
public abstract class DragonPayBiz {
@Autowired
private MqHandleUtil mqHandleUtil;
......@@ -35,6 +41,7 @@ public abstract class DragonPayBiz {
//构造订单
DragonOrders orders = new DragonOrders();
// orders.setMid();
orders.setOrderId(IDGenerator.nextTimeId());
orders.setStatus(Integer.valueOf(DragonConstant.PayStatusEnum.STATUS_UNPAID.getCode()));
orders.setCode(respDto.getCode());
orders.setType(dragonPayBaseReqDto.getType());
......@@ -58,13 +65,14 @@ public abstract class DragonPayBiz {
// 持久化到数据库
boolean insertResult = mqHandleUtil.sendMySqlRedis(
SqlMapping.get("dragon_orders.insert"),
new Object[]{orders.getStatus(), orders.getCode(), orders.getType()
new Object[]{orders.getOrderId(),orders.getStatus(), orders.getCode(), orders.getType()
, orders.getPrice(), orders.getName(), orders.getDetail()
, orders.getOrderCode(), orders.getClientIp()
, orders.getNotifyUrl(), orders.getPaymentType(),
orders.getPaymentId(), orders.getPaymentAt()
, orders.getFinishedAt(), orders.getCreatedAt()
, orders.getUpdatedAt()}
, orders.getUpdatedAt(),orders.getDeletedAt()}
,DragonConstant.MysqlRedisQueueEnum.DRAGON_PAY_KEY.getCode()
);
return orders;
}
......@@ -83,4 +91,48 @@ public abstract class DragonPayBiz {
payNotifyReqBo.setPayNotifyDto(payNotifyDto);
return payNotifyReqBo;
}
public void createDragonOrderLogs(String paymentType,String content){
try {
String orderId = IDGenerator.nextTimeId();
LocalDateTime createAt = LocalDateTime.now();
LocalDateTime updateAt = null;
LocalDateTime deleteAt = null;
boolean insertResult = mqHandleUtil.sendMySqlRedis(
SqlMapping.get("dragon_order_logs.insert"),
new Object[]{orderId,paymentType,content, createAt, updateAt,deleteAt}
,DragonConstant.MysqlRedisQueueEnum.DRAGON_PAY_NOTIFY_KEY.getCode()
);
} catch (Exception e) {
log.error("dragon:createOrderLog:error msg:{}",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()}
// );
}
}
public String getPaymentType(String payType,String deviceFrom){
return (deviceFrom+payType).toUpperCase();
}
}
......@@ -77,12 +77,15 @@ public class PayChannelStrategyAlipayImpl implements IPayChannelStrategy {
}
@Override
public void dragonNotify(HttpServletRequest request,String payType,String deviceFrom) {
public String dragonNotify(HttpServletRequest request,String payType,String deviceFrom) {
log.info("alipay-->notify-->begin payType:{} deviceFrom:{}",payType,deviceFrom);
Map<String, String[]> requestParams = request.getParameterMap();
Map<String, String> notifyMap = new HashMap<String, String>();
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");
......@@ -136,6 +139,8 @@ public class PayChannelStrategyAlipayImpl implements IPayChannelStrategy {
}
log.info("返回支付通道{}信息{}", payType, returnStr);
log.info("alipay-->notify-->end payType:{} deviceFrom:{}",payType,deviceFrom);
return returnStr;
}
@Override
......@@ -162,11 +167,10 @@ public class PayChannelStrategyAlipayImpl implements IPayChannelStrategy {
log.info("订单支付成功!");
dragonOrdersDto.setPaymentAt(timeEnd);
dragonOrdersDto.setPaymentId(bankTrxNo);// 设置银行流水号
// DragonOrdersDto.(bankReturnMsg);
dragonOrdersDto.setStatus(Integer.parseInt(DragonConstant.PayStatusEnum.STATUS_PAID.getCode()));
dataUtils.updateOrderStatus(dragonOrdersDto.getCode(),dragonOrdersDto);
//通知消息入队列
mqHandleUtil.sendQueueAlipay(alipayBiz.buildPayNotifyReqBo(dragonOrdersDto));
//通知商户
alipayBiz.sendNotify(alipayBiz.buildPayNotifyReqBo(dragonOrdersDto));
}
/**
......@@ -182,4 +186,6 @@ public class PayChannelStrategyAlipayImpl implements IPayChannelStrategy {
//
// String notifyUrl = dragonOrdersDto.getNotifyUrl();
// }
}
......@@ -32,8 +32,8 @@ public class PayChannelStrategyApplepayImpl implements IPayChannelStrategy {
}
@Override
public void dragonNotify(HttpServletRequest request,String payType,String deviceFrom) {
public String dragonNotify(HttpServletRequest request,String payType,String deviceFrom) {
return null;
}
@Override
......
......@@ -62,7 +62,8 @@ public class PayChannelStrategyWepayImpl implements IPayChannelStrategy {
}
@Override
public void dragonNotify(HttpServletRequest request,String payType,String deviceFrom) {
public String dragonNotify(HttpServletRequest request,String payType,String deviceFrom) {
String returnStr = "<xml>\n" + " <return_code><![CDATA[FAIL]]></return_code>\n" + " <return_msg><![CDATA[FAIL]]></return_msg>\n" + "</xml>";;
try {
InputStream inputStream = request.getInputStream();// 从request中取得输入流
Map<String, String> notifyMap = new HashMap<String, String>();
......@@ -95,7 +96,7 @@ public class PayChannelStrategyWepayImpl implements IPayChannelStrategy {
timeEnd = DateUtil.Formatter.yyyyMMddHHmmss.parse(timeEndStr);
}
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>";
returnStr = "<xml>\n" + " <return_code><![CDATA[SUCCESS]]></return_code>\n" + " <return_msg><![CDATA[OK]]></return_msg>\n" + "</xml>";
} else {
// completeFailOrder(dragonOrdersDto, notifyMap.toString());
}
......@@ -108,6 +109,7 @@ public class PayChannelStrategyWepayImpl implements IPayChannelStrategy {
} catch (IOException e) {
e.printStackTrace();
}
return returnStr;
}
@Override
......@@ -122,11 +124,9 @@ public class PayChannelStrategyWepayImpl implements IPayChannelStrategy {
log.info("订单支付成功!");
dragonOrdersDto.setPaymentAt(timeEnd);
dragonOrdersDto.setPaymentId(bankTrxNo);// 设置银行流水号
// DragonOrdersDto.(bankReturnMsg);
dragonOrdersDto.setStatus(Integer.parseInt(DragonConstant.PayStatusEnum.STATUS_PAID.getCode()));
dataUtils.updateOrderStatus(dragonOrdersDto.getCode(),dragonOrdersDto);
//通知消息入队列
mqHandleUtil.sendQueueWepay(wepayBiz.buildPayNotifyReqBo(dragonOrdersDto));
wepayBiz.sendNotify(wepayBiz.buildPayNotifyReqBo(dragonOrdersDto));
}
}
package com.liquidnet.service.dragon.controller;
import com.liquidnet.service.dragon.service.IDragonOrderRefundsService;
import com.liquidnet.service.dragon.service.IDragonOrdersService;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
......@@ -39,7 +38,7 @@ public class PayNotifyController {
@ApiImplicitParams({
@ApiImplicitParam(type = "form", required = true, dataType = "String", name = "payType", value = "支付类型:alipay,wepay,iappay", example = "alipay")
})
public void dragonNotify(@PathVariable("payType") String payType,@PathVariable("deviceFrom") String deviceFrom,HttpServletRequest request, HttpServletResponse respone) throws Exception {
dragonOrdersService.dragonNotify(request,payType,deviceFrom);
public String dragonNotify(@PathVariable("payType") String payType,@PathVariable("deviceFrom") String deviceFrom,HttpServletRequest request, HttpServletResponse respone) throws Exception {
return dragonOrdersService.dragonNotify(request,payType,deviceFrom);
}
}
......@@ -41,8 +41,8 @@ public class DragonOrdersServiceImpl implements IDragonOrdersService {
}
@Override
public void dragonNotify(HttpServletRequest request,String payType,String deviceFrom) {
payChannelStrategyContext.getStrategy(payType).dragonNotify(request,payType,deviceFrom);
public String dragonNotify(HttpServletRequest request,String payType,String deviceFrom) {
return payChannelStrategyContext.getStrategy(payType).dragonNotify(request,payType,deviceFrom);
}
@Override
......
......@@ -2,7 +2,6 @@ package com.liquidnet.service.dragon.utils;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.dragon.bo.PayNotifyReqBo;
import com.liquidnet.service.dragon.constant.DragonConstant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.stream.MapRecord;
import org.springframework.data.redis.connection.stream.StreamRecords;
......@@ -31,55 +30,11 @@ public class MqHandleUtil {
* @param payNotifyReqBo
* @return
*/
public boolean sendQueueAlipay(PayNotifyReqBo payNotifyReqBo) {
public boolean sendNotifyErrorQueue(PayNotifyReqBo payNotifyReqBo,String queueKey) {
try {
HashMap<String, String> map = new HashMap<>();
map.put("message", payNotifyReqBo.toString());
MapRecord<String, String, String> record = StreamRecords.mapBacked(map).withStreamKey(DragonConstant.ChannelRedisQueueEnum.ALIPAY_PAY_KEY.getCode());
stringRedisTemplate.opsForStream().add(record);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* REDIS 队列发送消息 通知商户相关
* @param payNotifyReqBo
* @return
*/
public boolean sendQueueWepay(PayNotifyReqBo payNotifyReqBo) {
try {
HashMap<String, String> map = new HashMap<>();
map.put("message", payNotifyReqBo.toString());
MapRecord<String, String, String> record = StreamRecords.mapBacked(map).withStreamKey(DragonConstant.ChannelRedisQueueEnum.WECHAT_PAY_KEY.getCode());
stringRedisTemplate.opsForStream().add(record);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 给 REDIS 队列发送消息 数据库相关
*
* @param sql sql语句
* @param data 需要操作的数据
* @return
*/
public boolean sendMySqlRedis(String sql, Object[] data) {
try {
LinkedList<String> sqls = new LinkedList<>();
sqls.add(sql);
LinkedList<Object[]> sqlsData = new LinkedList();
sqlsData.add(data);
String sqlData = SqlMapping.gets(sqls, sqlsData);
HashMap<String, String> map = new HashMap<>();
map.put("message", sqlData);
MapRecord<String, String, String> record = StreamRecords.mapBacked(map).withStreamKey(DragonConstant.MysqlRedisQueueEnum.DRAGON_PAY_KEY.getCode());
MapRecord<String, String, String> record = StreamRecords.mapBacked(map).withStreamKey(queueKey);
stringRedisTemplate.opsForStream().add(record);
return true;
} catch (Exception e) {
......
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