Stripe Checkout集成问题:line_item仅接受整数如何传入可变支付金额
PHP集成Stripe Checkout可变金额传入解决方案
核心规则说明
Stripe Checkout的line_items.unit_amount参数要求传入正整数,对应支付货币的最小单位(例如人民币对应分、美元对应美分,实际支付金额为 unit_amount / 100 对应货币面值)
实现步骤
- 前端参数传递
前端自定义金额输入框新增基础校验:限制输入为正数,最多保留2位小数,发起创建支付会话请求时,将用户输入的金额以custom_amount(可自定义字段名)参数通过POST请求传递到后端 - 后端金额处理
接收前端传递的金额参数后,先转换为符合Stripe要求的整数格式,同时做合法性校验,避免精度异常或非法值:// 接收前端传参,空值默认设为0 $inputAmount = $_POST['custom_amount'] ?? 0; // 转换为对应货币最小单位的整数,避免浮点精度问题用round处理 $unitAmount = (int)round((float)$inputAmount * 100); // 合法性校验,可根据业务调整最低支付金额 if ($unitAmount < 1) { throw new Exception("支付金额不能低于最小限额"); } - 替换固定金额参数
构造Stripe Checkout Session时,将原来固定的unit_amount值2000替换为上述处理后的$unitAmount变量即可,示例代码:$stripe = new \Stripe\StripeClient('你的Stripe API密钥'); $checkout_session = $stripe->checkout->sessions->create([ 'payment_method_types' => ['card'], 'line_items' => [[ 'price_data' => [ 'currency' => 'cny', // 替换为实际使用的货币编码 'product_data' => [ 'name' => '自定义支付商品', ], 'unit_amount' => $unitAmount, // 替换原有固定值 ], 'quantity' => 1, ]], 'mode' => 'payment', 'success_url' => '支付成功跳转地址', 'cancel_url' => '支付取消跳转地址', ]);
常见失效原因排查
- 直接将前端传递的浮点型金额赋值给
unit_amount,未转换为整数格式导致请求被Stripe拦截 - 前后端参数名不一致,导致后端接收的金额为空,赋值未生效
- 未做金额校验,传递了负数、0或者超过Stripe支付限额的数值,触发Stripe接口报错
内容的提问来源于stack exchange,提问作者MMunir. Asif
相关产品推荐
相关产品推荐

