使用Stripe CLI和事件触发器进行调试时,Webhooks测试不一致。

问题是,如果我多次触发同一个事件,我得到的结果是不同的。

我有 三端 开。

  1. 倾听 使用。
   listen --forward-to localhost:8888/my-endpoint.php
  1. 触发 使用
    stripe trigger + event

(例如:stripe trigger payment_intent.successed)

  1. 伐木 来自本地主机的错误

疑难解答

  • 我也可以通过运行Stripe结账来触发。结账工作,但终端的结果与描述的类似。

  • 我还在xdebug监听的时候运行了触发器,可以看到代码按照预期的方式运行(即为主体分配简单的文本响应并调用200400代码)。

重要说明

下面的截图显示了日志(左)、监听(右上)和事件触发(右下)。

第1次和第4次尝试成功。第2次和第3次不成功。它们不包括日志或。

2020-04-24 16:17:16   --> payment_intent.succeeded [evt_1GbMikFOnngxtrI1EfZyfaNo]
2020-04-24 16:17:16  <--  [200] POST http://localhost:8888/scripts/stripe/webhook-endpoint.php [evt_1GbMikFOnngxtrI1EfZyfaNo]

注意,你可以看到不同事件的时间码在右上角。

而且日志只更新一次,在第一次触发时。

另一个有趣的事情是,有时响应会出现在Stripe仪表板中,有时不会。

有什么好办法吗?

screenshots of 3 terminals

Webhooks代码(上面设置了签名和api密钥,但在这里隐藏了起来

$payload = @file_get_contents('php://input'); //get json POST data stripe sends
$sig_header = $_SERVER['HTTP_STRIPE_SIGNATURE'];
$event = null;

try {
    $event = \Stripe\Webhook::constructEvent(
      $payload, $sig_header, $endpoint_secret, //get data
    );
  } catch(\UnexpectedValueException $e) {
    // Invalid payload
    printf("Invalid payload");
    http_response_code(400);
    exit();
  } catch(\Stripe\Exception\SignatureVerificationException $e) {
    // Invalid signature
    printf("Invalid signature.");
    http_response_code(400);
    exit();
  }
// Handle the event(s)
switch ($event->type) {
    case 'checkout.session.completed': 
        $session = $event->data->object;
        printf("Checkout Session Completed");
        http_response_code(200); 
        break;
    case 'payment_intent.succeeded': 
        $paymentIntent = $event->data->object; 
        $intent = $event->data->object;
        printf("Payment Intent Succeeded: %s", $intent->id);
        http_response_code(200);
        error_log( json_encode( $intent, JSON_PRETTY_PRINT ) );
        break;
    case 'payment_intent.payment_failed': 
        $paymentMethod = $event->data->object;
        $intent = $event->data->object;
        $error_message = $intent->last_payment_error ? $intent->last_payment_error->message : "";
        printf("Failed: %s, %s", $intent->id, $error_message);
        http_response_code(200);
        break;
    case 'payment_intent.processing':
        printf("Payment Intent Processing: %s", $intent->id);
        http_response_code(200);
        break;
    case 'payment_intent.canceled': 
        printf("Payment Intent canceled: %s", $intent->id);
        http_response_code(200);
        break;
    default:
        http_response_code(400);
        exit();
}

http_response_code(200);
return false;

解决方案:

我希望我的理解是正确的,如果我在这里偏离了主题,我道歉。

我认为这里的问题是,使用 stripe trigger payment_intent.succeeded 最终创建3个事件。

  • payment_intent.created
  • charge.succeeded
  • payment_intent.succeeded

似乎case语句没有针对前两个事件类型的条款 所以它们默认为400s。

根据你想做的事情,你可以扩展case语句来处理这些事件。另外,也许这与你的发现有关,但事件没有一个保证的排序,这是正常的行为,也是你在构建系统时必须记住的[0]。希望这对你有帮助

[0] https:/stripe.comdocswebhooksbest-practices#event-ordering。

给TA打赏
共{{data.count}}人
人已打赏
未分类

如何改变状态栏字体颜色?[重复]

2022-9-9 0:22:39

未分类

如何使用javascript扩展表格数据?

2022-9-9 0:22:41

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索