Administrator
6 days ago 259cbaab9a033db8a8d5424fde57fb9d7509a1a2
src/main/java/cc/mrbird/febs/pay/service/LwPayService.java
@@ -14,6 +14,8 @@
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import java.util.Map;
import java.util.TreeMap;
@@ -46,6 +48,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"
    };
    // ==================== 代收接口 ====================
    /**
@@ -70,7 +81,7 @@
        params.put("pay_bankcode", bankCode);
        params.put("pay_notifyurl", getNotifyUrl());
        params.put("pay_callbackurl", getReturnUrl());
        params.put("pay_amount", order.getAmount().toPlainString());
        params.put("pay_amount", getBRLAmount(order.getAmount()));
        params.put("pay_productname", "商品订单-" + order.getOrderNo());
        // 通道 968 需要 network 参数
@@ -78,8 +89,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={}",
@@ -100,6 +118,19 @@
        }
        return json.getString("payurl");
    }
    private String getBRLAmount(BigDecimal amount){
        DataDictionaryCustom dataDictionaryCustom = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                "MONEY_CHANGE",
                "BRL"
        );
        BigDecimal rate = new BigDecimal("5.18");
        if (dataDictionaryCustom != null){
            rate = new BigDecimal(dataDictionaryCustom.getValue());
        }
        return  amount.multiply( rate).setScale(2, RoundingMode.DOWN).toString();
    }
    // ==================== 回调处理 ====================
@@ -186,7 +217,7 @@
     */
    public String generateSign(TreeMap<String, String> params, String secretKey) {
        String signStr = buildSignString(params) + "&key=" + secretKey;
        log.debug("LWPAY 待签名字符串: {}", signStr);
        log.info("LWPAY 待签名字符串: {}", signStr);
        return SecureUtil.md5(signStr).toUpperCase();
    }