|
|
@@ -651,6 +651,8 @@ public class MembershipService implements MembershipServiceInterface {
|
|
|
resp.put("env", dto.getEnv());
|
|
|
resp.put("signType", dto.getSignType());
|
|
|
resp.put("currentPeriod", dto.getCurrentPeriod());
|
|
|
+ // 虚拟支付兜底:道具价格/风控校验失败(如 GOODS_PRICE_INVALID)时,前端自动改走普通微信支付(JSAPI)
|
|
|
+ resp.put("wechatPayParams", buildWechatFallbackParams(mainOrder, level, openid));
|
|
|
return resp;
|
|
|
}
|
|
|
// 虚拟道具未配置或停用,降级为普通微信支付
|
|
|
@@ -667,6 +669,34 @@ public class MembershipService implements MembershipServiceInterface {
|
|
|
return resp;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 虚拟支付失败兜底:生成普通微信支付(v3 JSAPI)参数。
|
|
|
+ *
|
|
|
+ * <p>微信虚拟支付对道具价格做严格校验(goodsPrice 需与后台道具注册价一致),
|
|
|
+ * 价格不匹配时前端会收到 GOODS_PRICE_INVALID(-15013) 而无法完成支付。
|
|
|
+ * 此处预先生成 JSAPI 支付参数,前端在虚拟支付失败时自动改走普通微信支付完成下单。
|
|
|
+ *
|
|
|
+ * @return 微信 JSAPI 支付参数;openid 缺失或微信统一下单失败时返回 null
|
|
|
+ */
|
|
|
+ private Map<String, Object> buildWechatFallbackParams(PaymentOrder order, MembershipLevel level, String openid) {
|
|
|
+ if (order == null || order.getAmount() == null || order.getAmount() <= 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ if (openid == null || openid.isEmpty()) {
|
|
|
+ log.warn("会员订单普通支付兜底跳过(openid缺失): orderNo={}", order.getOrderNo());
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ String levelName = level != null && level.getLevelName() != null
|
|
|
+ ? level.getLevelName() : order.getLevelCode();
|
|
|
+ String description = "\u6d6e\u827e\u798f-" + levelName + "\u4f1a\u5458";
|
|
|
+ return paymentService.createWechatPrepay(order.getOrderNo(), description, order.getAmount(), openid);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("会员订单普通支付兜底参数生成失败: orderNo={}", order.getOrderNo(), e);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 处理支付回调
|
|
|
*/
|