点击“继续查看订单”时,PayPal 会立即重定向到我的网站

问题描述 投票:0回答:1

我正在我的网站上实施 PayPal,一切正常,我收到了所有 webhooks,它将向用户添加令牌

CHECKOUT.ORDER.APPROVED

但是,我的问题是,用户不会等待付款实际完成(最终会完成),而是立即重定向到我的网站

我不知道我是否错过了 PayPal webhook 端的状态调用?

我所说的页面仅供参考

这是我的控制器代码

exports.createPayment = async (req, res) => {
  const { userId, amountCNY, selectedTokens } = req.body;

  // Convert amount from RMB to USD based on the current exchange rate
  const amountInUsd = convertRmbToUsd(amountCNY);

  // Concatenate userId and selectedTokens to use as custom_id
  const customId = `${userId}:${selectedTokens}`;

  const request = new paypal.orders.OrdersCreateRequest();
  request.prefer('return=representation');
  request.requestBody({
    intent: 'CAPTURE',
    purchase_units: [
      {
        amount: {
          currency_code: 'USD',
          value: amountInUsd.toFixed(2).toString(),
        },
        custom_id: customId,
      },
    ],
    application_context: {
      return_url: 'example.com',
      cancel_url: 'example.com',
    },
  });

  try {
    const response = await client().execute(request);
    if (response.statusCode === 201) {
      const approvalUrl = response.result.links.find((link) => link.rel === 'approve').href;
      res.json({ id: response.result.id, approvalUrl: approvalUrl });
    }
  } catch (error) {
    res.status(500).send('Error creating PayPal payment');
  }
};

exports.executePayment = async (req, res) => {
  const { orderId } = req.body;

  const request = new paypal.orders.OrdersCaptureRequest(orderId);
  request.requestBody({});

  try {
    const capture = await client().execute(request);
    res.status(200).json(capture.result);
  } catch (error) {
    res.status(500).send('Error capturing PayPal payment');
  }
};

exports.handleWebhook = async (req, res) => {
  const event = req.body;

  if (event.event_type === 'CHECKOUT.ORDER.APPROVED') {
    const orderId = event.resource.id;

    try {
      const request = new paypal.orders.OrdersCaptureRequest(orderId);
      request.requestBody({});
      const capture = await client().execute(request);

      const purchaseUnit = capture.result.purchase_units[0];
      const customId = purchaseUnit.custom_id;
      const [userId, selectedTokens] = customId.split(':');

      const newBalance = await addTokensByUserId(userId, parseInt(selectedTokens, 10));
      res.status(200).send('Success! Tokens added.');
    } catch (error) {
      res.status(500).send({ error: `Error processing payment: ${error.message}` });
    }
  } else if (event.event_type === 'PAYMENT.CAPTURE.COMPLETED') {
    res.status(200).send('Payment capture completed.');
  } else {
    res.status(200).send('Event received, but not handled.');
  }
};

node.js paypal
1个回答
0
投票

已批准是指付款人在 PayPal 登录并批准结账。这并不意味着任何付款被捕获;该阶段订单尚未完成。

Webhooks 不需要处理正常的 v2/结帐/订单付款。如果您实施它们,请稍后再实施;您的 Orders v2 集成应该首先在没有它们的情况下工作。

付款人可以通过两种方式批准 PayPal 订单,将其从您的网站重定向到 PayPal 并返回,或者使用 JS SDK。出于多种原因,JS SDK 提供了更好的付款人体验,您应该对此进行更改,请参阅 https://developer.paypal.com/docs/checkout/standard/integrate/ 了解与订单后端配对的 JS 示例。

如果使用旧的从站点重定向模式,您圈出的按钮将(默认情况下)显示“继续查看订单”,并且您应该向用户显示您自己的确认页面。当他们通过点击您最后一页上的某些操作确认订单后,您需要执行最终订单“cature”API 调用来提交交易。根据该捕获 API 调用的响应,您应该向付款人显示成功或失败的明确消息。

使用 JS SDK,该按钮将(默认情况下)显示“立即付款”。使用该默认设置,不需要审核步骤,您可以通过 API 调用立即继续捕获订单。根据您的响应预计会向付款人显示成功或失败的消息。

可以使用 API 参数 user_action 覆盖 PayPal 最后操作的默认措辞。这仅改变了措辞,并没有改变 PayPal 所做的任何事情。如果您要更改任何批准方法的默认设置,则您的集成在批准后执行的行为必须进行相应更改。

如果由于某种原因您不熟悉 JS SDK 提供的更好的无重定向体验,请参阅前端代码演示:https://developer.paypal.com/demo/checkout/#/pattern/server

© www.soinside.com 2019 - 2024. All rights reserved.