为什么我没有在客户端得到包含捕获详细信息的响应?
我正在尝试为PayPal的智能按钮实现服务器端集成。我尝试了几种不同的方法,这是我最成功的方法。
但是,它似乎仍然无法100%工作。 Atm,单击按钮会打开付款窗口,我可以使用沙盒个人帐户登录,通过结帐流程,然后得到标准警报,但是由于某种原因,我没有从服务器得到期望的响应。 >
当我在个人帐户上登录沙盒贝宝时,我可以看到交易已成功发送(正在等待交易,正在等待商人的确认)。当我登录沙盒商户帐户时,没有可用的交易。当我从智能按钮获取订单ID并将其发送到PayPal的api路线以获取订单详细信息时,它会在捕获并完成后返回。
有没有其他人遇到过类似的情况,但付款没有显示在商家沙箱帐户上?如果我登录到开发者帐户,然后查看API日志,则可以看到成功创建和捕获的订单,但它们仍未显示在商家帐户中。
const express = require("express");
const router = express.Router();
// 1. Set up your server to make calls to PayPal
// 1a. Import the SDK package
const paypal = require("@paypal/checkout-server-sdk");
// 1b. Import the PayPal SDK client that was created in `Set up Server-Side SDK`.
/**
*
* PayPal HTTP client dependency
*/
const payPalClient = require("./PayPalConfig");
// route to set up a transaction
router.post("/orders/create", async (req, res) => {
// 3. Call PayPal to set up a transaction
const request = new paypal.orders.OrdersCreateRequest();
request.prefer("return=representation");
request.requestBody({
intent: "CAPTURE",
purchase_units: [
{
amount: {
currency_code: "USD",
value: "4.20",
},
},
],
});
let order;
try {
order = await payPalClient.client().execute(request);
} catch (err) {
// 4. Handle any errors from the call
console.error(err);
return res.sendStatus(500);
}
// 5. Return a successful response to the client with the order ID
res.json({
orderID: order.result.id,
});
console.log(order.result.id);
});
// route to handle capturing of orders
router.post("/orders/capture", async (req, res) => {
// const captureDetails
let captureDetails = "";
// 2a. Get the order ID from the request body
const orderID = req.body.orderID;
// 3. Call PayPal to capture the order
const request = new paypal.orders.OrdersCaptureRequest(orderID);
request.requestBody({});
try {
const capture = await payPalClient.client().execute(request);
// 4. Save the capture ID to your database. Implement logic to save capture to your database for future reference.
const captureID = capture.result.purchase_units[0].payments.captures[0].id;
captureDetails = capture.result;
// await database.saveCaptureID(captureID);
res.json(captureDetails);
} catch (err) {
// 5. Handle any errors from the call
console.error(err);
return res.sendStatus(500);
}
// 6. Return a successful response to the client
// res.sendStatus(200).json({ details: captureDetails });
res.json({ details: captureDetails });
});
module.exports = router;
// Render the PayPal button into #paypal-button-container
paypal
.Buttons({
// Call your server to set up the transaction
createOrder: function (data, actions) {
return fetch("http://localhost:3000/payment/paypal/orders/create", {
method: "post",
})
.then(function (res) {
return res.json();
})
.then(function (orderData) {
return orderData.orderID;
console.log(orderData.orderID);
});
},
// Call your server to finalize the transaction
onApprove: function (data) {
return fetch("http://localhost:3000/payment/paypal/orders/capture", {
method: "post",
headers: {
"content-type": "application/json",
},
body: JSON.stringify({
orderID: data.orderID,
}),
})
.then(function (res) {
return res;
})
.then(function (details) {
console.log(details);
alert("Transaction funds captured from " + details.payer_given_name);
});
},
})
.render("#paypal-button-container");
Response {type: "cors", url: "http://localhost:3000/payment/paypal/orders/capture", redirected: false, status: 200, ok: true, …}
body: (...)
bodyUsed: false
headers: Headers {}
ok: true
redirected: false
status: 200
statusText: "OK"
type: "cors"
url: "http://localhost:3000/payment/paypal/orders/capture"
__proto__: Response
答案 0 :(得分:0)
在服务器端,请勿将“详细信息”指定为键。
res.json(captureDetails);
您需要在客户端返回res.json()。它没有解析json对象。
当我登录沙盒商户帐户时,没有 可用交易。当我从智能手机中获取订单ID时 按钮,并将其发送到PayPal的api路线以获取订单详细信息, 返回并捕获并完成。
您登录的是错误的沙盒商家帐户。正确的选择取决于您使用的沙盒clientId。