我一直在考虑将我的一个大项目与PayPal Express Checkout集成,并将其作为主要系统来处理我网站上的付款。虽然他们的文档非常广泛,但我真的找不到太好的起点。在过去的几天里,我在头痛时遇到了头痛,试图找出地球上如何将我的网站及其数据库与PayPal Express Checkout集成。
JavaScript位非常简单,使用the client-side integration收费非常容易。但是我还需要一种方法来在付款过程中(成功)更新我的数据库中的字段,并且从目前为止我所理解的情况来看,这只能通过使用the advanced server integration来完成。
出于上述原因,问题是以某种方式管理在我的平台中实现高级服务器集成解决方案,以便在事务成功时让数据库中的更改发生。
如前所述,PayPal文档相当广泛 - 问题是,我从来没有真正使用REST API,并且看起来好像集成我之后只能使用PayPal完成REST API,用于验证付款是否已经发生。
尽管如此,我需要帮助的是在所有这些中找到一些地方开始。我知道StackOverflow可能不是这样一个问题的最佳位置,但似乎很多人都遇到了这个问题的困难,而且它是设置网络上任何业务的重要部分工作。
任何关于从哪里开始的指示,或与PayPal文档以外的主题相关的任何指示都将非常有用。
答案 0 :(得分:0)
以下是使用Express Checkout与服务器端Payments REST API集成的最小方法,包括JavaScript中客户端和服务器的关联代码。我希望它有所帮助。
您需要登录developer.paypal.com并创建REST API应用。您的新应用程序将被分配一个客户端ID和密钥,您可以使用它来请求访问令牌,授权您使用PayPal REST API。您在此处所需的唯一应用设置是“接受付款”。创建应用程序时会自动创建用于测试的沙箱帐户。
您的(结帐)页面加载了PayPal的Express Checkout脚本,您编写的脚本会显示PayPal按钮:
// In your script:
paypal.Button.render({
env: 'sandbox', // Or 'production'.
commit: true, // Show 'Pay Now' button.
style: { // Style the button.
size: 'responsive',
color: 'silver',
shape: 'rect'
},
payment: function(data, actions) {
// See step 3.
},
onAuthorize: function(data, actions) {
// See step 7.
}
}, '#paypal-button');
您的客户点击了呈现的PayPal结帐按钮。
您在payment
的参数中定义的paypal.Button.render()
函数由PayPal的脚本调用,该脚本使用您的有效负载向您的服务器发送请求。您的有效负载包含(例如)购物车内容及其相关数据。
paypal.Button.render({
// ...
payment: function(data, actions) {
return paypal.request(
{
method: 'post',
url: '/your-api/create-payment',
json: {
order: items,
or: whatever
}
}
).then(
function(res) {
// Return the payment id received from your server.
return res.paymentId;
}
).catch(
function(err) {
// Oops, foobared.
}
);
},
// ...
}
您的服务器会使用您的访问令牌向api.sandbox.paypal.com发送请求以创建付款。当您的服务器从PayPal收到新创建的支付数据时,它(可能)会将数据保留在您的服务器上,但必须将支付ID返回给客户端。
// HTTP request data for creating a payment.
{
method: 'post',
// Remove '.sandbox' below to use production endpoint.
url: 'https://api.sandbox.paypal.com/v1/payments/payment';
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + 'your access token here'
},
data: {
// Allows immediate payments with PayPal and credit cards in
// the Express Checkout dialog.
intent: 'sale',
// I suppose these were required by other PayPal REST services,
// but they won't be used because, for Express Checkout, you
// handle the confirmation/cancellation flow yourself, on the
// client.
redirect_urls: {
return_url: 'https://...'
cancel_url: 'https://...'
},
payer: {
payment_method: 'paypal',
},
note_to_payer: 'Thanks, you\'re magnificently awesome!',
transactions: [{
amount: {
total: total, // Your computed total.
currency: 'USD',
details: {
subtotal: subtotal, // Your computed subtotal.
tax: tax, // Your computed tax.
shipping: shipping // Your computed shipping.
// Other parameters are available for your use.
}
},
item_list: {
items: [
{
name: 'shinny shirt of mithril mail',
description: 'shinny',
sku: '12345',
quantity: 1,
price: 1.00,
currency: 'USD'
}
],
// Some properties aren't required, like this one.
shipping_method: 'USPS'
},
description: 'Your PayPal payment for a shinny shirt of mithril mail.',
// Not required and can be added later by patching the
// payment: maybe you don't want to add an invoice to and
// order until the payment is approved.
invoice_number: 12345
}]
}
}
您提供的payment
功能会从您的服务器收到付款ID,并将其用作返回值。
// See return value in step 3.
现在,您的客户会弹出快速结帐付款对话框,客户必须登录并确认付款,创建帐户或使用信用卡/借记卡结帐。
客户通过单击“快速结账”对话框中的“立即付款”按钮确认付款后,您在onAuthorize
的参数中定义的paypal.Button.render()
函数将由PayPal的脚本调用。您可以将此功能的actions
参数用于来自PayPal的get()
付款信息,您可以在确认页面中使用该信息等。使用其data
参数获取付款ID和付款人ID,必须在请求中发送给您的服务器以执行付款。
onAuthorize: function(data, actions) {
return actions.payment.get().then(function(paymentDetails) {
// Get at the payment details like this...
// paymentDetails.payer.payer_info.first_name;
// paymentDetails.payer.payer_info.shipping_address.city;
// paymentDetails.payer.payer_info.shipping_address.state;
var payload = {
paymentId: data.paymentID,
payerId: data.payerID
};
return paypal.request(
{
method: 'post',
url: '/your-api/execute-payment',
json: payload {
paymentId: data.paymentID,
payerId: data.payerID
}
}
).then(
function(res) {
// Gotten paid! Show confirmation page.
}
).catch(
function(err) {
// Dang it.
}
);
});
}
您的服务器从客户端收到付款ID和付款人ID,并向PayPal发出另一个请求,这次是执行付款。如果执行请求成功返回,则事务完成。现在,您可以在服务器上保留(或更新)付款数据。
// HTTP request data for executing a payment.
{
method: 'post',
// Remove '.sandbox' below to use production endpoint.
url: 'https://api.sandbox.paypal.com/v1/payments/payment/' + paymentId + '/execute/',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + 'your access token here'
},
data: {
payer_id: payerId
}
}
客户对服务器的最新请求已成功完成,您可以显示确认页面,可选择显示步骤7或您服务器的付款信息。
至于一个开始的地方,这就是我的建议:
自动在您的服务器上请求和存储您的访问令牌。您需要存储它,因为PayPal速率限制令牌请求。因此,要么自动保持新鲜,要么在需要时请求新的。我相信他们会在八九个小时后到期;在任何情况下,使用令牌给你的到期时间。 https://developer.paypal.com/docs/api/overview/
构建/your-api/create-payment
服务器端点。使用您的访问令牌,使用Postman等API工具的请求对其进行测试。当一切顺利时,您的服务器将成功调用PayPal来创建付款,您可以在响应中浏览数据。你不打算执行付款并不重要......毕竟这是沙箱。然后构建服务器端持久性(如果需要)并将支付ID返回给客户端。
接下来,在您的网站上加载PayPal脚本和结帐按钮呈现脚本,并查看单击结帐按钮时是否显示Express Checkout登录信息。如果在创建付款流程中发生错误,您将看到错误而不是快速结帐登录。
当您的系统创建付款并且您可以使用沙箱凭据登录Express Checkout对话框时,请构建/your-api/execute-payment
端点。当您的服务器具有可用的执行付款终端时,您应该能够使用Express Checkout登录并使用您的沙盒买家帐户来完成付款。
如果您认为自己已经开始了,那么您需要注意的文档是https://developer.paypal.com/docs/api/> API参考>付款API>付款。共有五个部分:创建,执行,显示,更新和列表。读它们。它会有所帮助。