javascript - Paypal 中的 RESOURCE_NOT_FOUND
问题描述
我必须在我的 ReactJs 项目中设置 paypal 以进行付款。为此,我创建了贝宝按钮并致电贝宝以获取交易详细信息。看起来效果很好,我也收到了带有交易详细信息的成功消息。这里出现的问题是当我尝试验证交易详细信息在我的服务器端,即 nodejs 中是否符合预期(如此处所述:“ https://developer .paypal.com/docs/checkout/reference/server-integration/capture-transaction/ “)我得到了这个错误。在我的 nodjs 项目中,我使用“ @paypal/checkout-server-sdk ”。
我的代码是:
在 ReactJs 中:PaypalButton.js
import React, { useState, useEffect } from "react";
import ReactDOM from "react-dom";
const PaypalButton = props => {
const [sdkReady, setSdkReady] = useState(false);
const addPaypalSdk = () => {
const clientID ="**********CLIENT_ID**************";
const script = document.createElement("script");
script.type = "text/javascript";
script.src = `https://www.paypal.com/sdk/js?client-id=${clientID}`;
script.async = true;
script.onload = () => {
setSdkReady(true);
};
script.onerror = () => {
throw new Error("Paypal SDK could not be loaded.");
};
document.body.appendChild(script);
};
useEffect(() => {
if (window !== undefined && window.paypal === undefined) {
addPaypalSdk();
} else if (
window !== undefined &&
window.paypal !== undefined &&
props.onButtonReady
) {
props.onButtonReady();
}
}, []);
//amount goes in the value field we will use props of the button for this
const createOrder = (data, actions) => {
console.log("createOrder", data);
return actions.order.create({
purchase_units: [
{
amount: {
currency_code: "USD",
value: props.amount
}
}
]
});
};
const onApprove = (data, actions) => {
return actions.order
.capture()
.then(details => {
if (props.onSuccess) {
window.alert("Payment Sucessfull...");
return props.onSuccess(data, details);
}
})
.catch(err => {
console.log(err);
});
};
const clickPaypal = flag => {
return props.onClick(flag);
};
if (!sdkReady && window.paypal === undefined) {
return <div>Loading...</div>;
}
const Button = window.paypal.Buttons.driver("react", {
React,
ReactDOM
});
return (
<div style={{ width: 200 }}>
<Button
{...props}
createOrder={
props.amount && !createOrder
? (data, actions) => createOrder(data, actions)
: (data, actions) => createOrder(data, actions)
}
onApprove={
props.onSuccess
? (data, actions) => onApprove(data, actions)
: (data, actions) => onApprove(data, actions)
}
style={{
layout: "horizontal",
color: "gold",
shape: "pill",
label: "pay",
size: "responsive",
tagline: true
}}
onClick={props.onClick ? clickPaypal : clickPaypal}
/>
</div>
);
};
export default PaypalButton;
Pay.js
onSuccess = (payment, details) => {
const {
processInvoicePaypalPayment
} = this.props;
this.paypalSucesssDetails = { ...details };
processInvoicePaypalPayment( . //call to server
{
invoice: invoice.data._id,
orderId: this.paypalSucesssDetails.id // This order id is from sucess transaction details
},
this.paypalCapture
);
};
render=()=>{
<PaypalButton
amount={invoiceData.amount}
onSuccess={this.onSuccess}
env={"sandbox"}
onClick={this.clickPaypal}
/>
}
在我的nodejs中
import paypal from "@paypal/checkout-server-sdk";
const clientId = "CLIENTID";
const clientSecret = "SECRET";
const environment = new paypal.core.SandboxEnvironment(clientId, clientSecret);
const client = new paypal.core.PayPalHttpClient(environment);
try{
export const processInvoicePaypalPayment = async (user, data) => {
const customerId = user.customer,
{ invoice: invoiceId, orderId: orderID } = data;
let request = new paypal.orders.OrdersGetRequest(orderID);
const createOrder = async () => {
const response = await client.execute(request);
return { ok: true, data: { _id: invoiceId, payment: response.result } };
};
const result = await createOrder();
}
}catch (err) {
console.log(err);
}
结果是:
{ Error: {"name":"RESOURCE_NOT_FOUND","details":
[{"location":"path","issue":"INVALID_RESOURCE_ID","description":"Specified resource ID does not exist. Please check the resource ID and try again."}],"message":"The specified resource does not exist.","debug_id":"c3b5026d6dd74","links":[{"href":"https://developer.paypal.com/docs/api/orders/v2/#error-INVALID_RESOURCE_ID","rel":"information_link","method":"GET"}]}
我该如何解决这个问题?任何帮助和建议将不胜感激。
解决方案
似乎正在发生的事情是您有一个用于处理事务的客户端集成,然后您尝试使用服务器端 API 调用来检查订单状态,但该服务器端 API 调用与您使用的订单处理。
你有两个选择:
切换到对支付 ID而非订单 ID的服务器端 API 调用。这记录在这里:https ://developer.paypal.com/docs/api/payments/v2/#captures_get 。无论如何,支付 ID 比订单 ID 更有用,因为支付/交易 ID 是在 www.paypal.com 中实际保留多年并用于会计目的的内容。订单 ID 仅在付款批准期间使用。
切换到服务器端集成模式,例如:https ://developer.paypal.com/demo/checkout/#/pattern/server 。然后,您将执行自己的 API 调用来设置和捕获付款,并且您现有的 OrdersGetRequest(..) 可以工作
推荐阅读
- html - 如何在框内插入页脚
- python-3.x - Pandas 使用不同窗口大小的偏移量反向滚动总和
- codeigniter-4 - 为什么 Codeigniter4 查询生成器不适用于控制器中的模型?
- amazon-web-services - 使用对等 VPC 安全组进行启动配置
- java - 如何将数据从 java 服务类发送到 kotlin 活动类?
- tensorflow - Tensorflow:如何更改 .pb 文件中的权重?
- php - 如何使用 str_replace 摆脱链接属性 id
- r - 如何在 R 中优化以下程序以提高性能?(涉及计算密集型置换测试的蒙特卡罗模拟)
- node.js - 如何执行 30k 连续 API 调用(节点)[错误:连接 ECONNRESET]
- python-3.x - 如何使不同模型的字段在 django 中独一无二