通过复选框修改Stripe产品价格(PHP实现方案问询)
解决方案
1. 前端修改:传递复选框选中状态到后端
在checkout.js的handleSubmit函数中,添加代码收集两个复选框的选中状态,并在请求payment_init.php时将这些数据一并发送:
async function handleSubmit(e) { e.preventDefault(); setLoading(true); let customer_name = document.getElementById("name").value; let customer_email = document.getElementById("email").value; // 收集复选框状态 let urgent_selected = document.getElementById("urgentserviciu").checked; let whatsapp_selected = document.getElementById("whatssapserviciu").checked; const { id, customer_id } = await fetch("payment_init.php", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ request_type:'create_customer', payment_intent_id: payment_intent_id, name: customer_name, email: customer_email, urgent: urgent_selected, // 新增复选框状态字段 whatsapp: whatsapp_selected // 新增复选框状态字段 }), }).then((r) => r.json()); // 后续Stripe确认支付代码保持不变 const { error } = await stripe.confirmPayment({ elements, confirmParams: { return_url: window.location.href+'?customer_id='+customer_id, }, }); }
2. 后端修改:计算最终价格并生成支付意图
在payment_init.php中,先确保已正确获取JSON请求体,再根据前端传递的复选框状态计算最终总价,最后转换为Stripe要求的最小货币单位:
// 先获取前端传来的JSON数据 $jsonObj = json_decode(file_get_contents('php://input'), false); if($jsonObj->request_type == 'create_payment_intent'){ // 引入配置文件中的基础价格 require_once 'config.php'; $total_price = $itemPrice; // 根据复选框状态计算加价 if(isset($jsonObj->urgent) && $jsonObj->urgent){ $total_price += 10; } if(isset($jsonObj->whatsapp) && $jsonObj->whatsapp){ $total_price += 2; } // 转换为RON的最小单位(分),符合Stripe金额要求 $itemPriceCents = round($total_price * 100); // 后续创建Stripe Payment Intent的代码,使用$itemPriceCents作为金额参数 }
关键注意事项
- 安全校验:绝对不能直接使用前端传来的总价,必须后端根据选中选项重新计算。前端数据可被篡改,直接使用会导致支付金额被恶意修改。
- 参数合法性:可以在后端额外校验
urgent和whatsapp字段的类型(确保是布尔值),避免非法参数干扰价格计算。
内容的提问来源于stack exchange,提问作者Gabi Adrian
相关产品推荐
相关产品推荐

