elunez/eladmin · error · BadRequestException

请先添加相应配置,再操作

Error message

请先添加相应配置,再操作

What it means

Thrown by AliPayServiceImpl.toPayAsPc when the supplied AlipayConfig has a null id, meaning no alipay configuration row has been persisted (config rows always get id=1L in the config() method, which also @CachePut's it under key 'config'). The check is a proxy for 'the merchant has never saved Alipay credentials'.

Source

Thrown at eladmin-tools/src/main/java/me/zhengjie/service/impl/AliPayServiceImpl.java:65

    @Cacheable(key = "'config'")
    public AlipayConfig find() {
        Optional<AlipayConfig> alipayConfig = alipayRepository.findById(1L);
        return alipayConfig.orElseGet(AlipayConfig::new);
    }

    @Override
    @CachePut(key = "'config'")
    @Transactional(rollbackFor = Exception.class)
    public AlipayConfig config(AlipayConfig alipayConfig) {
        alipayConfig.setId(1L);
        return alipayRepository.save(alipayConfig);
    }

    @Override
    public String toPayAsPc(AlipayConfig alipay, TradeVo trade) throws Exception {

        if(alipay.getId() == null){
            throw new BadRequestException("请先添加相应配置,再操作");
        }
        AlipayClient alipayClient = new DefaultAlipayClient(alipay.getGatewayUrl(), alipay.getAppId(), alipay.getPrivateKey(), alipay.getFormat(), alipay.getCharset(), alipay.getPublicKey(), alipay.getSignType());

        // 创建API对应的request(电脑网页版)
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();

        // 订单完成后返回的页面和异步通知地址
        request.setReturnUrl(alipay.getReturnUrl());
        request.setNotifyUrl(alipay.getNotifyUrl());
        // 填充订单参数
        request.setBizContent("{" +
                "    \"out_trade_no\":\""+trade.getOutTradeNo()+"\"," +
                "    \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +
                "    \"total_amount\":"+trade.getTotalAmount()+"," +
                "    \"subject\":\""+trade.getSubject()+"\"," +
                "    \"body\":\""+trade.getBody()+"\"," +
                "    \"extend_params\":{" +
                "    \"sys_service_provider_id\":\""+alipay.getSysServiceProviderId()+"\"" +

View on GitHub (pinned to 55fbf70595)

Solutions

  1. Complete Alipay setup first: call the config endpoint (PUT/POST handled by AliPayController -> config()) with appId, gatewayUrl, privateKey, publicKey, etc.
  2. Verify a row with id=1 exists in the alipay_config table and is returned by the find() cache.
  3. If the row exists but the error persists, the Spring cache ('config' key) may hold an empty AlipayConfig — clear the redis cache entry or restart after saving config.
  4. Gate the pay endpoints in the UI until configuration exists (check via the config query API).

Example fix

// before
if(alipay.getId() == null){
    throw new BadRequestException("请先添加相应配置,再操作");
}

// after (caller-side guard, controller already loads via find()):
AlipayConfig alipay = aliPayService.find();
if(alipay.getId() == null){
    // redirect user to admin config page instead of hitting toPayAsPc
    return ResponseEntity.status(HttpStatus.PRECONDITION_FAILED)
        .body(Collections.singletonMap("message", "Alipay not configured"));
}
return ResponseEntity.ok(aliPayService.toPayAsPc(alipay, trade));
Defensive patterns

Strategy: validation

Validate before calling

// guard in the controller before invoking payment
AlipayConfig alipay = aliPayService.find();
if (alipay.getId() == null) {
    return ResponseEntity.status(HttpStatus.PRECONDITION_FAILED)
        .body("Alipay 未配置");
}
return ResponseEntity.ok(aliPayService.toPayAsPc(alipay, trade));

Try / catch

try { aliPayService.toPayAsPc(alipay, trade); } catch (BadRequestException e) { if ("请先添加相应配置,再操作".equals(e.getMessage())) { /* route admin to Alipay config page */ } }

Prevention

When it happens

Trigger: Calling the PC payment endpoint (POST /api/aliPay/toPayAsPc or similar controller route into toPayAsPc) before ever POSTing a valid AlipayConfig through the config endpoint; or when the controller loads the config via find() which returns `new AlipayConfig()` (id null) when the table row with id=1 is absent.

Common situations: Fresh environment/database where alipay_config table is empty; the config cache holding an empty object after a cache flush sequence; frontend payment page reachable before the admin completed Alipay setup; DB restored without the config row.

Related errors


AI-assisted analysis of elunez/eladmin@55fbf70595 (2026-08-14). Data as JSON: /api/errors/5dff6b350e457a30. Report an issue: GitHub.