Browse Source

基础配置

release
张彭杰 1 year ago
parent
commit
b12bec7650
14 changed files with 264 additions and 40 deletions
  1. 1
      dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/paymentorder/constant/PaymentMethodEnum.java
  2. 8
      dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/paymentchannelorder/entity/PaymentChannelOrder.java
  3. 6
      dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/request/ThirdPartyField.java
  4. 2
      dating-agency-mall-server/src/main/java/com/qniao/dam/api/query/withdrawaudit/user/request/UserPageWithdrawAuditQueryParams.java
  5. 5
      dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/notify/NotifyApplicationService.java
  6. 21
      dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/PaymentChannelOrderApplicationService.java
  7. 23
      dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/IChannelPayService.java
  8. 135
      dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/wechat/WeChatPayH5Processor.java
  9. 55
      dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/wechat/WeChatPayJsApiProcessor.java
  10. 4
      dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/wechat/utils/WXPayV3Util.java
  11. 7
      dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ThirdOauthConfigDao.java
  12. 9
      dating-agency-mall-server/src/main/java/com/qniao/dam/query/thirdoauthconfig/ThirdOauthConfigQueryService.java
  13. 25
      dating-agency-mall-server/src/main/java/com/qniao/dam/query/thirdoauthconfig/impl/ThirdOauthConfigQueryServiceImpl.java
  14. 3
      dating-agency-mall-server/src/main/resources/mapper/withdrawaudit/WithdrawAuditViewMapper.xml

1
dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/paymentorder/constant/PaymentMethodEnum.java

@ -11,6 +11,7 @@ import lombok.Getter;
public enum PaymentMethodEnum { public enum PaymentMethodEnum {
WECHAT_PAY(1, "微信付款JSAPI"), WECHAT_PAY(1, "微信付款JSAPI"),
WECHAT_PAY_H5(2, "微信付款H5"); WECHAT_PAY_H5(2, "微信付款H5");

8
dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/paymentchannelorder/entity/PaymentChannelOrder.java

@ -1,6 +1,8 @@
package com.qniao.dam.domain.aggregate.paymentchannelorder.entity; package com.qniao.dam.domain.aggregate.paymentchannelorder.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.qniao.dam.domian.aggregate.paymentchannelorder.constant.PaymentChannelOrderStatusEnum; import com.qniao.dam.domian.aggregate.paymentchannelorder.constant.PaymentChannelOrderStatusEnum;
import com.qniao.dam.domian.aggregate.paymentorder.constant.PaymentMethodEnum; import com.qniao.dam.domian.aggregate.paymentorder.constant.PaymentMethodEnum;
import com.qniao.domain.Entity; import com.qniao.domain.Entity;
@ -10,6 +12,7 @@ import lombok.EqualsAndHashCode;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Map;
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@ -22,9 +25,6 @@ public class PaymentChannelOrder extends Entity<PaymentChannelOrder> {
@ApiModelProperty("付款方式") @ApiModelProperty("付款方式")
private PaymentMethodEnum paymentMethod; private PaymentMethodEnum paymentMethod;
@ApiModelProperty("openId")
private String openId;
@ApiModelProperty("应用ID") @ApiModelProperty("应用ID")
private Long appId; private Long appId;
@ -43,5 +43,7 @@ public class PaymentChannelOrder extends Entity<PaymentChannelOrder> {
@ApiModelProperty("状态") @ApiModelProperty("状态")
private PaymentChannelOrderStatusEnum status; private PaymentChannelOrderStatusEnum status;
@TableField(typeHandler = JacksonTypeHandler.class)
private Map<String, String> extInfo;
} }

6
dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/request/ThirdPartyField.java

@ -15,7 +15,7 @@ public class ThirdPartyField {
private String value; private String value;
public static ThirdPartyField findFieldByKey(String specifiedKey, List<ThirdPartyField> fieldList) { public static ThirdPartyField findFieldByKey(String specifiedKey, List<ThirdPartyField> fieldList) {
return fieldList.stream().filter(f -> Objects.equals(f.getKey(), specifiedKey)).findFirst().orElseThrow(() -> new BizException(StrFormatter.format("认证字段[{}]不存在", specifiedKey)));
return fieldList.stream().filter(f -> Objects.equals(f.getKey(), specifiedKey)).findFirst().orElseThrow(() -> new BizException(StrFormatter.format("第三方字段[{}]不存在", specifiedKey)));
} }
public static String findFiledValueByKey(String specifiedKey, List<ThirdPartyField> fieldList) { public static String findFiledValueByKey(String specifiedKey, List<ThirdPartyField> fieldList) {
@ -23,5 +23,7 @@ public class ThirdPartyField {
} }
public static final String JS_CODE = "jsCode"; public static final String JS_CODE = "jsCode";
public static final String OPEN_ID = "openId";
public static final String PAYER_CLIENT_IP = "payerClientIp";
public static final String H5_INFO_TYPE = "h5InfoType";
} }

2
dating-agency-mall-server/src/main/java/com/qniao/dam/api/query/withdrawaudit/user/request/UserPageWithdrawAuditQueryParams.java

@ -9,6 +9,8 @@ import java.time.LocalDateTime;
@Data @Data
public class UserPageWithdrawAuditQueryParams { public class UserPageWithdrawAuditQueryParams {
private Long queryUserId;
@ApiModelProperty("申请开始时间") @ApiModelProperty("申请开始时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime applyTimeFrom; private LocalDateTime applyTimeFrom;

5
dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/notify/NotifyApplicationService.java

@ -2,7 +2,7 @@ package com.qniao.dam.application.service.notify;
import com.qniao.dam.api.command.notify.user.response.WeChatNotification; import com.qniao.dam.api.command.notify.user.response.WeChatNotification;
import com.qniao.dam.api.command.notify.user.response.WeChatNotificationVo; import com.qniao.dam.api.command.notify.user.response.WeChatNotificationVo;
import com.qniao.dam.application.service.paymentchannelorder.processor.wechat.WeChatPayProcessor;
import com.qniao.dam.application.service.paymentchannelorder.processor.wechat.WeChatPayJsApiProcessor;
import com.qniao.dam.application.service.paymentchannelorder.processor.wechat.utils.WXPayV3Util; import com.qniao.dam.application.service.paymentchannelorder.processor.wechat.utils.WXPayV3Util;
import com.qniao.dam.domain.aggregate.paymentchannelorder.PaymentChannelOrderAggregate; import com.qniao.dam.domain.aggregate.paymentchannelorder.PaymentChannelOrderAggregate;
import com.qniao.dam.domain.aggregate.paymentchannelorder.entity.PaymentChannelOrder; import com.qniao.dam.domain.aggregate.paymentchannelorder.entity.PaymentChannelOrder;
@ -17,7 +17,6 @@ import org.springframework.util.Assert;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Service @Service
@Slf4j @Slf4j
@ -41,7 +40,7 @@ public class NotifyApplicationService extends BaseApplicationService {
PaymentChannelOrder paymentChannelOrder = paymentChannelOrderDao.selectById(notification.getOutTradeNo()); PaymentChannelOrder paymentChannelOrder = paymentChannelOrderDao.selectById(notification.getOutTradeNo());
Assert.notNull(paymentChannelOrder, "支付订单不存在"); Assert.notNull(paymentChannelOrder, "支付订单不存在");
// 更新订单信息 // 更新订单信息
paymentChannelOrder.setPaidTime(LocalDateTime.parse(notification.getSuccessTime(), WeChatPayProcessor.formatter));
paymentChannelOrder.setPaidTime(LocalDateTime.parse(notification.getSuccessTime(), WeChatPayJsApiProcessor.formatter));
paymentChannelOrder.setExtOrderNo(notification.getTransactionId()); paymentChannelOrder.setExtOrderNo(notification.getTransactionId());
BaseDomainEvent event = paymentChannelOrderAggregate.paid(paymentChannelOrder); BaseDomainEvent event = paymentChannelOrderAggregate.paid(paymentChannelOrder);
this.sendEvent(event); this.sendEvent(event);

21
dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/PaymentChannelOrderApplicationService.java

@ -6,13 +6,16 @@ import com.qniao.dam.domain.aggregate.paymentchannelorder.PaymentChannelOrderAgg
import com.qniao.dam.domain.aggregate.paymentchannelorder.entity.PaymentChannelOrder; import com.qniao.dam.domain.aggregate.paymentchannelorder.entity.PaymentChannelOrder;
import com.qniao.dam.domain.aggregate.paymentorder.entity.PaymentOrder; import com.qniao.dam.domain.aggregate.paymentorder.entity.PaymentOrder;
import com.qniao.dam.domain.aggregate.paymentorder.repository.PaymentOrderRepository; import com.qniao.dam.domain.aggregate.paymentorder.repository.PaymentOrderRepository;
import com.qniao.dam.query.thirdoauthconfig.ThirdOauthConfigQueryService;
import com.qniao.dam.query.useropenid.UserOpenIdQueryService; import com.qniao.dam.query.useropenid.UserOpenIdQueryService;
import com.qniao.dau.application.UecServerApplicationService; import com.qniao.dau.application.UecServerApplicationService;
import com.qniao.dau.application.request.GetWechatSessionDto; import com.qniao.dau.application.request.GetWechatSessionDto;
import com.qniao.dau.application.response.WeChatAppletUserSessionVo; import com.qniao.dau.application.response.WeChatAppletUserSessionVo;
import com.qniao.dau.domain.aggregate.thirdoauthconfig.valueobj.ThirdOauthConfig;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -20,26 +23,12 @@ import java.util.Map;
public class PaymentChannelOrderApplicationService { public class PaymentChannelOrderApplicationService {
@Resource @Resource
private PaymentOrderRepository paymentOrderRepository;
@Resource
private PaymentChannelOrderAggregate paymentChannelOrderAggregate;
@Resource
private UecServerApplicationService uecServerApplicationService;
private ThirdOauthConfigQueryService thirdOauthConfigQueryService;
/** /**
* todo 旧的付款单失效处理 * todo 旧的付款单失效处理
*/ */
public Map<String, String> prePay(PaymentChannelOrder paymentChannelOrder, List<ThirdPartyField> fieldList, Long appFrom) { public Map<String, String> prePay(PaymentChannelOrder paymentChannelOrder, List<ThirdPartyField> fieldList, Long appFrom) {
// 获取账号
String jsCode = ThirdPartyField.findFiledValueByKey(ThirdPartyField.JS_CODE, fieldList);
GetWechatSessionDto sessionDto = new GetWechatSessionDto(jsCode, appFrom);
WeChatAppletUserSessionVo sessionVo = uecServerApplicationService.getWechatSession(sessionDto);
PaymentOrder paymentOrder = paymentOrderRepository.load(paymentChannelOrder.getTxnOrderId());
paymentChannelOrder.setOpenId(sessionVo.getOpenid());
paymentChannelOrder.setAmount(paymentOrder.getUnpaidAmount());
paymentChannelOrder.setComment("订单交易");
paymentChannelOrderAggregate.create(paymentChannelOrder);
IChannelPayService channelPayService = IChannelPayService.getService(paymentChannelOrder.getPaymentMethod()); IChannelPayService channelPayService = IChannelPayService.getService(paymentChannelOrder.getPaymentMethod());
return channelPayService.prepay(paymentChannelOrder, sessionVo.getPlatformAppId(), sessionVo.getOpenid());
return channelPayService.prepay(paymentChannelOrder, fieldList,appFrom);
} }
} }

23
dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/IChannelPayService.java

@ -1,30 +1,45 @@
package com.qniao.dam.application.service.paymentchannelorder.processor; package com.qniao.dam.application.service.paymentchannelorder.processor;
import com.qniao.dam.api.command.paymentchannelorder.user.request.ThirdPartyField; import com.qniao.dam.api.command.paymentchannelorder.user.request.ThirdPartyField;
import com.qniao.dam.application.service.paymentchannelorder.processor.wechat.WeChatPayProcessor;
import com.qniao.dam.application.service.paymentchannelorder.processor.wechat.WeChatPayH5Processor;
import com.qniao.dam.application.service.paymentchannelorder.processor.wechat.WeChatPayJsApiProcessor;
import com.qniao.dam.domain.aggregate.paymentchannelorder.entity.PaymentChannelOrder; import com.qniao.dam.domain.aggregate.paymentchannelorder.entity.PaymentChannelOrder;
import com.qniao.dam.domain.aggregate.paymentorderrefund.entity.PaymentOrderRefund; import com.qniao.dam.domain.aggregate.paymentorderrefund.entity.PaymentOrderRefund;
import com.qniao.dam.domian.aggregate.paymentorder.constant.PaymentMethodEnum; import com.qniao.dam.domian.aggregate.paymentorder.constant.PaymentMethodEnum;
import com.qniao.dau.application.response.WeChatAppletUserSessionVo;
import com.qniao.dam.query.thirdoauthconfig.ThirdOauthConfigQueryService;
import com.qniao.dau.domain.aggregate.thirdoauthconfig.valueobj.ThirdOauthConfig;
import com.qniao.dau.domian.aggregate.authorization.constant.OAuthPlatformEnum;
import com.qniao.framework.exception.BizException; import com.qniao.framework.exception.BizException;
import com.qniao.framework.utils.SpringContextUtil; import com.qniao.framework.utils.SpringContextUtil;
import javax.annotation.Resource;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
public abstract class IChannelPayService { public abstract class IChannelPayService {
@Resource
private ThirdOauthConfigQueryService thirdOauthConfigQueryService;
public static IChannelPayService getService(PaymentMethodEnum paymentMethod) { public static IChannelPayService getService(PaymentMethodEnum paymentMethod) {
switch (paymentMethod) { switch (paymentMethod) {
case WECHAT_PAY: case WECHAT_PAY:
return SpringContextUtil.getBean(WeChatPayProcessor.class);
return SpringContextUtil.getBean(WeChatPayJsApiProcessor.class);
case WECHAT_PAY_H5:
return SpringContextUtil.getBean(WeChatPayH5Processor.class);
default: default:
throw new BizException("invalid auth method"); throw new BizException("invalid auth method");
} }
} }
public abstract Map<String, String> prepay(PaymentChannelOrder paymentChannelOrder, String platformAppId, String openId);
public abstract Map<String, String> prepay(PaymentChannelOrder paymentChannelOrder, List<ThirdPartyField> fieldList, Long appFrom);
public abstract void refund(PaymentOrderRefund paymentOrderRefund); public abstract void refund(PaymentOrderRefund paymentOrderRefund);
protected ThirdOauthConfig getThirdOauthConfig(Long appId) {
return thirdOauthConfigQueryService.queryByAppId(appId, getOAuthPlatform());
}
public abstract OAuthPlatformEnum getOAuthPlatform();
} }

135
dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/wechat/WeChatPayH5Processor.java

@ -0,0 +1,135 @@
package com.qniao.dam.application.service.paymentchannelorder.processor.wechat;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.qniao.dam.api.command.paymentchannelorder.user.request.ThirdPartyField;
import com.qniao.dam.application.service.paymentchannelorder.processor.IChannelPayService;
import com.qniao.dam.application.service.paymentchannelorder.processor.wechat.utils.WXPayV3Util;
import com.qniao.dam.domain.aggregate.paymentchannelorder.PaymentChannelOrderAggregate;
import com.qniao.dam.domain.aggregate.paymentchannelorder.entity.PaymentChannelOrder;
import com.qniao.dam.domain.aggregate.paymentorder.entity.PaymentOrder;
import com.qniao.dam.domain.aggregate.paymentorder.repository.PaymentOrderRepository;
import com.qniao.dam.domain.aggregate.paymentorderrefund.entity.PaymentOrderRefund;
import com.qniao.dau.domain.aggregate.thirdoauthconfig.valueobj.ThirdOauthConfig;
import com.qniao.dau.domian.aggregate.authorization.constant.OAuthPlatformEnum;
import com.qniao.framework.exception.BizException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
@Slf4j
public class WeChatPayH5Processor extends IChannelPayService {
@Value("${weixin.apiV3Key}")
private String v3Key;
@Value("${weixin.mchid}")
private String mchId;
@Value("${weixin.notifyurl}")
private String notifyUrl;
@Resource
private WXPayV3Util wxPayV3Util;
@Resource
private PaymentOrderRepository paymentOrderRepository;
@Resource
private PaymentChannelOrderAggregate paymentChannelOrderAggregate;
public static DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
@Override
public Map<String, String> prepay(PaymentChannelOrder paymentChannelOrder,
List<ThirdPartyField> fieldList,
Long appFrom) {
try {
ThirdOauthConfig thirdOauthConfig = getThirdOauthConfig(appFrom);
PaymentOrder paymentOrder = paymentOrderRepository.load(paymentChannelOrder.getTxnOrderId());
paymentChannelOrder.setAmount(paymentOrder.getUnpaidAmount());
paymentChannelOrder.setComment("订单交易");
//额外信息
Map<String, String> extInfo = new HashMap<>();
String payerClientIp = ThirdPartyField.findFiledValueByKey(ThirdPartyField.PAYER_CLIENT_IP, fieldList);
String h5InfoType = ThirdPartyField.findFiledValueByKey(ThirdPartyField.H5_INFO_TYPE, fieldList);
extInfo.put(ThirdPartyField.PAYER_CLIENT_IP, payerClientIp);
extInfo.put(ThirdPartyField.H5_INFO_TYPE, h5InfoType);
paymentChannelOrder.setExtInfo(extInfo);
paymentChannelOrderAggregate.create(paymentChannelOrder);
Map<String, Object> reqParams = new HashMap<>();
reqParams.put("appid", thirdOauthConfig.getPlatformAppid());
reqParams.put("mchid", mchId);
reqParams.put("description", paymentChannelOrder.getComment());
reqParams.put("out_trade_no", paymentChannelOrder.getId().toString());
reqParams.put("notify_url", notifyUrl);
reqParams.put("amount", new HashMap<String, Object>() {
{
put("total", paymentChannelOrder.getAmount().multiply(BigDecimal.valueOf(100)).intValue());
put("currency", "CNY");
}
});
reqParams.put("scene_info", new HashMap<String, Object>() {
{
put("payer_client_ip", payerClientIp);
}
});
reqParams.put("h5_info", new HashMap<String, Object>() {
{
put("type", h5InfoType);
}
});
JSONObject result = wxPayV3Util.doPostWeiXinV3(WXPayV3Util.api_v3_h5_placeAnOrder_url, JSONUtil.toJsonStr(reqParams));
if (ObjectUtil.isNull(result.get("h5_url"))) {
throw new BizException("微信支付下单失败,请检查配置");
}
Map<String, String> returnMap = new HashMap<>();
String h5Url = result.getString("h5_url");
returnMap.put("h5Url", h5Url);
log.info("returnMap________" + returnMap);
return returnMap;
} catch (Exception e) {
log.error("发起微信预支付失败:{}", e.getMessage());
throw new BizException("发起微信预支付失败");
}
}
@Override
public void refund(PaymentOrderRefund paymentOrderRefund) {
try {
Map<String, Object> reqParams = new HashMap<>();
reqParams.put("out_trade_no", paymentOrderRefund.getPaymentChannelOrder().toString());
reqParams.put("out_refund_no", paymentOrderRefund.getId().toString());
reqParams.put("amount", new HashMap<String, Object>() {
{
put("refund", paymentOrderRefund.getRefundAmount().multiply(BigDecimal.valueOf(100)).intValue());
put("total", paymentOrderRefund.getOrderAmount().multiply(BigDecimal.valueOf(100)).intValue());
put("currency", "CNY");
}
});
JSONObject result = wxPayV3Util.doPostWeiXinV3(WXPayV3Util.api_v3_refund_url, JSONUtil.toJsonStr(reqParams));
log.error("微信退款申请返回报文:{}", result.toJSONString());
if (ObjectUtil.isNull(result.get("refund_id"))) {
throw new BizException("微信退款申请失败,请检查配置");
}
paymentOrderRefund.setRefundId(result.getString("refund_id"));
String refundTime = result.getString("create_time");
paymentOrderRefund.setRefundTime(LocalDateTime.parse(refundTime, WeChatPayJsApiProcessor.formatter));
paymentOrderRefund.setStatus(WeChatPayJsApiProcessor.transformRefundStatus(result.getString("status")));
} catch (Exception e) {
log.error("发起微信退款申请失败:{}", e.getMessage());
throw new BizException("发起微信退款申请失败");
}
}
@Override
public OAuthPlatformEnum getOAuthPlatform() {
return OAuthPlatformEnum.WeChatMiniProgram;
}
}

dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/wechat/WeChatPayProcessor.java → dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/wechat/WeChatPayJsApiProcessor.java

@ -3,11 +3,20 @@ package com.qniao.dam.application.service.paymentchannelorder.processor.wechat;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.qniao.dam.api.command.paymentchannelorder.user.request.ThirdPartyField;
import com.qniao.dam.application.service.paymentchannelorder.processor.IChannelPayService; import com.qniao.dam.application.service.paymentchannelorder.processor.IChannelPayService;
import com.qniao.dam.application.service.paymentchannelorder.processor.wechat.utils.WXPayV3Util; import com.qniao.dam.application.service.paymentchannelorder.processor.wechat.utils.WXPayV3Util;
import com.qniao.dam.domain.aggregate.paymentchannelorder.PaymentChannelOrderAggregate;
import com.qniao.dam.domain.aggregate.paymentchannelorder.entity.PaymentChannelOrder; import com.qniao.dam.domain.aggregate.paymentchannelorder.entity.PaymentChannelOrder;
import com.qniao.dam.domain.aggregate.paymentorder.entity.PaymentOrder;
import com.qniao.dam.domain.aggregate.paymentorder.repository.PaymentOrderRepository;
import com.qniao.dam.domain.aggregate.paymentorderrefund.entity.PaymentOrderRefund; import com.qniao.dam.domain.aggregate.paymentorderrefund.entity.PaymentOrderRefund;
import com.qniao.dam.domian.aggregate.paymentorderrefund.constant.PaymentOrderRefundStatusEnum; import com.qniao.dam.domian.aggregate.paymentorderrefund.constant.PaymentOrderRefundStatusEnum;
import com.qniao.dau.application.UecServerApplicationService;
import com.qniao.dau.application.request.GetWechatSessionDto;
import com.qniao.dau.application.response.WeChatAppletUserSessionVo;
import com.qniao.dau.domain.aggregate.thirdoauthconfig.valueobj.ThirdOauthConfig;
import com.qniao.dau.domian.aggregate.authorization.constant.OAuthPlatformEnum;
import com.qniao.framework.exception.BizException; import com.qniao.framework.exception.BizException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
@ -18,11 +27,12 @@ import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
@Service @Service
@Slf4j @Slf4j
public class WeChatPayProcessor extends IChannelPayService {
public class WeChatPayJsApiProcessor extends IChannelPayService {
@Value("${weixin.apiV3Key}") @Value("${weixin.apiV3Key}")
private String v3Key; private String v3Key;
@ -32,18 +42,36 @@ public class WeChatPayProcessor extends IChannelPayService {
private String notifyUrl; private String notifyUrl;
@Resource @Resource
private WXPayV3Util wxPayV3Util; private WXPayV3Util wxPayV3Util;
@Resource
private UecServerApplicationService uecServerApplicationService;
@Resource
private PaymentOrderRepository paymentOrderRepository;
@Resource
private PaymentChannelOrderAggregate paymentChannelOrderAggregate;
public static DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME; public static DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
@Override @Override
public Map<String, String> prepay(PaymentChannelOrder paymentChannelOrder, public Map<String, String> prepay(PaymentChannelOrder paymentChannelOrder,
String platformAppId,
String openId) {
List<ThirdPartyField> fieldList,
Long appFrom) {
try { try {
ThirdOauthConfig thirdOauthConfig = getThirdOauthConfig(appFrom);
String jsCode = ThirdPartyField.findFiledValueByKey(ThirdPartyField.JS_CODE, fieldList);
GetWechatSessionDto sessionDto = new GetWechatSessionDto(jsCode, appFrom);
WeChatAppletUserSessionVo sessionVo = uecServerApplicationService.getWechatSession(sessionDto);
PaymentOrder paymentOrder = paymentOrderRepository.load(paymentChannelOrder.getTxnOrderId());
paymentChannelOrder.setAmount(paymentOrder.getUnpaidAmount());
paymentChannelOrder.setComment("订单交易");
//额外信息
Map<String, String> extInfo = new HashMap<>();
extInfo.put(ThirdPartyField.OPEN_ID, sessionVo.getOpenid());
paymentChannelOrder.setExtInfo(extInfo);
paymentChannelOrderAggregate.create(paymentChannelOrder);
Map<String, Object> reqParams = new HashMap<>(); Map<String, Object> reqParams = new HashMap<>();
reqParams.put("mchid", mchId); reqParams.put("mchid", mchId);
reqParams.put("out_trade_no", paymentChannelOrder.getId().toString()); reqParams.put("out_trade_no", paymentChannelOrder.getId().toString());
reqParams.put("appid", platformAppId);
reqParams.put("appid", thirdOauthConfig.getOauthPlatform());
reqParams.put("description", paymentChannelOrder.getComment()); reqParams.put("description", paymentChannelOrder.getComment());
reqParams.put("notify_url", notifyUrl); reqParams.put("notify_url", notifyUrl);
reqParams.put("amount", new HashMap<String, Object>() { reqParams.put("amount", new HashMap<String, Object>() {
@ -54,10 +82,10 @@ public class WeChatPayProcessor extends IChannelPayService {
}); });
reqParams.put("payer", new HashMap<String, Object>() { reqParams.put("payer", new HashMap<String, Object>() {
{ {
put("openid", openId);
put("openid", sessionVo.getOpenid());
} }
}); });
JSONObject result = wxPayV3Util.doPostWeiXinV3(WXPayV3Util.api_v3_placeAnOrder_url, JSONUtil.toJsonStr(reqParams));
JSONObject result = wxPayV3Util.doPostWeiXinV3(WXPayV3Util.api_v3_jsapi_placeAnOrder_url, JSONUtil.toJsonStr(reqParams));
if (ObjectUtil.isNull(result.get("prepay_id"))) { if (ObjectUtil.isNull(result.get("prepay_id"))) {
throw new BizException("微信支付下单失败,请检查配置"); throw new BizException("微信支付下单失败,请检查配置");
} }
@ -68,14 +96,14 @@ public class WeChatPayProcessor extends IChannelPayService {
long timestamp = System.currentTimeMillis() / 1000; long timestamp = System.currentTimeMillis() / 1000;
String sign; String sign;
try { try {
sign = wxPayV3Util.sign(platformAppId, timestamp, nonceStr, "prepay_id=" + prepayId);
sign = wxPayV3Util.sign(thirdOauthConfig.getPlatformAppid(), timestamp, nonceStr, "prepay_id=" + prepayId);
} catch (Exception e) { } catch (Exception e) {
log.error(" sign fail AppV3PayStrategyImpl {}", e.getMessage(), e); log.error(" sign fail AppV3PayStrategyImpl {}", e.getMessage(), e);
throw new BizException("生成签名错误:" + e.getMessage()); throw new BizException("生成签名错误:" + e.getMessage());
} }
log.info("sign____________________" + sign); log.info("sign____________________" + sign);
Map<String, String> returnMap = new HashMap<>(); Map<String, String> returnMap = new HashMap<>();
returnMap.put("appId", platformAppId);
returnMap.put("appId", thirdOauthConfig.getPlatformAppid());
returnMap.put("nonceStr", nonceStr); returnMap.put("nonceStr", nonceStr);
returnMap.put("timeStamp", String.valueOf(timestamp)); returnMap.put("timeStamp", String.valueOf(timestamp));
returnMap.put("packages", "prepay_id=" + prepayId); returnMap.put("packages", "prepay_id=" + prepayId);
@ -109,7 +137,7 @@ public class WeChatPayProcessor extends IChannelPayService {
} }
paymentOrderRefund.setRefundId(result.getString("refund_id")); paymentOrderRefund.setRefundId(result.getString("refund_id"));
String refundTime = result.getString("create_time"); String refundTime = result.getString("create_time");
paymentOrderRefund.setRefundTime(LocalDateTime.parse(refundTime, WeChatPayProcessor.formatter));
paymentOrderRefund.setRefundTime(LocalDateTime.parse(refundTime, WeChatPayJsApiProcessor.formatter));
paymentOrderRefund.setStatus(transformRefundStatus(result.getString("status"))); paymentOrderRefund.setStatus(transformRefundStatus(result.getString("status")));
} catch (Exception e) { } catch (Exception e) {
log.error("发起微信退款申请失败:{}", e.getMessage()); log.error("发起微信退款申请失败:{}", e.getMessage());
@ -117,7 +145,12 @@ public class WeChatPayProcessor extends IChannelPayService {
} }
} }
private PaymentOrderRefundStatusEnum transformRefundStatus(String status) {
@Override
public OAuthPlatformEnum getOAuthPlatform() {
return OAuthPlatformEnum.WeChatMiniProgram;
}
public static PaymentOrderRefundStatusEnum transformRefundStatus(String status) {
PaymentOrderRefundStatusEnum refundStatus = null; PaymentOrderRefundStatusEnum refundStatus = null;
switch (status) { switch (status) {
case "SUCCESS": case "SUCCESS":

4
dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/wechat/utils/WXPayV3Util.java

@ -43,7 +43,9 @@ import java.util.stream.Stream;
@Slf4j @Slf4j
public class WXPayV3Util { public class WXPayV3Util {
public static final String api_v3_placeAnOrder_url = "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi";
public static final String api_v3_jsapi_placeAnOrder_url = "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi";
public static final String api_v3_h5_placeAnOrder_url = "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi";
public static final String api_v3_refund_url = "https://api.mch.weixin.qq.com/v3/refund/domestic/refunds"; public static final String api_v3_refund_url = "https://api.mch.weixin.qq.com/v3/refund/domestic/refunds";

7
dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ThirdOauthConfigDao.java

@ -0,0 +1,7 @@
package com.qniao.dam.infrastructure.persistent.dao.domain;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qniao.dau.domain.aggregate.thirdoauthconfig.valueobj.ThirdOauthConfig;
public interface ThirdOauthConfigDao extends BaseMapper<ThirdOauthConfig> {
}

9
dating-agency-mall-server/src/main/java/com/qniao/dam/query/thirdoauthconfig/ThirdOauthConfigQueryService.java

@ -0,0 +1,9 @@
package com.qniao.dam.query.thirdoauthconfig;
import com.qniao.dau.domain.aggregate.thirdoauthconfig.valueobj.ThirdOauthConfig;
import com.qniao.dau.domian.aggregate.authorization.constant.OAuthPlatformEnum;
public interface ThirdOauthConfigQueryService {
ThirdOauthConfig queryByAppId(Long appId, OAuthPlatformEnum oauthPlatform);
}

25
dating-agency-mall-server/src/main/java/com/qniao/dam/query/thirdoauthconfig/impl/ThirdOauthConfigQueryServiceImpl.java

@ -0,0 +1,25 @@
package com.qniao.dam.query.thirdoauthconfig.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qniao.dam.infrastructure.persistent.dao.domain.ThirdOauthConfigDao;
import com.qniao.dam.query.thirdoauthconfig.ThirdOauthConfigQueryService;
import com.qniao.dau.domain.aggregate.thirdoauthconfig.valueobj.ThirdOauthConfig;
import com.qniao.dau.domian.aggregate.authorization.constant.OAuthPlatformEnum;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class ThirdOauthConfigQueryServiceImpl implements ThirdOauthConfigQueryService {
@Resource
private ThirdOauthConfigDao thirdOauthConfigDao;
@Override
public ThirdOauthConfig queryByAppId(Long appId, OAuthPlatformEnum oauthPlatform) {
return thirdOauthConfigDao.selectOne(new LambdaQueryWrapper<ThirdOauthConfig>()
.eq(ThirdOauthConfig::getAppId, appId)
.eq(ThirdOauthConfig::getOauthPlatform, oauthPlatform)
.last("limit 1"));
}
}

3
dating-agency-mall-server/src/main/resources/mapper/withdrawaudit/WithdrawAuditViewMapper.xml

@ -15,6 +15,9 @@
from da_withdraw_audit as dwa from da_withdraw_audit as dwa
LEFT JOIN da_matchmaker as dm on dwa.wallet_account_user_id=dm.user_id and dm.is_delete=0 LEFT JOIN da_matchmaker as dm on dwa.wallet_account_user_id=dm.user_id and dm.is_delete=0
where dwa.is_delete=0 where dwa.is_delete=0
<if test="queryParams.queryUserId != null">
and dm.user_id = #{queryParams.queryUserId}
</if>
<if test="queryParams.status != null"> <if test="queryParams.status != null">
and dwa.`status` = #{queryParams.status} and dwa.`status` = #{queryParams.status}
</if> </if>

Loading…
Cancel
Save