Symfony 5,测试条带时得到 403

Posted

技术标签:

【中文标题】Symfony 5,测试条带时得到 403【英文标题】:Symfony 5, got 403 when testing stripe 【发布时间】:2021-08-12 00:54:13 【问题描述】:

我正在尝试通过 symfony 5 使用 Stripe 进行每月订阅。

我在我的项目中集成了条带,我正在测试一个 webbook 以收听诸如支付失败之类的事件。

我在控制器中创建了一个动作:

/**
     * @Route("/webhook", name="webhook")
     * @param Request $request
     * @return Response
     */
    public function webhook(Request $request) 
        \Stripe\Stripe::setApiKey('sk_test_..');

        $event = $request->query;
        $webhookSecret = "whsec_..";
        $signature = $request->headers->get('stripe-signature');

        if ($webhookSecret) 
            try 
                $event = \Stripe\Webhook::constructEvent(
                    $request->getContent(),
                    $signature,
                    $webhookSecret
                );
             catch (\Exception $e) 
                //  return new JsonResponse([['error' => $e->getMessage(),'status'=>403]]);
                $response = new Response();
                $response->setContent(json_encode([
                    'error' => $e->getMessage(),
                ]));
                $response->headers->set('Content-Type', 'application/json');
                $response->setStatusCode(403);
                return $response;
            
         else 
            $event =  $request->query;
        

        $type = $event['type'];
        $object = $event['data']['object'];

        switch ($type) 
            case 'checkout.session.completed':
                // Payment is successful and the subscription is created.
                // You should provision the subscription and save the customer ID to your database.

                break;
            case 'invoice.paid':
                // Continue to provision the subscription as payments continue to be made.
                // Store the status in your database and check when a user accesses your service.
                // This approach helps you avoid hitting rate limits.

                break;
            case 'invoice.payment_failed':
                // The payment failed or the customer does not have a valid payment method.
                // The subscription becomes past_due. Notify your customer and send them to the
                // customer portal to update their payment information.

                break;
            // ... handle other event types
            default:
                // Unhandled event type
        

        $response = new Response();
        $response->setContent(json_encode([
            'status' => 'success',
        ]));
        $response->setStatusCode(200);
        return $response;

    

基于条纹官方文档:https://stripe.com/docs/billing/subscriptions/checkout

我修改了代码以使其适应 symfony,我正在尝试使用 postman 和 stripe cli 测试该操作:

我得到了邮递员:

无法从标头中提取时间戳和签名

使用 stripe cli 我开始听 路由使用:stripe listen --forward-to http://localhost/webhook 我使用条纹触发器 payment_intent.created 来模拟付款,但出现 403 错误

如何修复网络钩子?

enter image description here

【问题讨论】:

【参考方案1】:

Postman 不是测试 Stripe webhook 的好方法,因为您的请求会丢失某些标头,例如时间戳,正如您所发现的那样。

相反,您应该使用 Stripe CLI 或仪表板来发送测试事件(CLI 对此更好,因为它会创建所有对象,而不是向您发送带有虚拟数据的事件)。

至于您在通过 CLI 触发事件时遇到的 403 错误,如果没有更多详细信息,我无法真正告诉您那里发生了什么。 403 是“禁止”状态代码,因此您应该仔细检查您的服务器设置,确保 Webhook 端点无需身份验证即可访问 Internet。

【讨论】:

感谢您的回答,我会尝试将 url 转换为 https 并使用 cli

以上是关于Symfony 5,测试条带时得到 403的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2:使用 FOSUserBundle 时如何在控制器内获取用户对象?

React.js 使用 JQuery 发布 Django 得到 403

Windows 安装 Symfony 2.2 框架 - 安装成功 !!

Symfony 5 功能测试 - 缺少环境变量,getenv() 返回 false

运行 PHPUnit 测试时,容器参数在 Symfony 5 服务中不可用/注入

路由错误或 wamp 错误?