【问题标题】:Yii2 Stripe Webhook testing: "[ERROR] Failed to Post"Yii2 Stripe Webhook 测试:“[错误] 发布失败”
【发布时间】:2023-03-08 20:47:01
【问题描述】:

我在 Yii2 控制器中设置了一个基本的 Webhook 端点,只是为了测试连接:

class CreditCardController extends Controller
{
    public function behaviors()
    {
        return [
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                     'webhook' => ['post'],
                ],
            ],
        ];
    }

    public function beforeAction($action)
    {
        if ($action->id == 'webhook')
            $this->enableCsrfValidation = false;
        return parent::beforeAction($action);
    }

...我只想转储有效负载并返回 HTTP 200(大致基于我遵循的示例 here

    public function actionWebhook()
    {
        $payload = file_get_contents('php://input');
        ob_start();
        var_dump($payload);
        error_log(ob_get_clean(), 4);

        echo json_encode(['status' => 'success']);
    }

我安装了 Stripe CLI 并将 Webhook 转发到我的本地测试服务器:

stripe listen -f https://testsite.office/credit-card/webhook

当我触发包含我正在监听的内容的事件时:

stripe trigger invoice.payment_succeeded

我收到这条消息:

[错误] POST 失败:发布“https://testsite.office/credit-card/webhook”:超出上下文期限(等待标头时超出 Client.Timeout)

如果我删除该操作的 POST 规则并在浏览器中对 URL 进行编码,它就可以正常工作。

有什么想法吗?

【问题讨论】:

  • 这似乎是您的框架在 Stripe CLI 转发事件时处理 POST 请求的方式存在问题。你能确认你的服务器收到了请求吗?它可以到达控制器吗?您需要在此处提供更详细的调试信息。

标签: yii2 webhooks


【解决方案1】:

对于遇到相同问题的任何人(我在网上看不到很多 Stripe/Yii2 webhook 喋喋不休),这对我有用。

我注意到 Yii 在 Apache error_log 中抛出了 HeadersAlreadySentException。所以我不得不将响应格式指定为 JSON:

return new Response([
    'format' => Response::FORMAT_JSON,
    'statusCode' => 200,
    'statusText' => 'Webhook Handled',
]);

可能与此问题无关,但我也将访问有效负载更改为“Yii 方式”:

$payload = json_decode(Yii::$app->request->getRawBody(), true);

【讨论】:

    猜你喜欢
    • 2021-11-28
    • 2021-04-03
    • 2016-03-09
    • 2022-01-17
    • 2020-01-05
    • 2020-08-03
    • 2016-11-10
    • 2018-11-02
    • 2017-10-08
    相关资源
    最近更新 更多