繁体   English   中英

PayPal Express Checkout,成功付款后更新数据库

[英]PayPal Express Checkout, update database on successful payment

介绍

我一直在考虑将我的一个有点大的项目与PayPal Express Checkout集成在一起,并将其用作在我的网站上处理付款的主要系统。 尽管他们的文档非常丰富,但我确实找不到一个很好的起点。 在过去的几天里,我头疼不已,试图弄清如何将我的网站及其数据库与PayPal Express Checkout集成在一起。

摘要

JavaScript非常简单,使用客户端集成来收费非常容易。 但是,我还需要一种在付款成功(成功)后更新数据库中字段的方法,并且据到目前为止所了解的,这只能通过使用高级服务器集成来完成。

问题

鉴于上述原因,该问题正在设法以某种方式设法将高级服务器集成解决方案实施到我的平台中,以便为在事务成功时发生数据库中的更改留出空间。

如前所述,贝宝(PayPal)文档相当广泛-问题是,我从未真正使用过REST API,而且似乎集成了我以后只能使用贝宝(PayPal)REST API完成的工作,验证付款是否已经完成。

综上所述,我需要帮助的地方是在所有这些地方找到一些起点。 我知道StackOverflow可能不是这样的问题的最佳选择,但是似乎很多人都无法解决这个确切的问题,这是在网络上设置任何业务以使其成功的重要组成部分工作。

除了贝宝(PayPal)文档以外,任何有关从何处开始的指针或与该主题相关的任何内容都将非常有帮助。

接下来是将Express Checkout与服务器端Payments REST API集成结合使用的最小方法,包括JavaScript中客户端和服务器的相关代码。 希望对您有所帮助。

您需要登录到developer.paypal.com并创建REST API应用。 您的新应用将被分配一个客户端ID和密码,可用于请求访问令牌,从而授权您使用PayPal REST API。 您需要在此处进行的唯一应用设置是“接受付款”。 创建应用时,会自动创建用于测试的沙盒帐户。

  1. 您的(签出)页面会加载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'); 
  2. 您的客户单击呈现的PayPal结帐按钮。

  3. 您在给paypal.Button.render()的参数中定义的payment功能由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. } ); }, // ... } 
  4. 您的服务器使用您的访问令牌向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 }] } } 
  5. 然后,您提供的payment功能会从您的服务器接收付款ID,并将其用作返回值。

     // See return value in step 3. 
  6. 现在,将为您的客户弹出Express Checkout付款对话框,该客户必须登录并确认付款,创建帐户或使用信用卡/借记卡付款。

  7. 客户通过单击“快速结帐”对话框中的“立即付款”按钮确认付款后,在paypal.Button.render()参数中定义的onAuthorize函数将由PayPal的脚本调用。 您可以使用此函数的actions参数从PayPal get()付款信息,您可以在确认页面中使用该data ,等等。使用其data参数获取付款ID和付款人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. } ); }); } 
  8. 您的服务器从客户端收到付款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 } } 
  9. 客户对您服务器的最新请求已成功完成,您将显示一个确认页面,还可以选择包含步骤7或服务器中的付款信息。

至于起点,我建议:

  1. 自动请求访问令牌并将其存储在服务器上。 您需要存储它,因为PayPal会限制令牌请求的速度。 因此,可以自动将其更新或在需要时请求一个新的。 我相信它们会在八或九小时内到期; 在任何情况下,过期时间都会与令牌一起提供给您。 https://developer.paypal.com/docs/api/overview/

  2. 构建/your-api/create-payment服务器端点。 使用访问令牌,通过Postman等API工具的请求进行测试。 当一切顺利时,您的服务器将成功致电PayPal以创建付款,您可以浏览响应中的数据。 您不打算执行付款没关系...毕竟是沙盒。 然后建立服务器端的持久性(如果需要),并将付款ID返回给客户端。

  3. 接下来,在您的站点上加载PayPal脚本和您的checkout-按钮呈现脚本,并查看单击Checkout按钮时是否显示Express Checkout登录。 如果在创建付款过程中发生错误,您将看到错误,而不是Express Checkout登录。

  4. 当系统创建付款时,您可以使用沙盒凭据登录“快速结帐”对话框,构建/your-api/execute-payment端点。 当您的服务器具有有效的执行付款端点时,您应该能够使用Express Checkout登录并使用您的沙盒买家帐户完成付款。

如果您认为一切都会顺利进行,那么您要关注的文档是https://developer.paypal.com/docs/api/ > API参考> Payments API> Payments。 共有五个部分:创建,执行,显示,更新和列出。 阅读它们。 我会帮你的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM