无法将变量传递给 PayPal Payments Rest API 的 JS 脚本

Posted

技术标签:

【中文标题】无法将变量传递给 PayPal Payments Rest API 的 JS 脚本【英文标题】:Cannot pass variable to JS script for PayPal Payments Rest API 【发布时间】:2017-05-12 22:19:41 【问题描述】:

问题是我无法将 PayPal 脚本所需的 paymentID 变量从 php 传递到 JS。 (无论是这个还是 PHP 脚本都不会运行)。

我正在按照这里的步骤操作:https://developer.paypal.com/docs/integration/direct/express-checkout/integration-jsv4/advanced-integration/#set-up-the-payment

我被困在第 4 步。

我使用了本教程中的代码:http://paypal.github.io/PayPal-PHP-SDK/sample/doc/payments/CreatePaymentUsingPayPal.html

这是 HTML:

% extends 'layout/master.twig' %

% block title %  parent() PayPal % endblock title %

% block head %
    <script src="https://www.paypalobjects.com/api/checkout.js"></script>
% endblock %

% block header % Testing PayPal % endblock header %


% block content %

    <div id="paypal-button"></div>

% endblock content %


% block scripts %
    <script>
        paypal.Button.render(

            env: 'sandbox', // Optional: specify 'production' environment

            payment: function(resolve, reject) 

                var CREATE_PAYMENT_URL = 'http://patch-request.app/paypal/payment/create';

                paypal.request.get(CREATE_PAYMENT_URL)
                    .then(function(data) 
                        alert(data);
                        console.log(data);
                        resolve(data.paymentID);
                    )
                    .catch(function(err) 
                        alert(data);
                        console.log(data);
                        reject(err);
                    );
            ,

            onAuthorize: function(data) 

                // Note: you can display a confirmation page before executing

                var EXECUTE_PAYMENT_URL = 'http://patch-request.com/paypal/execute-payment';

                paypal.request.post(EXECUTE_PAYMENT_URL,
                     paymentID: data.paymentID, payerID: data.payerID )

                    .then(function(data)  /* Go to a success page */ )
                    .catch(function(err)  /* Go to an error page  */ );
            

        , '#paypal-button');
    </script>
% endblock scripts %

这是我要运行的脚本:

    public function create_payment ()
    
        $payer = new Payer();
        $payer->setPaymentMethod("paypal");

        $item1 = new Item();
        $item1->setName('Ground Coffee 40 oz')
            ->setCurrency('USD')
            ->setQuantity(1)
            ->setSku("123123")// Similar to `item_number` in Classic API
            ->setPrice(7.5);
        $item2 = new Item();
        $item2->setName('Granola bars')
            ->setCurrency('USD')
            ->setQuantity(5)
            ->setSku("321321")// Similar to `item_number` in Classic API
            ->setPrice(2);

        $itemList = new ItemList();
        $itemList->setItems([$item1, $item2]);

        $details = new Details();
        $details->setShipping(1.2)
            ->setTax(1.3)
            ->setSubtotal(17.50);

        $amount = new Amount();
        $amount->setCurrency("USD")
            ->setTotal(20)
            ->setDetails($details);

        $transaction = new Transaction();
        $transaction->setAmount($amount)
            ->setItemList($itemList)
            ->setDescription("Payment description")
            ->setInvoiceNumber(uniqid());

//        $baseUrl = getBaseUrl();
        $baseUrl = "http://patch-request.app";
        $redirectUrls = new RedirectUrls();
        $redirectUrls->setReturnUrl("$baseUrl/ExecutePayment.php?success=true")
            ->setCancelUrl("$baseUrl/ExecutePayment.php?success=false");

        $payment = new Payment();
        $payment->setIntent("sale")
            ->setPayer($payer)
            ->setRedirectUrls($redirectUrls)
            ->setTransactions([$transaction]);

        $request = clone $payment;

        try
        
                $payment->create($this->apiContext); //$payment is a JSON
        
        catch (Exception $ex)
        
            echo 'Sth went wrong';
        

        $approvalUrl = $payment->getApprovalLink();


        return json_encode(['paymentID' => $payment->id]);
    

有什么想法吗?

【问题讨论】:

【参考方案1】:

我不知道你使用的是什么模板系统,但你可以试试这个

% block head %
    <script src="https://www.paypalobjects.com/api/checkout.js"></script>
    // add it here
    <script>
        window.paymentID = '<?= getPaymentID(); ?>'; // you need to implement this
    </script>
% endblock %

现在您可以在其他 JS 中的任何位置访问 window.paymentID

【讨论】:

感谢您的回答。 (仅供参考,我正在使用 Twig)但是,当 PayPal JS 请求在这一行 paypal.request.get(CREATE_PAYMENT_URL) 中运行时,paymentID 应该由 PHP 脚本传递,它必须是 paypal.request.post(CREATE_PAYMENT_URL),所以问题解决了 :)

以上是关于无法将变量传递给 PayPal Payments Rest API 的 JS 脚本的主要内容,如果未能解决你的问题,请参考以下文章

将总金额传递给 PayPal 快速结帐

使用 Paypal Adaptive Payments API 添加“给收件人的消息”

使用客户端集成将变量 Amount 传递给 Smart PayPal 按钮是不是安全?

电子邮件链接中的 PayPal 自定义变量

很抱歉,我们现在无法完成您的付款。请稍后再试 - PayPal Payments Pro

Paypal Payments Pro Sandbox 错误 很抱歉,我们现在无法完成您的付款。请稍后再试