使用cURL集成Stripe API时遭遇amount参数无效整数错误
Stripe Payment Intents创建时
amount参数无效整数错误排查方案 核心问题分析
错误parameter_invalid_integer指向amount参数,即便本地var_dump显示为int(5000),仍说明实际发送到Stripe的amount不符合要求——大概率是数据编码、传输格式或参数上下文的问题。
1. 检查请求的编码与Content-Type匹配
- 如果用表单编码(
application/x-www-form-urlencoded):
确保amount在拼接表单数据时是纯数字字符串,无任何额外字符(比如空格、引号)。例如:$data = [ 'amount' => 5000, 'currency' => 'usd', // 其他参数 ]; // 正确拼接表单数据,避免自动类型转换异常 $postFields = http_build_query($data); - 如果用JSON编码(
application/json):
必须保证amount在JSON中是整数类型,而非字符串。PHP的json_encode默认会把整数转成字符串(如果包含在关联数组中),需添加JSON_NUMERIC_CHECK参数强制数字类型:$jsonData = json_encode($data, JSON_NUMERIC_CHECK);
2. 确认Stripe参数规则
amount必须是对应货币的最小单位整数(比如美元是分,5000对应50美元),不能包含小数或非数字字符。currency必须是Stripe支持的三位字母代码(如usd、eur),大小写不敏感,但需确保拼写正确。
3. 排查实际发送的请求内容
通过cURL日志查看真实发送的数据,确认amount的实际格式:
$ch = curl_init('https://api.stripe.com/v1/payment_intents'); // 基础配置(密钥、请求方法等) curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer YOUR_SECRET_KEY']); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields); // 开启 verbose 日志 curl_setopt($ch, CURLOPT_VERBOSE, true); $verboseLog = fopen('php://temp', 'w+'); curl_setopt($ch, CURLOPT_STDERR, $verboseLog); $response = curl_exec($ch); // 读取日志 rewind($verboseLog); $logContent = stream_get_contents($verboseLog); var_dump($logContent);
重点查看发送的amount值是否为纯数字,有无被意外转成带引号的字符串或混入其他字符。
4. Postman测试的同步排查
- 在Postman的Raw JSON请求体中,确保
amount是整数(无引号):{ "amount": 5000, "currency": "usd" } - 检查请求头的
Content-Type是否为application/json,如果用表单模式,确保amount字段的输入类型是数字而非文本。
5. 简化请求排除干扰
暂时移除所有非必要参数,只保留amount和currency发送请求。如果请求成功,再逐个添加其他参数,定位是否有其他参数格式错误导致的连锁报错。
内容的提问来源于stack exchange,提问作者Mukhila Asokan
相关产品推荐
相关产品推荐

