前端-胡立永 3 months ago
parent
commit
79ce191be4
49 changed files with 1508 additions and 102 deletions
  1. +2
    -0
      .idea/compiler.xml
  2. +2
    -0
      .idea/encodings.xml
  3. +1
    -0
      .idea/misc.xml
  4. +1
    -0
      .trae/rules/project_rules.md
  5. +5
    -0
      jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/pom.xml
  6. +1
    -1
      jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiAddressController.java
  7. +1
    -1
      jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiLoginController.java
  8. +13
    -6
      jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiOrderController.java
  9. +51
    -0
      jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiSubscribeController.java
  10. +5
    -0
      jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/AppletApiOrderService.java
  11. +12
    -0
      jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/AppletApiSubscribeService.java
  12. +212
    -7
      jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiOrderServiceImpl.java
  13. +39
    -0
      jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiSubscribeServiceImpl.java
  14. +12
    -0
      jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletOrder/entity/AppletOrder.java
  15. +5
    -0
      jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletOrder/entity/AppletOrderProduct.java
  16. +5
    -0
      jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/entity/AppletProduct.java
  17. +1
    -1
      jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletSubscribeDetection/controller/AppletSubscribeDetectionController.java
  18. +46
    -20
      jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletSubscribeDetection/entity/AppletSubscribeDetection.java
  19. +1
    -1
      jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletSubscribeDetection/mapper/AppletSubscribeDetectionMapper.java
  20. +1
    -1
      jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletSubscribeDetection/service/IAppletSubscribeDetectionService.java
  21. +1
    -1
      jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletSubscribeDetection/service/impl/AppletSubscribeDetectionServiceImpl.java
  22. +35
    -11
      jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletSubscribeDetection/uniapp/AppletSubscribeDetectionForm.vue
  23. +27
    -7
      jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletSubscribeDetection/uniapp3/AppletSubscribeDetectionData.ts
  24. +59
    -22
      jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletSubscribeDetection/uniapp3/AppletSubscribeDetectionForm.vue
  25. +86
    -21
      jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletSubscribeDetection/vue3/AppletSubscribeDetection.data.ts
  26. +1
    -0
      jeecg-boot/jeecg-boot-module/module-pay/.gitignore
  27. +55
    -0
      jeecg-boot/jeecg-boot-module/module-pay/pom.xml
  28. +47
    -0
      jeecg-boot/jeecg-boot-module/module-pay/src/main/java/org/jeecg/PayDemoApplication.java
  29. +191
    -0
      jeecg-boot/jeecg-boot-module/module-pay/src/main/java/org/jeecg/modules/pay/AlipayService.java
  30. +43
    -0
      jeecg-boot/jeecg-boot-module/module-pay/src/main/java/org/jeecg/modules/pay/MpWxEntPayService.java
  31. +201
    -0
      jeecg-boot/jeecg-boot-module/module-pay/src/main/java/org/jeecg/modules/pay/MpWxPayService.java
  32. +23
    -0
      jeecg-boot/jeecg-boot-module/module-pay/src/main/java/org/jeecg/modules/pay/config/AliPay.java
  33. +29
    -0
      jeecg-boot/jeecg-boot-module/module-pay/src/main/java/org/jeecg/modules/pay/config/WeixinConfig.java
  34. +79
    -0
      jeecg-boot/jeecg-boot-module/module-pay/src/main/java/org/jeecg/modules/pay/config/WxPay.java
  35. +53
    -0
      jeecg-boot/jeecg-boot-module/module-pay/src/main/java/org/jeecg/modules/pay/config/WxPayConfiguration.java
  36. BIN
      jeecg-boot/jeecg-boot-module/module-pay/src/main/resources/apiclient_cert.p12
  37. +25
    -0
      jeecg-boot/jeecg-boot-module/module-pay/src/main/resources/apiclient_cert.pem
  38. +28
    -0
      jeecg-boot/jeecg-boot-module/module-pay/src/main/resources/apiclient_key.pem
  39. +28
    -0
      jeecg-boot/jeecg-boot-module/module-pay/src/main/resources/apiclient_key1.pem
  40. +2
    -0
      jeecg-boot/jeecg-boot-module/module-pay/src/main/resources/application.yml
  41. +4
    -0
      jeecg-boot/jeecg-boot-module/module-pay/src/main/resources/pay_alipay.properties
  42. +7
    -0
      jeecg-boot/jeecg-boot-module/module-pay/src/main/resources/pay_weixin.properties
  43. +1
    -0
      jeecg-boot/jeecg-boot-module/pom.xml
  44. BIN
      jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/apiclient_cert.p12
  45. +25
    -0
      jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/apiclient_cert.pem
  46. +28
    -0
      jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/apiclient_key.pem
  47. +2
    -2
      jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml
  48. +4
    -0
      jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/pay_alipay.properties
  49. +8
    -0
      jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/pay_weixin.properties

+ 2
- 0
.idea/compiler.xml View File

@ -9,6 +9,7 @@
<module name="jeecg-boot-module-airag" />
<module name="jeecg-system-cloud-api" />
<module name="jeecgboot-boot-applet" />
<module name="module-pay" />
<module name="jeecg-boot-base-core" />
<module name="jeecg-system-biz" />
<module name="jeecg-system-start" />
@ -31,6 +32,7 @@
<module name="jeecg-system-local-api" options="-parameters" />
<module name="jeecg-system-start" options="-parameters" />
<module name="jeecgboot-boot-applet" options="-parameters" />
<module name="module-pay" options="-parameters" />
</option>
</component>
</project>

+ 2
- 0
.idea/encodings.xml View File

@ -9,6 +9,8 @@
<file url="file://$PROJECT_DIR$/jeecg-boot/jeecg-boot-module/jeecg-module-demo/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/jeecg-boot/jeecg-boot-module/module-pay/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/jeecg-boot/jeecg-boot-module/module-pay/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/jeecg-boot/jeecg-boot-module/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/jeecg-boot/jeecg-boot-module/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/jeecg-boot/jeecg-module-system/jeecg-system-api/jeecg-system-cloud-api/src/main/java" charset="UTF-8" />


+ 1
- 0
.idea/misc.xml View File

@ -5,6 +5,7 @@
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/jeecg-boot/pom.xml" />
<option value="$PROJECT_DIR$/jeecg-boot/jeecg-boot-module/module-pay/pom.xml" />
</list>
</option>
</component>


+ 1
- 0
.trae/rules/project_rules.md View File

@ -4,3 +4,4 @@
4. 项目使用的是shiro权限框架
5. 项目使用的是vue3+element-plus前端框架
POST接口也不要使用@RequestBody接收参数,不使用参数注解

+ 5
- 0
jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/pom.xml View File

@ -34,6 +34,11 @@
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-boot-base-core</artifactId>
</dependency>
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>module-pay</artifactId>
<version>3.8.1</version>
</dependency>
</dependencies>
</project>

+ 1
- 1
jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiAddressController.java View File

@ -115,7 +115,7 @@ public class AppletApiAddressController {
*/
@Operation(summary="删除地址,多个用,分割")
@PostMapping(value = "/delete")
public Result<String> delete(@RequestParam String addressId) {
public Result<String> delete(String addressId) {
appletAddressService.delete(addressId);
return Result.OK("删除地址成功!");
}


+ 1
- 1
jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiLoginController.java View File

@ -120,4 +120,4 @@ public class AppletApiLoginController {
log.info("收到更新用户信息请求");
return appletApiLoginService.updateUserInfo(userInfo);
}
}
}

+ 13
- 6
jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiOrderController.java View File

@ -58,6 +58,12 @@ public class AppletApiOrderController {
}
//支付成功回调
@PostMapping("/payNotify")
public Object payNotify(@RequestBody String requestBody){
return appletApiOrderService.payNotify(requestBody);
}
/**
* 订单详情
*
@ -79,20 +85,21 @@ public class AppletApiOrderController {
*/
@Operation(summary = "创建订单")
@PostMapping(value = "/create")
public Result create(@RequestBody CreateOrderBo bo) {
public Result create(CreateOrderBo bo) {
return Result.OK(appletApiOrderService.create(bo));
}
/**
* 再次支付
*
* @param
* @param id 订单ID
* @return
*/
@Operation(summary = "再次支付")
@PostMapping(value = "/pay")
public Result pay(String id) {
return Result.OK();
Object payResult = appletApiOrderService.pay(id);
return Result.OK(payResult);
}
/**
@ -103,7 +110,7 @@ public class AppletApiOrderController {
*/
@Operation(summary = "申请售后")
@PostMapping(value = "/afterSale")
public Result afterSale(@RequestBody AppletOrderAfterSale afterSale) {
public Result afterSale(AppletOrderAfterSale afterSale) {
appletApiOrderService.afterSale(afterSale);
return Result.OK();
}
@ -116,7 +123,7 @@ public class AppletApiOrderController {
*/
@Operation(summary = "订单评价")
@PostMapping(value = "/evaluate")
public Result evaluate(@RequestBody AppletOrderEvaluate evaluate) {
public Result evaluate(AppletOrderEvaluate evaluate) {
appletApiOrderService.evaluate(evaluate);
return Result.OK();
}
@ -129,7 +136,7 @@ public class AppletApiOrderController {
*/
@Operation(summary = "确认收货")
@PostMapping(value = "/confirm")
public Result confirm(@RequestParam String id) {
public Result confirm(String id) {
appletApiOrderService.confirm(id);
return Result.OK();
}


+ 51
- 0
jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiSubscribeController.java View File

@ -0,0 +1,51 @@
package org.jeecg.modules.applet.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.config.shiro.IgnoreAuth;
import org.jeecg.modules.applet.service.AppletApiSubscribeService;
import org.jeecg.modules.demo.appletProduct.entity.AppletProduct;
import org.jeecg.modules.demo.appletSubscribeDetection.entity.AppletSubscribeDetection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@Tag(name="预约检测", description="预约检测")
@RestController
@RequestMapping("/appletApi/subscribe")
@Slf4j
public class AppletApiSubscribeController {
@Autowired
private AppletApiSubscribeService appletApiSubscribeService;
/**
* 预约检测列表查询
* @param type 预约检测类型(选填)
* @param pageNo 页码
* @param pageSize 每页大小
* @return 预约检测列表
*/
@AutoLog(value = "预约检测列表查询")
@Operation(summary = "预约检测列表查询", description = "分页查询")
@GetMapping(value = "/list")
public Result<IPage<AppletSubscribeDetection>> list(
@Parameter(description = "产品类型【选填】(0自采,1上门,2到店,3已取消)", required = false) String type,
@Parameter(description = "页码") @RequestParam(defaultValue = "1") Integer pageNo,
@Parameter(description = "每页大小") @RequestParam(defaultValue = "10") Integer pageSize) {
log.info("产品列表查询 - type: {}, pageNo: {}, pageSize: {}",
type, pageNo, pageSize);
return Result.OK(appletApiSubscribeService.getAppletSubscribeDetection(pageNo, pageSize, type));
}
}

+ 5
- 0
jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/AppletApiOrderService.java View File

@ -31,9 +31,14 @@ public interface AppletApiOrderService {
Object create(CreateOrderBo bo);
Object pay(String id);
Object payNotify(String requestBody);
void afterSale(AppletOrderAfterSale afterSale);
void evaluate(AppletOrderEvaluate evaluate);
void confirm(String id);
}

+ 12
- 0
jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/AppletApiSubscribeService.java View File

@ -0,0 +1,12 @@
package org.jeecg.modules.applet.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.jeecg.modules.demo.appletSubscribeDetection.entity.AppletSubscribeDetection;
public interface AppletApiSubscribeService {
IPage<AppletSubscribeDetection> getAppletSubscribeDetection(Integer pageNo, Integer pageSize, String type);
}

+ 212
- 7
jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiOrderServiceImpl.java View File

@ -3,7 +3,10 @@ package org.jeecg.modules.applet.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.system.util.AppletUserUtil;
import org.jeecg.modules.applet.bo.CreateOrderBo;
@ -26,6 +29,9 @@ import org.jeecg.modules.demo.appletProductSpec.entity.AppletProductSpec;
import org.jeecg.modules.demo.appletProductSpec.service.IAppletProductSpecService;
import org.jeecg.modules.demo.appletShippingAddress.entity.AppletShippingAddress;
import org.jeecg.modules.demo.appletShippingAddress.service.IAppletShippingAddressService;
import org.jeecg.modules.demo.appletSubscribeDetection.entity.AppletSubscribeDetection;
import org.jeecg.modules.demo.appletSubscribeDetection.service.IAppletSubscribeDetectionService;
import org.jeecg.modules.pay.MpWxPayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -39,6 +45,7 @@ import java.util.stream.Collectors;
@Service
@Slf4j
public class AppletApiOrderServiceImpl implements AppletApiOrderService {
@Autowired
@ -68,6 +75,12 @@ public class AppletApiOrderServiceImpl implements AppletApiOrderService {
@Autowired
private IAppletProductSpecService appletProductSpecService;
@Autowired
private MpWxPayService mpWxPayService;
@Autowired
private IAppletSubscribeDetectionService appletSubscribeDetectionService;
/**
* 订单列表查询
*
@ -77,8 +90,8 @@ public class AppletApiOrderServiceImpl implements AppletApiOrderService {
*/
@Override
public IPage<AppletOrder> page(Page<AppletOrder> page, String status) {
String userId = AppletUserUtil.getCurrentAppletUserId();
log.info("查询订单列表,用户ID: {}, 状态: {}, 页码: {}, 页大小: {}", userId, status, page.getCurrent(), page.getSize());
Page<AppletOrder> page1 = appletOrderService
.lambdaQuery()
@ -95,6 +108,7 @@ public class AppletApiOrderServiceImpl implements AppletApiOrderService {
record.setAfterSales(appletOrderAfterSaleService.getById(record.getId()));
}
log.info("订单列表查询完成,返回 {} 条记录", page1.getRecords().size());
return page1;
}
@ -106,8 +120,13 @@ public class AppletApiOrderServiceImpl implements AppletApiOrderService {
*/
@Override
public AppletOrder detail(String id) {
log.info("查询订单详情,订单ID: {}", id);
AppletOrder order = appletOrderService.getById(id);
if (order == null) {
log.warn("订单不存在,订单ID: {}", id);
throw new JeecgBootException("订单不存在");
}
order.setAppletOrderProductList(appletOrderProductService
.lambdaQuery()
@ -122,14 +141,17 @@ public class AppletApiOrderServiceImpl implements AppletApiOrderService {
order.setAfterSales(appletOrderAfterSaleService.getById(order.getId()));
log.info("订单详情查询完成,订单号: {}", order.getOrderNo());
return order;
}
@Override
public Object create(CreateOrderBo bo) {
String userId = AppletUserUtil.getCurrentAppletUserId();
log.info("开始创建订单,用户ID: {}, 商品数量: {}", userId, bo != null && bo.getList() != null ? bo.getList().size() : 0);
if (bo == null || bo.getList() == null || bo.getList().isEmpty()) {
log.error("创建订单失败,订单商品不能为空,用户ID: {}", userId);
throw new JeecgBootException("订单商品不能为空");
}
@ -144,11 +166,12 @@ public class AppletApiOrderServiceImpl implements AppletApiOrderService {
// 创建订单
AppletOrder order = new AppletOrder();
order.setTitle(list.size() > 1 ? "聚合订单" : null);
order.setUserId(userId);
order.setOrderNo(generateOrderNo()); // 生成订单号
order.setOrderDate(new Date());
order.setOrderStatus(0); // 0待支付但这里不需要支付直接设为1待发货
order.setPayId(generatePayId()); // 生成支付ID
if (address != null) {
order.setCustomerName(address.getName());
order.setCustomerPhone(address.getPhone());
@ -178,6 +201,10 @@ public class AppletApiOrderServiceImpl implements AppletApiOrderService {
spec = appletProductSpecService.getById(item.getSpecId());
}
if (StringUtils.isEmpty(order.getTitle())){
order.setTitle(product.getName());
}
// 创建订单商品
AppletOrderProduct orderProduct = new AppletOrderProduct();
orderProduct.setUserId(userId);
@ -187,7 +214,8 @@ public class AppletApiOrderServiceImpl implements AppletApiOrderService {
orderProduct.setQuantity(item.getNum());
orderProduct.setType(product.getType());
orderProduct.setUnit(product.getUnit());
orderProduct.setStatus("1"); // 正常状态
orderProduct.setStatus("0");
orderProduct.setSubscribeType(product.getSubscribeType());
if (spec != null) {
orderProduct.setSpecId(spec.getId());
@ -201,19 +229,168 @@ public class AppletApiOrderServiceImpl implements AppletApiOrderService {
}
order.setOrderAmount(totalAmount);
order.setPaymentMethod("无需支付"); // 不需要支付
order.setOrderStatus(1); // 直接设为待发货状态
order.setPaymentMethod("微信支付");
order.setOrderStatus(0); // 0待支付
// 保存订单
appletOrderService.save(order);
log.info("订单保存成功,订单ID: {}, 订单号: {}, 支付ID: {}", order.getId(), order.getOrderNo(), order.getPayId());
// 设置订单ID并保存订单商品
for (AppletOrderProduct orderProduct : orderProductList) {
orderProduct.setOrderId(order.getId());
}
appletOrderProductService.saveBatch(orderProductList);
log.info("订单商品保存成功,商品数量: {}", orderProductList.size());
// 调用微信支付创建订单
String openId = AppletUserUtil.getCurrentAppletUserOpenid();
String clientIp = "127.0.0.1"; // 可以从请求中获取真实IP
log.info("开始调用微信支付,订单ID: {}, 支付ID: {}, 金额: {}", order.getId(), order.getPayId(), totalAmount);
Object payResult = mpWxPayService.createOrder(
"订单支付", // 商品名称
clientIp, // 客户端IP
order.getId(), // 商品ID使用订单ID
1, // 金额转换为分
// totalAmount.multiply(new BigDecimal(100)).intValue(), // 金额转换为分
order.getPayId(), // 订单号
openId, // 用户openId
"订单支付" // 商品描述
);
log.info("微信支付调用完成,订单ID: {}", order.getId());
return payResult;
}
@Override
public Object pay(String id) {
log.info("开始重新支付,订单ID: {}", id);
if (StringUtils.isEmpty(id)) {
log.error("重新支付失败,订单ID不能为空");
throw new JeecgBootException("订单ID不能为空");
}
AppletOrder order = appletOrderService.getById(id);
if (order == null) {
log.error("重新支付失败,订单不存在,订单ID: {}", id);
throw new JeecgBootException("订单不存在");
}
if (order.getOrderStatus() != 0) {
log.error("重新支付失败,订单状态不正确,当前状态: {}, 订单ID: {}", order.getOrderStatus(), id);
throw new JeecgBootException("订单状态不正确,无法支付");
}
// 重新生成支付ID避免重复支付时订单号重复
String oldPayId = order.getPayId();
order.setPayId(generatePayId());
appletOrderService.updateById(order);
log.info("重新生成支付ID,订单ID: {}, 旧支付ID: {}, 新支付ID: {}", id, oldPayId, order.getPayId());
// 调用微信支付创建订单
String openId = AppletUserUtil.getCurrentAppletUserOpenid();
String clientIp = "127.0.0.1"; // 可以从请求中获取真实IP
log.info("开始调用微信支付重新支付,订单ID: {}, 支付ID: {}, 金额: {}", id, order.getPayId(), order.getOrderAmount());
Object payResult = mpWxPayService.createOrder(
"订单支付", // 商品名称
clientIp, // 客户端IP
order.getId(), // 商品ID使用订单ID
// order.getOrderAmount().multiply(new BigDecimal(100)).intValue(), // 金额转换为分
1,
order.getPayId(), // 支付ID作为订单号
openId, // 用户openId
"订单支付" // 商品描述
);
log.info("微信支付重新支付调用完成,订单ID: {}", id);
return payResult;
}
//支付成功支付回调
@Override
public Object payNotify(String requestBody) {
log.info("收到微信支付回调通知,requestBody: {}", requestBody);
try {
WxPayOrderNotifyResult notify = mpWxPayService.notify(requestBody);
String outTradeNo = notify.getOutTradeNo();
String totalFee = notify.getTotalFee().toString();
String resultCode = notify.getResultCode();
log.info("微信支付回调解析成功,订单号: {}, 金额: {}, 结果: {}", outTradeNo, totalFee, resultCode);
// 验证支付结果
if ("SUCCESS".equals(resultCode)) {
// 根据payId查找订单
AppletOrder order = appletOrderService.lambdaQuery()
.eq(AppletOrder::getPayId, outTradeNo)
.one();
if (order != null) {
// 检查订单状态避免重复处理
if (order.getOrderStatus() == 0) {
// 更新订单状态为已支付
order.setOrderStatus(1); // 1表示已支付待发货
order.setPaymentTime(LocalTime.now());
appletOrderService.updateById(order);
handleSpecialProducts(order.getId());
log.info("订单支付成功,订单ID: {}, payId: {}", order.getId(), outTradeNo);
} else {
log.warn("订单状态异常,当前状态: {}, 订单ID: {}", order.getOrderStatus(), order.getId());
}
} else {
log.error("未找到对应的订单,payId: {}", outTradeNo);
}
} else {
log.error("支付失败,订单号: {}, 错误信息: {}", outTradeNo, notify.getReturnMsg());
}
} catch (Exception e) {
log.error("处理微信支付回调异常", e);
return "<xml>" +
" <return_code><![CDATA[FAIL]]></return_code>" +
" <return_msg><![CDATA[处理异常]]></return_msg>" +
" </xml>";
}
return "<xml>" +
" <return_code><![CDATA[SUCCESS]]></return_code>" +
" <return_msg><![CDATA[OK]]></return_msg>" +
" </xml>";
}
/**
* 处理特殊产品
* @param id 订单id
*/
private void handleSpecialProducts(String id){
List<AppletOrderProduct> products = appletOrderProductService.selectByMainId(id);
for (AppletOrderProduct orderProduct : products) {
if ("1".equals(orderProduct.getType())){//检测类型添加检测数据
AppletSubscribeDetection detection = new AppletSubscribeDetection();
detection.setTitle(orderProduct.getProductName());
detection.setOrderId(id);
detection.setProductId(orderProduct.getProductId());
detection.setPrice(orderProduct.getPrice());
detection.setSkuId(orderProduct.getSpecId());
detection.setSubscribeType(orderProduct.getSpecId());
detection.setUserId(orderProduct.getUserId());
detection.setSubscribeType(orderProduct.getSubscribeType());
appletSubscribeDetectionService.save(detection);
}
}
return order.getId();
}
/**
@ -228,11 +405,26 @@ public class AppletApiOrderServiceImpl implements AppletApiOrderService {
return "ORD" + timestamp + random;
}
/**
* 生成支付ID
* @return 支付ID
*/
private String generatePayId() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
String timestamp = sdf.format(new Date());
// 添加4位随机数确保唯一性
int random = (int) (Math.random() * 9000) + 1000;
return "PAY" + timestamp + random;
}
@Override
public void afterSale(AppletOrderAfterSale afterSale) {
String userId = AppletUserUtil.getCurrentAppletUserId();
log.info("开始申请售后,用户ID: {}, 订单ID: {}, 售后原因: {}", userId, afterSale.getOrderId(), afterSale.getReason());
afterSale.setUserId(userId);
appletOrderAfterSaleService.save(afterSale);
log.info("售后申请保存成功,售后ID: {}", afterSale.getId());
appletOrderAfterSaleProcessService.save(AppletOrderAfterSaleProcess.builder()
.saleId(afterSale.getId())
@ -247,18 +439,23 @@ public class AppletApiOrderServiceImpl implements AppletApiOrderService {
.title("等待审核")
.orderId(afterSale.getOrderId())
.build());
log.info("售后流程记录创建完成,订单ID: {}", afterSale.getOrderId());
}
@Override
public void evaluate(AppletOrderEvaluate evaluate) {
String userId = AppletUserUtil.getCurrentAppletUserId();
log.info("开始订单评价,用户ID: {}, 订单ID: {}", userId, evaluate.getOrderId());
if (StringUtils.isEmpty(evaluate.getOrderId())){
log.error("订单评价失败,订单ID不能为空,用户ID: {}", userId);
throw new JeecgBootException("订单ID不能为空");
}
AppletOrder order = appletOrderService.getById(evaluate.getOrderId());
if (order == null){
log.error("订单评价失败,订单不存在,订单ID: {}", evaluate.getOrderId());
throw new JeecgBootException("订单不存在");
}
@ -272,22 +469,30 @@ public class AppletApiOrderServiceImpl implements AppletApiOrderService {
order.setOrderStatus(4);
appletOrderService.updateById(order);
log.info("订单状态更新为已评价,订单ID: {}", evaluate.getOrderId());
appletOrderEvaluateService.save(evaluate);
log.info("订单评价保存成功,订单ID: {}, 评价ID: {}", evaluate.getOrderId(), evaluate.getId());
}
@Override
public void confirm(String id) {
log.info("开始确认收货,订单ID: {}", id);
if (StringUtils.isEmpty(id)){
log.error("确认收货失败,订单ID不能为空");
throw new JeecgBootException("订单ID不能为空");
}
AppletOrder order = appletOrderService.getById(id);
if (order == null){
log.error("确认收货失败,订单不存在,订单ID: {}", id);
throw new JeecgBootException("订单不存在");
}
order.setOrderStatus(3);
appletOrderService.updateById(order);
log.info("确认收货成功,订单状态更新为已完成,订单ID: {}", id);
}
}

+ 39
- 0
jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiSubscribeServiceImpl.java View File

@ -0,0 +1,39 @@
package org.jeecg.modules.applet.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.modules.applet.service.AppletApiSubscribeService;
import org.jeecg.modules.demo.appletSubscribeDetection.entity.AppletSubscribeDetection;
import org.jeecg.modules.demo.appletSubscribeDetection.service.IAppletSubscribeDetectionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class AppletApiSubscribeServiceImpl implements AppletApiSubscribeService {
@Autowired
private IAppletSubscribeDetectionService appletSubscribeDetectionService;
@Override
public IPage<AppletSubscribeDetection> getAppletSubscribeDetection(Integer pageNo, Integer pageSize, String type) {
Page<AppletSubscribeDetection> page = appletSubscribeDetectionService.lambdaQuery()
.and(StringUtils.isNotBlank(type), q -> {//进行筛选
q.and("3".equals(type), w -> {
w.eq(AppletSubscribeDetection::getStatus, 3);
});
q.and(!"3".equals(type), w -> {
w.ne(AppletSubscribeDetection::getStatus, 3)
.eq(AppletSubscribeDetection::getType, type);
});
}).page(new Page<>(pageNo, pageSize));
return page;
}
}

+ 12
- 0
jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletOrder/entity/AppletOrder.java View File

@ -2,6 +2,7 @@ package org.jeecg.modules.demo.appletOrder.entity;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.time.LocalTime;
import java.util.Date;
import java.util.List;
@ -51,10 +52,21 @@ public class AppletOrder implements Serializable {
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@Schema(description = "更新日期")
private java.util.Date updateTime;
/**支付时间*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@Schema(description = "支付时间")
private LocalTime paymentTime;
/**订单编号*/
@Excel(name = "订单编号", width = 15)
@Schema(description = "订单编号")
private java.lang.String orderNo;
/**标题*/
@Excel(name = "标题", width = 15)
@Schema(description = "标题")
private java.lang.String title;
/**客户姓名*/
@Excel(name = "客户姓名", width = 15)
@Schema(description = "客户姓名")


+ 5
- 0
jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletOrder/entity/AppletOrderProduct.java View File

@ -98,4 +98,9 @@ public class AppletOrderProduct implements Serializable {
@Excel(name = "用户ID", width = 15)
@Schema(description = "用户ID")
private java.lang.String userId;
/**服务*/
@Excel(name = "检测类型", width = 15)
@Schema(description = "检测类型")
private String subscribeType;
}

+ 5
- 0
jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/entity/AppletProduct.java View File

@ -120,6 +120,11 @@ public class AppletProduct implements Serializable {
@Schema(description = "服务")
private String service;
/**服务*/
@Excel(name = "检测类型", width = 15)
@Schema(description = "检测类型")
private String subscribeType;
@TableField(exist = false)
private List<AppletProductSpec> specs;


+ 1
- 1
jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletSubscribeDetection/controller/AppletSubscribeDetectionController.java View File

@ -41,7 +41,7 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
/**
* @Description: 预约检测
* @Author: jeecg-boot
* @Date: 2025-07-22
* @Date: 2025-08-20
* @Version: V1.0
*/
@Tag(name="预约检测")


+ 46
- 20
jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletSubscribeDetection/entity/AppletSubscribeDetection.java View File

@ -8,21 +8,20 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.*;
import org.jeecg.common.constant.ProvinceCityArea;
import org.jeecg.common.util.SpringContextUtils;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecg.common.aspect.annotation.Dict;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* @Description: 预约检测
* @Author: jeecg-boot
* @Date: 2025-07-22
* @Date: 2025-08-20
* @Version: V1.0
*/
@Data
@ -30,6 +29,9 @@ import lombok.experimental.Accessors;
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@Schema(description="预约检测")
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class AppletSubscribeDetection implements Serializable {
private static final long serialVersionUID = 1L;
@ -75,30 +77,30 @@ public class AppletSubscribeDetection implements Serializable {
/**价格*/
@Excel(name = "价格", width = 15)
@Schema(description = "价格")
private java.lang.String price;
/**类型(自采、上门、到店)*/
@Excel(name = "类型(自采、上门、到店)", width = 15)
@Schema(description = "类型(自采、上门、到店)")
private BigDecimal price;
/**类型*/
@Excel(name = "类型", width = 15)
@Schema(description = "类型")
private java.lang.String type;
/**寄送地址id*/
@Excel(name = "寄送地址id", width = 15)
@Schema(description = "寄送地址id")
private java.lang.String sendAddressId;
/**寄送地址(*/
@Excel(name = "寄送地址(", width = 15)
@Schema(description = "寄送地址(")
/**省*/
@Excel(name = "省", width = 15)
@Schema(description = "省")
private java.lang.String sendAddressProvince;
/**详细地址*/
@Excel(name = "详细地址", width = 15)
@Schema(description = "详细地址")
private java.lang.String sendAddressDetail;
/**寄送地址(*/
@Excel(name = "寄送地址(", width = 15)
@Schema(description = "寄送地址(")
/**市*/
@Excel(name = "市", width = 15)
@Schema(description = "市")
private java.lang.String sendAddressCity;
/**寄送地址(*/
@Excel(name = "寄送地址(", width = 15)
@Schema(description = "寄送地址(")
/**区*/
@Excel(name = "区", width = 15)
@Schema(description = "区")
private java.lang.String sendAddressDistrict;
/**预约日期*/
@Excel(name = "预约日期", width = 15, format = "yyyy-MM-dd")
@ -109,9 +111,33 @@ public class AppletSubscribeDetection implements Serializable {
/**医院*/
@Excel(name = "医院", width = 15)
@Schema(description = "医院")
private java.lang.String hospital;
/**医院id*/
@Excel(name = "医院id", width = 15)
@Schema(description = "医院id")
private java.lang.String hospitalId;
/**可选预约类型*/
@Excel(name = "可选预约类型", width = 15, dicCode = "applett_subscribe_type")
@Dict(dicCode = "applett_subscribe_type")
@Schema(description = "可选预约类型")
private java.lang.String subscribeType;
/**状态*/
@Excel(name = "状态", width = 15, dicCode = "applet_subscribe_status")
@Dict(dicCode = "applet_subscribe_status")
@Schema(description = "状态")
private java.lang.String status;
/**产品*/
@Excel(name = "产品", width = 15)
@Schema(description = "产品")
private java.lang.String productId;
/**用户*/
@Excel(name = "用户", width = 15)
@Schema(description = "用户")
private java.lang.String userId;
/**规格*/
@Excel(name = "规格", width = 15, dictTable = "applet_product_spec", dicText = "spec_name", dicCode = "id")
@Dict(dictTable = "applet_product_spec", dicText = "spec_name", dicCode = "id")
@Schema(description = "规格")
private java.lang.String skuId;
/**订单*/
@Excel(name = "订单", width = 15, dictTable = "applet_order", dicText = "order_no", dicCode = "id")
@Dict(dictTable = "applet_order", dicText = "order_no", dicCode = "id")
@Schema(description = "订单")
private java.lang.String orderId;
}

+ 1
- 1
jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletSubscribeDetection/mapper/AppletSubscribeDetectionMapper.java View File

@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 预约检测
* @Author: jeecg-boot
* @Date: 2025-07-22
* @Date: 2025-08-20
* @Version: V1.0
*/
public interface AppletSubscribeDetectionMapper extends BaseMapper<AppletSubscribeDetection> {


+ 1
- 1
jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletSubscribeDetection/service/IAppletSubscribeDetectionService.java View File

@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
/**
* @Description: 预约检测
* @Author: jeecg-boot
* @Date: 2025-07-22
* @Date: 2025-08-20
* @Version: V1.0
*/
public interface IAppletSubscribeDetectionService extends IService<AppletSubscribeDetection> {


+ 1
- 1
jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletSubscribeDetection/service/impl/AppletSubscribeDetectionServiceImpl.java View File

@ -10,7 +10,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* @Description: 预约检测
* @Author: jeecg-boot
* @Date: 2025-07-22
* @Date: 2025-08-20
* @Version: V1.0
*/
@Service


+ 35
- 11
jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletSubscribeDetection/uniapp/AppletSubscribeDetectionForm.vue View File

@ -40,8 +40,8 @@
</view>
<view class="cu-form-group">
<view class="flex align-center">
<view class="title"><text space="ensp">类型自采上门到店</text></view>
<input placeholder="请输入类型(自采、上门、到店)" v-model="model.type"/>
<view class="title"><text space="ensp">类型</text></view>
<input placeholder="请输入类型" v-model="model.type"/>
</view>
</view>
<view class="cu-form-group">
@ -52,8 +52,8 @@
</view>
<view class="cu-form-group">
<view class="flex align-center">
<view class="title"><text space="ensp">寄送地址</text></view>
<input placeholder="请输入寄送地址(" v-model="model.sendAddressProvince"/>
<view class="title"><text space="ensp"></text></view>
<input placeholder="请输入省" v-model="model.sendAddressProvince"/>
</view>
</view>
<view class="cu-form-group">
@ -64,27 +64,51 @@
</view>
<view class="cu-form-group">
<view class="flex align-center">
<view class="title"><text space="ensp">寄送地址</text></view>
<input placeholder="请输入寄送地址(" v-model="model.sendAddressCity"/>
<view class="title"><text space="ensp"></text></view>
<input placeholder="请输入市" v-model="model.sendAddressCity"/>
</view>
</view>
<view class="cu-form-group">
<view class="flex align-center">
<view class="title"><text space="ensp">寄送地址</text></view>
<input placeholder="请输入寄送地址(" v-model="model.sendAddressDistrict"/>
<view class="title"><text space="ensp"></text></view>
<input placeholder="请输入区" v-model="model.sendAddressDistrict"/>
</view>
</view>
<my-date label="预约日期:" fields="day" v-model="model.subscribeDate" placeholder="请输入预约日期"></my-date>
<view class="cu-form-group">
<view class="flex align-center">
<view class="title"><text space="ensp">医院</text></view>
<input placeholder="请输入医院" v-model="model.hospital"/>
<input placeholder="请输入医院" v-model="model.hospitalId"/>
</view>
</view>
<view class="cu-form-group">
<view class="flex align-center">
<view class="title"><text space="ensp">医院id</text></view>
<input placeholder="请输入医院id" v-model="model.hospitalId"/>
<view class="title"><text space="ensp">可选预约类型</text></view>
<input placeholder="请输入可选预约类型" v-model="model.subscribeType"/>
</view>
</view>
<view class="cu-form-group">
<view class="flex align-center">
<view class="title"><text space="ensp">状态</text></view>
<input placeholder="请输入状态" v-model="model.status"/>
</view>
</view>
<view class="cu-form-group">
<view class="flex align-center">
<view class="title"><text space="ensp">产品</text></view>
<input placeholder="请输入产品" v-model="model.productId"/>
</view>
</view>
<view class="cu-form-group">
<view class="flex align-center">
<view class="title"><text space="ensp">规格</text></view>
<input placeholder="请输入规格" v-model="model.skuId"/>
</view>
</view>
<view class="cu-form-group">
<view class="flex align-center">
<view class="title"><text space="ensp">订单</text></view>
<input placeholder="请输入订单" v-model="model.orderId"/>
</view>
</view>
<view class="padding">


+ 27
- 7
jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletSubscribeDetection/uniapp3/AppletSubscribeDetectionData.ts View File

@ -27,7 +27,7 @@ export const columns = [
dataIndex: 'price'
},
{
title: '类型(自采、上门、到店)',
title: '类型',
align:"center",
dataIndex: 'type'
},
@ -37,7 +37,7 @@ export const columns = [
dataIndex: 'sendAddressId'
},
{
title: '寄送地址(',
title: '省',
align:"center",
dataIndex: 'sendAddressProvince'
},
@ -47,12 +47,12 @@ export const columns = [
dataIndex: 'sendAddressDetail'
},
{
title: '寄送地址(',
title: '市',
align:"center",
dataIndex: 'sendAddressCity'
},
{
title: '寄送地址(',
title: '区',
align:"center",
dataIndex: 'sendAddressDistrict'
},
@ -64,11 +64,31 @@ export const columns = [
{
title: '医院',
align:"center",
dataIndex: 'hospital'
dataIndex: 'hospitalId'
},
{
title: '医院id',
title: '可选预约类型',
align:"center",
dataIndex: 'hospitalId'
dataIndex: 'subscribeType_dictText'
},
{
title: '状态',
align:"center",
dataIndex: 'status_dictText'
},
{
title: '产品',
align:"center",
dataIndex: 'productId_dictText'
},
{
title: '规格',
align:"center",
dataIndex: 'skuId_dictText'
},
{
title: '订单',
align:"center",
dataIndex: 'orderId_dictText'
},
];

+ 59
- 22
jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletSubscribeDetection/uniapp3/AppletSubscribeDetectionForm.vue View File

@ -82,10 +82,10 @@ navigationBarTitleText: '预约检测',
<wd-input
label-width="100px"
v-model="myFormData['type']"
:label="get4Label('类型(自采、上门、到店)')"
:label="get4Label('类型')"
name='type'
prop='type'
placeholder="请选择类型(自采、上门、到店)"
placeholder="请选择类型"
:rules="[
]"
clearable
@ -108,10 +108,10 @@ navigationBarTitleText: '预约检测',
<wd-input
label-width="100px"
v-model="myFormData['sendAddressProvince']"
:label="get4Label('寄送地址(')"
:label="get4Label('省')"
name='sendAddressProvince'
prop='sendAddressProvince'
placeholder="请选择寄送地址("
placeholder="请选择省"
:rules="[
]"
clearable
@ -134,10 +134,10 @@ navigationBarTitleText: '预约检测',
<wd-input
label-width="100px"
v-model="myFormData['sendAddressCity']"
:label="get4Label('寄送地址(')"
:label="get4Label('市')"
name='sendAddressCity'
prop='sendAddressCity'
placeholder="请选择寄送地址("
placeholder="请选择市"
:rules="[
]"
clearable
@ -147,10 +147,10 @@ navigationBarTitleText: '预约检测',
<wd-input
label-width="100px"
v-model="myFormData['sendAddressDistrict']"
:label="get4Label('寄送地址(')"
:label="get4Label('区')"
name='sendAddressDistrict'
prop='sendAddressDistrict'
placeholder="请选择寄送地址("
placeholder="请选择区"
:rules="[
]"
clearable
@ -168,10 +168,10 @@ navigationBarTitleText: '预约检测',
<view class="{ 'mt-14px': 0 == 0 }">
<wd-input
label-width="100px"
v-model="myFormData['hospital']"
v-model="myFormData['hospitalId']"
:label="get4Label('医院')"
name='hospital'
prop='hospital'
name='hospitalId'
prop='hospitalId'
placeholder="请选择医院"
:rules="[
]"
@ -179,17 +179,54 @@ navigationBarTitleText: '预约检测',
/>
</view>
<view class="{ 'mt-14px': 1 == 0 }">
<wd-input
label-width="100px"
v-model="myFormData['hospitalId']"
:label="get4Label('医院id')"
name='hospitalId'
prop='hospitalId'
placeholder="请选择医院id"
:rules="[
]"
clearable
/>
<online-multi
:label="get4Label('可选预约类型')"
labelWidth="100px"
type="list_multi"
name='subscribeType'
dict="applett_subscribe_type"
v-model="myFormData['subscribeType']"
></online-multi>
</view>
<view class="{ 'mt-14px': 0 == 0 }">
<online-select
:label="get4Label('状态')"
labelWidth="100px"
type="list"
name='status'
dict="applet_subscribe_status"
v-model="myFormData['status']"
></online-select>
</view>
<view class="{ 'mt-14px': 1 == 0 }">
<online-select
:label="get4Label('产品')"
labelWidth="100px"
type="sel_search"
name='productId'
dict=""
v-model="myFormData['productId']"
></online-select>
</view>
<view class="{ 'mt-14px': 0 == 0 }">
<online-select
:label="get4Label('规格')"
labelWidth="100px"
type="sel_search"
name='skuId'
dict="applet_product_spec,spec_name,id"
v-model="myFormData['skuId']"
></online-select>
</view>
<view class="{ 'mt-14px': 1 == 0 }">
<online-select
:label="get4Label('订单')"
labelWidth="100px"
type="sel_search"
name='orderId'
dict="applet_order,order_no,id"
v-model="myFormData['orderId']"
></online-select>
</view>
</wd-cell-group>
</wd-form>


+ 86
- 21
jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletSubscribeDetection/vue3/AppletSubscribeDetection.data.ts View File

@ -31,7 +31,7 @@ export const columns: BasicColumn[] = [
dataIndex: 'price'
},
{
title: '类型(自采、上门、到店)',
title: '类型',
align:"center",
dataIndex: 'type'
},
@ -41,7 +41,7 @@ export const columns: BasicColumn[] = [
dataIndex: 'sendAddressId'
},
{
title: '寄送地址(',
title: '省',
align:"center",
dataIndex: 'sendAddressProvince'
},
@ -51,12 +51,12 @@ export const columns: BasicColumn[] = [
dataIndex: 'sendAddressDetail'
},
{
title: '寄送地址(',
title: '市',
align:"center",
dataIndex: 'sendAddressCity'
},
{
title: '寄送地址(',
title: '区',
align:"center",
dataIndex: 'sendAddressDistrict'
},
@ -72,16 +72,42 @@ export const columns: BasicColumn[] = [
{
title: '医院',
align:"center",
dataIndex: 'hospital'
dataIndex: 'hospitalId'
},
{
title: '医院id',
title: '可选预约类型',
align:"center",
dataIndex: 'hospitalId'
dataIndex: 'subscribeType_dictText'
},
{
title: '状态',
align:"center",
dataIndex: 'status_dictText'
},
{
title: '产品',
align:"center",
dataIndex: 'productId_dictText'
},
{
title: '规格',
align:"center",
dataIndex: 'skuId_dictText'
},
{
title: '订单',
align:"center",
dataIndex: 'orderId_dictText'
},
];
//查询数据
export const searchFormSchema: FormSchema[] = [
{
label: "类型",
field: 'type',
component: 'Input',
//colProps: {span: 6},
},
];
//表单数据
export const formSchema: FormSchema[] = [
@ -111,7 +137,7 @@ export const formSchema: FormSchema[] = [
component: 'Input',
},
{
label: '类型(自采、上门、到店)',
label: '类型',
field: 'type',
component: 'Input',
},
@ -121,7 +147,7 @@ export const formSchema: FormSchema[] = [
component: 'Input',
},
{
label: '寄送地址(',
label: '省',
field: 'sendAddressProvince',
component: 'Input',
},
@ -131,12 +157,12 @@ export const formSchema: FormSchema[] = [
component: 'Input',
},
{
label: '寄送地址(',
label: '市',
field: 'sendAddressCity',
component: 'Input',
},
{
label: '寄送地址(',
label: '区',
field: 'sendAddressDistrict',
component: 'Input',
},
@ -150,13 +176,48 @@ export const formSchema: FormSchema[] = [
},
{
label: '医院',
field: 'hospital',
field: 'hospitalId',
component: 'Input',
},
{
label: '医院id',
field: 'hospitalId',
component: 'Input',
label: '可选预约类型',
field: 'subscribeType',
component: 'JSelectMultiple',
componentProps:{
dictCode:"applett_subscribe_type"
},
},
{
label: '状态',
field: 'status',
component: 'JDictSelectTag',
componentProps:{
dictCode:"applet_subscribe_status"
},
},
{
label: '产品',
field: 'productId',
component: 'JSearchSelect',
componentProps:{
dict:""
},
},
{
label: '规格',
field: 'skuId',
component: 'JSearchSelect',
componentProps:{
dict:"applet_product_spec,spec_name,id"
},
},
{
label: '订单',
field: 'orderId',
component: 'JSearchSelect',
componentProps:{
dict:"applet_order,order_no,id"
},
},
// TODO 主键隐藏字段,目前写死为ID
{
@ -174,15 +235,19 @@ export const superQuerySchema = {
subscribeTime: {title: '预约时间',order: 2,view: 'text', type: 'string',},
phone: {title: '客户电话',order: 3,view: 'text', type: 'string',},
price: {title: '价格',order: 4,view: 'text', type: 'string',},
type: {title: '类型(自采、上门、到店)',order: 5,view: 'text', type: 'string',},
type: {title: '类型',order: 5,view: 'text', type: 'string',},
sendAddressId: {title: '寄送地址id',order: 6,view: 'text', type: 'string',},
sendAddressProvince: {title: '寄送地址(',order: 7,view: 'text', type: 'string',},
sendAddressProvince: {title: '省',order: 7,view: 'text', type: 'string',},
sendAddressDetail: {title: '详细地址',order: 8,view: 'text', type: 'string',},
sendAddressCity: {title: '寄送地址(',order: 9,view: 'text', type: 'string',},
sendAddressDistrict: {title: '寄送地址(',order: 10,view: 'text', type: 'string',},
sendAddressCity: {title: '市',order: 9,view: 'text', type: 'string',},
sendAddressDistrict: {title: '区',order: 10,view: 'text', type: 'string',},
subscribeDate: {title: '预约日期',order: 11,view: 'date', type: 'string',},
hospital: {title: '医院',order: 12,view: 'text', type: 'string',},
hospitalId: {title: '医院id',order: 13,view: 'text', type: 'string',},
hospitalId: {title: '医院',order: 12,view: 'text', type: 'string',},
subscribeType: {title: '可选预约类型',order: 13,view: 'list_multi', type: 'string',dictCode: 'applett_subscribe_type',},
status: {title: '状态',order: 14,view: 'list', type: 'string',dictCode: 'applet_subscribe_status',},
productId: {title: '产品',order: 15,view: 'sel_search', type: 'string',dictCode: '',},
skuId: {title: '规格',order: 16,view: 'sel_search', type: 'string',dictTable: "applet_product_spec", dictCode: 'id', dictText: 'spec_name',},
orderId: {title: '订单',order: 17,view: 'sel_search', type: 'string',dictTable: "applet_order", dictCode: 'id', dictText: 'order_no',},
};
/**


+ 1
- 0
jeecg-boot/jeecg-boot-module/module-pay/.gitignore View File

@ -0,0 +1 @@
/target/

+ 55
- 0
jeecg-boot/jeecg-boot-module/module-pay/pom.xml View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>jeecg-boot-module</artifactId>
<groupId>org.jeecgframework.boot</groupId>
<version>3.8.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>module-pay</artifactId>
<properties>
<weixin.version>3.5.0</weixin.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- alipay -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.11.33.ALL</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.3</version>
</dependency>
<!-- mp -->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
<version>${weixin.version}</version>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>${weixin.version}</version>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>${weixin.version}</version>
</dependency>
</dependencies>
</project>

+ 47
- 0
jeecg-boot/jeecg-boot-module/module-pay/src/main/java/org/jeecg/PayDemoApplication.java View File

@ -0,0 +1,47 @@
package org.jeecg;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import org.jeecg.modules.pay.MpWxPayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SpringBootApplication
public class PayDemoApplication {
public static void main(String[] args) {
ConfigurableApplicationContext app = SpringApplication.run(PayDemoApplication.class, args);
// 用法说明 @Autowired MpWxPayService mpWxPayService
MpWxPayService bean = app.getBean(MpWxPayService.class);
//Object callback = bean.createAppOrder("产品名", "127.0.0.1", "89", 1, "20219092", "{}","");
//System.err.println(callback.toString());
Object webOrder = bean.createWebOrder("产品名", "117.61.97.157", "89", 1, "20219092", "{}", "");
System.err.println(webOrder.toString());
//缓存该数据用于与异步通知对比处理
//WxPayAppOrderResult(sign=6E404CB2E71FD391BB0FE2C2B12F5264, prepayId=wx17011430290850d50f73c68d61e80a0000, partnerId=1560997691, appId=wx7081b3f6277c100d, packageValue=Sign=WXPay, timeStamp=1637082870, nonceStr=1637082870392)
//取以上数据交由前端调起支付
}
//部署该地址至外网接受异步通知
@RequestMapping("/notify")
public Object notify(@RequestBody String requestBody, @Autowired MpWxPayService mpWxPayService){
WxPayOrderNotifyResult notify = mpWxPayService.notify(requestBody);
String outTradeNo = notify.getOutTradeNo();
System.err.println(outTradeNo);
//对比outTradeNo进行业务处理
if (notify == null){
//会继续通知
return "FAIL";
}
//不再通知该结果
return "SUCCESS";
}
}

+ 191
- 0
jeecg-boot/jeecg-boot-module/module-pay/src/main/java/org/jeecg/modules/pay/AlipayService.java View File

@ -0,0 +1,191 @@
package org.jeecg.modules.pay;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.domain.AlipayTradeWapPayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import lombok.Data;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.pay.config.AliPay;
import org.springframework.web.bind.annotation.RequestMapping;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
@Slf4j
public class AlipayService {
AlipayClient alipayClient;
AliPay aliPay;
final String web_notify_Url = "";
final String web_retrun_Url = "";
final String app_notify_Url = "";
@RequestMapping("/webpay")
public Object webpay() {
String subject = "小李飞刀";
String amount = "0.01";
String body = "uid:9090";
String orderNo = String.valueOf(System.currentTimeMillis());
AlipayTradeWapPayRequest alipay_request=new AlipayTradeWapPayRequest();
AlipayTradeWapPayModel model=new AlipayTradeWapPayModel();
model.setOutTradeNo(orderNo);
model.setSubject(subject);
model.setTotalAmount(amount);
model.setBody(body);
model.setTimeoutExpress("5m");
model.setProductCode("QUICK_WAP_PAY");
alipay_request.setBizModel(model);
alipay_request.setNotifyUrl(web_notify_Url);
alipay_request.setReturnUrl(web_retrun_Url);
try {
return alipayClient.pageExecute(alipay_request).getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
return e.getErrMsg();
}
}
@RequestMapping("/reback")
public String webpayNotify() {
return null;
}
@RequestMapping("apppay")
public Object apppay(String subject, String clientIp, String productId, Integer price, String orderNo, String body){
System.err.printf("create Order: \n{} \n{} \n{} \n{} \n{} \n{}", subject, clientIp, productId, price, orderNo, body);
String amount = BigDecimal.valueOf(price/100).toString();
//String amount = "0.01";
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setOutTradeNo(orderNo);
model.setBody(body);
model.setSubject(subject);
model.setTimeoutExpress("15m");
model.setTotalAmount(amount);
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl(app_notify_Url);
try {
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
return response.getBody();
} catch (AlipayApiException alipayae) {
alipayae.printStackTrace();
return alipayae.getErrMsg();
}
}
public AliPayNotifyResult appNotify(Map<String,String[]> requestParams) throws AlipayApiException {
Map<String,String> params = new HashMap<>();
for (String name : requestParams.keySet()) {
String[] values = requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
}
if (name.equals("trade_status")) {
System.out.println("交易状态为:" + valueStr);
}
//乱码解决这段代码在出现乱码时使用如果mysign和sign不相等也可以使用这段代码转化
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
params.put(name, valueStr);
}
//return new AliPayNotifyResult(params, aliPay.getAliPubilcKey());
return new AliPayNotifyResult(params, "");
}
public JSONObject selectAlipayResult(String outTradeNo){
try {
//实例化客户端参数网关地址商户appid商户私钥格式编码支付宝公钥加密类型
AlipayTradeQueryRequest alipayTradeQueryRequest = new AlipayTradeQueryRequest();
alipayTradeQueryRequest.setBizContent("{" + "\"out_trade_no\":\""+outTradeNo+"\"" + "}");
AlipayTradeQueryResponse alipayTradeQueryResponse = alipayClient.execute(alipayTradeQueryRequest);
if(alipayTradeQueryResponse.isSuccess()){
switch (alipayTradeQueryResponse.getTradeStatus()) // 判断交易结果
{
case "TRADE_FINISHED": // 交易结束并不可退款
break;
case "TRADE_SUCCESS": // 交易支付成功
break;
case "TRADE_CLOSED": // 未付款交易超时关闭或支付完成后全额退款
break;
case "WAIT_BUYER_PAY": // 交易创建并等待买家付款
break;
default:
break;
}
return null;
} else {
return null;
}
} catch (AlipayApiException e) {
e.printStackTrace();
}
return null;
}
@Data
@ToString
public static class AliPayNotifyResult {
private String outTradeNo;
private String tradeNo;
private String authAppId;
private String buyerLogonId;
private String gmtPayment;
private String invoiceAmount;
private Boolean verifyResult = false;
public AliPayNotifyResult(Map<String, String> params, String pubilcKey){
this.outTradeNo = new String(params.get("out_trade_no"));
this.tradeNo = new String(params.get("trade_no"));
this.authAppId = new String(params.get("auth_app_id"));
this.buyerLogonId = new String(params.get("buyer_logon_id"));
this.gmtPayment = new String(params.get("gmt_payment"));
this.invoiceAmount = new String(params.get("invoice_amount"));
try {
this.verifyResult = AlipaySignature.rsaCheckV1(params, pubilcKey, "UTF-8", "RSA2");
} catch (AlipayApiException e) {
e.printStackTrace();
}
}
}
}

+ 43
- 0
jeecg-boot/jeecg-boot-module/module-pay/src/main/java/org/jeecg/modules/pay/MpWxEntPayService.java View File

@ -0,0 +1,43 @@
package org.jeecg.modules.pay;
import com.alibaba.fastjson.JSON;
import com.github.binarywang.wxpay.bean.entpay.EntPayRequest;
import com.github.binarywang.wxpay.bean.entpay.EntPayResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.pay.config.WxPay;
/**
* 微信付款到账户
**/
@Slf4j
public class MpWxEntPayService {
WxPay wxPayConfig;
WxPayService wxPayService;
public String entPay(Integer amount, String openId, String desc, String ip, String mchOrderNo) {
EntPayRequest entPayRequest = new EntPayRequest();
entPayRequest.setAppid(wxPayConfig.appId);
entPayRequest.setMchId(wxPayConfig.mchId);
entPayRequest.setPartnerTradeNo(mchOrderNo);
entPayRequest.setOpenid(openId);
entPayRequest.setCheckName("NO_CHECK");
entPayRequest.setAmount(amount);
entPayRequest.setDescription(desc);
entPayRequest.setSpbillCreateIp(ip);
EntPayResult entPayResult;
try {
entPayResult = wxPayService.getEntPayService().entPay(entPayRequest);
System.err.println("打款结果:" + entPayRequest);
} catch (WxPayException wpe) {
return wpe.getErrCodeDes();
} catch (Exception e) {
return e.getLocalizedMessage();
}
return JSON.toJSONString(entPayResult);
}
}

+ 201
- 0
jeecg-boot/jeecg-boot-module/module-pay/src/main/java/org/jeecg/modules/pay/MpWxPayService.java View File

@ -0,0 +1,201 @@
package org.jeecg.modules.pay;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
import com.github.binarywang.wxpay.bean.order.WxPayMwebOrderResult;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.constant.WxPayConstants;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import org.jeecg.modules.pay.config.WxPay;
import java.io.File;
@SuppressWarnings("all")
public class MpWxPayService {
public boolean dev = false;
public WxPay wxPay;
public WxPayService wxPayService;
/**
* 生成二维码
* @param codeUrl
* @param logoFile
* @param sideLength
* @return
*/
public Object createScanPayQrcodeMode2(String codeUrl, File logoFile, Integer sideLength){
try {
byte[] scanPayQrcodeMode2 = wxPayService.createScanPayQrcodeMode2(codeUrl, null, null);
return scanPayQrcodeMode2;
} catch (Exception e) {
e.printStackTrace();
return e.getLocalizedMessage();
}
}
/**
* 扫码支付
* @param productName
* @param clientIp
* @param productId
* @param price
* @param orderNo
* @param openId
* @param body
* @return
*/
public Object createQrOrder(String productName, String clientIp,
String productId, Integer price, String orderNo, String body) {
WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
request.setDeviceInfo("WEB"); //设备号
request.setTradeType("NATIVE"); //交易类型
request.setBody(productName); //商品描述
request.setOutTradeNo(orderNo); //商户订单号
request.setDetail(productName); //商品详情
request.setTotalFee(price); //总金额|分计
request.setSpbillCreateIp(clientIp); //终端IP
request.setNotifyUrl(wxPay.notifyUrl);//设置回调路径
request.setProductId(productId); //商品id
if (dev) {
request.setTotalFee(price);
request.setNotifyUrl(wxPay.notifyUrlDev);
}
try {
Object order = wxPayService.unifiedOrder(request);
return order;
} catch (WxPayException e) {
e.printStackTrace();
return e.getLocalizedMessage();
}
}
/**
* 微信吊起支付
* @param productName
* @param clientIp
* @param productId
* @param price
* @param orderNo
* @param openId
* @param body
* @return
*/
public Object createOrder(String productName, String clientIp,
String productId, Integer price, String orderNo,
String openId, String body){
WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
request.setDeviceInfo("WEB"); //设备号
request.setTradeType("JSAPI"); //交易类型
request.setBody(productName); //商品描述
request.setOutTradeNo(orderNo); //商户订单号
request.setDetail(productName); //商品详情
request.setTotalFee(price); //总金额|分计
request.setSpbillCreateIp(clientIp); //终端IP
request.setNotifyUrl(wxPay.notifyOneUrl);//设置回调路径
request.setProductId(productId); //商品id
request.setOpenid(openId); //JSAPI OPENID
if (dev){
request.setTotalFee(price);
request.setNotifyUrl(wxPay.notifyUrlOneDev);
}
try {
Object order = wxPayService.createOrder(request);
return order;
} catch (WxPayException e) {
e.printStackTrace();
return e.getLocalizedMessage();
}
}
public WxPayOrderNotifyResult notify(String requestBody){
WxPayOrderNotifyResult notify = null;
try {
notify = wxPayService.parseOrderNotifyResult(requestBody);
} catch (WxPayException e) {
e.printStackTrace();
}
return notify;
}
public Object createAppOrder(String productName, String clientIp,
String productId, Integer price,
String orderNo, String body,
String openid){
WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
request.setDeviceInfo("WEB");
request.setBody(productName);
request.setOutTradeNo(orderNo);
request.setDetail(productName);
request.setTotalFee(price);
request.setSpbillCreateIp(clientIp);
request.setNotifyUrl(wxPay.notifyUrl);
request.setTradeType(WxPayConstants.TradeType.JSAPI);
request.setProductId(productId);
request.setAppid(wxPay.appId);
request.setOpenid(openid);
if (dev){
request.setTotalFee(price);
request.setNotifyUrl(wxPay.notifyUrlDev);
request.setAppid(wxPay.appId);
request.setOpenid(openid);
}
try {
Object order = wxPayService.createOrder(request);
return order;
} catch (WxPayException e) {
e.printStackTrace();
return e.getLocalizedMessage();
}
}
public Object createWebOrder(String productName, String clientIp,
String productId, Integer price,
String orderNo, String body,
String openid){
WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
request.setDeviceInfo("WEB");
request.setBody(productName);
request.setOutTradeNo(orderNo);
request.setDetail(productName);
request.setTotalFee(price);
request.setSpbillCreateIp(clientIp);
request.setNotifyUrl(wxPay.notifyUrl);
request.setTradeType(WxPayConstants.TradeType.MWEB);
request.setProductId(productId);
request.setAppid(wxPay.appId);
request.setOpenid(openid);
if (dev){
request.setTotalFee(price);
request.setNotifyUrl(wxPay.notifyUrlDev);
request.setAppid(wxPay.appId);
request.setOpenid(openid);
}
try {
Object order = wxPayService.createOrder(request);
return order;
} catch (WxPayException e) {
e.printStackTrace();
return e.getLocalizedMessage();
}
}
public WxPayOrderNotifyResult appNotify(String requestBody){
WxPayOrderNotifyResult notify = null;
try {
notify = wxPayService.parseOrderNotifyResult(requestBody);
} catch (WxPayException e) {
e.printStackTrace();
}
return notify;
}
}

+ 23
- 0
jeecg-boot/jeecg-boot-module/module-pay/src/main/java/org/jeecg/modules/pay/config/AliPay.java View File

@ -0,0 +1,23 @@
package org.jeecg.modules.pay.config;
import lombok.Data;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Data
@ToString
@Component
@PropertySource("classpath:pay_alipay.properties")
@ConfigurationProperties(prefix = "alipay")
public class AliPay {
private String appId;
private String aliPubilcKey;
private String appPrivateKey;
private String appPubilcKey;
}

+ 29
- 0
jeecg-boot/jeecg-boot-module/module-pay/src/main/java/org/jeecg/modules/pay/config/WeixinConfig.java View File

@ -0,0 +1,29 @@
package org.jeecg.modules.pay.config;
import com.github.binarywang.wxpay.service.WxPayService;
import lombok.extern.java.Log;
import org.jeecg.modules.pay.MpWxPayService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
@Log
@Configuration
public class WeixinConfig {
@Resource
WxPay wxPay;
@Resource
WxPayService wxPayService;
@Bean
public MpWxPayService mpWxPayService(){
MpWxPayService mpWxPayService = new MpWxPayService();
mpWxPayService.wxPay = wxPay;
mpWxPayService.wxPayService = wxPayService;
mpWxPayService.dev = true;
log.info("MpWxPayService is regiterd (" + (mpWxPayService.dev?"dev":"prod") + ") as " + wxPay.mchId);
return mpWxPayService;
}
}

+ 79
- 0
jeecg-boot/jeecg-boot-module/module-pay/src/main/java/org/jeecg/modules/pay/config/WxPay.java View File

@ -0,0 +1,79 @@
package org.jeecg.modules.pay.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Data
@Component
@PropertySource("classpath:pay_weixin.properties")
@ConfigurationProperties(prefix = "pay")
public class WxPay {
/**
* 微信支付mchId
*/
public String mchId;
/**
* app支付appId JS支付openId
*/
public String appId;
/**
* 微信支付mchKey
*/
public String mchKey;
/**
* 回调地址
*/
public String notifyUrl;
/**
* 回调地址dev
*/
public String notifyUrlDev;
/**
* 回调地址
*/
public String notifyOneUrl;
/**
* 回调地址dev
*/
public String notifyUrlOneDev;
/**
* 签名类型
*/
public String signType;
/**
* 支付证书路径
*/
public String keyPath;
/**
* 回调地址
*/
public String notifyOrderUrl;
/**
* 回调地址dev
*/
public String notifyOrderUrlDev;
}

+ 53
- 0
jeecg-boot/jeecg-boot-module/module-pay/src/main/java/org/jeecg/modules/pay/config/WxPayConfiguration.java View File

@ -0,0 +1,53 @@
package org.jeecg.modules.pay.config;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.constant.WxPayConstants;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
@Configuration
@RequiredArgsConstructor
@ConditionalOnClass(WxPayService.class)
public class WxPayConfiguration {
@Resource
private WxPay wxPay;
@Bean
public WxPayService wxMpPayService() {
WxPayConfig payConfig = new WxPayConfig();
payConfig.setAppId(wxPay.appId);
payConfig.setMchId(wxPay.mchId);
payConfig.setMchKey(wxPay.mchKey);
payConfig.setKeyPath(wxPay.keyPath);
payConfig.setSignType(WxPayConstants.SignType.MD5);
WxPayService wxPayService = new WxPayServiceImpl();
wxPayService.setConfig(payConfig);
return wxPayService;
}
// @Bean("saboxWxPayService")
// public WxPayService saboxWxPayService(){
// WxPayConfig payConfig = new WxPayConfig();
// WxPayService wxPayService = new WxPayServiceImpl();
// String sandboxSignKey = null;
// try {
// wxPayService.setConfig(payConfig);
// sandboxSignKey = wxPayService.getSandboxSignKey();
// } catch (WxPayException e) {
// e.printStackTrace();
// }
// payConfig.setUseSandboxEnv(true);
// payConfig.setMchKey(sandboxSignKey);
// wxPayService.setConfig(payConfig);
// return wxPayService;
// }
}

BIN
jeecg-boot/jeecg-boot-module/module-pay/src/main/resources/apiclient_cert.p12 View File


+ 25
- 0
jeecg-boot/jeecg-boot-module/module-pay/src/main/resources/apiclient_cert.pem View File

@ -0,0 +1,25 @@
-----BEGIN CERTIFICATE-----
MIIENDCCAxygAwIBAgIUe+VtxpWythK9HGxxCn+/oaxGsQ8wDQYJKoZIhvcNAQEL
BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
Q0EwHhcNMjQxMjA5MDUzNTU3WhcNMjkxMjA4MDUzNTU3WjCBjTETMBEGA1UEAwwK
MTY1OTA2Njg3MDEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMTkwNwYDVQQL
DDDlvq7nqIvpg6jokL3vvIjoi4/lt57vvInlm73pmYXml4XooYzmnInpmZDlhazl
j7gxCzAJBgNVBAYTAkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBAMOUPv24dTCOvyuFKWTuDIK+ZYA4f3DWe+Xq+NK0
3RQRsaQ9gS1mEAqnKTArm49XQJcckjxrsiW/6qsLRjWb4xDrdJnwAdv57nB36IaR
dJdfhP/LaMEcEZXEmTA8Hts3ueHtRirg5nU8HnEpe9jBiCtO2YMrEyvBtqh0mvIt
uLr9bMLhBwotJBPAno716EdWtRZsFeLNgplf9AeP0FBjvca182GP+mlVWHjx0+R9
jLbSkZLm04/pUMeyU1B7UUexQvPZAqv1+pRwYqX0KGeltxQCQO0fOUjY0NiJWyJ1
ElmNqMkDjOljKfdJv12XpUb8GxWAtMBI8OiHyWKdcqSya4ECAwEAAaOBuTCBtjAJ
BgNVHRMEAjAAMAsGA1UdDwQEAwID+DCBmwYDVR0fBIGTMIGQMIGNoIGKoIGHhoGE
aHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2NybD9DQT0xQkQ0
MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMwMUMzRThFQkQyJnNnPUhBQ0M0NzFC
NjU0MjJFMTJCMjdBOUQzM0E4N0FEMUNERjU5MjZFMTQwMzcxMA0GCSqGSIb3DQEB
CwUAA4IBAQB2wKNWFtzqAwwVMH2QeF2Fx8i0utPR03D22jmaHGtsxV08vxo2tt6k
j9Xh2X4sTwn7ZDcPWP8Yqq41m3/LxmSpcaocTUG5WAIr7Waz19pmqUnFit17XiZb
PEHNLtz1UosdpsrEKbRBQOz3VYZBsB/IPBEVOKrcmt9oRgMFKz1LfSG/DBY2Vf9q
yUagxC1wsSP1ZFYL6ZCkroXmmyMDaaJ9JvSYRBfmmXJ0626ag2L1FqzDHIObFM+J
3Im6Qm0c9TzH/VsX/QdJhDJcYN6jlBn22xnWeVMnLNS5YzX7zcDuZR3m0Oakru6y
i6bO8IWfJzS22nnM0hy1ORHieMB6Jrsq
-----END CERTIFICATE-----

+ 28
- 0
jeecg-boot/jeecg-boot-module/module-pay/src/main/resources/apiclient_key.pem View File

@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDDlD79uHUwjr8r
hSlk7gyCvmWAOH9w1nvl6vjStN0UEbGkPYEtZhAKpykwK5uPV0CXHJI8a7Ilv+qr
C0Y1m+MQ63SZ8AHb+e5wd+iGkXSXX4T/y2jBHBGVxJkwPB7bN7nh7UYq4OZ1PB5x
KXvYwYgrTtmDKxMrwbaodJryLbi6/WzC4QcKLSQTwJ6O9ehHVrUWbBXizYKZX/QH
j9BQY73GtfNhj/ppVVh48dPkfYy20pGS5tOP6VDHslNQe1FHsULz2QKr9fqUcGKl
9ChnpbcUAkDtHzlI2NDYiVsidRJZjajJA4zpYyn3Sb9dl6VG/BsVgLTASPDoh8li
nXKksmuBAgMBAAECggEAf4/cee3qeY5RP9hthEgDXu9CEpxG+tjaHL7iJcQTgfh8
bcwzyeGMyvX2VlXK83YMScM32jLAEgEX1RHYbDTNqAZ6mcDB5bEhBLggsEyEyApk
G9aW74UYLx/4bk54LbEuCx6QKn1fss1QaayN+3VXFDAsjHH24g5JzZuoSBbsKwDl
WVP3wHh87x4eiXnDtR9hBG5ul5AXRhuE24ka1cpYE0N3/7cm+D+lNfvXz/A427z9
6+El2sBTutrfIzFnJjz2KUX1RqFHXqBWVwCxUPH0SSp6l59qy/kWOkIW1nlOjo8x
fPoLEd6y6x5YgaNSLG3ur4hhxp7h/2beVqwfmSSxJQKBgQDwuG8LTpB+xDKjmE3C
sX82n1yvE6I0UQo4mc/5LkS/PxsKAE9zo6yX96WsFThY8S43Ep6gg6SdMVGINHBx
vPudiWgIrhGMocJ+9PHapJQBtUAxem64gNVxSXFrfyphjO+GRtM4ji9+71fcUwFD
lS0T0wKm5MVCbSzbUWIdGgWM5wKBgQDP/kqqP/SalLD89dQa4jaJ5jOQJTiYq7lB
9BIsy23dQEv5mNXJS6pcOjayuE1iaiYdA0Ri0Rueu4xZ+hNaAdSHcH1Pgt/0qMI7
+SuaHjPFxffNFtePkmHg6dS9JzXwQ/xub6ZOf+E/qUf1BTv6ja0o69ApWl0RFtAF
xL/Z6kIPVwKBgETsujbllvAFI26+ND2z7vXn6XTjzUTnk2Kjf+4cNmkAG7DgZ993
lPqqWRCNvuWQoSf5t9vD9cVgkrTKNwwKDY2NA3HAzZuT0YnifsGY8BwRFsFUChHg
Kb1XRxd9gNgPr6Gl8+K0q5rP0ztttOXx98c+WvsIdAbSFc7yXYJxqfcvAoGAAorI
HNaVRcJle2IByqZTJlJS9QMPcwY+SGkUQ8nkuNyNUSqmCkTLez8W5g5Mm9RSTO56
Sn7lyIXgTEU7MVFuaI1earddx168qQD9oG+YEGXABpit38pZOeeBuyIcjag3EJ56
uODlPuLxxzPeLMzIfgSL0cWR96CAwGFMOvya/BcCgYBpOOie5LdFOLh0kCRWk0sg
1/pIJYr9hXmG+QEFSELZ56mWl0ujPfZ8g7bh211RZ5FWaddD3ba7nZR6u884bRwN
9Tg/BKz5rXd7FkKtaodxs1/ti1WLGdrC/mnCjIq0LfnVK6Zg5dbOSGdE2qQaVyPY
ZUrwYWW/VDgsAyeMuWWdEQ==
-----END PRIVATE KEY-----

+ 28
- 0
jeecg-boot/jeecg-boot-module/module-pay/src/main/resources/apiclient_key1.pem View File

@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDGTdqq3lLCX5s2
Du4/F43kUjTDS7gzFgYfdxQFVAvY5Fb49JkApKAnTIi/Oql4MmRQEHXePxS84HA+
Ses6/21klPX7VDBy2i5FvHVLJVpkYG1Y0Otlv0RgLN5iZrrLvOG0IU0AQs/F5sgH
XA4k7W3QhYAlxJVBRuWqj/9PxDLNwdRMGDvfF84I29XVxrDEq9c+QfomZbZumnVg
VIJYo7Do6GKDEYItMKGlr9nfiQ8eXbfbOnaIwlzP+TIUfsbLUDpvCjon3MhwkZw5
jtslpxMceLV6r3Dd0pv1OvOVDEbeARiIwgSoI2+PH3pLuDMfkGDOQoH96mIcBPrO
4wgq8ma/AgMBAAECggEBAKy5RTxNF3KcCboFOTkVEA8OF0z/1/oPNdgURQj7ErKg
+KwxiE8KFUEFpZpCwzehVMR0AeZJtYtqRfnLMquZrbPNF5AI3YY8Sc+N/fAtIdWK
M9QHbPGbrjfC/RRifFNXOpRF6SbQCt9KS3I1mVBKybq1fU/oMUTBNuvgLrZQoxuZ
LnyrRaYI18xJXXXXqvf5RDEaviFRNbf7+uv85hBWGbiZV12eWhXOY50hTqmvQOp1
jG/emsKxBUN2o0S+2l7hks/tNvT3kFEPMyJDoKh6WpQcHVngegHgTMrkI9YD0Ryc
oBCTfaD2glJYcTtWaD47Vxq2iW1tsxxbK45FHe4WLIkCgYEA7aPTQecIHL6sMxC0
eZ0C9rsmewtaa1COQq1o50oiLW+qRlQixA9BytYZn+VNfBw+toYfL4OYH1J69z+f
EvZ5P9/N+7IusOnIPqNk31SONR9m/Z6MhoGbouYIArR5aeZXo4Bo3MZXtq+CwbtR
hayPCY6yLy3AWVEQ8+eclxWo+h0CgYEA1aAF7dvi34tciIP1DonjD4vFqtTH5Irh
EIxO0gduzHV78fyrW14ezRKA25n90TinKBeBKrveOrCIq+Am/Z6MWtEbQCZMbo3D
MHR53GfOK3WqAxF92ioVWkOrlcLNJCfVUID78L/lNRmq6+ED4IXI11FMQQ3L/OGU
7emnTSRRrYsCgYAcR42hXxP5D7vAS/GeM1Ah+n2G0QAOm0SCrM46D/lnPM2flu2Y
NVSYBciA3bHN3jKcV/OoHNniiFc3yytr/0bIkiKaHEcwKHH6+kjLxu0xZy5DajXA
3/WcehFj+QQl1RKC04onE7dmdxZxZZA6/yD6ey+7K4+jUWFaFSruU9aLBQKBgERD
RGHDl/WzBLii4hXpPeNj2KBEKjP/pPeyviUjNuaizB6BjQg/RTxmo0KJLLBEmDWZ
fS74pYS/kIzLrenxVgxXMYwIMPhK2IqNTbt+eEUu7krYtgyW0gfsA9JxUzgwelul
O9yslUOolhOV7bU7SvhzBBjtnbeLJhn4RfvClU8NAoGAXOQRM4SHGEKKfvrgBqf5
KD/gyoOB/akfFaucKOZ6wCXqRGPzvfWb3DiOk8vonzhUotJIHUJ3HyfL1+LxDNuH
FkV4NTSc8W0/GMgUX840Mf0bgAv9tCk/C22EWbSU45y7C9yb4IaOb02xqnrn0HTX
QMF4fplSUn1iU6rG3NmO6qo=
-----END PRIVATE KEY-----

+ 2
- 0
jeecg-boot/jeecg-boot-module/module-pay/src/main/resources/application.yml View File

@ -0,0 +1,2 @@
server:
port: 7002

+ 4
- 0
jeecg-boot/jeecg-boot-module/module-pay/src/main/resources/pay_alipay.properties View File

@ -0,0 +1,4 @@
alipay.appId=
alipay.aliPubilcKey=
alipay.appPubilcKey=
alipay.appPrivateKey=

+ 7
- 0
jeecg-boot/jeecg-boot-module/module-pay/src/main/resources/pay_weixin.properties View File

@ -0,0 +1,7 @@
pay.mchId=
pay.appId=
pay.mchKey=
pay.keyPath=
pay.notifyUrl=
pay.notifyUrlDev=

+ 1
- 0
jeecg-boot/jeecg-boot-module/pom.xml View File

@ -16,6 +16,7 @@
<module>jeecg-module-demo</module>
<module>jeecg-boot-module-airag</module>
<module>jeecgboot-boot-applet</module>
<module>module-pay</module>
</modules>

BIN
jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/apiclient_cert.p12 View File


+ 25
- 0
jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/apiclient_cert.pem View File

@ -0,0 +1,25 @@
-----BEGIN CERTIFICATE-----
MIIENDCCAxygAwIBAgIUS2ctG8sgsiCB/WxeyqfBJ3rxt3IwDQYJKoZIhvcNAQEL
BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
Q0EwHhcNMjUwNjIwMDg1MTE2WhcNMzAwNjE5MDg1MTE2WjCBjTETMBEGA1UEAwwK
MTcxMTAzMDQ2OTEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMTkwNwYDVQQL
DDDlvJjlpKrohb7ooavvvIjkuIrmtbfvvInljLvnlpfnp5HmioDmnInpmZDlhazl
j7gxCzAJBgNVBAYTAkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBAN4LlVj/OWVE0T1W7ZpOqDDLYtbHOPWY8VbvJdsH
imHaYfLVB2ouaN8FDNHATHvInj2D0BwxnFuWcusJr8k5Pyu/eEkGmsvWSLefY6dd
qrF7F/eZCber2UTJ8Q69gUSSaXAhZ3bkppKP+JcNSRtaswqT/pLMjRrx4MLZbyTa
pTqsEGDRSpXG1694vgv8MOD3YdmTLwJ+4paS7QZ5wZypPWLnK7/5haTJWoeLy6G4
ZOdBHqnksh3uQ7DQQEl0mx4i+bQdIDN2V4qAvQJM3CQlVJbYBqIPqRQJdH1Cqpvh
vtwTjD4UuZw9gX1vVKBnitE85r2qXmpTgIigPtHkIemKWXsCAwEAAaOBuTCBtjAJ
BgNVHRMEAjAAMAsGA1UdDwQEAwID+DCBmwYDVR0fBIGTMIGQMIGNoIGKoIGHhoGE
aHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2NybD9DQT0xQkQ0
MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMwMUMzRThFQkQyJnNnPUhBQ0M0NzFC
NjU0MjJFMTJCMjdBOUQzM0E4N0FEMUNERjU5MjZFMTQwMzcxMA0GCSqGSIb3DQEB
CwUAA4IBAQCBwGs4zHnrTAuGMIxknKqU1Z1ZpYGRRomZBZrygMOBwPkPOHOYAgyu
8+JBPTtYp9Nq25nYpcM8GXHFwAGB28Z8jvRnAXVg/VMRTFmrTEI1mg1NZF1PNo0f
wFJT/71ZU6uT1vJBUVLbPvfIHmnue6Uk56JAqUZNaJPyup7LDC01x9MsCzsHFimZ
b4D9g3hhTVvfuChXQE4xpysUP2GgRRtY13w9bxwLYoR1NVGPC9un9Dpszs20ExNt
flSQiw4pIdJlKHaFclD03tlFctH9pl24b10WsNVzpsq1akIjLFscykq+ERzWVn/w
YtGglgy+OG1fPFna3xapR/k7MDcIQ2QO
-----END CERTIFICATE-----

+ 28
- 0
jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/apiclient_key.pem View File

@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDeC5VY/zllRNE9
Vu2aTqgwy2LWxzj1mPFW7yXbB4ph2mHy1QdqLmjfBQzRwEx7yJ49g9AcMZxblnLr
Ca/JOT8rv3hJBprL1ki3n2OnXaqxexf3mQm3q9lEyfEOvYFEkmlwIWd25KaSj/iX
DUkbWrMKk/6SzI0a8eDC2W8k2qU6rBBg0UqVxteveL4L/DDg92HZky8CfuKWku0G
ecGcqT1i5yu/+YWkyVqHi8uhuGTnQR6p5LId7kOw0EBJdJseIvm0HSAzdleKgL0C
TNwkJVSW2AaiD6kUCXR9Qqqb4b7cE4w+FLmcPYF9b1SgZ4rRPOa9ql5qU4CIoD7R
5CHpill7AgMBAAECggEBAJteHY1dYKrUgVhbV/wt54/k8G76jYeEEfLTeXiOCS05
ImpI11xbxvOuU+78kEfY86h1cAwaRp7rYdPGPmMdlG8nFaJ7ZZsVgGJDu/YjG0n+
qKGOSvdi3q88Ylj/DtGNZQuZxAy0Jz3MUZRYLnxedYMEVRAg4ucksjGE9TkjaJPo
/XEJBgPFAAS0p802cLD+P6rn08IQXOws8hvempRbwhtHbhmnKzytf54tQxqD0CJ6
b9QZW0wourw7PTnIA1Ss7XmJ0YV0i5Fdc9aUP7nvBqdW44cvq21zOOjJ4o4SyaXO
l0qyfvwoTla6xqjW5gIVltlBD8Jp8ZEyTX9q7rdEtQkCgYEA/Xtg/zxOmE5i2xdV
+ZhYS+axTdPBRs31ZMifMNsgjRyblzgzdxA6qt7XS7fSdXJ2h2oZetU5jOHITt7z
Q/D7GTfe9yrFqYrRo8Ckj8zgAPuZwGA6Vjkr+SoLNwnWiFo6OrGUGrrGRT1dk7t0
rsD+e0V66sAfiMXLrRV/OsWWsi0CgYEA4EBCSFG+TILW7Gheev4FmEXl48jf8m7u
nKQwgyEPn1CE/q1K6V+Rrq8R45HEPxtSZuPUwR1la3pLFnCFnE6fMT7sFcF77JuZ
eem29NJoL7yBvCezPoRXxBaXTWLL7MOCgOBTb+N5Ty46ECWMDUSxwCK45nZTaLIZ
oJ1ykujTC0cCgYEAnQURp+oesaBVAmzpOC0T/SiRiqly375zlZPlcOk8t80R4NHS
p52pCfHyohfjyhc2r1mdIQb2mHvAjoLzZJHhqdR/TNL1ELpKdMq/5cg+tr0kmBPD
72eJAtb1jYmNmHdz/KnGGey7J2cFEZ+cfyhUO95lbwfGQP5t1fEsGCcP250CgYB7
iss5XldRfW98VE9gwNtCNZfd8sd1nymzgDz9sNQTd9+dEslHYpA2xVo8ngyYm6u8
5V1Leq9qE7iURy9EmofXMIwNvEdSZbKa2Ggj3lrpmZd7mf+EvJJBhBSc3IXuDROz
fmJZLN+jAJuaU6Uhliu65yYoSR3QevXlZ3g8eSnzdwKBgBxoA1/79eW/vIlypk3G
ujEToMVY1e0JQTIe+ns0BgxG/iP1zHSJXUqzCUCirArgiQUxXMhV5oO5VApgxQ/e
Aeb/jw7Rr0V3+/tx6KzBqRej5rtNB7YBj5XDtIypHjEhgCJXgqUUeIY1pu01l7F8
8H+Jh6L0yQ+oslN1Uf9BLRrq
-----END PRIVATE KEY-----

+ 2
- 2
jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml View File

@ -331,8 +331,8 @@ wechat:
mpAppId: wx8ff2ab9559aa6387 # 微信小程序appid
mpAppSecret: 19427a20219ab25b187e4179aea3a5f4 # 微信小程序密钥
merchantId: 1711030469 # 商户号
privateKeyPath: module-system/src/main/resources/apiclient_key.pem #本地私钥路径
publicKeyPath: module-system/src/main/resources/pub_key.pem #本地公钥路径
privateKeyPath: jeecg-system-start/src/main/resources/apiclient_key.pem #本地私钥路径
publicKeyPath: jeecg-system-start/src/main/resources/pub_key.pem #本地公钥路径
# privateKeyPath: /data/app-test/hly/cerFile/apiclient_key.pem #线上私钥路径
# publicKeyPath: /data/app-test/hly/cerFile/pub_key.pem #线上公钥路径
publicKeyId: PUB_KEY_ID_0117018416542025022100395100001649 #公钥


+ 4
- 0
jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/pay_alipay.properties View File

@ -0,0 +1,4 @@
alipay.appId=111
alipay.aliPubilcKey=111
alipay.appPubilcKey=111
alipay.appPrivateKey=111

+ 8
- 0
jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/pay_weixin.properties View File

@ -0,0 +1,8 @@
pay.mchId=1711030469
pay.appId=wx8ff2ab9559aa6387
pay.mchKey=0fdb77429ffdf206c151af76a663041c
pay.keyPath=classpath:apiclient_cert.pem
pay.notifyUrl=https://prod-api.budingxiaoshuo.com/health-admin/order/payNotify
pay.notifyUrlDev=https://prod-api.budingxiaoshuo.com/health-admin/order/payNotify
pay.notifyOneUrl=https://prod-api.budingxiaoshuo.com/health-admin/order/payNotify
pay.notifyUrlOneDev=https://prod-api.budingxiaoshuo.com/health-admin/order/payNotify

Loading…
Cancel
Save