【问题标题】:php webhook not responding to Stripe test eventphp webhook 没有响应 Stripe 测试事件
【发布时间】:2017-10-25 13:13:01
【问题描述】:

我已经建立了一个基本的 webhook php 页面,它以条带文档为模型,并在下面列出。当我从 Stripe webhook 仪表板发送测试事件时,stripe 以空白响应响应“测试 webhook 发送成功”。但是,没有写入输出日志文件,没有发送电子邮件,也没有任何内容记录到 http 服务器错误日志或 php 错误日志中。我的 php 版本是 5.3.3。我做错了什么?

<?php
error_reporting(15);
// Set your secret key: remember to change this to your live secret    key in production
// See your keys here: https://dashboard.stripe.com/account/apikeys
require_once('vendor/autoload.php');

\Stripe\Stripe::setApiKey("secret_test_key");

$handle = fopen("webhook.log","a");

// Retrieve the request's body and parse it as JSON
$input = file_get_contents("php://input");

$event_json = json_decode($input);

// Do something with $event_json
if (fwrite($handle, $event_json) === FALSE) {
    mail("mike@example.com","Cannot write to webhook.log","");
    echo "Cannot write to webhook.log";
    exit;
}

mail('mike@example.com','Webhook Event',$event_json);
header(':', true, 200);
//http_response_code(200); // PHP 5.4 or greater
?>

【问题讨论】:

    标签: php stripe-payments webhooks


    【解决方案1】:

    您有一些潜在的问题。作为一个快速的经验法则,调试它的最佳方法是从自己触发事件开始,您可以通过自己在浏览器中加载 webhook url 来完成。然后你可以直接测试它并确保它正在做你期望它做的事情。显然有两种可能:

    1. 由于某种原因,Stripe 未触发您的 webhook 处理程序
    2. 您的处理程序没有正确记录自己

    后者首先:可能是 Stripe 正在触发您的处理程序,但它没有成功记录该事实。这意味着您的电子邮件记录和文件记录都失败了。这实际上是很有可能的。使用邮件功能进行电子邮件记录实际上非常不可靠,除非您知道它确实有效。使用邮件功能发送的邮件会被大多数现代电子邮件系统(gmail 等)静默丢弃,除非您正确配置了 DNS 记录,而大多数人没有这样做。因此,除非您确定您的邮件尝试正常工作,否则可能不是。如果您在尝试写入日志文件时也碰巧遇到了权限问题(这对于新设置的服务器来说并不少见),那么您的日志可能只是失败了。最简单的检查方法是自己在浏览器中加载 webhook URL。这样您就知道它正在被触发,并且可以确定问题是日志记录不当还是 Stripe 没有调用您的 webhook。

    如果您确定 stripe 没有调用您的 webhook,则最有可能的罪魁祸首是无效的 HTTPS 证书。您的 webhook 是否通过 HTTPS 连接(应该是)?如果是这样,它是有效的证书吗?当您浏览自己的网站时,您可以告诉浏览器忽略无效证书,但如果遇到无效证书,stripe 将简单地拒绝发送请求。

    如果以上方法都不能解决问题,那么是时候进行更多挖掘了,但我会从这些开始:它们可能是最有可能出现的问题。

    【讨论】:

    • 谢谢康纳。我也许应该提到我已经通过浏览器进行了测试,并且日志记录和电子邮件都有效。我还通过 ngrok 进行了测试并收到了 json。对于 http 和 https,stripe 会响应测试成功。我还返回了 Stripe 确认已收到的 500 错误。我很困惑。
    【解决方案2】:

    解决方案是 $event_json 是一个对象并且 fwrite 失败,因为它需要一个字符串而不是一个对象。通过转换为数组然后序列化,我能够写入日志并发送电子邮件。

    $event_json = (array)json_decode($input);
    $event = serialize($event_json);
    

    【讨论】:

    • 顺便说一句,json_decode 有一个标志,用于返回数组而不是对象:$event_json = json_decode( $input, true )。此外,当您将 JSON 写入日志文件时,您不必重新序列化它。你已经把它作为一个字符串,因为它最初是这样出现的:fwrite( $handle, $input )
    • @conor 知道了。谢谢
    猜你喜欢
    • 2020-07-03
    • 2019-04-14
    • 2023-03-19
    • 2021-04-03
    • 2021-10-24
    • 2015-10-24
    • 2020-01-05
    • 2020-08-01
    • 2014-01-12
    相关资源
    最近更新 更多