diff --git a/server/like-admin/src/main/java/com/mdd/admin/controller/setting/SettingNoticeController.java b/server/like-admin/src/main/java/com/mdd/admin/controller/setting/SettingNoticeController.java index e3168155..b02a3e5d 100644 --- a/server/like-admin/src/main/java/com/mdd/admin/controller/setting/SettingNoticeController.java +++ b/server/like-admin/src/main/java/com/mdd/admin/controller/setting/SettingNoticeController.java @@ -15,9 +15,6 @@ import javax.annotation.Resource; import java.util.List; import java.util.Map; -/** - * 通知设置管理 - */ @RestController @RequestMapping("api/setting/notice") @Api(tags = "配置消息通知") diff --git a/server/like-admin/src/main/java/com/mdd/admin/controller/setting/SettingPaymentController.java b/server/like-admin/src/main/java/com/mdd/admin/controller/setting/SettingPaymentController.java new file mode 100644 index 00000000..d143e8ab --- /dev/null +++ b/server/like-admin/src/main/java/com/mdd/admin/controller/setting/SettingPaymentController.java @@ -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 method() { + return AjaxResult.success(); + } + + @NotLogin + @GetMapping("/list") + @ApiOperation(value="支付渠道列表") + public AjaxResult list() { + List list = iSettingPaymentService.list(); + return AjaxResult.success(list); + } + + @NotLogin + @PostMapping("/edit") + @ApiOperation(value="支付渠道编辑") + public AjaxResult edit(@Validated @RequestBody SettingPaymentValidate paymentValidate) { + iSettingPaymentService.edit(paymentValidate); + return AjaxResult.success(); + } + +} diff --git a/server/like-admin/src/main/java/com/mdd/admin/service/ISettingPaymentService.java b/server/like-admin/src/main/java/com/mdd/admin/service/ISettingPaymentService.java new file mode 100644 index 00000000..c077f382 --- /dev/null +++ b/server/like-admin/src/main/java/com/mdd/admin/service/ISettingPaymentService.java @@ -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 list(); + + void edit(SettingPaymentValidate paymentValidate); + +} diff --git a/server/like-admin/src/main/java/com/mdd/admin/service/impl/SettingPaymentServiceImpl.java b/server/like-admin/src/main/java/com/mdd/admin/service/impl/SettingPaymentServiceImpl.java new file mode 100644 index 00000000..2e7e6be9 --- /dev/null +++ b/server/like-admin/src/main/java/com/mdd/admin/service/impl/SettingPaymentServiceImpl.java @@ -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 list() { + List devPayConfigs = devPayConfigMapper.selectList( + new QueryWrapper() + .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() + .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); + } + + +} diff --git a/server/like-admin/src/main/java/com/mdd/admin/validate/setting/SettingPaymentValidate.java b/server/like-admin/src/main/java/com/mdd/admin/validate/setting/SettingPaymentValidate.java new file mode 100644 index 00000000..72491e87 --- /dev/null +++ b/server/like-admin/src/main/java/com/mdd/admin/validate/setting/SettingPaymentValidate.java @@ -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 params; + +} diff --git a/server/like-common/pom.xml b/server/like-common/pom.xml index 58fc9b29..f341b8bb 100644 --- a/server/like-common/pom.xml +++ b/server/like-common/pom.xml @@ -186,6 +186,12 @@ oshi-core + + + io.springfox + springfox-boot-starter + + com.github.binarywang @@ -198,9 +204,11 @@ weixin-java-mp + - io.springfox - springfox-boot-starter + com.github.binarywang + weixin-java-pay + 4.4.0 diff --git a/server/like-common/src/main/java/com/mdd/common/config/wechat/WxPayConfiguration.java b/server/like-common/src/main/java/com/mdd/common/config/wechat/WxPayConfiguration.java new file mode 100644 index 00000000..4b8935ab --- /dev/null +++ b/server/like-common/src/main/java/com/mdd/common/config/wechat/WxPayConfiguration.java @@ -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() + .eq("way", 2) + .last("limit 1")); + + Map 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() + .eq("way", 2) + .last("limit 1")); + + Map 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; + } + +} diff --git a/server/like-common/src/main/java/com/mdd/common/entity/setting/DevPayConfig.java b/server/like-common/src/main/java/com/mdd/common/entity/setting/DevPayConfig.java new file mode 100644 index 00000000..97e8b2ce --- /dev/null +++ b/server/like-common/src/main/java/com/mdd/common/entity/setting/DevPayConfig.java @@ -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; + +} diff --git a/server/like-common/src/main/java/com/mdd/common/mapper/setting/DevPayConfigMapper.java b/server/like-common/src/main/java/com/mdd/common/mapper/setting/DevPayConfigMapper.java new file mode 100644 index 00000000..e236f050 --- /dev/null +++ b/server/like-common/src/main/java/com/mdd/common/mapper/setting/DevPayConfigMapper.java @@ -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 { +} diff --git a/server/like-common/src/main/java/com/mdd/common/plugin/wechat/WxPayDriver.java b/server/like-common/src/main/java/com/mdd/common/plugin/wechat/WxPayDriver.java new file mode 100644 index 00000000..87cbdd7d --- /dev/null +++ b/server/like-common/src/main/java/com/mdd/common/plugin/wechat/WxPayDriver.java @@ -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() + .eq("way", 2) + .last("limit 1")); + + String scene = type.equals("oa") ? "oa_channel" : "mp_channel"; + String appId = ConfigUtils.get(scene, "appId", ""); + + Map 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); + } + +} diff --git a/server/like-front/src/main/java/com/mdd/front/controller/PayController.java b/server/like-front/src/main/java/com/mdd/front/controller/PayController.java new file mode 100644 index 00000000..e3257b40 --- /dev/null +++ b/server/like-front/src/main/java/com/mdd/front/controller/PayController.java @@ -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 + */ + @NotLogin + @PostMapping("/prepay") + public AjaxResult prepay() throws Exception { + iPayService.prepay(); + return AjaxResult.success(); + } + + /** + * 微信支付回调 + * + * @return AjaxResult + */ + public AjaxResult notifyMnp() { + return AjaxResult.success(); + } + +} diff --git a/server/like-front/src/main/java/com/mdd/front/controller/RechargeController.java b/server/like-front/src/main/java/com/mdd/front/controller/RechargeController.java new file mode 100644 index 00000000..4efc6ed2 --- /dev/null +++ b/server/like-front/src/main/java/com/mdd/front/controller/RechargeController.java @@ -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 list() { + return AjaxResult.success(); + } + + @PostMapping("/placeOrder") + public AjaxResult placeOrder() { + return AjaxResult.success(); + } + +} diff --git a/server/like-front/src/main/java/com/mdd/front/service/IPayService.java b/server/like-front/src/main/java/com/mdd/front/service/IPayService.java new file mode 100644 index 00000000..033934de --- /dev/null +++ b/server/like-front/src/main/java/com/mdd/front/service/IPayService.java @@ -0,0 +1,10 @@ +package com.mdd.front.service; + +/** + * 支付接口服务类 + */ +public interface IPayService { + + void prepay() throws Exception; + +} diff --git a/server/like-front/src/main/java/com/mdd/front/service/impl/PayServiceImpl.java b/server/like-front/src/main/java/com/mdd/front/service/impl/PayServiceImpl.java new file mode 100644 index 00000000..3914234b --- /dev/null +++ b/server/like-front/src/main/java/com/mdd/front/service/impl/PayServiceImpl.java @@ -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); + } + +} diff --git a/server/pom.xml b/server/pom.xml index 9fe4c180..7a5505f1 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -222,6 +222,13 @@ ${oshi-core.version} + + + io.springfox + springfox-boot-starter + 3.0.0 + + com.github.binarywang @@ -236,18 +243,19 @@ ${weixin.version} + + + com.github.binarywang + weixin-java-pay + ${weixin.version} + + org.mdd like-common ${like.version} - - - io.springfox - springfox-boot-starter - 3.0.0 -