实现支付功能 (未完成)

This commit is contained in:
TinyAnts 2023-03-20 16:02:32 +08:00
parent d1b1317d1f
commit 9c9db1c79b
15 changed files with 529 additions and 11 deletions

View File

@ -15,9 +15,6 @@ import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
* 通知设置管理
*/
@RestController
@RequestMapping("api/setting/notice")
@Api(tags = "配置消息通知")

View File

@ -0,0 +1,45 @@
package com.mdd.admin.controller.setting;
import com.mdd.admin.service.ISettingPaymentService;
import com.mdd.admin.validate.setting.SettingPaymentValidate;
import com.mdd.common.aop.NotLogin;
import com.mdd.common.core.AjaxResult;
import com.mdd.common.entity.setting.DevPayConfig;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("api/setting/payment")
@Api(tags = "配置支付参数")
public class SettingPaymentController {
@Resource
ISettingPaymentService iSettingPaymentService;
public AjaxResult<Object> method() {
return AjaxResult.success();
}
@NotLogin
@GetMapping("/list")
@ApiOperation(value="支付渠道列表")
public AjaxResult<Object> list() {
List<DevPayConfig> list = iSettingPaymentService.list();
return AjaxResult.success(list);
}
@NotLogin
@PostMapping("/edit")
@ApiOperation(value="支付渠道编辑")
public AjaxResult<Object> edit(@Validated @RequestBody SettingPaymentValidate paymentValidate) {
iSettingPaymentService.edit(paymentValidate);
return AjaxResult.success();
}
}

View File

@ -0,0 +1,17 @@
package com.mdd.admin.service;
import com.mdd.admin.validate.setting.SettingPaymentValidate;
import com.mdd.common.entity.setting.DevPayConfig;
import java.util.List;
/**
* 支付配置服务接口类
*/
public interface ISettingPaymentService {
List<DevPayConfig> list();
void edit(SettingPaymentValidate paymentValidate);
}

View File

@ -0,0 +1,59 @@
package com.mdd.admin.service.impl;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.mdd.admin.service.ISettingPaymentService;
import com.mdd.admin.validate.setting.SettingPaymentValidate;
import com.mdd.common.entity.setting.DevPayConfig;
import com.mdd.common.mapper.setting.DevPayConfigMapper;
import com.mdd.common.util.MapUtils;
import com.mdd.common.util.UrlUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
/**
* 支付配置服务实现类
*/
@Service
public class SettingPaymentServiceImpl implements ISettingPaymentService {
@Resource
DevPayConfigMapper devPayConfigMapper;
@Override
public List<DevPayConfig> list() {
List<DevPayConfig> devPayConfigs = devPayConfigMapper.selectList(
new QueryWrapper<DevPayConfig>()
.orderByDesc(Arrays.asList("sort", "id")));
for (DevPayConfig dev : devPayConfigs) {
dev.setParams(MapUtils.jsonToMap(dev.getParams().toString()));
dev.setIcon(UrlUtils.toAbsoluteUrl(dev.getIcon()));
}
return devPayConfigs;
}
@Override
public void edit(SettingPaymentValidate paymentValidate) {
DevPayConfig devPayConfig = devPayConfigMapper.selectOne(
new QueryWrapper<DevPayConfig>()
.eq("id", paymentValidate.getId())
.last("limit 1"));
Assert.notNull(devPayConfig, "数据不存在!");
devPayConfig.setName(paymentValidate.getName());
devPayConfig.setIcon(UrlUtils.toRelativeUrl(paymentValidate.getIcon()));
devPayConfig.setSort(paymentValidate.getSort());
devPayConfig.setRemark(paymentValidate.getRemark());
devPayConfig.setParams(JSON.toJSONString(paymentValidate.getParams()));
devPayConfigMapper.updateById(devPayConfig);
}
}

View File

@ -0,0 +1,35 @@
package com.mdd.admin.validate.setting;
import com.mdd.common.validator.annotation.IDMust;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.Map;
@Data
@ApiModel("支付渠道设置参数")
public class SettingPaymentValidate {
@IDMust(message = "id参数必传且需大于0")
@ApiModelProperty(value = "ID", required = true)
private Integer id;
@NotNull(message = "name参数缺失")
@ApiModelProperty(value = "模版名称", required = true)
private String name;
@ApiModelProperty(value = "模版名称")
private String icon;
@ApiModelProperty(value = "排序编号")
private Integer sort;
@ApiModelProperty(value = "备注信息")
private String remark;
@ApiModelProperty(value = "配置参数")
private Map<String, String> params;
}

View File

@ -186,6 +186,12 @@
<artifactId>oshi-core</artifactId>
</dependency>
<!-- Swagger3 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
</dependency>
<!-- 微信小程序 -->
<dependency>
<groupId>com.github.binarywang</groupId>
@ -198,9 +204,11 @@
<artifactId>weixin-java-mp</artifactId>
</dependency>
<!-- 微信支付 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
<version>4.4.0</version>
</dependency>
</dependencies>

View File

@ -0,0 +1,94 @@
package com.mdd.common.config.wechat;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import com.mdd.common.entity.setting.DevPayConfig;
import com.mdd.common.mapper.setting.DevPayConfigMapper;
import com.mdd.common.util.ConfigUtils;
import com.mdd.common.util.MapUtils;
import lombok.AllArgsConstructor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
import java.util.Map;
@Configuration
@ConditionalOnClass(WxPayService.class)
@AllArgsConstructor
public class WxPayConfiguration {
@Resource
DevPayConfigMapper devPayConfigMapper;
/**
* 微信小程序支付配置
*
* @author fzr
* @return WxPayService
*/
@Bean
@ConditionalOnMissingBean
public WxPayService mnpPayService() {
DevPayConfig config = devPayConfigMapper.selectOne(
new QueryWrapper<DevPayConfig>()
.eq("way", 2)
.last("limit 1"));
Map<String, String> params = MapUtils.jsonToMap(config.getParams().toString());
String appId = ConfigUtils.get("mp_channel", "appId", "");
String mchId = params.get("mch_id");
String paySignKey = params.get("pay_sign_key");
byte[] privateKey = params.getOrDefault("private_key", "").getBytes();
byte[] privateCert = params.getOrDefault("private_cert", "").getBytes();
WxPayConfig payConfig = new WxPayConfig();
payConfig.setAppId(appId);
payConfig.setMchId(mchId);
payConfig.setApiV3Key(paySignKey);
payConfig.setPrivateKeyContent(privateKey);
payConfig.setPrivateCertContent(privateCert);
payConfig.setUseSandboxEnv(false);
WxPayService wxPayService = new WxPayServiceImpl();
wxPayService.setConfig(payConfig);
return wxPayService;
}
/**
* 微信公众号支付配置
*
* @author fzr
* @return WxPayService
*/
@Bean
@ConditionalOnMissingBean
public WxPayService wxOaService() {
DevPayConfig config = devPayConfigMapper.selectOne(
new QueryWrapper<DevPayConfig>()
.eq("way", 2)
.last("limit 1"));
Map<String, String> params = MapUtils.jsonToMap(config.getParams().toString());
String appId = ConfigUtils.get("oa_channel", "appId", "");
String mchId = params.get("mch_id");
String paySignKey = params.get("pay_sign_key");
byte[] privateKey = params.getOrDefault("private_key", "").getBytes();
byte[] privateCert = params.getOrDefault("private_cert", "").getBytes();
WxPayConfig payConfig = new WxPayConfig();
payConfig.setMchId(mchId);
payConfig.setAppId(appId);
payConfig.setApiV3Key(paySignKey);
payConfig.setPrivateKeyContent(privateKey);
payConfig.setPrivateCertContent(privateCert);
payConfig.setUseSandboxEnv(false);
WxPayService wxPayService = new WxPayServiceImpl();
wxPayService.setConfig(payConfig);
return wxPayService;
}
}

View File

@ -0,0 +1,37 @@
package com.mdd.common.entity.setting;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("支付配置实体")
public class DevPayConfig {
private static final long serialVersionUID = 1L;
@TableId(value="id", type= IdType.AUTO)
@ApiModelProperty("ID")
private Integer id;
@ApiModelProperty("模版名称")
private String name;
@ApiModelProperty("渠道图标")
private String icon;
@ApiModelProperty("支付方式: [1=余额支付, 2=微信支付, 3=支付宝支付]")
private Integer way;
@ApiModelProperty("排序编号")
private Integer sort;
@ApiModelProperty("备注信息")
private String remark;
@ApiModelProperty("配置参数")
private Object params;
}

View File

@ -0,0 +1,12 @@
package com.mdd.common.mapper.setting;
import com.mdd.common.core.basics.IBaseMapper;
import com.mdd.common.entity.setting.DevPayConfig;
import org.apache.ibatis.annotations.Mapper;
/**
* 支付配置Mapper
*/
@Mapper
public interface DevPayConfigMapper extends IBaseMapper<DevPayConfig> {
}

View File

@ -0,0 +1,81 @@
package com.mdd.common.plugin.wechat;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import com.mdd.common.entity.setting.DevPayConfig;
import com.mdd.common.enums.ClientEnum;
import com.mdd.common.mapper.setting.DevPayConfigMapper;
import com.mdd.common.util.ConfigUtils;
import com.mdd.common.util.MapUtils;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Map;
@Component
public class WxPayDriver {
private static DevPayConfigMapper devPayConfigMapper;
private static WxPayService wxPayService;
@Resource
public void setDevPayConfigMapper(DevPayConfigMapper devPayConfigMapper) {
WxPayDriver.devPayConfigMapper = devPayConfigMapper;
}
@Resource
public void setWxPayService(WxPayService wxPayService) {
WxPayDriver.wxPayService = wxPayService;
}
/**
* 对象句柄
*
* @author fzr
* @return WxPayService
*/
public static WxPayService handler(String terminal) {
if (String.valueOf(ClientEnum.OA.getCode()).equalsIgnoreCase(terminal)) {
resetConfig("oa");
} else {
resetConfig("mnp");
}
return wxPayService;
}
/**
* 重设配置
*
* @author fzr
* @param type 类型
*/
private static void resetConfig(String type) {
DevPayConfig config = devPayConfigMapper.selectOne(
new QueryWrapper<DevPayConfig>()
.eq("way", 2)
.last("limit 1"));
String scene = type.equals("oa") ? "oa_channel" : "mp_channel";
String appId = ConfigUtils.get(scene, "appId", "");
Map<String, String> params = MapUtils.jsonToMap(config.getParams().toString());
String mchId = params.get("mch_id");
String paySignKey = params.get("pay_sign_key");
byte[] privateCert = params.getOrDefault("private_cert", "").getBytes();
byte[] privateKey = params.getOrDefault("private_key", "").getBytes();
WxPayConfig payConfig = new WxPayConfig();
payConfig.setAppId(appId);
payConfig.setMchId(mchId);
payConfig.setApiV3Key(paySignKey);
payConfig.setPrivateKeyContent(privateKey);
payConfig.setPrivateCertContent(privateCert);
payConfig.setUseSandboxEnv(false);
WxPayService wxPayService = new WxPayServiceImpl();
wxPayService.setConfig(payConfig);
}
}

View File

@ -0,0 +1,42 @@
package com.mdd.front.controller;
import com.mdd.common.aop.NotLogin;
import com.mdd.common.core.AjaxResult;
import com.mdd.front.service.IPayService;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/api/pay")
@Api(tags = "支付管理")
public class PayController {
@Resource
IPayService iPayService;
/**
* 预支付
*
* @return AjaxResult<Object>
*/
@NotLogin
@PostMapping("/prepay")
public AjaxResult<Object> prepay() throws Exception {
iPayService.prepay();
return AjaxResult.success();
}
/**
* 微信支付回调
*
* @return AjaxResult<Object>
*/
public AjaxResult<Object> notifyMnp() {
return AjaxResult.success();
}
}

View File

@ -0,0 +1,25 @@
package com.mdd.front.controller;
import com.mdd.common.core.AjaxResult;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/recharge")
@Api(tags = "充值管理")
public class RechargeController {
@GetMapping("/list")
public AjaxResult<Object> list() {
return AjaxResult.success();
}
@PostMapping("/placeOrder")
public AjaxResult<Object> placeOrder() {
return AjaxResult.success();
}
}

View File

@ -0,0 +1,10 @@
package com.mdd.front.service;
/**
* 支付接口服务类
*/
public interface IPayService {
void prepay() throws Exception;
}

View File

@ -0,0 +1,48 @@
package com.mdd.front.service.impl;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request;
import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
import com.github.binarywang.wxpay.service.WxPayService;
import com.mdd.common.plugin.wechat.WxPayDriver;
import com.mdd.front.service.IPayService;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
@Service
public class PayServiceImpl implements IPayService {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
@Override
public void prepay() throws Exception {
WxPayService wxPayService = WxPayDriver.handler("1");
String sn = "sn" + System.currentTimeMillis() / 1000;
Long expireTime = System.currentTimeMillis() + 60 * 1000;
String timeExpire = format.format(expireTime) + "+08:00";
// 订单信息
WxPayUnifiedOrderV3Request wxPayUnifiedOrderV3Request = new WxPayUnifiedOrderV3Request();
wxPayUnifiedOrderV3Request.setOutTradeNo(sn);
wxPayUnifiedOrderV3Request.setNotifyUrl("https://www.likeadmin.cn");
wxPayUnifiedOrderV3Request.setDescription("充值");
wxPayUnifiedOrderV3Request.setTimeExpire(timeExpire);
// 订单金额
WxPayUnifiedOrderV3Request.Amount amount = new WxPayUnifiedOrderV3Request.Amount();
amount.setTotal(1);
amount.setCurrency("CNY");
wxPayUnifiedOrderV3Request.setAmount(amount);
// 付款人
WxPayUnifiedOrderV3Request.Payer payer = new WxPayUnifiedOrderV3Request.Payer();
payer.setOpenid("");
wxPayUnifiedOrderV3Request.setPayer(payer);
WxPayUnifiedOrderV3Result.JsapiResult jsapiResult = wxPayService.createOrderV3(TradeTypeEnum.JSAPI, wxPayUnifiedOrderV3Request);
System.out.println(jsapiResult);
}
}

View File

@ -222,6 +222,13 @@
<version>${oshi-core.version}</version>
</dependency>
<!-- Swagger3 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<!-- 微信小程序 -->
<dependency>
<groupId>com.github.binarywang</groupId>
@ -236,18 +243,19 @@
<version>${weixin.version}</version>
</dependency>
<!-- 微信支付 -->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
<version>${weixin.version}</version>
</dependency>
<!-- 全局工具 -->
<dependency>
<groupId>org.mdd</groupId>
<artifactId>like-common</artifactId>
<version>${like.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
</dependencyManagement>