Подписки Angular и Stripe сохраняют платежные данные и создают подписку

#javascript #angular #typescript #stripe-payments

#javascript #angular #typescript #stripe-платежи

Вопрос:

Я следую документации по подписке на Stripe. У меня возникли трудности с преобразованием кода JavaScript в TypeScript. В документации stripe они передают объект в функцию createPaymentMethod . В Angular это не позволяет ему проходить, потому что объект должен иметь 3 свойства, но в документации они передают только одно свойство.

Ошибка:

 error TS2345: Argument of type '{ card: any; }' is not assignable to parameter of type '{ card: any; isPaymentRetry: any; invoiceId: any; }'.
  Type '{ card: any; }' is missing the following properties from type '{ card: any; isPaymentRetry: any; invoiceId: any; }': isPaymentRetry, invoiceId
  

Код:

 export class StripeSubsriptionCheckoutComponent implements AfterViewChecked {
  card: any;

  constructor(private http: HttpClient) {}

  ngAfterViewChecked() {
    // Set up Stripe.js and Elements to use in checkout form
    var style = {
        base: {
            color: "#32325d",
            fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
            fontSmoothing: "antialiased",
            fontSize: "16px",
                "::placeholder": {
                color: "#aab7c4"
            }
        },
        invalid: {
            color: "#fa755a",
            iconColor: "#fa755a"
        }
    };

    var cardElement = window['elements'].create("card", { style: style });
    console.log('card element', cardElement)
    cardElement.mount("#card-element");
    cardElement.on('change', this.showCardError);
    this.card = cardElement;
  }

  showCardError(event) {
    let displayError = document.getElementById('card-errors');
    if (event.error) {
      displayError.textContent = event.error.message;
    } else {
      displayError.textContent = '';
    }
  }

  savePaymentDetails() {
    var card = this.card
      console.log('savePaymentDetails')
      const latestInvoicePaymentIntentStatus = localStorage.getItem(
        'latestInvoicePaymentIntentStatus'
      );
      console.log('lastestInvoicePay', latestInvoicePaymentIntentStatus)

      if (latestInvoicePaymentIntentStatus === 'requires_payment_method') {
          console.log('fjd')
          const invoiceId = localStorage.getItem('latestInvoiceId');
          const isPaymentRetry = true;

         
          // Create new payment method amp; retry payment on invoice with new payment method
          this.createPaymentMethod({
              card,
              isPaymentRetry,
              invoiceId
          });
      }
      else {
         this.createPaymentMethod({ card});
      }
  }

  createPaymentMethod({ card, isPaymentRetry, invoiceId}) {
      console.log('createPaymentMethod')
      console.log(card)
        // Set up payment method for recurring usage
      let billingName = 'tom'
      console.log(billingName)

      window['stripe'].createPaymentMethod({ 
        type: 'card',
        card: card,
        billing_details: {
            name: billingName
        }
      })
      .then((result) => {
          console.log('line 90', result)
          if(result.error) {
            //  displayError(result);
          }
          else {
              console.log('line 95: else statement')
              if(isPaymentRetry) {
                console.log('line 97', result)
              }
              else {
                  console.log('result', result)
                  // Create the subscription
                  this.createSubscription({
                      customerId: result,
                      paymentMethodId: result.paymentMethod.id,
                    priceId: result
                  })
              }
            }
          
      })

  }

  createSubscription({ customerId, paymentMethodId, priceId }) {
      console.log('createSubscriptiton')
  }
}
  

Ответ №1:

Проблема в строках

 else {
  this.createPaymentMethod({ card});
}
  

Здесь вы вызываете this.createPaymentMethod объект, который содержит только card , но сигнатура метода требует card , isPaymentRetry и invoiceId :

 createPaymentMethod({ card, isPaymentRetry, invoiceId}) {
  

Вы захотите изменить это, чтобы либо передать значения для отсутствующих параметров, либо указать, что isPaymentRetry и invoiceId являются необязательными, например:

 createPaymentMethod({ card: any, isPaymentRetry?: bool, invoiceId?: string }) {