PayPal快速结账安全性与静默Ajax调用

12
新的PayPal结账让我感到不安,用户不能在客户端触发假付款吗?提供的代码看起来是这样的。
paypal.Button.render({  
    env: 'sandbox',
    client: {
        sandbox: 'AapGZeCaaDK_q_KPeG19DHnD_kd18vr6BxNe4P6uuhfTKPjIedtNEI9plyDgmzfyI-xGhbxjpv0k-Ha9',
        production: 'xxxxxxxxx' // u expose the key to client side? is this ok?
    },
    payment: function() {
        var env    = this.props.env;
        var client = this.props.client;

        return paypal.rest.payment.create(env, client, {
            transactions: [{
                amount: { total: ($scope.number_of_uses * 9) + '.00' , currency: 'USD' },
                item_list: {
                    items: [{
                        "name": "example",
                        "quantity": $scope.number_of_uses,
                        "price": "9.00",
                        "currency": "USD"
                    }]
                }
            }],
            redirect_urls: {
                "return_url": $location.absUrl(),
                "cancel_url": $location.absUrl()
            }
        });
    },

    onAuthorize: function(data, actions) {
        return actions.payment.execute().then(function() {
            actions.payment.get().then(function(data){
                // here I will save data detail to db to record sales
                // $http something something 
            });
        });
    }

}, '#paypal-button');
在Stripe中,我需要将一个令牌传递到后端,然后在服务器端验证该令牌,如果一切正常,则进行销售记录。但是在PayPal中似乎只需要实现这一点就可以进行快速结账。这是否安全?

在Stripe中,我需要将一个令牌传递到后端,然后在服务器端验证该令牌,如果一切正常,则进行销售记录。但是在PayPal中似乎只需要实现这一点就可以进行快速结账。这是否安全?


用户点击按钮后,将被重定向到PayPal,并需要提供信用卡详细信息或登录其PayPal帐户。key仅告诉PayPal客户正在向谁付款,而item_list告诉PayPal他们正在支付什么。我在这里看不到任何不安全的地方。所有安全的事情都发生在PayPal这一侧。 - Molda
@Molda 意味着用户无法触发对我的数据库的POST请求?你看到我放置的评论了吗?那是我担心的地方。 - Jessie Emerson
3
很抱歉漏说了这一点。这是基本的整合方法,不需要您这样做。它假定您通过不同的渠道获取交易数据(只需登录您的账户即可)。您可以将交易ID发送到您的服务器,然后通过rest API从PayPal拉取数据。您还可以使用高级整合方法,通过您的服务器创建付款,然后将用户重定向到PayPal确认付款。这确保在PayPal上创建付款之前,订单数据已经存在于您的服务器上。 - Molda
1
这意味着我不能使用上述代码保存我的销售记录吗?我必须发送ID,然后通过PayPal API在后台拉取它吗?原因是像上面的方法不安全,对吧? - Jessie Emerson
2
是的,没错。我相信这种基本集成对于没有后端的静态网站很有用。 - Molda
5
在结账前,有人可以只需更改"price": "9.00"这一行来设置更低的价格吗? - MoralCode
1个回答

7
您说得没错,更新数据库不安全。虽然这是一种安全的支付方法,但您无法使用onAuthorize方法验证客户端是否成功付款,然后更新数据库。
要验证支付是否成功并更新数据库,您必须使用服务器端 REST API。遗憾的是,PayPal 对此文档非常缺乏,但有SDK可以更好地记录和实现(Node SDK 快捷方式)。
我建议您使用它们来更新数据库。PayPal 返回一个参数,告诉您支付是否成功。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接