【问题标题】:How to pass codeigniter's CSRF token to Paypal Express Checkout?如何将 codeigniter 的 CSRF 令牌传递给 Paypal Express Checkout?
【发布时间】:2017-12-19 23:12:07
【问题描述】:

我正在将 Paypal Express Checkout 与服务器端 REST 集成到我的 codeigniter 网站中。 根据 Paypal 文档,我在结帐页面中添加了以下内容:

<script src="https://www.paypalobjects.com/api/checkout.js"></script>
<script>
    var CREATE_PAYMENT_URL  = 'https://#######/paypal/create';
    var EXECUTE_PAYMENT_URL = 'https://######/paypal/execute';

    paypal.Button.render({

        env: 'production', // Or 'sandbox'

        commit: true, // Show a 'Pay Now' button

        payment: function() {
            return paypal.request.post(CREATE_PAYMENT_URL).then(function(data) {
                return data.id;
            });
        },

        onAuthorize: function(data) {
            return paypal.request.post(EXECUTE_PAYMENT_URL, {
                paymentID: data.paymentID,
                payerID:   data.payerID
            }).then(function() {

                // The payment is complete!
                // You can now show a confirmation message to the customer
            });
        }

    }, '#paypal-button');
</script>

一切正常,但是,当我打开 codeigniter CSRF 保护时,checkout.js 使用 CREATE_PAYMENT_URL 对我的服务器进行的调用被拒绝,因为缺少 CSRF 令牌。我对 JavaScript 知之甚少,我需要一些帮助才能将令牌传递给 checkout.js,Paypal 的文档没有帮助。

我尝试过的:

在 codeigniter 配置上关闭 CSRF 有效! Paypal express checkout 完美运行,但这不是一个选项,CSRF 安全必须开启。 从 codeignter config 中的 CSRF 检查中排除 URI 再次完美运行,但我不满意。必须有一种方法可以使用 CSRF 令牌保护对服务器的调用。 我希望我的问题很清楚,您可以提出一些解决方案。谢谢!

【问题讨论】:

标签: javascript php codeigniter paypal csrf-protection


【解决方案1】:
return paypal.request({
    method: 'post',
    url: CREATE_PAYMENT_URL,
    headers: {
        'x-csrf-token': CSRF_TOKEN
    }
}).then(function(data) {
    return data.id;
});

【讨论】:

    【解决方案2】:

    您应该能够通过将X-CSRF-TOKEN 参数添加到ajax 请求的http 标头来解决此问题。假设您正在使用 jquery,以下应该可以解决问题:

    $(document).ready(function(){
    
    
        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': '{{PUT_YOU_CSRF_VARIABLE_HERE}}'
            }
        });
    
        var CREATE_PAYMENT_URL  = 'https://#######/paypal/create';
        var EXECUTE_PAYMENT_URL = 'https://######/paypal/execute';
    
        paypal.Button.render({
    
            env: 'production', // Or 'sandbox'
    
            commit: true, // Show a 'Pay Now' button
    
            payment: function() {
                return paypal.request.post(CREATE_PAYMENT_URL).then(function(data) {
                    return data.id;
                });
            },
    
            onAuthorize: function(data) {
                return paypal.request.post(EXECUTE_PAYMENT_URL, {
                    paymentID: data.paymentID,
                    payerID:   data.payerID
                }).then(function() {
    
                    // The payment is complete!
                    // You can now show a confirmation message to the customer
                });
            }
    
        }, '#paypal-button');
    
    
    });
    

    【讨论】:

    • 建议添加:$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': 'security->get_csrf_hash(); ?>' } } );仍然没有运气。
    猜你喜欢
    • 2023-04-02
    • 2017-02-17
    • 2018-10-23
    • 2014-04-11
    • 2019-06-01
    • 1970-01-01
    • 2015-01-31
    • 2014-04-17
    • 2021-01-04
    相关资源
    最近更新 更多