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 3fc0e43..172eac1 100644 --- a/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java +++ b/src/main/java/com/gxwebsoft/shop/service/impl/ShopOrderServiceImpl.java @@ -15,6 +15,7 @@ import com.gxwebsoft.common.system.entity.Payment; import com.gxwebsoft.common.system.entity.User; import com.gxwebsoft.shop.entity.*; import com.gxwebsoft.shop.service.*; +import com.wechat.pay.java.core.RSAAutoCertificateConfig; import lombok.extern.slf4j.Slf4j; import com.gxwebsoft.common.system.service.PaymentService; import com.gxwebsoft.common.system.service.SettingService; @@ -28,6 +29,8 @@ import com.wechat.pay.java.core.RSAPublicKeyConfig; 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; +// Native支付的类将使用完全限定名避免冲突 import com.wechat.pay.java.service.payments.model.Transaction; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -125,6 +128,7 @@ public class ShopOrderServiceImpl extends ServiceImpl createWxOrder(ShopOrder order) { + Payment payment = null; // 声明在try块外面,这样catch块也能访问 try { System.out.println("=== 开始创建微信支付订单 ==="); System.out.println("订单号: " + order.getOrderNo()); @@ -143,34 +147,23 @@ public class ShopOrderServiceImpl extends ServiceImpl orderInfo = new HashMap<>(); - // 构建service - System.out.println("开始构建微信支付服务..."); - JsapiServiceExtension service = getWxService(order); - System.out.println("微信支付服务构建完成"); - - // 订单金额 - BigDecimal decimal = order.getTotalPrice(); - final BigDecimal multiply = decimal.multiply(new BigDecimal(100)); - Integer money = multiply.intValue(); - - System.out.println("=== 构建支付请求参数 ==="); - // 检查支付配置的关键字段 if (payment.getAppId() == null || payment.getAppId().trim().isEmpty()) { throw new RuntimeException("支付配置中应用ID为null或空"); @@ -179,61 +172,18 @@ public class ShopOrderServiceImpl extends ServiceImpl orderInfo = new HashMap<>(); - 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()); + // 根据支付类型选择不同的处理逻辑 + if (order.getPayType().equals(102)) { + // Native支付处理 + return createNativePayOrder(order, payment); + } else { + // JSAPI支付处理(原有逻辑) + return createJsapiPayOrder(order, payment); } - System.out.println("=== 发起微信支付请求 ==="); - System.out.println("请求参数: " + request); - - PrepayWithRequestPaymentResponse response = service.prepayWithRequestPayment(request); - - System.out.println("=== 微信支付响应成功 ==="); - System.out.println("预支付ID: " + response.getPackageVal()); - - 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()); - return orderInfo; + } catch (Exception e) { System.err.println("=== 创建微信支付订单失败 ==="); System.err.println("错误信息: " + e.getMessage()); @@ -248,19 +198,160 @@ 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(); + + // 订单金额(转换为分) + BigDecimal decimal = order.getTotalPrice(); + final BigDecimal multiply = decimal.multiply(new BigDecimal(100)); + Integer money = multiply.intValue(); + + // 测试环境使用1分钱 + if (active.equals("dev")) { + money = 1; + } + + // 构建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()); + + // 设置回调地址 + 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", "NATIVE"); + + return orderInfo; + } + + /** + * 创建JSAPI支付订单(原有逻辑) + */ + private HashMap createJsapiPayOrder(ShopOrder order, Payment payment) throws Exception { + System.out.println("=== 使用JSAPI支付模式 ==="); + + // JSAPI支付必须有OpenID + if (order.getOpenid() == null || order.getOpenid().trim().isEmpty()) { + throw new RuntimeException("JSAPI支付必须传openid"); } + + // 构建JSAPI支付服务 + JsapiServiceExtension service = getWxService(order); + System.out.println("微信支付服务构建完成"); + + // 订单金额 + BigDecimal decimal = order.getTotalPrice(); + final BigDecimal multiply = decimal.multiply(new BigDecimal(100)); + Integer money = multiply.intValue(); + + 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); + + 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()); + return orderInfo; } @Override @@ -839,5 +930,86 @@ public class ShopOrderServiceImpl extends ServiceImpl