【问题标题】:Cannot read property 'configure' of undefined无法读取未定义的属性“配置”
【发布时间】:2020-09-23 07:32:53
【问题描述】:

我得到错误:

core.js:5882 错误类型错误:无法读取属性“配置” 未定义

当我在 Angular 2 中为万事达卡实现 Hosted Session Integration 时。这是我的代码:

payment-detail.component.ts

import { AfterViewInit, Component, OnInit } from '@angular/core';
declare var $: any;

@Component({
  selector: 'app-payment-detail',
  templateUrl: './payment-detail.component.html',
  styleUrls: ['./payment-detail.component.css'],
})
export class PaymentDetailComponent implements OnInit, AfterViewInit {
  // PaymentSession: any;

  constructor() {}

  ngAfterViewInit(): void {


    $.getScript(
      'https://ap-gateway.mastercard.com/form/version/57/merchant/<MERCHANTID>/session.js?debug=true',
      function () {
        $.PaymentSession.configure({
          fields: {
            // Attach hosted fields to your payment page
            card: {
              number: '#card-number',
              securityCode: '#security-code',
              expiryMonth: '#expiry-month',
              expiryYear: '#expiry-year',
              nameOnCard: '#cardholder-name',
            },
            giftCard: {
              number: '#gift-card-number',
              pin: '#gift-card-pin',
            },
            ach: {
              accountType: '#ach-account-type',
              bankAccountHolder: '#ach-account-holder',
              bankAccountNumber: '#ach-account-number',
              routingNumber: '#ach-routing-number',
            },
          },
          frameEmbeddingMitigation: ['javascript'],
          callbacks: {
            initialized: function (response) {
              // HANDLE INITIALIZATION RESPONSE
              if (response.status === 'ok') {
                document.getElementById('visaCheckoutButton').style.display =
                  'block';
              }
            },

            formSessionUpdate: function (response) {
              // HANDLE RESPONSE FOR UPDATE SESSION
              if (response.status) {
                if ('ok' == response.status) {
                  console.log(
                    'Session updated with data: ' + response.session.id
                  );

                  //check if the security code was provided by the user
                  if (response.sourceOfFunds.provided.card.securityCode) {
                    console.log('Security code was provided.');
                  }

                  //check if the user entered a MasterCard credit card
                  if (
                    response.sourceOfFunds.provided.card.scheme == 'MASTERCARD'
                  ) {
                    console.log('The user entered a MasterCard credit card.');
                  }
                } else if ('fields_in_error' == response.status) {
                  console.log('Session update failed with field errors.');
                  if (response.errors.cardNumber) {
                    console.log('Card number invalid or missing.');
                  }
                  if (response.errors.expiryYear) {
                    console.log('Expiry year invalid or missing.');
                  }
                  if (response.errors.expiryMonth) {
                    console.log('Expiry month invalid or missing.');
                  }
                  if (response.errors.securityCode) {
                    console.log('Security code invalid.');
                  }
                  if (response.errors.number) {
                    console.log('Gift card number invalid or missing.');
                  }
                  if (response.errors.pin) {
                    console.log('Pin invalid or missing.');
                  }
                  if (response.errors.bankAccountHolder) {
                    console.log('Bank account holder invalid.');
                  }
                  if (response.errors.bankAccountNumber) {
                    console.log('Bank account number invalid.');
                  }
                  if (response.errors.routingNumber) {
                    console.log('Routing number invalid.');
                  }
                } else if ('request_timeout' == response.status) {
                  console.log(
                    'Session update failed with request timeout: ' +
                      response.errors.message
                  );
                } else if ('system_error' == response.status) {
                  console.log(
                    'Session update failed with system error: ' +
                      response.errors.message
                  );
                }
              } else {
                console.log('Session update failed: ' + response);
              }
            },
            visaCheckout: function (response) {
              // HANDLE VISA CHECKOUT RESPONSE
            },
            amexExpressCheckout: function (response) {
              // HANDLE AMEX EXPRESS CHECKOUT RESPONSE
            },
          },
          interaction: {
            displayControl: {
              formatCard: 'EMBOSSED',
              invalidFieldCharacters: 'REJECT',
            },
          },
          order: {
            amount: 10.0,
            currency: 'AUD',
          },
          wallets: {
            visaCheckout: {
              enabled: true,
              // Add Visa Checkout API specific attributes here
              countryCode: 'AU',
              displayName: 'Display name',
              locale: 'en_au',
              logoUrl: 'http://logo.logo',
              payment: {
                cardBrands: ['VISA'],
              },
              review: {
                buttonAction: 'Pay',
                message: 'Message',
              },
              shipping: {
                acceptedRegions: ['AU'],
                collectShipping: true,
              },
            },
            amexExpressCheckout: {
              enabled: true,
              // Add Amex Express Checkout API specific attributes here
              initTags: {
                theme: 'responsive',
                env: 'qa',
                disable_btn: 'false',
                button_color: 'light',
                client_id:
                  '<MSO Client Id from the Amex Express Checkout configuration page in Merchant Administration>',
              },
            },
          },
        });
      }
    );
  }

  ngOnInit(): void {
  }

  load(): void {}
}

payment-detail.component.html

<div>Please enter your payment details:</div>
<div>Card Number: <input type="text" id="card-number" class="input-field" value="5123450000000008" readonly></div>
<div>Expiry Month:<input type="text" id="expiry-month" class="input-field" value="05"></div>
<div>Expiry Year:<input type="text" id="expiry-year" class="input-field" value="21"></div>
<div>Security Code:<input type="text" id="security-code" class="input-field" value="1234" readonly></div>
<div><button id="payButton" onclick="pay();">Pay Now</button></div>

如果我从 $.PaymentSession.configure 中删除 $.,我会找不到 PaymentSession。

更新

我按照 Maxine Lafarie 的建议使用了这段代码:

$.getScript( "your-script", function( data, textStatus, jqxhr ) {
  console.log( data ); // Data returned
  console.log( textStatus ); // Success
  console.log( jqxhr.status ); // 200
  console.log( "Load was performed." );
});

这是结果:

undefined payment-detail.component.ts:31 成功 payment-detail.component.ts:32 200 payment-detail.component.ts:33 加载 已执行。

将 url 粘贴到浏览器我得到一个脚本:

【问题讨论】:

    标签: javascript angular mastercard


    【解决方案1】:

    你有绑定记录$.getScript的回复吗?

    你可以这样做:

    $.getScript( "your-script", function( data, textStatus, jqxhr ) {
      console.log( data ); // Data returned
      console.log( textStatus ); // Success
      console.log( jqxhr.status ); // 200
      console.log( "Load was performed." );
    });
    

    无论如何,我不知道您是在整个应用程序中使用 jQuery 还是只是为了获得 getScript 方法的“好处”,但我建议您避免混合使用 Angular 和 jQ,因为 Angular 可以做到绝对是 jQuery 的全部功能。

    如果您想以 Angular 方式加载第 3 方脚本,您可以使用 as explained here

    所以检查是否:

    • 当您调用 jQuery 时,它会很好地导入和/或加载到您的组件中
    • 在调用$.getScript 方法后,您有一些成功日志
    • 导入 3rd 方脚本的 Angular 方式有效(也许更好)

    编辑:

    自从您导入脚本后,您就可以像这样调用全局属性: $.PaymentSession.configure 但我认为你必须这样称呼它:PaymentSession.configure

    【讨论】:

    • @Maxine Lafarie,我运行了您给先生的示例脚本,我得到了这个:undefined payment-detail.component.ts:31 success payment-detail.component.ts:32 200 payment-detail.component.ts:33 Load was performed. 请参阅上面的更新。
    • @Ibanez1408 好的,所以 getScript 函数运行良好,这意味着 jQuery 加载良好,所以这不是问题。我猜它来自脚本本身,如果您获取整个脚本 URL 并将其放入浏览器会发生什么?它会显示一些代码(或要求您对脚本文件进行 DL)吗?
    • 如果我将 URL 放入浏览器,我会得到一个 javascript。请查看我的编辑。
    • 谢谢@Ibanez1408,所以我们现在有更多信息!如果脚本文件在加载的脚本列表中和/或如果您的控制台中有一些 CORS 错误,您是否尝试查看您的控制台/newtork 开发人员的控制台选项卡(在您的浏览器中)? (顺便说一句,我编辑了我的答案)
    • 您说得对,先生。感谢您的宝贵时间。 IDE 给了我一条波浪线,但我只是忽略了它。它通过了。现在唯一的问题是我得到另一个错误:Session update failed with system error: Form Session not found or expired.
    猜你喜欢
    • 2022-07-06
    • 2022-07-12
    • 1970-01-01
    • 2022-01-15
    • 2019-02-20
    • 2021-12-20
    • 2022-01-05
    • 2022-01-01
    • 2017-08-26
    相关资源
    最近更新 更多