如何解决PayPal服务器端集成未将付款详细信息传递给客户端
为什么我没有在客户端得到包含捕获详细信息的响应?
我正在尝试为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",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",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
解决方法
在服务器端,请勿将“详细信息”指定为键。
res.json(captureDetails);
您需要在客户端返回res.json()。它没有解析json对象。
当我登录沙盒商户帐户时,没有 可用交易。当我从智能手机中获取订单ID时 按钮,并将其发送到PayPal的api路线以获取订单详细信息, 返回并捕获并完成。
您登录的是错误的沙盒商家帐户。正确的选择取决于您使用的沙盒clientId。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。