ReferenceError:当我使用 vuejs 设置 PayPal Checkout 时,未定义 paypal

Posted

技术标签:

【中文标题】ReferenceError:当我使用 vuejs 设置 PayPal Checkout 时,未定义 paypal【英文标题】:ReferenceError: paypal is not defined when i setup PayPal Checkout using vuejs 【发布时间】:2020-07-31 08:21:06 【问题描述】:

我有一个组件 PaypalButton.vue,当我按照以下说明实现按钮时:https://developer.paypal.com/docs/checkout/integrate/#

<template>
  <div>
    <div id="paypal-button-container"></div>
  </div>
</template>
    <script src="https://www.paypal.com/sdk/js?client-id=AZy2xQtNMcibA3BneS56WHoq1oqLhWdM7nsP3pwS02lr_1TOpC9Lnpp-IGbZQDS8K_xvMH5ssRmNPoDT" >
      // Required. Replace SB_CLIENT_ID with your sandbox client ID.
    </script>


<script>
import JQuery from 'jquery'
let $ = JQuery

var checkExist = setInterval(function() 
   if ($('#paypal-button-container').length) 
      console.log("Exists!");
      paypal
  .Buttons(
    createOrder: function(data, actions) 
      // This function sets up the details of the transaction, including the amount and line item details.
      return actions.order.create(
        purchase_units: [
          
            amount: 
              value: "0.01"
            
          
        ]
      );
    ,
    onApprove: function(data, actions) 
      // This function captures the funds from the transaction.
      return actions.order.capture().then(function(details) 
        // This function shows a transaction success message to your buyer.
        alert("Transaction completed by " + details.payer.name.given_name);
      );
    
  )
  .render("#paypal-button-container");
//This function displays Smart Payment Buttons on your web page.

      clearInterval(checkExist);
   
, 100); // check every 100ms


export default 
  data: () => (
    //
  )
;
</script>



我收到此错误..有人知道发生了什么吗?我试图在 index.html 中导入 paypal 脚本,但同样的事情发生了

【问题讨论】:

您使用的是实际的客户端 ID 吗?这不是秘密信息,因此您可以将其包含在您的帖子中,以便我们测试问题所在。如果您的代码在独立运行时可以正常工作,那么您的 vue 环境可能会阻止 PayPal 脚本正确加载,因此我们需要一种方法对其进行测试。 我更新了我的代码。我尝试实现一个函数,在执行脚本之前等待我的组件加载,这样我就可以解决另一个错误:文档已准备好,元素 #paypal-button-container 不存在。 对于 paypal 未定义的错误,我在 files..index 和 playbutton 组件中都添加了脚本 不知道它是否正确,但它有效,哈哈 对 vue 不太熟悉,但我认为索引是它需要的地方。我不确定您是否需要 checkExist 间隔,尽管它肯定会起作用。如果需要类似的东西,你可以试试$(document).ready(function(... 【参考方案1】:

在我的例子中,我遇到了类似的“'script' is not defined”问题。所以这是我出于类似目的使用脚本的解决方案。我希望它可以帮助某人。首先,我需要使用“窗口”范围。此外,如果您需要访问“onload”函数中的任何 Vue 元素,则需要为“this”实例创建一个新变量。

<template>
  <div>
    <h2>PayWay Payment</h2>
    <div id="payway-credit-card"></div>
    <br />
    <button id="pay" disabled>Add credit card</button>
  </div>
</template>
<script>
import  mapActions  from "vuex";
export default 
  name: "Payment",
  methods: 
    ...mapActions(["aVueAction"])
  ,
  created() 
    let paywayScript = document.createElement("script");
    let self = this;
    paywayScript.onload = () => 
      // call to Vuex action.
      self.aVueAction();
      // call to script function
      window.payway.aScriptFunction();
    ;
    // paywayScript.async = true;
    paywayScript.setAttribute(
      "src",
     "https://api.payway.com.au/rest/v1/payway.js"
    );
    document.body.appendChild(paywayScript);
  
;
</script>

我在 Vue 2.6 上使用过这个。

【讨论】:

以上是关于ReferenceError:当我使用 vuejs 设置 PayPal Checkout 时,未定义 paypal的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的 ReferenceError: $ 未定义 (VueJS)

Uncaught ReferenceError: jQuery is not defined VueJS Parcel

ReferenceError: 导入外部js文件时未定义Vue

VueJS - 未定义 Vue

在 VueJS 中写入全局变量

ReferenceError:未定义窗口。当我通过 jest 运行 npm test 进行单元测试时出现此错误