You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Ajax请求设置配送费用?代码执行后费用未变更

配送费用Ajax设置失效解决方案

核心失效原因

你当前的代码无法修改配送费用,问题出在3个环节:

  • 调用vmPSPlugin::storePSPluginInternalData()时缺失必填的virtuemart_shipmentmethod_id字段,方法无法定位到目标配送方式的配置记录,不会执行更新操作
  • 未在Joomla/VirtueMart框架引导流程内发起请求,直接调用插件方法会出现类加载、权限校验层面的错误
  • 配置更新后未清除购物车会话内的配送费用缓存,前端结算页读取的仍是会话存储的旧值

可直接复用的实现方案

前端Ajax请求逻辑

不要直接构造裸请求,必须携带CSRF令牌、当前配送方式ID两类必要参数,请求地址走VirtueMart的标准入口:

// 原生JS实现,使用jQuery/其他框架可自行调整请求写法
const csrfToken = Joomla.getOptions('csrf.token');
const currentShipmentId = document.querySelector('input[name="virtuemart_shipmentmethod_id"]:checked').value;
const postData = new URLSearchParams();
postData.append(csrfToken, 1); // 传入CSRF令牌避免被安全拦截
postData.append('option', 'com_virtuemart');
postData.append('view', 'plugin');
postData.append('task', 'updateShipmentCost');
postData.append('shipment_id', currentShipmentId);
postData.append('shipment_cost', 50);
postData.append('shipment_package_fee', 90);

fetch('/index.php', {
  method: 'POST',
  body: postData
})
.then(resp => resp.json())
.then(res => {
  if(res.status) {
    // 刷新购物车价格模块,拉取最新配送费用
    Virtuemart.refreshCartPrices();
  }
})

后端处理逻辑

建议把处理逻辑写在自定义配送插件类中,不要新建独立PHP文件绕过框架引导流程,代码如下:

<?php
// 代码放在你的配送插件主类文件中即可
public function updateShipmentCost() {
  $app = JFactory::getApplication();
  $resp = ['status' => false, 'msg' => ''];
  
  // 校验请求合法性
  if(!JSession::checkToken()) {
    $resp['msg'] = '请求令牌校验失败';
    echo json_encode($resp);
    jexit();
  }

  // 获取请求参数
  $shipmentId = $app->input->getInt('shipment_id');
  $shipmentCost = $app->input->getFloat('shipment_cost');
  $packageFee = $app->input->getFloat('shipment_package_fee');

  if(empty($shipmentId)) {
    $resp['msg'] = '配送方式ID不能为空';
    echo json_encode($resp);
    jexit();
  }

  // 构造存储参数,补全必填主键字段
  $storeData = [
    'virtuemart_shipmentmethod_id' => $shipmentId, // 这是你之前代码缺失的核心字段
    'shipment_cost' => $shipmentCost,
    'shipment_package_fee' => $packageFee
  ];

  // 执行配置存储
  $storeResult = vmPSPlugin::storePSPluginInternalData($storeData);
  if($storeResult) {
    // 清除购物车配送缓存,强制重新计算费用
    $cart = VirtueMartCart::getCart();
    $cart->clearCartPrices();
    $cart->setShipmentmethod(false);
    $resp['status'] = true;
    $resp['msg'] = '更新成功';
  } else {
    $resp['msg'] = '配置存储失败';
  }

  echo json_encode($resp);
  jexit();
}

排查建议

  • 代码部署后可直接查询数据库#__virtuemart_shipmentmethods表,确认对应配送方式的shipment_cost、shipment_package_fee字段值是否更新,先排除存储层问题
  • 如果配送费用是按订单金额、收货地址动态计算的,不建议直接修改全局配置值,建议通过plgVmOnSelectedCalculateShipmentCost钩子动态返回计算后的费用,避免影响其他用户的结算流程
  • 如果是多商户场景,要额外校验当前请求用户是否有修改对应配送方式的权限,避免越权操作

内容的提问来源于stack exchange,提问作者user490872

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 05:24:29