如何仅在交易完成后重定向?

Posted

技术标签:

【中文标题】如何仅在交易完成后重定向?【英文标题】:How can I redirect only after transaction is finalized? 【发布时间】:2020-01-01 05:07:10 【问题描述】:

在我使用 paypal 结帐的示例代码中,有一个重定向请求到路由 purchase/complete。我想确保仅在对/paypal/purchase/complete 的发布请求完成后才请求此路由,以便我可以获取在服务器端创建的orderID 并将其作为get 参数传递给purchase/complete 路由这样它就类似于purchase/complete?orderId=XXXX。这里的 XXXX 将是收到的data.orderID

客户端:

    // Render the PayPal button into #paypal-button-container
    paypal.Buttons(

      // Set up the transaction
      createOrder: function(data, actions) 
        var payableAmount = $("#finalAmountTotalOrders").attr("amountData");
        return actions.order.create(
          purchase_units: [
            amount: 
              value: payableAmount
            
          ]
        );
      ,

      // Finalize the transaction
      onApprove: function(data, actions) 
        return actions.order.capture().then(function(details) 
          //will redirect user to custom page change values as desired
          window.location.replace("/purchase/complete");
          // Call your server to save the transaction
          return fetch('/paypal/purchase/complete', 
            method: 'post',
            headers: 
              'content-type': 'application/json',
              'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            ,
            body: JSON.stringify(
              orderID: data.orderID,
              details: details

            )

          );

        );
      


    ).render('#paypal-button-container');

编辑:

我想这样做的原因是,虽然我能够创建一个订单并将其存储在我的数据库中,一旦发出/paypal/purchase/complete 发布请求,我不确定我什么时候会做类似电子邮件的事情具有我刚刚创建的订单 ID(数据库行)的客户和商家。尝试在 post 请求中执行此操作会引发错误,因此如果我可以在 /purchase/complete 路由上获取 ID,我可以查询数据库并获取订单详细信息并通过电子邮件发送。任何其他方法都会对我有用。

【问题讨论】:

【参考方案1】:

我发现你可以在第一个 actions.order.capture().then 块之后链接另一个 .then

onApprove: function(data, actions) 
    return actions.order.capture().then(function(details) 
        //will redirect user to custom page change values as desired
        // Call your server to save the transaction
        return fetch('/paypal/purchase/complete', 
        method: 'post',
        headers: 
            'content-type': 'application/json',
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        ,
        body: JSON.stringify(
            orderID: data.orderID,
            details:details

        )

        ).then((response) => 
          window.location.replace("/purchase/complete?paypalOrderId="+data.orderID);
        );

    );
  

【讨论】:

以上是关于如何仅在交易完成后重定向?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 toastr 通知后重定向

React Router - 身份验证后重定向延迟

在 Paypal 中完成购买后重定向到原始站点

用户完成 PayPal 购买后重定向到 Struts 2 动作类

在 React 中提交后重定向

CakePHP 登录后重定向到当前页面