Administrator
6 days ago bd0f33bb7cbcca5eec92325c350bc7fbc366b609
refactor(pay): 优化LWPAY签名逻辑,使用字段白名单确保安全

- 定义SIGN_FIELD_KEYS常量数组,明确指定参与签名的7个业务必传字段
- 修改签名方法,仅对白名单中的字段进行签名计算
- 过滤pay_productname、pay_attach、pay_md5sign等非签名字段
- 使用TreeMap确保签名参数按字典序排列
- 提升支付接口的安全性和规范性
1 files modified
20 ■■■■■ changed files
src/main/java/cc/mrbird/febs/pay/service/LwPayService.java 20 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/service/LwPayService.java
@@ -46,6 +46,15 @@
    /** LWPAY API 基础地址 */
    private static final String LWPAY_BASE_URL = "https://lwpay.live";
    /**
     * 参与签名的字段白名单
     * 签名只包含这 7 个业务必传字段,pay_productname / pay_attach / pay_md5sign 不参与签名
     */
    private static final String[] SIGN_FIELD_KEYS = {
            "pay_memberid", "pay_orderid", "pay_applydate",
            "pay_bankcode", "pay_notifyurl", "pay_callbackurl", "pay_amount"
    };
    // ==================== 代收接口 ====================
    /**
@@ -78,8 +87,15 @@
            params.put("pay_attach", "network:" + network);
        }
        // 生成签名
        String sign = generateSign(params, secretKey);
        // 签名:仅使用白名单中的 7 个业务必传字段
        TreeMap<String, String> signParams = new TreeMap<>();
        for (String key : SIGN_FIELD_KEYS) {
            String val = params.get(key);
            if (StrUtil.isNotBlank(val)) {
                signParams.put(key, val);
            }
        }
        String sign = generateSign(signParams, secretKey);
        params.put("pay_md5sign", sign);
        log.info("LWPAY 代收请求: memberId={}, orderNo={}, amount={}, bankCode={}",