【问题标题】:Stripe Webhooks Error 503 Invalid encoding: ISO-8859-1Stripe Webhooks 错误 503 编码无效:ISO-8859-1
【发布时间】:2021-06-02 02:54:32
【问题描述】:

我按照 stripe 的建议设置了一个带有签名验证的 Stripe webhook:

<?php

logme("Secure connection: ".isSecure());
logme("I was called at:".time());

require 'vendor/autoload.php';

\Stripe\Stripe::setApiKey('sk_test_ff...');
$endpoint_secret = 'whsec_Ky...';

$payload = @file_get_contents('php://input');

if($payload) {
//request body is set
} else {
//request body is not set
    exit();
}

$sig_header = $_SERVER['HTTP_STRIPE_SIGNATURE'];

$event = null;


try {
    $event = \Stripe\Webhook::constructEvent(
        $payload, $sig_header, $endpoint_secret
    );

} catch(\UnexpectedValueException $e) {
    // Invalid payload
    http_response_code(400);
    exit();
} catch(\Stripe\Exception\SignatureVerificationException $e) {
    // Invalid signature
    http_response_code(400);
    exit();
}

http_response_code(200);

// Handle the event
switch ($event->type) {
    case 'event1':
    // do something 
    break;
    
    // ... handle other event types
    default:
        echo 'Received unknown event type ' . $event->type;
        logme('Received unknown event type ' . $event->type);
}


function logme($msg){

    $log_file = "error.txt";
// logging error message to given log file
    error_log($msg."\n-\n", 3, $log_file);
}
function isSecure() {
    return
        (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
        || $_SERVER['SERVER_PORT'] == 443;
}


在条纹仪表板上,我使用 https://example.org/path/to/webhook.php 创建了一个 webhook,但如果我在测试模式下触发 invoice.paid webhook,我会收到以下错误:

Test-Webhook-Error: 503 
Invalid encoding: ISO-8859-1 

有人熟悉这种错误吗?


更新
它似乎取决于触发的事件类型。例如。 plan.deleted 有效,而 payment_intent.succeeded 无效

【问题讨论】:

    标签: encoding stripe-payments webhooks


    【解决方案1】:

    此错误似乎不是来自签名验证,而是来自您的请求/网络堆栈中的其他地方。请注意,您在 try {} 中抛出的错误是 withStatus(403)(不是 503)。您能否从您的服务器提供更详细的日志记录以确定失败的位置?

    请参阅this related question 以及连接到 HTTP -> HTTPS 重定向的解决方案。确保您配置的端点直接连接到 HTTPS,并且您的 SSL 证书正确响应。

    我还看到您在处理程序开始时甚至在签名检查之前就调用了$event = $request-&gt;getParsedBody();,这可能会导致正在处理的正文数据出现问题(签名验证需要请求的原始正文)。

    【讨论】:

    • 我刚刚更新了代码。新版本如上。在 Stripes 后端,webhook 端点位于 https,.htaccess 将每个请求重定向到 https
    • 并确保我删除了整个.htaccess 看看是否有任何由此引起的干扰,但同样的错误
    • 当然,但是您再次说存在 503 错误,但没有代码会引发显示的错误。您是否有显示错误来源的服务器日志?
    • (对不起,我未能将链接添加到另一个问题,已编辑)
    • 我在条纹后端收到错误 503。我将$payloadheaders 记录在一个txt 文件中,看起来一切正常。
    【解决方案2】:

    对于仍然面临此问题的任何人,我最近遇到了这个问题,并最终意识到这是由于我错过了 webhook 端点的尾部斜线....花费了几个小时!

    【讨论】:

    • 感谢您为我节省了一周或一个月的时间!
    猜你喜欢
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2018-02-21
    • 2012-02-17
    • 1970-01-01
    相关资源
    最近更新 更多