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

Saving paypal capture and custom order to database

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

支付模型存储 paypal 捕获


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({});
});

在您的 orders create request bodypurchase_units[0] 中,您可以包含一个唯一的** invoice_id(对付款人可见,用于搜索的索引),或任意的 custom_id(仅对接收者可见,未编入索引)。

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


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