diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/paymentorder/constant/PaymentMethodEnum.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/paymentorder/constant/PaymentMethodEnum.java index dcb4ead..4b10d15 100644 --- a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/paymentorder/constant/PaymentMethodEnum.java +++ b/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 { WECHAT_PAY(1, "微信付款JSAPI"), + WECHAT_PAY_H5(2, "微信付款H5"); diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/paymentchannelorder/entity/PaymentChannelOrder.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/paymentchannelorder/entity/PaymentChannelOrder.java index 5e93cae..c27de8a 100644 --- a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/paymentchannelorder/entity/PaymentChannelOrder.java +++ b/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; +import com.baomidou.mybatisplus.annotation.TableField; 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.paymentorder.constant.PaymentMethodEnum; import com.qniao.domain.Entity; @@ -10,6 +12,7 @@ import lombok.EqualsAndHashCode; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.Map; @Data @EqualsAndHashCode(callSuper = true) @@ -22,9 +25,6 @@ public class PaymentChannelOrder extends Entity { @ApiModelProperty("付款方式") private PaymentMethodEnum paymentMethod; - @ApiModelProperty("openId") - private String openId; - @ApiModelProperty("应用ID") private Long appId; @@ -43,5 +43,7 @@ public class PaymentChannelOrder extends Entity { @ApiModelProperty("状态") private PaymentChannelOrderStatusEnum status; + @TableField(typeHandler = JacksonTypeHandler.class) + private Map extInfo; } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/request/ThirdPartyField.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/request/ThirdPartyField.java index e8b41e3..d7603da 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/request/ThirdPartyField.java +++ b/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; public static ThirdPartyField findFieldByKey(String specifiedKey, List 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 fieldList) { @@ -23,5 +23,7 @@ public class ThirdPartyField { } 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"; } \ No newline at end of file diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/query/withdrawaudit/user/request/UserPageWithdrawAuditQueryParams.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/query/withdrawaudit/user/request/UserPageWithdrawAuditQueryParams.java index bf8f4a6..ee77be9 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/query/withdrawaudit/user/request/UserPageWithdrawAuditQueryParams.java +++ b/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 public class UserPageWithdrawAuditQueryParams { + private Long queryUserId; + @ApiModelProperty("申请开始时间") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime applyTimeFrom; diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/notify/NotifyApplicationService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/notify/NotifyApplicationService.java index 2839564..d69197b 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/notify/NotifyApplicationService.java +++ b/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.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.domain.aggregate.paymentchannelorder.PaymentChannelOrderAggregate; import com.qniao.dam.domain.aggregate.paymentchannelorder.entity.PaymentChannelOrder; @@ -17,7 +17,6 @@ import org.springframework.util.Assert; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; @Service @Slf4j @@ -41,7 +40,7 @@ public class NotifyApplicationService extends BaseApplicationService { PaymentChannelOrder paymentChannelOrder = paymentChannelOrderDao.selectById(notification.getOutTradeNo()); Assert.notNull(paymentChannelOrder, "支付订单不存在"); // 更新订单信息 - paymentChannelOrder.setPaidTime(LocalDateTime.parse(notification.getSuccessTime(), WeChatPayProcessor.formatter)); + paymentChannelOrder.setPaidTime(LocalDateTime.parse(notification.getSuccessTime(), WeChatPayJsApiProcessor.formatter)); paymentChannelOrder.setExtOrderNo(notification.getTransactionId()); BaseDomainEvent event = paymentChannelOrderAggregate.paid(paymentChannelOrder); this.sendEvent(event); diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/PaymentChannelOrderApplicationService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/PaymentChannelOrderApplicationService.java index 5c765c5..8a6d2c4 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/PaymentChannelOrderApplicationService.java +++ b/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.paymentorder.entity.PaymentOrder; 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.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 org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,26 +23,12 @@ import java.util.Map; public class PaymentChannelOrderApplicationService { @Resource - private PaymentOrderRepository paymentOrderRepository; - @Resource - private PaymentChannelOrderAggregate paymentChannelOrderAggregate; - @Resource - private UecServerApplicationService uecServerApplicationService; - + private ThirdOauthConfigQueryService thirdOauthConfigQueryService; /** * todo 旧的付款单失效处理? */ public Map prePay(PaymentChannelOrder paymentChannelOrder, List 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()); - return channelPayService.prepay(paymentChannelOrder, sessionVo.getPlatformAppId(), sessionVo.getOpenid()); + return channelPayService.prepay(paymentChannelOrder, fieldList,appFrom); } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/IChannelPayService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/IChannelPayService.java index df56b36..9c38aaf 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/IChannelPayService.java +++ b/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; 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.paymentorderrefund.entity.PaymentOrderRefund; 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.utils.SpringContextUtil; +import javax.annotation.Resource; import java.util.List; import java.util.Map; public abstract class IChannelPayService { + @Resource + private ThirdOauthConfigQueryService thirdOauthConfigQueryService; public static IChannelPayService getService(PaymentMethodEnum paymentMethod) { switch (paymentMethod) { case WECHAT_PAY: - return SpringContextUtil.getBean(WeChatPayProcessor.class); + return SpringContextUtil.getBean(WeChatPayJsApiProcessor.class); + case WECHAT_PAY_H5: + return SpringContextUtil.getBean(WeChatPayH5Processor.class); default: throw new BizException("invalid auth method"); } } - public abstract Map prepay(PaymentChannelOrder paymentChannelOrder, String platformAppId, String openId); + public abstract Map prepay(PaymentChannelOrder paymentChannelOrder, List fieldList, Long appFrom); public abstract void refund(PaymentOrderRefund paymentOrderRefund); + + + protected ThirdOauthConfig getThirdOauthConfig(Long appId) { + return thirdOauthConfigQueryService.queryByAppId(appId, getOAuthPlatform()); + } + + public abstract OAuthPlatformEnum getOAuthPlatform(); } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/wechat/WeChatPayH5Processor.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/wechat/WeChatPayH5Processor.java new file mode 100644 index 0000000..dda6330 --- /dev/null +++ b/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 prepay(PaymentChannelOrder paymentChannelOrder, + List fieldList, + Long appFrom) { + try { + ThirdOauthConfig thirdOauthConfig = getThirdOauthConfig(appFrom); + PaymentOrder paymentOrder = paymentOrderRepository.load(paymentChannelOrder.getTxnOrderId()); + paymentChannelOrder.setAmount(paymentOrder.getUnpaidAmount()); + paymentChannelOrder.setComment("订单交易"); + //额外信息 + Map 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 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() { + { + put("total", paymentChannelOrder.getAmount().multiply(BigDecimal.valueOf(100)).intValue()); + put("currency", "CNY"); + } + }); + reqParams.put("scene_info", new HashMap() { + { + put("payer_client_ip", payerClientIp); + } + }); + reqParams.put("h5_info", new HashMap() { + { + 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 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 reqParams = new HashMap<>(); + reqParams.put("out_trade_no", paymentOrderRefund.getPaymentChannelOrder().toString()); + reqParams.put("out_refund_no", paymentOrderRefund.getId().toString()); + reqParams.put("amount", new HashMap() { + { + 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; + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/wechat/WeChatPayProcessor.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/wechat/WeChatPayJsApiProcessor.java similarity index 68% rename from dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/wechat/WeChatPayProcessor.java rename to dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/wechat/WeChatPayJsApiProcessor.java index 04f6611..01bebf0 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/wechat/WeChatPayProcessor.java +++ b/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.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.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 lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -18,11 +27,12 @@ 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 WeChatPayProcessor extends IChannelPayService { +public class WeChatPayJsApiProcessor extends IChannelPayService { @Value("${weixin.apiV3Key}") private String v3Key; @@ -32,18 +42,36 @@ public class WeChatPayProcessor extends IChannelPayService { private String notifyUrl; @Resource private WXPayV3Util wxPayV3Util; + @Resource + private UecServerApplicationService uecServerApplicationService; + @Resource + private PaymentOrderRepository paymentOrderRepository; + @Resource + private PaymentChannelOrderAggregate paymentChannelOrderAggregate; public static DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME; @Override public Map prepay(PaymentChannelOrder paymentChannelOrder, - String platformAppId, - String openId) { - + List fieldList, + Long appFrom) { 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 extInfo = new HashMap<>(); + extInfo.put(ThirdPartyField.OPEN_ID, sessionVo.getOpenid()); + paymentChannelOrder.setExtInfo(extInfo); + paymentChannelOrderAggregate.create(paymentChannelOrder); + Map reqParams = new HashMap<>(); reqParams.put("mchid", mchId); reqParams.put("out_trade_no", paymentChannelOrder.getId().toString()); - reqParams.put("appid", platformAppId); + reqParams.put("appid", thirdOauthConfig.getOauthPlatform()); reqParams.put("description", paymentChannelOrder.getComment()); reqParams.put("notify_url", notifyUrl); reqParams.put("amount", new HashMap() { @@ -54,10 +82,10 @@ public class WeChatPayProcessor extends IChannelPayService { }); reqParams.put("payer", new HashMap() { { - 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"))) { throw new BizException("微信支付下单失败,请检查配置"); } @@ -68,14 +96,14 @@ public class WeChatPayProcessor extends IChannelPayService { long timestamp = System.currentTimeMillis() / 1000; String sign; try { - sign = wxPayV3Util.sign(platformAppId, timestamp, nonceStr, "prepay_id=" + prepayId); + sign = wxPayV3Util.sign(thirdOauthConfig.getPlatformAppid(), timestamp, nonceStr, "prepay_id=" + prepayId); } catch (Exception e) { log.error(" sign fail AppV3PayStrategyImpl {}", e.getMessage(), e); throw new BizException("生成签名错误:" + e.getMessage()); } log.info("sign____________________" + sign); Map returnMap = new HashMap<>(); - returnMap.put("appId", platformAppId); + returnMap.put("appId", thirdOauthConfig.getPlatformAppid()); returnMap.put("nonceStr", nonceStr); returnMap.put("timeStamp", String.valueOf(timestamp)); returnMap.put("packages", "prepay_id=" + prepayId); @@ -109,7 +137,7 @@ public class WeChatPayProcessor extends IChannelPayService { } paymentOrderRefund.setRefundId(result.getString("refund_id")); 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"))); } catch (Exception e) { 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; switch (status) { case "SUCCESS": diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/wechat/utils/WXPayV3Util.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/wechat/utils/WXPayV3Util.java index 101c204..ca50e05 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/wechat/utils/WXPayV3Util.java +++ b/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 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"; diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ThirdOauthConfigDao.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ThirdOauthConfigDao.java new file mode 100644 index 0000000..b488f0d --- /dev/null +++ b/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 { +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/thirdoauthconfig/ThirdOauthConfigQueryService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/thirdoauthconfig/ThirdOauthConfigQueryService.java new file mode 100644 index 0000000..e0e6d9b --- /dev/null +++ b/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); +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/thirdoauthconfig/impl/ThirdOauthConfigQueryServiceImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/thirdoauthconfig/impl/ThirdOauthConfigQueryServiceImpl.java new file mode 100644 index 0000000..78443cd --- /dev/null +++ b/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() + .eq(ThirdOauthConfig::getAppId, appId) + .eq(ThirdOauthConfig::getOauthPlatform, oauthPlatform) + .last("limit 1")); + } +} diff --git a/dating-agency-mall-server/src/main/resources/mapper/withdrawaudit/WithdrawAuditViewMapper.xml b/dating-agency-mall-server/src/main/resources/mapper/withdrawaudit/WithdrawAuditViewMapper.xml index b4c5c3b..a038f8b 100644 --- a/dating-agency-mall-server/src/main/resources/mapper/withdrawaudit/WithdrawAuditViewMapper.xml +++ b/dating-agency-mall-server/src/main/resources/mapper/withdrawaudit/WithdrawAuditViewMapper.xml @@ -15,6 +15,9 @@ 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 where dwa.is_delete=0 + + and dm.user_id = #{queryParams.queryUserId} + and dwa.`status` = #{queryParams.status}