使用PHP cURL调用Stripe Subscription Search API时遇400 Bad Request错误
修复PHP cURL调用Stripe订阅搜索API的400错误
你的代码存在几个导致400错误的问题,以下是问题分析和修正方案:
问题点
- URL拼接冗余符号:当
next_page为空时,URL会出现?&expand这种格式,多余的&会导致参数解析失败 - 查询语法错误:
metadata['order_id']:'6735'AND中缺少空格,Stripe查询语法要求逻辑运算符前后必须有空格 - 未编码特殊字符:query参数包含空格、
<等特殊字符,直接拼接会破坏URL格式
修正后的代码
$ch = curl_init(); $created = 'created<' . strtotime('tomorrow'); // 处理分页参数,避免多余符号 $next_page = isset($_REQUEST['next_page']) ? '&page=' . $_REQUEST['next_page'] : ''; $limit = 20; // 构建符合语法的查询语句 $query = "status:'active' AND metadata['order_id']:'6735' AND " . $created; // 编码查询参数并拼接正确的URL $curl_url = "https://api.stripe.com/v1/subscriptions/search?expand[]=total_count&limit=" . $limit . "&query=" . urlencode($query) . $next_page; curl_setopt($ch, CURLOPT_URL, $curl_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); $headr = array(); $headr[] = 'Stripe-Version: 2022-11-15'; curl_setopt($ch, CURLOPT_HTTPHEADER, $headr); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, 'XXXX-secret_key_test-XXX'); $response = curl_exec($ch); // 新增错误排查代码,方便定位问题 if(curl_errno($ch)){ echo 'cURL错误:' . curl_error($ch); } curl_close($ch);
关键修改说明
- 调整分页参数拼接逻辑:仅当
next_page存在时才添加&page=,避免空值时的格式错误 - 修正查询语句空格:在
'6735'与AND之间添加空格,符合Stripe查询语法规范 - 对query参数做
urlencode处理:确保空格、<等特殊字符被正确编码,避免URL解析失败 - 新增cURL错误捕获:方便查看具体错误信息,辅助后续调试
内容的提问来源于stack exchange,提问作者sridharnetha
相关产品推荐
相关产品推荐

