html - Recibiendo errores al inicializar la página de pago de Stripe y al enviar los datos de la tarjeta
En mi página de Angular/TypeScript donde guardo tarjetas de crédito, recibo 2 errores diferentes que no puedo solucionar. Solo he podido encontrar este enlace en línea que es similar: Cómo cambiar la configuración regional de Stripe cuando la variable de Stripe ha sido inicializada
- Cuando la página se carga por primera vez y Stripe y los elementos se inicializan y cargan, recibo este error a continuación:
TypeError no capturado TypeError: No se pueden leer las propiedades de undefined (leyendo 'queuedMessages') en value (https://js.stripe.com/v3/fingerprinted/js/controller-803e2f3ecfca23afd889cd24f93bdf22.js:1:452741) en (https://js.stripe.com/v3/fingerprinted/js/controller-803e2f3ecfca23afd889cd24f93bdf22.js:1:451881) value @ js.stripe.com/v3/fingerprinted/js/controller-803e2f3ecfca23afd889cd24f93bdf22.js:1:452741
- Cuando ingreso los detalles de mi tarjeta, la función 'stripe.createToken()' falla y recibo el siguiente error:
ERROR IntegrationError: Por favor, use la misma instancia de
Stripeque utilizó para crear este Elemento para crear su Fuente o Token. en Ii (/Users/mysite/client:1:350323) en e._handleMessage (/Users/mysite/client:1:355676) en e._handleMessage (/Users/mysite/client:1:152157) en /Users/mysite/client:1:353245 en _ZoneDelegate.invokeTask (/Users/mysite/client/node_modules/zone.js/fesm2015/zone.js:406:1) en Object.onInvokeTask (/Users/mysite/client/node_modules/@angular/core/fesm2015/core.mjs:25535:1) en _ZoneDelegate.invokeTask (/Users/mysite/client/node_modules/zone. js/fesm2015/zone.js:405:1) en Zone.runTask (/Users/mysite/client/node_modules/zone.js/fesm2015/zone.js:178:1) en ZoneTask.invokeTask [como invoke] (/Users/mysite/client/node_modules/zone.js/fesm2015/zone.js:487:1) en invokeTask (https://localhost:4200/polyfills.js:4776:18) {mensaje: 'Por favor, usa la misma instancia deStripeque usaste con este Elemento para crear tu Fuente o Token.', nombre: 'IntegrationError', stack: 'IntegrationError: Por favor, usa la misma instanc…(https://localhost:4200/polyfills.js:4776:18)'}
Aquí está el código a continuación donde tengo los 2 problemas.
// Just below all my imports, I declare Stripe like this
declare
const Stripe: any;
// Stripe and the elements get initialized in the ngAfterViewInit() like this
ngAfterViewInit() {
const style = {
// all style css left out for brevity
};
this.stripe = Stripe('pk_test_fTrh6B1...');
this.stripeElements = this.stripe.elements();
this.cardNumber = this.stripeElements.create('cardNumber', {
style
});
this.cardNumber.mount(this.cardNumberElement.nativeElement);
this.cardNumber.addEventListener('change', this.cardNumberHandler);
this.cardExpiry = this.stripeElements.create('cardExpiry', {
style
});
this.cardExpiry.mount(this.cardExpiryElement.nativeElement);
this.cardExpiry.addEventListener('change', this.cardExpiryHandler);
this.cardCvc = this.stripeElements.create('cardCvc', {
style
});
this.cardCvc.mount(this.cardCvcElement.nativeElement);
this.cardCvc.addEventListener('change', this.cardCvcHandler);
});
}
// here is the submit button to save card details
submitCard() {
this.loadingPayment = true;
const cardData = {
name: this.nameOnCard.value,
};
// 2nd error gets thrown below on createToken()
from(this.stripe.createToken(this.cardNumber, cardData)).pipe(take(1)).subscribe((result: any) => {
if (result.error) {
this.loadingPayment = false;
this.alertService.danger(result.error.message);
} else {
if (['Visa', 'MasterCard', 'Discover', 'American Express'].includes(result.token.card.brand) === true) {
this.accountService.saveCard({
token: result.token.id
}).subscribe(() => {
this.router.navigate(['/account/cards']);
this.alertService.success('Card added successfully');
}, error => {
console.log(error);
}).add(() => {
this.loadingPayment = false;
});
} else {
this.loadingPayment = false;
this.alertService.info('Only Visa, MasterCard, Discover or American Express are accepted');
}
}
});
}<div class="mt-4" [formGroup]="paymentForm">
<div class="form-floating mb-3">
<input type="text" class="form-control" id="floatingName" placeholder="ex. John Smith" formControlName="nameOnCard" required maxlength="30" pattern="^[a-zA-Z\s]*$" [ngClass]="{'is-valid': nameOnCard.valid, 'is-invalid': nameOnCard.invalid && (nameOnCard.dirty || nameOnCard.touched)}">
<label for="floatingName">Name on Card</label>
<div *ngIf="nameOnCard.invalid && (nameOnCard.dirty || nameOnCard.touched)">
<div class="invalid-feedback d-block" role="alert" *ngIf="nameOnCard.errors.required">
Name is required
</div>
<div class="invalid-feedback d-block" role="alert" *ngIf="nameOnCard.errors.pattern">
Only characters are permitted
</div>
</div>
</div>
<div class="form-floating mb-3">
<div class="form-control" id="floatingNumber" placeholder="ex. 1111-1111-1111-1111" #cardNumber [ngClass]="{'is-valid': cardNumberValid === true, 'is-invalid': cardNumberValid === false && cardNumberErrors !== null}"></div>
<label for="floatingNumber">Number</label>
<div *ngIf="cardNumberErrors" class="invalid-feedback d-block" role="alert">
{{cardNumberErrors}}
</div>
</div>
<div class="form-floating mb-3">
<div class="form-control" id="floatingExpiration" placeholder="ex. 11/24" #cardExpiry [ngClass]="{'is-valid': cardExpiryValid === true, 'is-invalid': cardExpiryValid === false && cardExpiryErrors !== null}"></div>
<label for="floatingExpiration">Expirtion</label>
<div *ngIf="cardExpiryErrors" class="invalid-feedback d-block" role="alert">
{{cardExpiryErrors}}
</div>
</div>
<div class="form-floating mb-3">
<div class="form-control" id="floatingCvc" placeholder="ex. 123" #cardCvc [ngClass]="{'is-valid': cardCvcValid === true, 'is-invalid': cardCvcValid === false && cardCvcErrors !== null}"></div>
<label for="floatingCvc">CVC</label>
<div *ngIf="cardCvcErrors" class="invalid-feedback d-block" role="alert">
{{cardCvcErrors}}
</div>
</div>
<nav class="navbar fixed-bottom navbar-light bg-light">
<div class="container-md px-3">
<div class="w-100">
<button class="btn btn-yb float-md-end" style="width: 100px;" [disabled]="paymentForm.invalid || loadingPayment || paymentForm.pristine || !cardNumberValid || !cardExpiryValid || !cardCvcValid" [ngClass]="{'nopacity' : loadingPayment}" type="button" (click)="submitCard()">
<span *ngIf="loadingPayment" class="spinner-border spinner-border-sm color-white" role="status" aria-hidden="true"></span>
<span class="sr-only">Loading...</span>
<span *ngIf="!loadingPayment">Save</span>
</button>
</div>
</div>
</nav>
</div>