将贝宝捕获和自定义订单保存到数据库

时间:2021-04-17 14:35:03

标签: node.js mongoose paypal

我正在尝试使用付款属性 Payment._id 保存订单,但无法在创建路由中获取捕获 ID。有没有办法通过paypal传递一些id然后在捕获中获取该ID?将订单和付款保存在捕获路径中是否是个好主意?

支付模型存储贝宝捕获


router.post("/order/create", async (req, res) => {
  const { items, payment_method, price } = req.body;

  try {
    //Document just for validation that doesn't save
    const newOrder = new Order({
      items,
      payment_method,
      price,
    });

    const validationError = await newOrder.validate();
    if (validationError !== undefined) throw Error("Validation Failed");

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

    const body = {
      intent: "CAPTURE",
      purchase_units: [
        {
          items: paypalItems(newOrder.items),
          amount: {
            currency_code: "USD",
            value: newOrder.price,
            breakdown: {
              item_total: {
                currency_code: "USD",
                value: newOrder.price,
              },
            },
          },
        },
      ]
    };

    request.prefer("return=representation");
    request.requestBody(body);

    const order = await client.execute(request);

    res.status(200).json({
      orderID: order.result.id,
    });
  } catch (e) {
    console.error(e);
    res.status(500);
  }
});

router.post("/order/capture", async (req, res) => {
  const { items, payment_method, price } = req.body;

  const orderID = req.body.orderID;

  const request = new paypalSDK.orders.OrdersCaptureRequest(orderID);
  request.requestBody({});

  try {
    const capture = await client.execute(request);
    const captureID = capture.result.purchase_units[0].payments.captures[0].id;

    const newPayment = new Payment(capture.result);
    const savedPayment = await newPayment.save();

    const newOrder = new Order({
      items,
      payment_method,
      price,
      payment: savedPayment._id,
    });
    await newOrder.save();
  } catch (err) {
    console.error(err);
    return res.sendStatus(500);
  }
  res.status(200).json({});
});

1 个答案:

答案 0 :(得分:1)

在您的 orders create request bodypurchase_units[0] 中,您可以包含唯一的 * invoice_id(付款人可见)或任意 custom_id(仅收款人可见) ).

*发票 ID 之前不应该用于成功捕获的付款,否则这将导致默认配置中的重复发票 ID 错误(以防止同一事物意外重复付款)


成功获取订单后,PayPal 交易 ID 将为 purchase_units[0].payments.captures[0].id。将其存储在您的数据库中以备将来参考。