Selaa lähdekoodia

小程序鉴权调整

liuchengsen 1 kuukausi sitten
vanhempi
sitoutus
47b2c7253c

+ 2 - 2
zhijiayun-gateway/src/main/resources/application-prod.yml

@@ -166,5 +166,5 @@ payment:
   # 小程序 JSAPI 下单签名的 appId 必须为小程序自身的 appId,与 Native 扫码的 appId 区分
   # 不配置时自动回退到 payment.wechat.app-id(当两者相同时可省略)
   miniapp:
-    app-id: ${WECHAT_PAY_MINIAPP_APP_ID:wx24a9669e84ba1f0b}
-    app-secret: ${WECHAT_PAY_MINIAPP_APP_SECRET:dd9bfde339632c26eeb00c7cb1725696}
+    app-id: ${WECHAT_PAY_MINIAPP_APP_ID:wx246605ec671bf08d}
+    app-secret: ${WECHAT_PAY_MINIAPP_APP_SECRET:5dfa6b60f10347ffa7b959658b3f2496}

+ 3 - 0
zhijiayun-payment/src/main/java/com/xuekairui/payment/dto/OrderResponse.java

@@ -16,6 +16,9 @@ import java.time.LocalDateTime;
 @AllArgsConstructor
 public class OrderResponse {
 
+    /** 响应类型:QR_CODE(扫码支付,返回二码图) / MINIAPP_PAY(小程序支付,返回调起参数) */
+    private String type;
+
     /** 订单号 */
     private String orderNo;
 

+ 13 - 4
zhijiayun-payment/src/main/java/com/xuekairui/payment/service/PaymentOrderService.java

@@ -6,6 +6,7 @@ import com.alipay.api.domain.AlipayTradePrecreateModel;
 import com.alipay.api.request.AlipayTradePrecreateRequest;
 import com.alipay.api.response.AlipayTradePrecreateResponse;
 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request;
+import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
 import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.xuekairui.common.BusinessException;
@@ -135,6 +136,7 @@ public class PaymentOrderService {
                 orderNo, userId, plan.getPlanName(), plan.getPrice(), channel.getDisplayName());
 
         return OrderResponse.builder()
+                .type(miniAppPayParams != null ? "MINIAPP_PAY" : "QR_CODE")
                 .orderNo(orderNo)
                 .planName(plan.getPlanName())
                 .amount(order.getAmount())
@@ -192,6 +194,7 @@ public class PaymentOrderService {
         log.info("切换支付渠道: orderNo={} 新渠道={}", orderNo, newChannel.getDisplayName());
 
         return OrderResponse.builder()
+                .type(miniAppPayParams != null ? "MINIAPP_PAY" : "QR_CODE")
                 .orderNo(order.getOrderNo())
                 .planName(plan.getPlanName())
                 .amount(order.getAmount())
@@ -725,6 +728,10 @@ public class PaymentOrderService {
             payer.setOpenid(openid);
             request.setPayer(payer);
 
+            // JSAPI 下单 appId 必须为小程序自身的 appId(与 openid 的归属一致)
+            String jsapiAppId = resolveJsapiAppId(wc);
+            request.setAppid(jsapiAppId);
+
             // 过期时间(RFC3339格式)
             String timeExpire = java.time.format.DateTimeFormatter
                     .ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX")
@@ -732,13 +739,14 @@ public class PaymentOrderService {
                             .plusMinutes(paymentProperties.getOrderExpireMinutes()));
             request.setTimeExpire(timeExpire);
 
-            // JSAPI 返回 prepay_id
-            String prepayId = wxPayService.createOrderV3(TradeTypeEnum.JSAPI, request);
+            // JSAPI 下单:使用 unifiedOrderV3 直接获取 WxPayUnifiedOrderV3Result(含 prepay_id)
+            // 不能用 createOrderV3(泛型方法返回 JsapiResult,不继承 WxPayUnifiedOrderV3Result)
+            WxPayUnifiedOrderV3Result unifiedOrderResult =
+                    wxPayService.unifiedOrderV3(TradeTypeEnum.JSAPI, request);
+            String prepayId = unifiedOrderResult.getPrepayId();
             log.info("微信JSAPI预下单成功: orderNo={}, amount={}, prepayId={}", orderNo, amount, prepayId);
 
             // 对支付参数进行签名,供小程序 wx.requestPayment 使用
-            // JSAPI 签名 appId 优先用 payment.miniapp.app-id,未配置时回退到 payment.wechat.app-id
-            String jsapiAppId = resolveJsapiAppId(wc);
             return buildMiniAppPayParams(jsapiAppId, prepayId, wxPayService);
         } catch (BusinessException e) {
             throw e;
@@ -866,6 +874,7 @@ public class PaymentOrderService {
         }
 
         return OrderResponse.builder()
+                .type(PaymentChannel.WECHAT_MINIAPP.name().equals(order.getChannel()) ? "MINIAPP_PAY" : "QR_CODE")
                 .orderNo(order.getOrderNo())
                 .planName(plan != null ? plan.getPlanName() : null)
                 .amount(order.getAmount())