PayPal + Node.js - 如果我与另一个用户登录并清除了浏览器缓存,则获取“已捕获订单”

Posted

技术标签:

【中文标题】PayPal + Node.js - 如果我与另一个用户登录并清除了浏览器缓存,则获取“已捕获订单”【英文标题】:PayPal + Node.js - Getting "Order Already Captured" if though I logged with another User and cleared browser Cache 【发布时间】:2021-09-28 09:20:02 【问题描述】:

我正在开发一个带有 Nuxt + Node + Express 的网站,并且我正在尝试实施 PayPal。 我正在使用PayPal Node SDK,并按照他们的 Github 页面中的描述创建了文件。 我正在我的电脑上开发(所以,localhost..)并使用 PayPal Sandbox。

问题是:它第一次完美运行。我点击前端的“购买”按钮,我被重定向到 PayPal 支付页面,我使用沙盒帐户付款,然后我再次使用 URL 中的 TOKEN 重定向到我的网站。调用后端 API 的输出是“完成”。 但是,如果我使用其他用户登录,清除浏览器缓存甚至更改浏览器,然后再次尝试购买,它会显示:“订单已被捕获”。几个小时后,我可以再次购买。唯一有效的是重新启动服务器。我用cookies-parser检查了服务器中是否有一些cookie,但没有。

打电话给任何人帮助我了解为什么会发生这种情况?

这是我使用的文件/代码:

创建了paypal_controller.js

const paypal = require("@paypal/checkout-server-sdk");
let clientId = "<<MY CLIENT ID>>";
let clientSecret = "<<MY CLIENT SECRET>>";
let environment = new paypal.core.SandboxEnvironment(clientId, clientSecret);
let client = new paypal.core.PayPalHttpClient(environment);
let request = new paypal.orders.OrdersCreateRequest();

request.requestBody(
  intent: "CAPTURE",
  purchase_units: [
    
      description: "Subscription",
      amount: 
        currency_code: "USD",
        value: "200.00",
      ,
    ,
  ],
  application_context: 
    return_url: "http://localhost:3000/user/dashboard",
    cancel_url: "http://localhost:3000",
  ,
);  

const createOrder = async (req, res) => 
  console.log("creating order");
  await client
    .execute(request)
    .then((data) => 
      res.json(data);
    )
    .catch((err) => 
      console.log(err);
      res.json(err);
    );
;

api.js中创建了路由:

const express = require("express");

const 
  createOrder,
  captureOrder,
  getOrderDetail,
 = require("../controllers/paypal_controller");

const router = express.Router();
router.get("/payment/createorder", createOrder)

module.exports = router;

我在前端调用:

await this.$axios.$get('http://localhost:9000/api/payment/createorder')
  .then((det) => 
    window.location.href = det['result']['links'][1]['href']
)

【问题讨论】:

【参考方案1】:

在服务器启动时,以下内容被初始化,因此每个用户的顺序相同:

let request = new paypal.orders.OrdersCreateRequest();

request.requestBody(
  intent: "CAPTURE",
  purchase_units: [
    
      description: "Subscription",
      amount: 
        currency_code: "USD",
        value: "200.00",
      ,
    ,
  ],
  application_context: 
    return_url: "http://localhost:3000/user/dashboard",
    cancel_url: "http://localhost:3000",
  ,
);  

您想将该代码放置在路线中,而不是外部

const createOrder = async (req, res) => 
  console.log("creating order");
  
  // place aforementioned code here, after validation!

  await client
    .execute(request)
    .then((data) => 

【讨论】:

以上是关于PayPal + Node.js - 如果我与另一个用户登录并清除了浏览器缓存,则获取“已捕获订单”的主要内容,如果未能解决你的问题,请参考以下文章

Paypal 与 reactjs -node.js 集成 - 实施指南

node.js / axios AUTHENTICATION_FAILURE 与 PayPal 订阅 API

node.js 贝宝 https 请求

使用 node.js 进行 Paypal IPN 验证 - 快速应用

如何从 Paypal IPN 传输到 Node.JS?

如何在 node.js 中的 paypal 中创建可变的定期付款