我正在尝试设置一个Stripe webhook,一旦发生'charge.succeeded'事件就会发送一封电子邮件。当我在Stripe上测试webhook时,我不断得到一个广义的“错误500”。我对Stripe很新,我真的被困在这里。
<?php
require 'PHPMailerAutoload.php';
$mail = new PHPMailer;
require_once('stripe/lib/Stripe.php');
Stripe::setApiKey("XXXYYYZZZ");
// retrieve the request's body and parse it as JSON
$body = @file_get_contents('php://input');
$event_json = json_decode($body);
// for extra security, retrieve from the Stripe API
$event_id = $event_json->id;
$event = Stripe_Event::retrieve($event_id);
// This will send receipts on successful charges
if ($event_json->type == 'charge.succeeded') {
// This is where we e-mail the invoice.
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'smtp.gmail.com'; // Specify main and backup server
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = 'abc@gmail.com'; // SMTP username
$mail->Password = 'password!'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable encryption, 'ssl' also accepted
$mail->From = 'abc@gmail.com';
$mail->FromName = 'John Doe';
$mail->addAddress('email@stanford.edu, John Doe'); // Add a recipient
$mail->WordWrap = 50; // Set word wrap to 50 characters
$mail->isHTML(true); // Set email format to HTML
$mail->Subject = 'Your webhook works!!!!!';
$mail->Body = "The message sent!";
if(!$mail->send()) {
echo 'Message could not be sent. Contact us at hello@beerboy.co.';
echo 'Mailer Error: ' . $mail->ErrorInfo;
exit;
}
}
?>
答案 0 :(得分:1)
检查此代码:
// retrieve the request's body and parse it as JSON
$body = @file_get_contents('php://input');
$event_json = json_decode($body);
// for extra security, retrieve from the Stripe API
$event_id = $event_json->id;
$event = Stripe_Event::retrieve($event_id);
$body
是使用php://input
定义的,id
想要读取提交到您的网页的POST或GET信息,而不是Stripe。 See here。 POST或GET中的任何内容显然都是无效的JSON或包含无效的json_decode($body)
。
因此,当您尝试$event_json->id
时,您正在尝试json_decode POST或GET中的内容,而不是您从Stripe获得的内容。 $event_id
不存在或无效,因此Stripe_Event::retrieve($event_id);
不存在或无效,因此当您致电var_dump($event_json); die();
时,Stripe会翻转。
在Stripe_Event
来电之前尝试id
并查看您的请求中的内容。
编辑:确保您正在POST(或包含查询字符串)语法上有效的JSON。换句话说,您的用户如何访问此页面?确保无论它们来自何处,输入都包含有效的JSON并符合您的期望(即,具有{{1}}参数等。)
答案 1 :(得分:1)
对于仍在寻找答案的人,请从file_get_contents()
函数中删除“@”符号:
`Stripe::setApiKey("sk_test_5cgfJ8yqBHE8L6radSAUhoo7");
$input = file_get_contents("php://input");
$event_json = json_decode($input);
var_dump($event_json);
http_response_code(200); // PHP 5.4 or greater`
从条带webhooks部分发送条带管理员测试。您将收到一条消息“测试webhook已成功发送”,单击此按钮可查看响应,该响应应为请求对象的数组。
答案 2 :(得分:-1)
你应该在最后添加这一行:
http_response_code(200); // PHP 5.4或更高版本
在所有exit;
之前