2014-06-06 9 views
6

Ich bin derzeit Integration von Stripe in eine Website und stieß auf ein Problem mit benutzerdefinierten Checkout-Integration.Benutzerdefinierte Stripe-Checkout-Button funktioniert nicht auf Handy

Ich habe die benutzerdefinierte Integration Anweisungen auf dem Stripe website gefolgt, und es funktioniert gut auf dem Desktop, aber tut leider nichts auf dem Handy.

Ich habe einen Handler in jQuery bekam, die, wenn der Knopf meine Gewohnheit feuert geklickt wird, und es läuft handler.open({…}), wie pro die docs, aber die folgende JavaScript-Fehler protokolliert:

TypeError: 'undefined' is not an object (evaluating '(s=this.frame).focus') - checkout.js:2:21656 

Irgendwelche Ideen?

Bearbeiten: Nach viel herumspielen habe ich festgestellt, dass es nicht in iOS 7 startet, wenn es eine Verzögerung von mehr als 1 Sekunde zum Anruf gibt.

Zum Beispiel sind die folgenden Werke:

setTimeout(function(){stripe_payment();}, 1000); 

und die folgenden nicht:

setTimeout(function(){stripe_payment();}, 2000); 

In den obigen Beispielen stripe_payment() Sätze auf und ruft den Handler. Wie bereits erwähnt, kann der selbe Affekt auftreten, wenn der Handler nach einem AJAX-Aufruf aufgerufen wird (was vermutlich zu lange dauert). Es ist auch erwähnenswert, dass sogar eine Verzögerung von 5 Sekunden auf Desktop-Browsern gut funktioniert.

+0

Können Sie den Code anzeigen? –

+0

Ich habe einige zusätzliche Details hinzugefügt @AndreiNemes, irgendwelche Ideen? –

Antwort

13

Dies wird verursacht, weil this.frame nicht definiert ist. In Streifen des checkout.js wird this.frame tatsächlich eingestellt kurz vor dem Fehler:

this.frame = window.open(this.fullPath(), "stripe_checkout_tabview") 

Das Problem tritt auf, weil window.open ausfällt. Dies liegt an dem Popup-Blocker des Browsers; window.open kann nur von einigen Event-Handlern (wie ein Tastendruck) erfolgreich aufgerufen werden. Wenn Sie es von einem (ausreichend langen) Timeout aufrufen, kann es fehlschlagen.

Sie müssen handler.open({…}) direkt vom Click-Ereignis der Schaltfläche aufrufen. Falls Sie es aus dem Ergebnis einer AJAX-Anfrage aufrufen, müssen Sie Ihren Code umgestalten, damit dies nicht erforderlich ist.

+4

FYI, das ist auch adressiert (mit Beispielen) in der Stripe-Dokumentation: https://stripe.com/docs/checkout#integration-more-runloop –

+0

Works! Ich musste dies tun, auch wenn ich eine Direktklick-Funktion nutze, aber einen Rückruf dort habe. –

Verwandte Themen