From 486cea2c30fdf86762851709a08a27d5ef1503c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com>
Date: Tue, 14 Jan 2025 23:27:31 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E5=85=BC=E5=AE=B9?=
=?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98V3Key?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 2 +-
.../shop/controller/ShopOrderController.java | 23 ++--
.../com/gxwebsoft/shop/entity/ShopOrder.java | 15 +++
.../shop/service/ShopOrderService.java | 2 +
.../service/impl/ShopOrderServiceImpl.java | 119 ++++++++++++++++++
5 files changed, 151 insertions(+), 10 deletions(-)
diff --git a/pom.xml b/pom.xml
index c891e20..410d334 100644
--- a/pom.xml
+++ b/pom.xml
@@ -256,7 +256,7 @@
com.github.wechatpay-apiv3
wechatpay-java
- 0.2.9
+ 0.2.15
diff --git a/src/main/java/com/gxwebsoft/shop/controller/ShopOrderController.java b/src/main/java/com/gxwebsoft/shop/controller/ShopOrderController.java
index 94e2aa6..0c4cd9f 100644
--- a/src/main/java/com/gxwebsoft/shop/controller/ShopOrderController.java
+++ b/src/main/java/com/gxwebsoft/shop/controller/ShopOrderController.java
@@ -1,5 +1,6 @@
package com.gxwebsoft.shop.controller;
+import cn.hutool.core.util.IdUtil;
import com.gxwebsoft.common.core.web.BaseController;
import com.gxwebsoft.common.system.entity.User;
import com.gxwebsoft.shop.service.ShopOrderService;
@@ -61,15 +62,19 @@ public class ShopOrderController extends BaseController {
@ApiOperation("添加订单")
@PostMapping()
public ApiResult> save(@RequestBody ShopOrder shopOrder) {
- // 记录当前登录用户id
- User loginUser = getLoginUser();
- if (loginUser != null) {
- shopOrder.setUserId(loginUser.getUserId());
- }
- if (shopOrderService.save(shopOrder)) {
- return success("添加成功");
- }
- return fail("添加失败");
+ // 记录当前登录用户id
+ User loginUser = getLoginUser();
+ if (loginUser != null) {
+ shopOrder.setUserId(loginUser.getUserId());
+ shopOrder.setOpenid(loginUser.getOpenid());
+ }
+ if (shopOrder.getOrderNo() == null) {
+ shopOrder.setOrderNo(Long.toString(IdUtil.getSnowflakeNextId()));
+ }
+ if (shopOrderService.save(shopOrder)) {
+ return success("下单成功", shopOrderService.createWxOrder(shopOrder));
+ }
+ return fail("添加失败");
}
@ApiOperation("修改订单")
diff --git a/src/main/java/com/gxwebsoft/shop/entity/ShopOrder.java b/src/main/java/com/gxwebsoft/shop/entity/ShopOrder.java
index cf2af44..d0fb1b3 100644
--- a/src/main/java/com/gxwebsoft/shop/entity/ShopOrder.java
+++ b/src/main/java/com/gxwebsoft/shop/entity/ShopOrder.java
@@ -2,6 +2,7 @@ package com.gxwebsoft.shop.entity;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableLogic;
@@ -175,4 +176,18 @@ public class ShopOrder implements Serializable {
@ApiModelProperty(value = "创建时间")
private Date createTime;
+ @ApiModelProperty(value = "自提码")
+ private String selfTakeCode;
+
+ @ApiModelProperty(value = "是否已收到赠品")
+ private Boolean hasTakeGift;
+
+ @ApiModelProperty(value = "accessToken")
+ @TableField(exist = false)
+ private String accessToken;
+
+ @ApiModelProperty(value = "openid")
+ @TableField(exist = false)
+ private String openid;
+
}
diff --git a/src/main/java/com/gxwebsoft/shop/service/ShopOrderService.java b/src/main/java/com/gxwebsoft/shop/service/ShopOrderService.java
index ff9452e..e37736e 100644
--- a/src/main/java/com/gxwebsoft/shop/service/ShopOrderService.java
+++ b/src/main/java/com/gxwebsoft/shop/service/ShopOrderService.java
@@ -5,6 +5,7 @@ import com.gxwebsoft.common.core.web.PageResult;
import com.gxwebsoft.shop.entity.ShopOrder;
import com.gxwebsoft.shop.param.ShopOrderParam;
+import java.util.HashMap;
import java.util.List;
/**
@@ -39,4 +40,5 @@ public interface ShopOrderService extends IService {
*/
ShopOrder getByIdRel(Integer orderId);
+ HashMap createWxOrder(ShopOrder shopOrder);
}
diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java
index 01468d0..8314c3d 100644
--- a/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java
+++ b/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java
@@ -1,14 +1,30 @@
package com.gxwebsoft.shop.service.impl;
+import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gxwebsoft.common.core.config.ConfigProperties;
+import com.gxwebsoft.common.core.utils.RedisUtil;
+import com.gxwebsoft.common.system.entity.Payment;
import com.gxwebsoft.shop.mapper.ShopOrderMapper;
import com.gxwebsoft.shop.service.ShopOrderService;
import com.gxwebsoft.shop.entity.ShopOrder;
import com.gxwebsoft.shop.param.ShopOrderParam;
import com.gxwebsoft.common.core.web.PageParam;
import com.gxwebsoft.common.core.web.PageResult;
+import com.wechat.pay.java.core.Config;
+import com.wechat.pay.java.core.RSAConfig;
+import com.wechat.pay.java.core.RSAPublicKeyConfig;
+import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension;
+import com.wechat.pay.java.service.payments.jsapi.model.Amount;
+import com.wechat.pay.java.service.payments.jsapi.model.Payer;
+import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest;
+import com.wechat.pay.java.service.payments.jsapi.model.PrepayWithRequestPaymentResponse;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.HashMap;
import java.util.List;
/**
@@ -19,6 +35,18 @@ import java.util.List;
*/
@Service
public class ShopOrderServiceImpl extends ServiceImpl implements ShopOrderService {
+ @Value("${spring.profiles.active}")
+ String active;
+
+ @Resource
+ private ConfigProperties config;
+
+ @Resource
+ private RedisUtil redisUtil;
+
+ public static String privateKeyPath = "/Users/gxwebsoft/Downloads/ef7f7e0430cb47019d06b93f885bf95f/apiclient_key.pem";
+ public static String privateCertPath = "/Users/gxwebsoft/JAVA/com.gxwebsoft.core/src/main/resources/cert/apiclient_cert.pem";
+ public static String wechatpayCertPath = "/Users/gxwebsoft/Downloads/ef7f7e0430cb47019d06b93f885bf95f/wechatpay_55729BDEC2502C301BA02CDC28E4CEE4DE4D1DB9.pem"; // 平台证书
@Override
public PageResult pageRel(ShopOrderParam param) {
@@ -44,4 +72,95 @@ public class ShopOrderServiceImpl extends ServiceImpl createWxOrder(ShopOrder order) {
+ Integer payType = order.getPayType();
+ final String uploadPath = config.getUploadPath(); // 服务器本地路径
+ final HashMap orderInfo = new HashMap<>();
+ // 微信小程序(微信支付)
+ String key = "mp-weixin:".concat(order.getTenantId().toString());
+ final String string = redisUtil.get(key);
+// System.out.println("string = " + string);
+ final JSONObject mpWx = JSONObject.parseObject(string);
+// System.out.println("mpWx = " + mpWx);
+ String key2 = "Payment:".concat(payType.toString()).concat(":").concat(order.getTenantId().toString());
+ final Payment payment = redisUtil.get(key2, Payment.class);
+// System.out.println("payment = " + payment);
+
+ // 计算金额
+ BigDecimal decimal = order.getTotalPrice();
+ final BigDecimal multiply = decimal.multiply(new BigDecimal(100));
+ // 将 BigDecimal 转换为 Integer
+ Integer money = multiply.intValue();
+ String privateKey = uploadPath.concat("/file").concat(payment.getApiclientKey()); // 秘钥证书
+ String apiclientCert = uploadPath.concat("/file").concat(payment.getApiclientCert());
+ String pubKey = uploadPath.concat("/file").concat(payment.getPubKey()); // 公钥证书
+ // 开发环境配置
+ if (active.equals("dev")) {
+ privateKey = privateKeyPath;
+ apiclientCert = wechatpayCertPath;
+ }
+
+ // 兼容公钥
+ Config config;
+ if (payment.getPubKey() != null && !payment.getPubKey().isEmpty()) {
+ config = new RSAPublicKeyConfig.Builder()
+ .merchantId(payment.getMchId())
+ .privateKeyFromPath(privateKey)
+ .publicKeyFromPath(pubKey)
+ .publicKeyId(payment.getPubKeyId())
+ .merchantSerialNumber(payment.getMerchantSerialNumber())
+ .apiV3Key(payment.getApiKey())
+ .build();
+ } else {
+ config = new RSAConfig.Builder()
+ .merchantId(payment.getMchId())
+ .privateKeyFromPath(privateKey)
+ .merchantSerialNumber(payment.getMerchantSerialNumber())
+ .wechatPayCertificatesFromPath(apiclientCert)
+ .build();
+ }
+
+ // 构建service
+ JsapiServiceExtension service = new JsapiServiceExtension.Builder().config(config).build();
+ // 跟之前下单示例一样,填充预下单参数
+ PrepayRequest request = new PrepayRequest();
+ Amount amount = new Amount();
+ amount.setTotal(money);
+ amount.setCurrency("CNY");
+ request.setAmount(amount);
+ request.setAppid(mpWx.getString("appId"));
+ request.setMchid(payment.getMchId());
+ request.setDescription(order.getComments());
+ request.setOutTradeNo(order.getOrderNo());
+ request.setAttach(order.getTenantId().toString());
+ final Payer payer = new Payer();
+ payer.setOpenid(order.getOpenid());
+ request.setPayer(payer);
+ // 测试环境
+ if (active.equals("dev")) {
+ amount.setTotal(1);
+ request.setAmount(amount);
+ request.setNotifyUrl("http://jimei-api.natapp1.cc/api/shop/wx-pay/notify/" + order.getTenantId()); // 默认回调地址
+ }
+ // 生成环境
+ if (active.equals("prod")) {
+ request.setAmount(amount);
+ request.setNotifyUrl("https://server.gxwebsoft.com/api/system/wx-pay/notify/" + order.getTenantId()); // 默认回调地址
+ }
+// if (StrUtil.isNotBlank(payment.getNotifyUrl())) {
+ // 后台配置的回调地址
+// request.setNotifyUrl(payment.getNotifyUrl().concat("/").concat(order.getTenantId().toString()));
+// }
+ System.out.println("request = " + request);
+ PrepayWithRequestPaymentResponse response = service.prepayWithRequestPayment(request);
+ orderInfo.put("provider", "wxpay");
+ orderInfo.put("timeStamp", response.getTimeStamp());
+ orderInfo.put("nonceStr", response.getNonceStr());
+ orderInfo.put("package", response.getPackageVal());
+ orderInfo.put("signType", "RSA");
+ orderInfo.put("paySign", response.getPaySign());
+ return orderInfo;
+ }
+
}