diff --git a/dating-agency-mall-server/pom.xml b/dating-agency-mall-server/pom.xml index fc62dcc..98729a5 100644 --- a/dating-agency-mall-server/pom.xml +++ b/dating-agency-mall-server/pom.xml @@ -82,6 +82,11 @@ dating-agency-service-entity 0.0.1-SNAPSHOT + + com.qniao + dating-agency-uec-sdk + 0.0.1-SNAPSHOT + diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/PaymentChannelOrderUserCommandController.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/PaymentChannelOrderUserCommandController.java index ed811d0..53b6fba 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/PaymentChannelOrderUserCommandController.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/PaymentChannelOrderUserCommandController.java @@ -1,6 +1,8 @@ package com.qniao.dam.api.command.paymentchannelorder.user; +import com.qniao.dam.api.command.paymentchannelorder.user.assembler.ThirdPartyFieldAssembler; import com.qniao.dam.api.command.paymentchannelorder.user.request.PrePayThirdPartyDto; +import com.qniao.dam.api.command.paymentchannelorder.user.request.ThirdPartyField; import com.qniao.dam.application.service.paymentchannelorder.PaymentChannelOrderApplicationService; import com.qniao.dam.domain.aggregate.paymentchannelorder.entity.PaymentChannelOrder; import com.qniao.framework.utils.ServletUtils; @@ -10,6 +12,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.util.List; import java.util.Map; @RestController @@ -24,10 +27,12 @@ public class PaymentChannelOrderUserCommandController { @PostMapping("/pre-pay/third-party") public Map prePayThirdParty(@RequestBody @Validated PrePayThirdPartyDto dto, @RequestParam Long userId) { + Long appFrom = Long.valueOf(ServletUtils.getAppId()); PaymentChannelOrder paymentChannelOrder = dto.trans2Domain(); paymentChannelOrder.setAppId(Long.valueOf(ServletUtils.getAppId())); + List fieldList = ThirdPartyFieldAssembler.from(dto.getAuthFields()); //todo 付款单状态判断 订单支付方式是否满足 - return paymentChannelOrderApplicationService.prePay(paymentChannelOrder, userId); + return paymentChannelOrderApplicationService.prePay(paymentChannelOrder, userId, fieldList,appFrom); } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/assembler/ThirdPartyFieldAssembler.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/assembler/ThirdPartyFieldAssembler.java new file mode 100644 index 0000000..09ead80 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/assembler/ThirdPartyFieldAssembler.java @@ -0,0 +1,13 @@ +package com.qniao.dam.api.command.paymentchannelorder.user.assembler; + +import com.qniao.dam.api.command.paymentchannelorder.user.request.ThirdPartyField; +import com.qniao.dam.api.command.paymentchannelorder.user.request.ThirdPartyFieldDto; +import com.qniao.framework.utils.TypeConvertUtils; + +import java.util.List; + +public abstract class ThirdPartyFieldAssembler { + public static List from(List source) { + return TypeConvertUtils.convert(source, ThirdPartyField.class); + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/request/PrePayThirdPartyDto.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/request/PrePayThirdPartyDto.java index 857dcab..0805315 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/request/PrePayThirdPartyDto.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/request/PrePayThirdPartyDto.java @@ -5,7 +5,6 @@ import com.qniao.dam.domain.aggregate.paymentchannelorder.entity.PaymentChannelO import com.qniao.dam.domian.aggregate.paymentorder.constant.PaymentMethodEnum; import com.qniao.dam.infrastructure.persistent.dao.domain.PaymentOrderDao; import com.qniao.domain.Trans2DomainAssembler; -import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -28,15 +27,6 @@ public class PrePayThirdPartyDto implements Trans2DomainAssembler authFields; - @Data - @ApiModel - public static class ThirdPartyFieldDto { - @NotNull(message = "关键字不能为空") - private String key; - - private String value; - } - @Override public PaymentChannelOrder trans2Domain() { PaymentChannelOrder paymentChannelOrder = new PaymentChannelOrder(); 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 new file mode 100644 index 0000000..e8b41e3 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/request/ThirdPartyField.java @@ -0,0 +1,27 @@ +package com.qniao.dam.api.command.paymentchannelorder.user.request; + +import cn.hutool.core.text.StrFormatter; +import com.qniao.framework.exception.BizException; +import lombok.Data; + +import java.util.List; +import java.util.Objects; + +@Data +public class ThirdPartyField { + + private String key; + + 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))); + } + + public static String findFiledValueByKey(String specifiedKey, List fieldList) { + return findFieldByKey(specifiedKey, fieldList).getValue(); + } + + public static final String JS_CODE = "jsCode"; + +} \ No newline at end of file diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/request/ThirdPartyFieldDto.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/request/ThirdPartyFieldDto.java new file mode 100644 index 0000000..51d2a89 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/request/ThirdPartyFieldDto.java @@ -0,0 +1,13 @@ +package com.qniao.dam.api.command.paymentchannelorder.user.request; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +public class ThirdPartyFieldDto { + @NotNull(message = "关键字不能为空") + private String key; + + private String value; +} 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 29338b6..db6c9ab 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 @@ -1,5 +1,6 @@ package com.qniao.dam.application.service.paymentchannelorder; +import com.qniao.dam.api.command.paymentchannelorder.user.request.ThirdPartyField; import com.qniao.dam.application.service.paymentchannelorder.processor.IChannelPayService; import com.qniao.dam.domain.aggregate.paymentchannelorder.PaymentChannelOrderAggregate; import com.qniao.dam.domain.aggregate.paymentchannelorder.entity.PaymentChannelOrder; @@ -11,6 +12,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.Assert; import javax.annotation.Resource; +import java.util.List; import java.util.Map; @Service @@ -26,14 +28,12 @@ public class PaymentChannelOrderApplicationService { /** * todo 旧的付款单失效处理? */ - public Map prePay(PaymentChannelOrder paymentChannelOrder, Long userId) { - UserOpenId userOpenId = userOpenIdQueryService.getByUserId(userId, paymentChannelOrder.getAppId()); - Assert.notNull(userOpenId, "发起支付失败"); + public Map prePay(PaymentChannelOrder paymentChannelOrder, Long userId, List fieldList, Long appFrom) { PaymentOrder paymentOrder = paymentOrderRepository.load(paymentChannelOrder.getTxnOrderId()); paymentChannelOrder.setAmount(paymentOrder.getUnpaidAmount()); paymentChannelOrder.setComment("订单交易"); paymentChannelOrderAggregate.create(paymentChannelOrder); IChannelPayService channelPayService = IChannelPayService.getService(paymentChannelOrder.getPaymentMethod()); - return channelPayService.handle(paymentChannelOrder, userOpenId); + return channelPayService.handle(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 f8947fb..0e740d5 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,5 +1,6 @@ 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.domain.aggregate.paymentchannelorder.entity.PaymentChannelOrder; import com.qniao.dam.domian.aggregate.paymentorder.constant.PaymentMethodEnum; @@ -7,6 +8,7 @@ import com.qniao.dau.domain.aggregate.useropenid.entity.UserOpenId; import com.qniao.framework.exception.BizException; import com.qniao.framework.utils.SpringContextUtil; +import java.util.List; import java.util.Map; public abstract class IChannelPayService { @@ -21,5 +23,5 @@ public abstract class IChannelPayService { } } - public abstract Map handle(PaymentChannelOrder paymentChannelOrder, UserOpenId userOpenId); + public abstract Map handle(PaymentChannelOrder paymentChannelOrder, List fieldList, Long appFrom); } 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/WeChatPayProcessor.java index 859afdf..efe99c3 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/WeChatPayProcessor.java @@ -8,21 +8,27 @@ import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; import com.github.binarywang.wxpay.util.SignUtils; +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.vobj.ChannelPaymentField; import com.qniao.dam.application.service.paymentchannelorder.processor.wechat.vobj.WeChatPaymentBasic; import com.qniao.dam.domain.aggregate.paymentchannelorder.entity.PaymentChannelOrder; +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.useropenid.entity.UserOpenId; import com.qniao.framework.exception.BizException; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.HashMap; +import java.util.List; import java.util.Map; @Component @@ -36,10 +42,19 @@ public class WeChatPayProcessor extends IChannelPayService { @Value("${weixin.notifyurl}") private String notifyUrl; + @Resource + private UecServerApplicationService uecServerApplicationService; + @Override - public Map handle(PaymentChannelOrder paymentChannelOrder, UserOpenId userOpenId) { - WxPayConfig wxPayConfig = getWxPayConfig(userOpenId.getPlatformAppId()); - WxPayUnifiedOrderRequest request = buildUnifiedOrderRequest(paymentChannelOrder, wxPayConfig, userOpenId.getOpenId()); + public Map handle(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); + WxPayConfig wxPayConfig = getWxPayConfig(sessionVo.getPlatformAppId()); + WxPayUnifiedOrderRequest request = buildUnifiedOrderRequest(paymentChannelOrder, wxPayConfig, sessionVo.getOpenid()); WeChatPaymentBasic weChatPaymentBasic = getWeChatPaymentBasic(request, wxPayConfig); return transformToMap(weChatPaymentBasic); }