支付处理 (未完成)

This commit is contained in:
TinyAnts 2023-03-21 12:12:29 +08:00
parent c3ede05af0
commit 3456eb65d4
9 changed files with 247 additions and 47 deletions

View File

@ -5,6 +5,7 @@ import com.alibaba.fastjson2.JSONArray;
import com.baomidou.mybatisplus.core.toolkit.Assert; import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.mdd.admin.service.IChannelOaMenusService; import com.mdd.admin.service.IChannelOaMenusService;
import com.mdd.common.exception.OperateException; import com.mdd.common.exception.OperateException;
import com.mdd.common.plugin.wechat.WxMnpDriver;
import com.mdd.common.util.*; import com.mdd.common.util.*;
import me.chanjar.weixin.common.bean.menu.WxMenu; import me.chanjar.weixin.common.bean.menu.WxMenu;
import me.chanjar.weixin.common.bean.menu.WxMenuButton; import me.chanjar.weixin.common.bean.menu.WxMenuButton;
@ -112,7 +113,7 @@ public class ChannelOaMenusServiceImpl implements IChannelOaMenusService {
WxMenu wxMenu = new WxMenu(); WxMenu wxMenu = new WxMenu();
wxMenu.setButtons(menuButtons); wxMenu.setButtons(menuButtons);
WxMpService wxMpService = WeChatUtils.official(); WxMpService wxMpService = WxMnpDriver.oa();
WxMpMenuService wxMpMenuService = new WxMpMenuServiceImpl(wxMpService); WxMpMenuService wxMpMenuService = new WxMpMenuServiceImpl(wxMpService);
wxMpMenuService.menuCreate(wxMenu); wxMpMenuService.menuCreate(wxMenu);
} catch (WxErrorException e) { } catch (WxErrorException e) {

View File

@ -208,7 +208,6 @@
<dependency> <dependency>
<groupId>com.github.binarywang</groupId> <groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId> <artifactId>weixin-java-pay</artifactId>
<version>4.4.0</version>
</dependency> </dependency>
</dependencies> </dependencies>

View File

@ -24,11 +24,17 @@ public class WxPayDriver {
private static WxPayService wxPayService; private static WxPayService wxPayService;
/**
* 注入支付配置依赖
*/
@Resource @Resource
public void setDevPayConfigMapper(DevPayConfigMapper devPayConfigMapper) { public void setDevPayConfigMapper(DevPayConfigMapper devPayConfigMapper) {
WxPayDriver.devPayConfigMapper = devPayConfigMapper; WxPayDriver.devPayConfigMapper = devPayConfigMapper;
} }
/**
* 注入微信支付依赖
*/
@Resource @Resource
public void setWxPayService(WxPayService wxPayService) { public void setWxPayService(WxPayService wxPayService) {
WxPayDriver.wxPayService = wxPayService; WxPayDriver.wxPayService = wxPayService;

View File

@ -0,0 +1,61 @@
package com.mdd.common.util;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import java.math.BigDecimal;
/**
* 金额处理工具
*/
public class AmountUtil {
private AmountUtil() {}
/**
* 将单位为元的金额转换为单位为分
*
* @param yuan 单位为元的字符型值
* @return int
*/
public static int yuan2Fen(String yuan) {
int value;
try {
BigDecimal var1 = new BigDecimal(yuan);
BigDecimal var2 = new BigDecimal(100);
BigDecimal var3 = var1.multiply(var2);
value = Integer.parseInt(var3.stripTrailingZeros().toPlainString());
} catch (Exception e) {
throw new IllegalArgumentException(String.format("非法金额[%s]", yuan));
}
Assert.isTrue(value >= 0, String.format("非法金额[%s]", yuan));
return value;
}
/**
* 将单位为分的金额转换为单位为元
*
* @param fen 单位为分的字符型值
* @return String
*/
public static String fen2Yuan(int fen) {
BigDecimal var1 = new BigDecimal(fen);
BigDecimal var2 = new BigDecimal(100);
BigDecimal var3 = var1.divide(var2, 3);
return var3.stripTrailingZeros().toPlainString();
}
/**
* 将单位为分的金额转换为单位为元
*
* @param fen 单位为分的字符型值
* @return BigDecimal
*/
public static BigDecimal fen2YuanDecimal(int fen) {
BigDecimal var1 = new BigDecimal(fen);
BigDecimal var2 = new BigDecimal(100);
return var1.divide(var2, 3);
}
}

View File

@ -1,25 +1,36 @@
package com.mdd.front.controller; package com.mdd.front.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
import com.mdd.common.aop.NotLogin; import com.mdd.common.aop.NotLogin;
import com.mdd.common.core.AjaxResult; import com.mdd.common.core.AjaxResult;
import com.mdd.common.entity.RechargeOrder;
import com.mdd.common.exception.OperateException;
import com.mdd.common.mapper.RechargeOrderMapper;
import com.mdd.front.LikeFrontThreadLocal; import com.mdd.front.LikeFrontThreadLocal;
import com.mdd.front.service.IPayService; import com.mdd.front.service.IPayService;
import com.mdd.front.validate.PayPrepayValidate; import com.mdd.front.validate.PaymentValidate;
import com.mdd.front.validate.users.UserUpdateValidate;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.models.auth.In; import org.springframework.util.Assert;
import io.swagger.v3.oas.annotations.parameters.RequestBody;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.LinkedHashMap;
import java.util.Map;
@RestController @RestController
@RequestMapping("/api/pay") @RequestMapping("/api/pay")
@Api(tags = "支付管理") @Api(tags = "支付管理")
public class PayController { public class PayController {
@Resource
RechargeOrderMapper rechargeOrderMapper;
@Resource @Resource
IPayService iPayService; IPayService iPayService;
@ -28,14 +39,57 @@ public class PayController {
* *
* @return AjaxResult<Object> * @return AjaxResult<Object>
*/ */
@NotLogin
@PostMapping("/prepay") @PostMapping("/prepay")
public AjaxResult<Object> prepay(@Validated @RequestBody PayPrepayValidate payPrepayValidate) throws Exception { public AjaxResult<Object> prepay(@Validated @RequestBody PaymentValidate paymentValidate) {
String scene = payPrepayValidate.getScene(); String scene = paymentValidate.getScene();
Integer orderId = payPrepayValidate.getOrderId(); Integer payWay = paymentValidate.getPayWay();
Integer orderId = paymentValidate.getOrderId();
Integer terminal = LikeFrontThreadLocal.getTerminal(); Integer terminal = LikeFrontThreadLocal.getTerminal();
iPayService.prepay(scene, orderId, terminal); // 订单处理
int payStatus = 0;
switch (scene) {
case "recharge":
RechargeOrder rechargeOrder = rechargeOrderMapper.selectOne(
new QueryWrapper<RechargeOrder>()
.eq("id", orderId)
.last("limit 1"));
Assert.notNull(rechargeOrder, "订单不存在");
paymentValidate.setOrderSn(rechargeOrder.getOrderSn());
paymentValidate.setUserId(rechargeOrder.getUserId());
paymentValidate.setOrderAmount(rechargeOrder.getOrderAmount());
paymentValidate.setDescription("余额充值");
payStatus = rechargeOrder.getPayStatus();
break;
case "order":
// todo 其它订单处理
break;
}
// 订单校验
if (payStatus != 0) {
throw new OperateException("订单已支付");
}
// 发起支付
try {
switch (payWay) {
case 1:
iPayService.walletPay();
break;
case 2:
WxPayUnifiedOrderV3Result.JsapiResult result = iPayService.wxPay(paymentValidate, terminal);
return AjaxResult.success(result);
case 3:
iPayService.aliPay();
break;
}
} catch (Exception e) {
throw new OperateException(e.getMessage());
}
return AjaxResult.success(); return AjaxResult.success();
} }

View File

@ -1,10 +1,19 @@
package com.mdd.front.service; package com.mdd.front.service;
import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
import com.mdd.front.validate.PaymentValidate;
/** /**
* 支付接口服务类 * 支付接口服务类
*/ */
public interface IPayService { public interface IPayService {
void prepay(String scene, Integer orderId, Integer terminal) throws Exception; void walletPay();
WxPayUnifiedOrderV3Result.JsapiResult wxPay(PaymentValidate params, Integer terminal) throws Exception;
void aliPay();
void handlePaidNotify();
} }

View File

@ -5,12 +5,16 @@ import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request;
import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result; import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
import com.github.binarywang.wxpay.service.WxPayService; import com.github.binarywang.wxpay.service.WxPayService;
import com.mdd.common.entity.RechargeOrder; import com.mdd.common.entity.user.UserAuth;
import com.mdd.common.mapper.RechargeOrderMapper; import com.mdd.common.enums.ClientEnum;
import com.mdd.common.mapper.user.UserAuthMapper;
import com.mdd.common.plugin.wechat.WxPayDriver; import com.mdd.common.plugin.wechat.WxPayDriver;
import com.mdd.common.util.AmountUtil;
import com.mdd.common.util.IpUtils;
import com.mdd.common.util.RequestUtils; import com.mdd.common.util.RequestUtils;
import com.mdd.common.util.StringUtils;
import com.mdd.front.service.IPayService; import com.mdd.front.service.IPayService;
import com.mdd.front.validate.PaymentValidate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -21,18 +25,41 @@ import java.text.SimpleDateFormat;
public class PayServiceImpl implements IPayService { public class PayServiceImpl implements IPayService {
@Resource @Resource
RechargeOrderMapper rechargeOrderMapper; UserAuthMapper userAuthMapper;
/**
* 零钱支付
*/
@Override @Override
public void prepay(String scene, Integer orderId, Integer terminal) throws Exception { public void walletPay() {
RechargeOrder rechargeOrder = rechargeOrderMapper.selectOne(
new QueryWrapper<RechargeOrder>()
.eq("id", orderId)
.last("limit 1"));
String orderSn = rechargeOrder.getOrderSn(); }
Integer orderAmount = 1;
String orderDesc = "余额充值"; /**
* 微信支付
*
* @param params 支付参数
* @param terminal 终端
* @throws Exception 异常
*/
@Override
public WxPayUnifiedOrderV3Result.JsapiResult wxPay(PaymentValidate params, Integer terminal) throws Exception {
// 订单参数
Integer userId = params.getUserId();
String orderSn = params.getOrderSn();
BigDecimal orderAmount = params.getOrderAmount();
String description = params.getDescription();
// 查询OpenId
String openId = "";
UserAuth userAuth = userAuthMapper.selectOne(new QueryWrapper<UserAuth>()
.eq("user_id", userId)
.eq("terminal", terminal)
.last("limit 1"));
System.out.println(userAuth);
if (StringUtils.isNotNull(userAuth)) {
openId = userAuth.getOpenid();
}
// 失效时间 // 失效时间
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
@ -42,27 +69,51 @@ public class PayServiceImpl implements IPayService {
// 订单信息 // 订单信息
WxPayUnifiedOrderV3Request wxPayUnifiedOrderV3Request = new WxPayUnifiedOrderV3Request(); WxPayUnifiedOrderV3Request wxPayUnifiedOrderV3Request = new WxPayUnifiedOrderV3Request();
wxPayUnifiedOrderV3Request.setOutTradeNo(orderSn); wxPayUnifiedOrderV3Request.setOutTradeNo(orderSn);
wxPayUnifiedOrderV3Request.setDescription(orderDesc); wxPayUnifiedOrderV3Request.setDescription(description);
wxPayUnifiedOrderV3Request.setTimeExpire(timeExpire); wxPayUnifiedOrderV3Request.setTimeExpire(timeExpire);
wxPayUnifiedOrderV3Request.setNotifyUrl(RequestUtils.uri() + "/api/pay/notifyMnp"); wxPayUnifiedOrderV3Request.setNotifyUrl(RequestUtils.uri() + "/api/pay/notifyMnp");
// 订单金额 // 订单金额
WxPayUnifiedOrderV3Request.Amount amount = new WxPayUnifiedOrderV3Request.Amount(); WxPayUnifiedOrderV3Request.Amount amount = new WxPayUnifiedOrderV3Request.Amount();
amount.setTotal(orderAmount); amount.setTotal(AmountUtil.yuan2Fen(orderAmount.toPlainString()));
amount.setCurrency("CNY"); amount.setCurrency("CNY");
wxPayUnifiedOrderV3Request.setAmount(amount); wxPayUnifiedOrderV3Request.setAmount(amount);
// 付款人员 // 付款人员
WxPayUnifiedOrderV3Request.Payer payer = new WxPayUnifiedOrderV3Request.Payer(); WxPayUnifiedOrderV3Request.Payer payer = new WxPayUnifiedOrderV3Request.Payer();
payer.setOpenid(""); payer.setOpenid(openId);
// H5平台
if (terminal == ClientEnum.H5.getCode()) {
WxPayUnifiedOrderV3Request.SceneInfo sceneInfo = new WxPayUnifiedOrderV3Request.SceneInfo();
WxPayUnifiedOrderV3Request.H5Info h5Info = new WxPayUnifiedOrderV3Request.H5Info();
h5Info.setType("android");
sceneInfo.setH5Info(h5Info);
sceneInfo.setPayerClientIp(IpUtils.getHostIp());
sceneInfo.setDeviceId("1");
wxPayUnifiedOrderV3Request.setSceneInfo(sceneInfo);
}
// 发起订单 // 发起订单
WxPayService wxPayService = WxPayDriver.handler(terminal); WxPayService wxPayService = WxPayDriver.handler(terminal);
wxPayUnifiedOrderV3Request.setPayer(payer); wxPayUnifiedOrderV3Request.setPayer(payer);
WxPayUnifiedOrderV3Result.JsapiResult jsapiResult = wxPayService.createOrderV3(TradeTypeEnum.JSAPI, wxPayUnifiedOrderV3Request); WxPayUnifiedOrderV3Result.JsapiResult jsapiResult = wxPayService.createOrderV3(TradeTypeEnum.JSAPI, wxPayUnifiedOrderV3Request);
System.out.println(jsapiResult); return jsapiResult;
}
/**
* 支付宝支付
*/
@Override
public void aliPay() {
}
/**
* 支付回调处理
*/
public void handlePaidNotify() {
} }
} }

View File

@ -1,18 +0,0 @@
package com.mdd.front.validate;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("预支付订单参数")
public class PayPrepayValidate implements Serializable {
private static final long serialVersionUID = 1L;
private String scene;
private Integer orderId;
}

View File

@ -0,0 +1,37 @@
package com.mdd.front.validate;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@ApiModel("预支付订单参数")
public class PaymentValidate implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull(message = "scene参数缺失")
@ApiModelProperty("支付场景")
private String scene;
@NotNull(message = "payWay参数缺失")
@ApiModelProperty("支付方式")
private Integer payWay;
@NotNull(message = "orderId参数缺失")
@ApiModelProperty("订单ID")
private Integer orderId;
private Integer userId;
private String orderSn;
private BigDecimal orderAmount;
private String description;
}