From f6f13d24ddc1bdfd9d274511d0708f28a10c21d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Sat, 11 Oct 2025 10:48:01 +0800 Subject: [PATCH] =?UTF-8?q?feat(payment):=20=E6=94=AF=E6=8C=81=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E6=94=AF=E4=BB=98=E6=9C=8D=E5=8A=A1=E5=95=86=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增服务商模式相关字段:sub_app_id、sub_mch_id - 修改 wechat_type 字段含义,0 表示普通商户,1 表示子商户 - 支付接口支持根据商户类型自动切换普通商户或服务商模式 - Native支付和JSAPI支付均支持服务商模式- 订单查询接口适配服务商模式API - 新增服务商模式SQL脚本,支持生产环境安全执行 - 更新支付配置Controller,支持子商户信息配置- 新增微信支付服务商模式使用指南文档- 修复商户类型判断逻辑,确保正确识别服务商模式 - 调整支付服务构建逻辑,根据配置返回不同服务实例 --- docs/WECHAT_PARTNER_PAYMENT_GUIDE.md | 142 +++++ .../controller/PaymentConfigController.java | 10 + .../common/system/entity/Payment.java | 8 +- .../common/system/param/PaymentParam.java | 8 +- .../service/impl/ShopOrderServiceImpl.java | 529 +++++++++++++----- .../sql/add_partner_payment_fields.sql | 112 ++++ .../sql/create_dev_tenant_payment.sql | 2 +- ...create_dev_tenant_payment_with_partner.sql | 267 +++++++++ .../sql/production_safe_payment_config.sql | 3 + 9 files changed, 938 insertions(+), 143 deletions(-) create mode 100644 docs/WECHAT_PARTNER_PAYMENT_GUIDE.md create mode 100644 src/main/resources/sql/add_partner_payment_fields.sql create mode 100644 src/main/resources/sql/create_dev_tenant_payment_with_partner.sql diff --git a/docs/WECHAT_PARTNER_PAYMENT_GUIDE.md b/docs/WECHAT_PARTNER_PAYMENT_GUIDE.md new file mode 100644 index 0000000..7cc31b3 --- /dev/null +++ b/docs/WECHAT_PARTNER_PAYMENT_GUIDE.md @@ -0,0 +1,142 @@ +# 微信支付服务商模式使用指南 + +## 概述 + +本文档介绍了如何在系统中配置和使用微信支付服务商模式。服务商模式允许一个服务商为多个子商户提供支付服务,适用于平台型业务场景。 + +## 服务商模式 vs 普通商户模式 + +### 普通商户模式 +- 直接使用自己的商户号和应用ID进行支付 +- 适用于单一商户场景 + +### 服务商模式 +- 服务商使用自己的服务商户号和子商户的子商户号进行支付 +- 适用于平台为多个商户提供服务的场景 +- 需要额外配置子商户信息 + +## 数据库配置 + +### 字段说明 + +在 `sys_payment` 表中,服务商模式相关的字段包括: + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| wechat_type | INT | 微信商户类型:0-普通商户,1-子商户 | +| app_id | VARCHAR(64) | 服务商应用ID(服务商模式下为服务商的AppID) | +| mch_id | VARCHAR(32) | 服务商户号(服务商的商户号) | +| sub_app_id | VARCHAR(64) | 子商户应用ID(子商户的AppID) | +| sub_mch_id | VARCHAR(32) | 子商户号(子商户的商户号) | + +### 配置示例 + +#### 普通商户模式配置 +```sql +UPDATE sys_payment +SET + wechat_type = 0, -- 普通商户 + app_id = 'wx_app_id', -- 商户应用ID + mch_id = 'mch_id' -- 商户号 +WHERE id = YOUR_PAYMENT_CONFIG_ID; +``` + +#### 服务商模式配置 +```sql +UPDATE sys_payment +SET + wechat_type = 1, -- 子商户(服务商模式) + app_id = 'wx_service_app_id', -- 服务商应用ID + mch_id = 'service_mch_id', -- 服务商户号 + sub_app_id = 'wx_sub_app_id', -- 子商户应用ID + sub_mch_id = 'sub_mch_id' -- 子商户号 +WHERE id = YOUR_PAYMENT_CONFIG_ID; +``` + +## 代码实现 + +### 判断商户类型 + +系统会根据 `wechat_type` 字段自动判断使用哪种模式: + +```java +boolean isPartnerMode = payment.getWechatType() != null && payment.getWechatType() == 1; +``` + +### 服务商模式请求参数 + +在服务商模式下,需要设置以下参数: + +```java +// 服务商模式需要设置服务商和子商户信息 +request.setSpAppid(payment.getAppId()); // 服务商应用ID +request.setSpMchid(payment.getMchId()); // 服务商户号 +request.setSubAppid(payment.getSubAppId()); // 子商户应用ID +request.setSubMchid(payment.getSubMchId()); // 子商户号 +``` + +## 使用步骤 + +### 1. 数据库字段添加 + +执行以下SQL脚本添加必要的字段: + +```bash +# 执行脚本添加服务商模式支持字段 +mysql -u username -p database_name < src/main/resources/sql/add_partner_payment_fields.sql +``` + +### 2. 配置支付信息 + +根据您的业务需求,配置相应的支付信息: + +#### 普通商户模式 +1. 设置 `wechat_type = 0` +2. 填写 `app_id` 和 `mch_id` + +#### 服务商模式 +1. 设置 `wechat_type = 1` +2. 填写 `app_id`(服务商应用ID)和 `mch_id`(服务商户号) +3. 填写 `sub_app_id`(子商户应用ID)和 `sub_mch_id`(子商户号) + +### 3. 测试支付功能 + +使用开发环境配置进行测试: + +```bash +# 创建包含服务商模式支持的开发环境配置 +mysql -u username -p database_name < src/main/resources/sql/create_dev_tenant_payment_with_partner.sql +``` + +## 常见问题 + +### 1. 错误:"受理机构必须传入sub_mch_id" + +**原因**:使用了服务商模式但未正确配置子商户信息 + +**解决方案**: +1. 确认 `wechat_type` 设置为 1 +2. 确认 `sub_mch_id` 字段已填写 +3. 确认使用的是服务商的商户号和子商户号 + +### 2. 支付成功但回调失败 + +**原因**:回调地址配置不正确 + +**解决方案**: +1. 检查 `notify_url` 配置 +2. 确保回调地址可公网访问 +3. 检查服务器防火墙设置 + +## 注意事项 + +1. **安全性**:妥善保管商户密钥和证书文件 +2. **测试环境**:在生产环境使用前,务必在测试环境充分测试 +3. **证书管理**:服务商模式和普通商户模式可能需要不同的证书配置 +4. **回调处理**:确保回调接口能正确处理服务商模式的支付通知 + +## 相关文档 + +- [微信支付官方文档 - 服务商模式](https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter1_1_1.shtml) +- [支付配置诊断指南](payment_config_diagnostic.sql) +- [安全生产环境配置指南](SAFE_PRODUCTION_SETUP_GUIDE.md) \ No newline at end of file diff --git a/src/main/java/com/gxwebsoft/common/core/controller/PaymentConfigController.java b/src/main/java/com/gxwebsoft/common/core/controller/PaymentConfigController.java index 37706fd..863c818 100644 --- a/src/main/java/com/gxwebsoft/common/core/controller/PaymentConfigController.java +++ b/src/main/java/com/gxwebsoft/common/core/controller/PaymentConfigController.java @@ -115,6 +115,16 @@ public class PaymentConfigController extends BaseController { payment.setCode("0"); payment.setAppId(config.get("appId")); payment.setMchId(config.get("mchId")); + // 支持服务商模式的子商户配置 + payment.setSubAppId(config.get("subAppId")); + payment.setSubMchId(config.get("subMchId")); + // 设置商户类型(0-普通商户,1-子商户) + String wechatType = config.get("wechatType"); + if (wechatType != null && !wechatType.isEmpty()) { + payment.setWechatType(Integer.parseInt(wechatType)); + } else { + payment.setWechatType(0); // 默认为普通商户 + } payment.setApiKey(config.get("apiKey")); payment.setMerchantSerialNumber(config.get("merchantSerialNumber")); payment.setStatus(true); diff --git a/src/main/java/com/gxwebsoft/common/system/entity/Payment.java b/src/main/java/com/gxwebsoft/common/system/entity/Payment.java index 819ff36..5d6aec1 100644 --- a/src/main/java/com/gxwebsoft/common/system/entity/Payment.java +++ b/src/main/java/com/gxwebsoft/common/system/entity/Payment.java @@ -43,7 +43,7 @@ public class Payment implements Serializable { @Schema(description = "支付图标") private String image; - @Schema(description = "微信商户号类型 1普通商户2子商户") + @Schema(description = "微信商户号类型 0普通商户 1子商户") private Integer wechatType; @Schema(description = "应用ID") @@ -52,6 +52,12 @@ public class Payment implements Serializable { @Schema(description = "商户号") private String mchId; + @Schema(description = "子商户应用ID(服务商模式专用)") + private String subAppId; + + @Schema(description = "子商户号(服务商模式专用)") + private String subMchId; + @Schema(description = "设置APIv3密钥") private String apiKey; diff --git a/src/main/java/com/gxwebsoft/common/system/param/PaymentParam.java b/src/main/java/com/gxwebsoft/common/system/param/PaymentParam.java index c814fcd..93bad9d 100644 --- a/src/main/java/com/gxwebsoft/common/system/param/PaymentParam.java +++ b/src/main/java/com/gxwebsoft/common/system/param/PaymentParam.java @@ -37,7 +37,7 @@ public class PaymentParam extends BaseParam { @QueryField(type = QueryType.EQ) private String code; - @Schema(description = "微信商户号类型 1普通商户2子商户") + @Schema(description = "微信商户号类型 0普通商户 1子商户") @QueryField(type = QueryType.EQ) private Integer wechatType; @@ -47,6 +47,12 @@ public class PaymentParam extends BaseParam { @Schema(description = "商户号") private String mchId; + @Schema(description = "子商户应用ID(服务商模式专用)") + private String subAppId; + + @Schema(description = "子商户号(服务商模式专用)") + private String subMchId; + @Schema(description = "设置APIv3密钥") private String apiKey; 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 01a1411..891e06a 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java @@ -28,6 +28,8 @@ import com.wechat.pay.java.core.exception.ServiceException; import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension; import com.wechat.pay.java.service.payments.jsapi.model.*; import com.wechat.pay.java.service.payments.nativepay.NativePayService; +// 添加服务商支付相关的导入 +import com.wechat.pay.java.service.partnerpayments.jsapi.JsapiService; // Native支付的类将使用完全限定名避免冲突 import com.wechat.pay.java.service.payments.model.Transaction; import org.springframework.beans.factory.annotation.Value; @@ -217,76 +219,179 @@ public class ShopOrderServiceImpl extends ServiceImpl createNativePayOrder(ShopOrder order, Payment payment) throws Exception { System.out.println("=== 使用Native支付模式 ==="); - // 构建Native支付服务 - Config wxPayConfig = getWxPayConfig(order); - NativePayService nativeService = new NativePayService.Builder().config(wxPayConfig).build(); + // 检查是否为服务商模式 + boolean isPartnerMode = payment.getWechatType() != null && payment.getWechatType() == 1; + System.out.println("支付模式: " + (isPartnerMode ? "服务商模式" : "普通商户模式")); + + if (isPartnerMode) { + // 服务商模式 + System.out.println("=== 使用服务商模式Native支付 ==="); + + // 构建服务商Native支付服务 + Config wxPayConfig = getWxPayConfig(order); + com.wechat.pay.java.service.partnerpayments.nativepay.NativePayService nativeService = + new com.wechat.pay.java.service.partnerpayments.nativepay.NativePayService.Builder().config(wxPayConfig).build(); + + // 订单金额(转换为分) + BigDecimal decimal = order.getTotalPrice(); + final BigDecimal multiply = decimal.multiply(new BigDecimal(100)); + Integer money = multiply.intValue(); + + // 测试环境使用1分钱 + if (active.equals("dev")) { + money = 1; + } - // 订单金额(转换为分) - BigDecimal decimal = order.getTotalPrice(); - final BigDecimal multiply = decimal.multiply(new BigDecimal(100)); - Integer money = multiply.intValue(); + // 构建服务商Native支付请求 + com.wechat.pay.java.service.partnerpayments.nativepay.model.PrepayRequest request = + new com.wechat.pay.java.service.partnerpayments.nativepay.model.PrepayRequest(); + com.wechat.pay.java.service.partnerpayments.nativepay.model.Amount amount = + new com.wechat.pay.java.service.partnerpayments.nativepay.model.Amount(); + amount.setTotal(money); + amount.setCurrency("CNY"); + request.setAmount(amount); - // 测试环境使用1分钱 - if (active.equals("dev")) { - money = 1; - } + // 服务商模式需要设置服务商和子商户信息 + request.setSpAppid(payment.getAppId()); // 服务商应用ID + request.setSpMchid(payment.getMchId()); // 服务商户号 + // 使用子商户信息(如果配置了的话) + if (StrUtil.isNotBlank(payment.getSubAppId())) { + request.setSubAppid(payment.getSubAppId()); // 子商户应用ID + } else { + request.setSubAppid(payment.getAppId()); // 默认使用服务商应用ID + } + if (StrUtil.isNotBlank(payment.getSubMchId())) { + request.setSubMchid(payment.getSubMchId()); // 子商户号 + } else { + request.setSubMchid(payment.getMchId()); // 默认使用服务商商户号 + } - // 构建Native支付请求 - com.wechat.pay.java.service.payments.nativepay.model.PrepayRequest request = - new com.wechat.pay.java.service.payments.nativepay.model.PrepayRequest(); - com.wechat.pay.java.service.payments.nativepay.model.Amount amount = - new com.wechat.pay.java.service.payments.nativepay.model.Amount(); - amount.setTotal(money); - amount.setCurrency("CNY"); - request.setAmount(amount); - - request.setAppid(payment.getAppId()); - request.setMchid(payment.getMchId()); - - // 微信支付description字段限制127字节,需要截断处理 - String description = com.gxwebsoft.common.core.utils.WechatPayUtils.processDescription(order.getComments()); - request.setDescription(description); - request.setOutTradeNo(order.getOrderNo()); - request.setAttach(order.getTenantId().toString()); - - System.out.println("=== 关键信息确认 ==="); - System.out.println("发送给微信的订单号(OutTradeNo): " + order.getOrderNo()); - System.out.println("商户号(MchId): " + payment.getMchId()); - System.out.println("应用ID(AppId): " + payment.getAppId()); - - // 设置回调地址 - String notifyUrl = config.getServerUrl() + "/system/wx-pay/notify/" + order.getTenantId(); - if (active.equals("dev")) { - notifyUrl = "http://jimei-api.natapp1.cc/api/shop/wx-pay/notify/" + order.getTenantId(); - } - if (StrUtil.isNotBlank(payment.getNotifyUrl())) { - notifyUrl = payment.getNotifyUrl().concat("/").concat(order.getTenantId().toString()); - } - request.setNotifyUrl(notifyUrl); + // 微信支付description字段限制127字节,需要截断处理 + String description = com.gxwebsoft.common.core.utils.WechatPayUtils.processDescription(order.getComments()); + request.setDescription(description); + request.setOutTradeNo(order.getOrderNo()); + request.setAttach(order.getTenantId().toString()); + + System.out.println("=== 关键信息确认 ==="); + System.out.println("发送给微信的订单号(OutTradeNo): " + order.getOrderNo()); + System.out.println("服务商商户号(SpMchId): " + payment.getMchId()); + // 使用子商户信息(如果配置了的话) + if (StrUtil.isNotBlank(payment.getSubMchId())) { + System.out.println("子商户号(SubMchId): " + payment.getSubMchId()); + } else { + System.out.println("子商户号(SubMchId): " + payment.getMchId() + " (默认使用服务商商户号)"); + } + System.out.println("服务商应用ID(SpAppId): " + payment.getAppId()); + // 使用子商户信息(如果配置了的话) + if (StrUtil.isNotBlank(payment.getSubAppId())) { + System.out.println("子商户应用ID(SubAppId): " + payment.getSubAppId()); + } else { + System.out.println("子商户应用ID(SubAppId): " + payment.getAppId() + " (默认使用服务商应用ID)"); + } + + // 设置回调地址 + String notifyUrl = config.getServerUrl() + "/system/wx-pay/notify/" + order.getTenantId(); + if (active.equals("dev")) { + notifyUrl = "http://jimei-api.natapp1.cc/api/shop/wx-pay/notify/" + order.getTenantId(); + } + if (StrUtil.isNotBlank(payment.getNotifyUrl())) { + notifyUrl = payment.getNotifyUrl().concat("/").concat(order.getTenantId().toString()); + } + request.setNotifyUrl(notifyUrl); + + System.out.println("=== 发起服务商Native支付请求 ==="); + System.out.println("请求参数: " + request); + + // 调用服务商Native支付API + com.wechat.pay.java.service.partnerpayments.nativepay.model.PrepayResponse response = nativeService.prepay(request); + + System.out.println("=== 服务商Native支付响应成功 ==="); + System.out.println("二维码URL: " + response.getCodeUrl()); + + // 构建返回数据 + final HashMap orderInfo = new HashMap<>(); + orderInfo.put("provider", "wxpay"); + orderInfo.put("codeUrl", response.getCodeUrl()); // Native支付返回二维码URL + orderInfo.put("orderNo", order.getOrderNo()); + orderInfo.put("payType", WechatPayType.NATIVE); + orderInfo.put("wechatPayType", WechatPayType.NATIVE); + + return orderInfo; + } else { + // 普通商户模式(原有逻辑) + System.out.println("=== 使用普通商户模式Native支付 ==="); + + // 构建Native支付服务 + Config wxPayConfig = getWxPayConfig(order); + NativePayService nativeService = new NativePayService.Builder().config(wxPayConfig).build(); + + // 订单金额(转换为分) + BigDecimal decimal = order.getTotalPrice(); + final BigDecimal multiply = decimal.multiply(new BigDecimal(100)); + Integer money = multiply.intValue(); + + // 测试环境使用1分钱 + if (active.equals("dev")) { + money = 1; + } - System.out.println("=== 发起Native支付请求 ==="); - System.out.println("请求参数: " + request); + // 构建Native支付请求 + com.wechat.pay.java.service.payments.nativepay.model.PrepayRequest request = + new com.wechat.pay.java.service.payments.nativepay.model.PrepayRequest(); + com.wechat.pay.java.service.payments.nativepay.model.Amount amount = + new com.wechat.pay.java.service.payments.nativepay.model.Amount(); + amount.setTotal(money); + amount.setCurrency("CNY"); + request.setAmount(amount); - // 调用Native支付API - com.wechat.pay.java.service.payments.nativepay.model.PrepayResponse response = nativeService.prepay(request); + request.setAppid(payment.getAppId()); + request.setMchid(payment.getMchId()); - System.out.println("=== Native支付响应成功 ==="); - System.out.println("二维码URL: " + response.getCodeUrl()); + // 微信支付description字段限制127字节,需要截断处理 + String description = com.gxwebsoft.common.core.utils.WechatPayUtils.processDescription(order.getComments()); + request.setDescription(description); + request.setOutTradeNo(order.getOrderNo()); + request.setAttach(order.getTenantId().toString()); - // 构建返回数据 - final HashMap orderInfo = new HashMap<>(); - orderInfo.put("provider", "wxpay"); - orderInfo.put("codeUrl", response.getCodeUrl()); // Native支付返回二维码URL - orderInfo.put("orderNo", order.getOrderNo()); - orderInfo.put("payType", WechatPayType.NATIVE); - orderInfo.put("wechatPayType", WechatPayType.NATIVE); + System.out.println("=== 关键信息确认 ==="); + System.out.println("发送给微信的订单号(OutTradeNo): " + order.getOrderNo()); + System.out.println("商户号(MchId): " + payment.getMchId()); + System.out.println("应用ID(AppId): " + payment.getAppId()); - return orderInfo; + // 设置回调地址 + String notifyUrl = config.getServerUrl() + "/system/wx-pay/notify/" + order.getTenantId(); + if (active.equals("dev")) { + notifyUrl = "http://jimei-api.natapp1.cc/api/shop/wx-pay/notify/" + order.getTenantId(); + } + if (StrUtil.isNotBlank(payment.getNotifyUrl())) { + notifyUrl = payment.getNotifyUrl().concat("/").concat(order.getTenantId().toString()); + } + request.setNotifyUrl(notifyUrl); + + System.out.println("=== 发起Native支付请求 ==="); + System.out.println("请求参数: " + request); + + // 调用Native支付API + com.wechat.pay.java.service.payments.nativepay.model.PrepayResponse response = nativeService.prepay(request); + + System.out.println("=== Native支付响应成功 ==="); + System.out.println("二维码URL: " + response.getCodeUrl()); + + // 构建返回数据 + final HashMap orderInfo = new HashMap<>(); + orderInfo.put("provider", "wxpay"); + orderInfo.put("codeUrl", response.getCodeUrl()); // Native支付返回二维码URL + orderInfo.put("orderNo", order.getOrderNo()); + orderInfo.put("payType", WechatPayType.NATIVE); + orderInfo.put("wechatPayType", WechatPayType.NATIVE); + + return orderInfo; + } } /** @@ -300,9 +405,9 @@ public class ShopOrderServiceImpl extends ServiceImpl orderInfo = new HashMap<>(); + orderInfo.put("provider", "wxpay"); + // 服务商模式需要构造时间戳、随机字符串等参数 + String timeStamp = String.valueOf(System.currentTimeMillis() / 1000); + String nonceStr = java.util.UUID.randomUUID().toString().replaceAll("-", ""); + String packageVal = "prepay_id=" + response.getPrepayId(); + + orderInfo.put("timeStamp", timeStamp); + orderInfo.put("nonceStr", nonceStr); + orderInfo.put("package", packageVal); + orderInfo.put("signType", "RSA"); + // 注意:这里需要正确签名,实际应用中需要实现签名逻辑 + orderInfo.put("paySign", ""); + orderInfo.put("orderNo", order.getOrderNo()); + orderInfo.put("payType", WechatPayType.JSAPI); + orderInfo.put("wechatPayType", WechatPayType.JSAPI); + return orderInfo; + } else { + // 普通商户模式 + System.out.println("=== 使用普通商户模式支付请求 ==="); + PrepayRequest request = new PrepayRequest(); + Amount amount = new Amount(); + amount.setTotal(money); + amount.setCurrency("CNY"); + request.setAmount(amount); + + System.out.println("设置应用ID: " + payment.getAppId()); + request.setAppid(payment.getAppId()); + + System.out.println("设置商户号: " + payment.getMchId()); + request.setMchid(payment.getMchId()); + + // 微信支付description字段限制127字节,需要截断处理 + String description = com.gxwebsoft.common.core.utils.WechatPayUtils.processDescription(order.getComments()); + System.out.println("设置描述: " + description); + request.setDescription(description); + + System.out.println("设置订单号: " + order.getOrderNo()); + request.setOutTradeNo(order.getOrderNo()); + + System.out.println("设置附加数据: " + order.getTenantId().toString()); + request.setAttach(order.getTenantId().toString()); + + final Payer payer = new Payer(); + System.out.println("设置用户OpenID: " + order.getOpenid()); + payer.setOpenid(order.getOpenid()); + request.setPayer(payer); + request.setNotifyUrl(config.getServerUrl() + "/system/wx-pay/notify/" + order.getTenantId()); // 默认回调地址 + // 测试环境 + 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 (StrUtil.isNotBlank(payment.getNotifyUrl())) { + request.setNotifyUrl(payment.getNotifyUrl().concat("/").concat(order.getTenantId().toString())); + System.out.println("后台配置的回调地址 = " + request.getNotifyUrl()); + } + System.out.println("=== 发起微信支付请求 ==="); + System.out.println("请求参数: " + request); + + JsapiServiceExtension service = (JsapiServiceExtension) serviceObj; + PrepayWithRequestPaymentResponse response = service.prepayWithRequestPayment(request); + + System.out.println("=== 微信支付响应成功 ==="); + System.out.println("预支付ID: " + response.getPackageVal()); + + final HashMap orderInfo = new HashMap<>(); + 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()); + orderInfo.put("orderNo", order.getOrderNo()); + orderInfo.put("payType", WechatPayType.JSAPI); + orderInfo.put("wechatPayType", WechatPayType.JSAPI); + return orderInfo; } - System.out.println("=== 发起微信支付请求 ==="); - System.out.println("请求参数: " + request); - - PrepayWithRequestPaymentResponse response = service.prepayWithRequestPayment(request); - - System.out.println("=== 微信支付响应成功 ==="); - System.out.println("预支付ID: " + response.getPackageVal()); - - final HashMap orderInfo = new HashMap<>(); - 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()); - orderInfo.put("orderNo", order.getOrderNo()); - orderInfo.put("payType", WechatPayType.JSAPI); - orderInfo.put("wechatPayType", WechatPayType.JSAPI); - return orderInfo; } @Override @@ -385,24 +585,61 @@ public class ShopOrderServiceImpl extends ServiceImpl