首页 > 解决方案 > 将贝宝捕获和自定义订单保存到数据库

问题描述

我尝试使用支付属性 Payment._id 保存订单,但无法在创建路由中获取捕获 ID。有没有办法通过贝宝传递一些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({});
});

标签: node.jsmongoosepaypal

解决方案


purchase_units[0]您的订单创建请求正文中,您可以包含唯一的** invoice_id(对付款人可见,为搜索编制索引),或任意custom_id(仅对接收人可见,不编制索引)。

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


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


推荐阅读