14 changed files with 264 additions and 40 deletions
Split View
Diff Options
-
1dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/paymentorder/constant/PaymentMethodEnum.java
-
8dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/paymentchannelorder/entity/PaymentChannelOrder.java
-
6dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/paymentchannelorder/user/request/ThirdPartyField.java
-
2dating-agency-mall-server/src/main/java/com/qniao/dam/api/query/withdrawaudit/user/request/UserPageWithdrawAuditQueryParams.java
-
5dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/notify/NotifyApplicationService.java
-
21dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/PaymentChannelOrderApplicationService.java
-
23dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/IChannelPayService.java
-
135dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/wechat/WeChatPayH5Processor.java
-
55dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/wechat/WeChatPayJsApiProcessor.java
-
4dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/paymentchannelorder/processor/wechat/utils/WXPayV3Util.java
-
7dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/ThirdOauthConfigDao.java
-
9dating-agency-mall-server/src/main/java/com/qniao/dam/query/thirdoauthconfig/ThirdOauthConfigQueryService.java
-
25dating-agency-mall-server/src/main/java/com/qniao/dam/query/thirdoauthconfig/impl/ThirdOauthConfigQueryServiceImpl.java
-
3dating-agency-mall-server/src/main/resources/mapper/withdrawaudit/WithdrawAuditViewMapper.xml
@ -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<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); |
|||
|
|||
|
|||
protected ThirdOauthConfig getThirdOauthConfig(Long appId) { |
|||
return thirdOauthConfigQueryService.queryByAppId(appId, getOAuthPlatform()); |
|||
} |
|||
|
|||
public abstract OAuthPlatformEnum getOAuthPlatform(); |
|||
} |
|||
@ -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; |
|||
} |
|||
} |
|||
@ -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> { |
|||
} |
|||
@ -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); |
|||
} |
|||
@ -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")); |
|||
} |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save