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

时间:2017-04-17 02:00:00

标签: php paypal paypal-sandbox

简介

我一直在考虑将我的一个大项目与PayPal Express Checkout集成,并将其作为主要系统来处理我网站上的付款。虽然他们的文档非常广泛,但我真的找不到太好的起点。在过去的几天里,我在头痛时遇到了头痛,试图找出地球上如何将我的网站及其数据库与PayPal Express Checkout集成。

摘要

JavaScript位非常简单,使用the client-side integration收费非常容易。但是我还需要一种方法来在付款过程中(成功)更新我的数据库中的字段,并且从目前为止我所理解的情况来看,这只能通过使用the advanced server integration来完成。

问题

出于上述原因,问题是以某种方式管理在我的平台中实现高级服务器集成解决方案,以便在事务成功时让数据库中的更改发生。

如前所述,PayPal文档相当广泛 - 问题是,我从来没有真正使用REST API,并且看起来好像集成我之后只能使用PayPal完成REST API,用于验证付款是否已经发生。

问题

尽管如此,我需要帮助的是在所有这些中找到一些地方开始。我知道StackOverflow可能不是这样一个问题的最佳位置,但似乎很多人都遇到了这个问题的困难,而且它是设置网络上任何业务的重要部分工作。

任何关于从哪里开始的指示,或与PayPal文档以外的主题相关的任何指示都将非常有用。

1 个答案:

答案 0 :(得分:0)

以下是使用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. 您在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.
                }
            );
        },
        // ...
    }
    
  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. 现在,您的客户会弹出快速结帐付款对话框,客户必须登录并确认付款,创建帐户或使用信用卡/借记卡结帐。

  7. 客户通过单击“快速结账”对话框中的“立即付款”按钮确认付款后,您在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.
                }
            );
        });
    }
    
  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或您服务器的付款信息。

  10. 至于一个开始的地方,这就是我的建议:

    1. 自动在您的服务器上请求和存储您的访问令牌。您需要存储它,因为PayPal速率限制令牌请求。因此,要么自动保持新鲜,要么在需要时请求新的。我相信他们会在八九个小时后到期;在任何情况下,使用令牌给你的到期时间。 https://developer.paypal.com/docs/api/overview/

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

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

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

    5. 如果您认为自己已经开始了,那么您需要注意的文档是https://developer.paypal.com/docs/api/> API参考>付款API>付款。共有五个部分:创建,执行,显示,更新和列表。读它们。它会有所帮助。