繁体   English   中英

PayPal 智能按钮错误:“要传递的预期订单 ID”

[英]PayPal Smart Buttons Error: "Expected order id to be passed"

我有一个问题:自上周五以来,我一直在努力弄清楚它是什么,我找不到任何好的文档,也没有在 inte.net 上找到任何线索,我分享了一些屏幕截图,如果有人可以提供帮助,那就太棒了,通过我的问题是,当单击我集成的 paypal 智能按钮时,我进入控制台“期望传递一个订单 ID”,不幸的是我找不到那个订单 ID 是什么东西

    paypal.Buttons({

        style: {
            shape: 'rect',
            color: 'gold',
            layout: 'vertical',
            label: 'pay',

        },

        // Sets up the transaction when a payment button is clicked
        createOrder: function (data, actions) {
            var cartArray = shoppingCart.listCart();
            // Call your backend to create the Checkout Session
            $.ajax({
                data: {
                    id: cookie
                },
                type: "POST",
                url: "create.php",
                success: function (response) {
                    response = JSON.parse(response)
                    surname = []
                    surname = response.name.split(/(\s+)/).filter(e => e.trim().length > 0)

                    const Cart5 = [];

                    function Cart(description, name, unit_amount, quantity) {
                        this.description = description;
                        this.name = name;
                        this.unit_amount = {
                            value: unit_amount,
                            currency_code: 'EUR'
                        };
                        this.quantity = quantity;
                        this.category = 'PHYSICAL_GOODS';
                    }
                    cartArray.forEach(element => {
                        var item = new Cart(element.id, element.name, element.price, element.count);
                        Cart5.push(item);
                    })
                    JSON.stringify(Cart5);


                    orderid = makeid(12);
                    const paymentData = {
                        //authorization: 'AdhHUVsamn71V-Xs5JZVpzL4v6ElEKiYywV6PwF7rRwCwRQ-AZHMcLELmvQuWlS1pL19iiCbbZUIupTt',
                        intent: "CAPTURE",
                        env: "production",
                        application_context: {
                            brand_name: "Skunker",
                            locale: "fr-FR",
                            landing_page: "BILLING",
                            shipping_preference: "SET_PROVIDED_ADDRESS",
                        },
                        purchase_units: [{
                            reference_id: orderid,
                            custom_id: orderid,
                            description: 'Achat chez Skunker.Store',
                            invoice_id: orderid,
                            payer: {
                                email_address: response.email,
                            },
                            amount: {
                                currency_code: "EUR",
                                value: shoppingCart.totalCart() - (shoppingCart.totalCart() * sessionStorage.getItem('discount') / 100) + 6.15,
                                breakdown: {
                                    item_total: {
                                        currency_code: "EUR",
                                        value: shoppingCart.totalCart()
                                    },
                                    tax_total: {
                                        currency_code: "EUR",
                                        value: 0.20
                                    },
                                    shipping: {
                                        currency_code: "EUR",
                                        value: 5.95
                                    },
                                    handling: {
                                        currency_code: "EUR",
                                        value: 0.00
                                    },
                                    insurance: {
                                        currency_code: "EUR",
                                        value: 0.0
                                    },
                                    shipping_discount: {
                                        currency_code: "EUR",
                                        value: 0.00
                                    }
                                }
                            },
                            items: Cart5,
                            shipping: {
                                method: "La Poste - Colissimo",
                                address: {
                                    name: {
                                        given_name: surname[0],
                                        surname: surname[1],
                                    },
                                    address_line_1: response.address,
                                    admin_area_2: response.city,
                                    postal_code: response.postalCode,
                                    country_code: "FR"
                                },
                                phone_number: {
                                    country_code: '33',
                                    national_number: response.tel,
                                }
                            }
                        }]
                    }

                    return actions.order.create(paymentData);
                }
            })

        },

        // Finalize the transaction after payer approval
        onApprove: function (data, actions) {
            return actions.order.capture().then(function (orderData) {
                // Full available details
                console.log('Capture result', orderData, JSON.stringify(orderData, null, 2));

                // Show a success message within this page, e.g.
                const element = document.getElementById('paypal-button-container');
                element.innerHTML = '';
                element.innerHTML = '<h3>Thank you for your payment!</h3>';
                // Successful capture! For dev/demo purposes:
                $.ajax({
                    data: JSON.stringify(paymentData),
                    type: "POST",
                    url: "https://skunker.store/scripts/paid.php",
                    success: function (response) {}
                })

                // When ready to go live, remove the alert and show a success message within this page. For example:
                // var element = document.getElementById('paypal-button-container');
                // element.innerHTML = '';
                // element.innerHTML = '<h3>Thank you for your payment!</h3>';
                // Or go to another URL:  actions.redirect('thank_you.html');
            });
        },
        onError: function (err) {
            console.log(err);
        },
    }).render('#payBtn');

这是我得到的错误:

Error: Expected an order id to be passed
    at https://www.sandbox.paypal.com/smart/buttons?style.label=pay&style.layout=vertical&style.color=gold&style.shape=rect&style.tagline=false&style.menuPlacement=below&components.0=buttons&locale.country=FR&locale.lang=fr&sdkMeta=eyJ1cmwiOiJodHRwczovL3d3dy5wYXlwYWwuY29tL3Nkay9qcz9jbGllbnQtaWQ9QVhTMWxLcXR2cjkzbDVkYlFPTE9nclJCYlNKMWt0cmNnYkpMZnJjRWEyckhING1ZYzVvWlQ1dmxpWUZDMnRobUFlcDVic1h4RmF1WEJ1cDMmY3VycmVuY3k9RVVSIiwiYXR0cnMiOnsiZGF0YS1zZGstaW50ZWdyYXRpb24tc291cmNlIjoiYnV0dG9uLWZhY3RvcnkiLCJkYXRhLXVpZCI6InVpZF9tdmh4dGh4aHhlYW13bHJzYXVna2dqeGRmcmpqenMifX0&clientID=AXS1lKqtvr93l5dbQOLOgrRBbSJ1ktrcgbJLfrcEa2rHH4mYc5oZT5vliYFC2thmAep5bsXxFauXBup3&sdkCorrelationID=f540177905bdc&storageID=uid_dbb0ba13c9_mtq6mzg6ndi&sessionID=uid_0e8f15ce50_mtq6ntq6nte&buttonSessionID=uid_1e5135ffcf_mtq6ntq6nte&env=sandbox&buttonSize=huge&fundingEligibility=eyJwYXlwYWwiOnsiZWxpZ2libGUiOnRydWUsInZhdWx0YWJsZSI6dHJ1ZX0sInBheWxhdGVyIjp7ImVsaWdpYmxlIjpmYWxzZSwibWVyY2hhbnRDb25maWdIYXNoIjoiZmQxNWMxYTBkNTFiYjBlMTRjODkxYTUzNDYwZTZiYWU1MDkyZmEzZCIsInByb2R1Y3RzIjp7InBheUluMyI6eyJlbGlnaWJsZSI6ZmFsc2UsInZhcmlhbnQiOm51bGx9LCJwYXlJbjQiOnsiZWxpZ2libGUiOmZhbHNlLCJ2YXJpYW50IjpudWxsfSwicGF5bGF0ZXIiOnsiZWxpZ2libGUiOmZhbHNlLCJ2YXJpYW50IjpudWxsfX19LCJjYXJkIjp7ImVsaWdpYmxlIjp0cnVlLCJicmFuZGVkIjp0cnVlLCJpbnN0YWxsbWVudHMiOmZhbHNlLCJ2ZW5kb3JzIjp7InZpc2EiOnsiZWxpZ2libGUiOnRydWUsInZhdWx0YWJsZSI6dHJ1ZX0sIm1hc3RlcmNhcmQiOnsiZWxpZ2libGUiOnRydWUsInZhdWx0YWJsZSI6dHJ1ZX0sImFtZXgiOnsiZWxpZ2libGUiOnRydWUsInZhdWx0YWJsZSI6dHJ1ZX0sImRpc2NvdmVyIjp7ImVsaWdpYmxlIjpmYWxzZSwidmF1bHRhYmxlIjp0cnVlfSwiaGlwZXIiOnsiZWxpZ2libGUiOmZhbHNlLCJ2YXVsdGFibGUiOmZhbHNlfSwiZWxvIjp7ImVsaWdpYmxlIjpmYWxzZSwidmF1bHRhYmxlIjp0cnVlfSwiamNiIjp7ImVsaWdpYmxlIjpmYWxzZSwidmF1bHRhYmxlIjp0cnVlfX0sImd1ZXN0RW5hYmxlZCI6ZmFsc2V9LCJ2ZW5tbyI6eyJlbGlnaWJsZSI6ZmFsc2V9LCJpdGF1Ijp7ImVsaWdpYmxlIjpmYWxzZX0sImNyZWRpdCI6eyJlbGlnaWJsZSI6ZmFsc2V9LCJhcHBsZXBheSI6eyJlbGlnaWJsZSI6ZmFsc2V9LCJzZXBhIjp7ImVsaWdpYmxlIjpmYWxzZX0sImlkZWFsIjp7ImVsaWdpYmxlIjpmYWxzZX0sImJhbmNvbnRhY3QiOnsiZWxpZ2libGUiOmZhbHNlfSwiZ2lyb3BheSI6eyJlbGlnaWJsZSI6ZmFsc2V9LCJlcHMiOnsiZWxpZ2libGUiOmZhbHNlfSwic29mb3J0Ijp7ImVsaWdpYmxlIjpmYWxzZX0sIm15YmFuayI6eyJlbGlnaWJsZSI6ZmFsc2V9LCJwMjQiOnsiZWxpZ2libGUiOmZhbHNlfSwiemltcGxlciI6eyJlbGlnaWJsZSI6ZmFsc2V9LCJ3ZWNoYXRwYXkiOnsiZWxpZ2libGUiOmZhbHNlfSwicGF5dSI6eyJlbGlnaWJsZSI6ZmFsc2V9LCJibGlrIjp7ImVsaWdpYmxlIjpmYWxzZX0sInRydXN0bHkiOnsiZWxpZ2libGUiOmZhbHNlfSwib3h4byI6eyJlbGlnaWJsZSI6ZmFsc2V9LCJtYXhpbWEiOnsiZWxpZ2libGUiOmZhbHNlfSwiYm9sZXRvIjp7ImVsaWdpYmxlIjpmYWxzZX0sIm1lcmNhZG9wYWdvIjp7ImVsaWdpYmxlIjpmYWxzZX19&platform=desktop&experiment.enableVenmo=false&experiment.disablePaylater=false&experiment.enableVenmoAppLabel=false&flow=purchase&currency=EUR&intent=capture&commit=true&vault=false&renderedButtons.0=paypal&renderedButtons.1=card&debug=false&applePaySupport=false&supportsPopups=true&supportedNativeBrowser=false&allowBillingPayments=true:1338:178001

我试过只把金额放进数据里还是不行,我也试过加一个订单ID,但还是不行输入输出

这有点乱,您正在对服务器上的“create.php”进行 ajax 调用,但由于某种原因没有从那里调用 PayPal API(使用 Checkout-PHP-SDK 或类似工具),但是而是使用该响应然后从客户端创建订单(这就是actions.order.create所做的)

这没有任何实际意义。 如果您使用的是服务器,则应该有两条路线: create.phpcapture.php?id=XXXXXXXXXXXXXXX" (如果需要,使用 JSON body参数来fetch而不是 GET URL 字符串)两者都与 8825345422814308 8114858 通信他们自己,分别创建和捕获订单。将您自己的服务器操作与 JS SDK 客户端方法相结合是没有意义的。

因此,您应该完全切换到此服务器模式示例: https://developer.paypal.com/demo/checkout/#/pattern/server ,并在调用的每个相应路由中 (create.php / capture. php 或类似的)您可以编写自己的 HTTPS 调用 PayPal API,或者使用Checkout-PHP-SDK根据需要抽象它们,并将 JSON 响应返回给提取调用方。


我不建议尝试让你必须工作的东西,但它不起作用的主要原因是未能正确返回 JavaScript Promise。 您正在调用一个异步 $.ajax 并且在这样做之后没有返回任何东西,因此出现错误“Expected an order id to be passed”,因为您实际上没有返回任何东西(即使您认为您已经返回); 实际上,您只是分离了一个异步 $.ajax 来做它自己的事情,并且该函数的结果永远不会被反馈(如果您返回它的结果也不会,因为它使用回调而不是承诺)。

在调用您自己的服务器路由时获得 promise 的最简单方法是使用fetch而不是$.ajax ,然后您可以只返回 fetch 的结果。 理论上可以将$.ajax回调转换为 promise 并返回,但如果我是你,我不会花任何时间在这上面; 内置的浏览器fetch会为你创建一个 promise 并且在现代 JS 中是首选。

暂无
暂无

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

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