Symfony 5条纹v3 can';找不到签出会话ID

Symfony 5条纹v3 can';找不到签出会话ID,symfony,stripe-payments,Symfony,Stripe Payments,我正在尝试使用stripe处理每月订阅: 我使用以下操作创建付款控制器: 创建签出会话操作: /** * @Route ("/create-checkout-session", name="checkout") */ public function checkout(Request $request) { $data = json_decode($request->getContent());

我正在尝试使用stripe处理每月订阅:

我使用以下操作创建付款控制器:

创建签出会话操作:

 /**
     * @Route ("/create-checkout-session", name="checkout")
     */
    public function checkout(Request $request)
    {
        $data = json_decode($request->getContent());
        \Stripe\Stripe::setApiKey('sk_test_...');
        try {
            $checkout_session = \Stripe\Checkout\Session::create([
                'payment_method_types' => ['card'],
                'line_items' => [[
                    'price' => $data->priceId,
                    // For metered billing, do not pass quantity
                    'quantity' => 1,
                ]],
                'mode' => 'subscription',
                'success_url' => $this->generateUrl('success', ["session_id" => "{CHECKOUT_SESSION_ID}"], UrlGeneratorInterface::ABSOLUTE_URL),
                'cancel_url' => $this->generateUrl('error', [], UrlGeneratorInterface::ABSOLUTE_URL),
            ]);
        } catch (\Exception $e) {
            return new JsonResponse(["error" => ['message' => $e->getMessage()]]);

        }
        return new JsonResponse(["sessionId" => $checkout_session['id']]);
    }
成功行动:

  /**
     * @Route(
     *     "/{_locale}/success/{session_id}",
     *      name="success",
     *      defaults={"_locale"="en"},
     *      requirements={"_locale"="en|fr"}
     * )
     * @param Request $request
     * @return Response
     */
    public function success(Request $request): Response
    {

        $locale = $request->getLocale();

        // Get current user
        $user = $this->getUser();

        \Stripe\Stripe::setApiKey('sk_test_...');

        $session = \Stripe\Checkout\Session::retrieve($request->get('session_id'));
        $customer = \Stripe\Customer::retrieve($session->customer);

        return $this->render('payment/success.html.twig', [
            'current_language' => $locale,
            'user' => $user,
            'session' => $session,
            'customer' => $customer,
        ]);
    }
我创建了一个脚本:

// Create an instance of the Stripe object with your publishable API key
const stripe = Stripe('pk_test_..');

const createCheckoutSession = function (priceId) {
    return fetch("/create-checkout-session", {
        method: "POST",
        headers: {
            "Content-Type": "application/json"
        },
        body: JSON.stringify({
            priceId: priceId
        })
    }).then(function (result) {
        return result.json();
    });
};


$(".subscription-btn").click(function (e) {
    e.preventDefault();
    let PRICE_ID = $(this).data('priceCode');
    console.log(PRICE_ID);
    createCheckoutSession(PRICE_ID).then(function (data) {
        // Call Stripe.js method to redirect to the new Checkout page
        stripe
            .redirectToCheckout({
                sessionId: data.sessionId
            })
            .then(function (result) {
                // If `redirectToCheckout` fails due to a browser or network
                // error, you should display the localized error message to your
                // customer using `error.message`.
                if (result.error) {
                    alert(result.error.message);
                }
            })
    });
});
付款工作,但我得到了这个eror后重定向到成功

无效的checkout.session id:{checkout\u session\u id}


如何修复此错误以及如何处理项目内的每月付款?

您可以将准确的值作为成功url传递给您的PSP

'success\u url'=>$this->generateUrl('success',[“session\u id”=>“{CHECKOUT\u session\u id}],urlgenerator interface::ABSOLUTE\u url),
然后您将返回重定向url,作为文本:
/en/success/{CHECKOUT\u SESSION\u ID}

接下来从一些api中查找确切的值
{CHECKOUT\u SESSION\u ID}

$session=\Stripe\Checkout\session::retrieve($request->get('session_id'));
我不确定,但我认为您需要从success\uURL的主体而不是
$request
对象获取会话id

我还认为您可以跳过成功url中的会话id,因为这是用户的回调url。当用户被重定向回您的应用程序时,用户仍在登录,您不想将会话id发送到PSP

我认为你的反馈在帖子正文中,基于你在stripe上的配置。做这样的事情应该会给你想要的

首先,从成功url中删除会话id

'success\u url'=>$this->generateUrl('success',UrlGeneratorInterface::ABSOLUTE\u url),
接下来,更改成功url逻辑以使用帖子正文

/**
     * @Route(
     *     "/{_locale}/success",
     *      name="success",
     *      defaults={"_locale"="en"},
     *      requirements={"_locale"="en|fr"}
     * )
     * @param Request $request
     * @return Response
     */
    public function success(Request $request): Response
    {
        ...
        $body = $request->getContent();
        $feedback = json_decode($body, true);

        $session = \Stripe\Checkout\Session::retrieve($feedback['id']);
        ...
    }

另外,请记住我还没有阅读关于Stripe的文档。但是我坚信他们会以某种形式将他们的会话id(您创建的)发送给您。

Leroy是正确的,但我建议您确认您生成的
成功url
实际上看起来像它应该的样子-也就是说,没有对这些{}的url进行编码-这可能就是这里发生的事情


除此之外,我相信你的方法是正确的,Leroy的方法不是-我认为你没有提供带有未编码URL的Stripe,因此它没有将
{CHECKOUT\u SESSION\u ID}
识别为模板字符串。谢谢你的回答,我在转换到symfony routethank的链接时遇到了问题,请回答,我使用generateUrl生成带有param的路由,但它不起作用,我使用了一个简单的链接:“success_url”=>“{CHECKOUT_SESSION_ID}”,