使用Stripe PHP API实现自定义结账时遭遇500内部服务器错误
解决Stripe Checkout PHP后端500内部服务器错误
遇到这种500错误,核心是先定位具体的错误原因,下面是一步步的排查和修复方案:
1. 先查看服务器的错误日志
500错误的具体细节都会记录在服务器的错误日志里,这是最直接的排查方式:
- 如果用Apache,日志一般在
/var/log/apache2/error.log(Linux)或者对应Windows服务器的日志目录 - 如果用Nginx,日志通常在
/var/log/nginx/error.log - PHP的错误日志可以在
php.ini里找到error_log配置项的路径
日志里会明确告诉你是哪一行代码出错,比如未定义的函数、API调用异常等。
2. 给Stripe API调用添加异常捕获
Stripe的PHP SDK在调用失败时会抛出异常(比如无效的token、金额错误、API密钥错误等),你的代码里没有任何异常处理,一旦API调用失败就会直接触发500错误。修改后端代码,添加try-catch块:
require_once('html/includes/vendor/autoload.php'); $stripe = array( "secret_key" => "sk_test_nJxSc9Yw716tLBWTa9HHMxhj", "publishable_key" => "pk_test_yGQM97VuEUdttuOOFQcyaPHW" ); $charge_reply = array(); \Stripe\Stripe::setApiKey($stripe['secret_key']); // 自定义sendJson函数,如果没定义的话先补上 function sendJson($data) { header('Content-Type: application/json'); echo json_encode($data); exit; } if ($_SERVER['REQUEST_METHOD'] === 'POST') { try { $token = $_POST['sT']; $email = $_POST['sE']; $customer = \Stripe\Customer::create(array( 'email' => $email, 'source' => $token )); $charge = \Stripe\Charge::create(array( "amount" => 1000, // 注意:这里是分,对应10美元 "currency" => "usd", "source" => $customer->id, "email" => $email, "description" => "Example charge" )); $charge_reply[] = [ 'token' => $token, 'email' => $email, 'charge_id' => $charge->id // 可以返回charge ID方便调试 ]; sendJson($charge_reply); } catch (\Stripe\Exception\ApiErrorException $e) { // 捕获Stripe的API异常,返回错误信息给前端 $charge_reply['error'] = $e->getMessage(); http_response_code(400); // 返回400状态码,而不是500 sendJson($charge_reply); } catch (Exception $e) { // 捕获其他PHP异常 $charge_reply['error'] = $e->getMessage(); http_response_code(500); sendJson($charge_reply); } return; }
3. 检查sendJson函数是否存在
你的代码最后调用了sendJson($charge_reply),但没有给出这个函数的实现。如果这个函数没有定义,PHP会直接抛出“Call to undefined function sendJson()”的错误,导致500。上面的代码里已经补上了这个函数的实现,你可以直接用,或者替换成原生的JSON输出:
header('Content-Type: application/json'); echo json_encode($charge_reply); exit;
4. 验证参数和配置的正确性
- 确认你的Stripe Secret Key是正确的,没有拼写错误
- 注意Stripe的金额单位是分,比如你代码里的
1000对应10美元,如果后续要改用前端传的金额,记得把美元数乘以100再传入 - 确认前端传的
token.id是有效的,Stripe的token只有5分钟有效期,如果请求延迟太久可能会失效
按照上面的步骤排查,你应该能找到具体的错误原因并修复。
内容的提问来源于stack exchange,提问作者MWA
相关产品推荐
相关产品推荐

