
Vor fünf Monaten haben wir ein NPM-Modul für die Arbeit mit der neuen Version von Yandex.Kassa veröffentlicht, die im Oktober 2017 veröffentlicht wurde. Unser Modul wurde in die offizielle Dokumentation aufgenommen und bereits mehr als 1300 Mal heruntergeladen.

Bei Habré haben wir zusammen mit Kollegen von Yandex bereits über die Erfahrungen bei der Erstellung des Moduls gesprochen, aber unsere Erfahrungen, die wir bei der Integration des Zahlungssystems für russische Kunden gesammelt haben, sind zurückgeblieben.
Daher möchten wir Ihnen heute mitteilen, wie wir für einen unserer inländischen Kunden von der Integration der uns bekannten ausländischen Zahlungssysteme zu russischen Kollegen gewechselt sind, auf welche Schwierigkeiten wir gestoßen sind und wie sie gelöst wurden.
Wie sie mit Zahlungssystemen arbeiteten
Bisher haben wir nur mit Zahlungssystemen ausländischer Kunden gearbeitet. Wir hatten Erfahrung in der Integration mit Authorize.net, Paypal, Braintree, Stripe, Payoneer, Wirecard und Svea.
Mit diesen Zahlungssystemen ist es einfach, verschiedene Funktionen zu interagieren und zu implementieren. Als wir beispielsweise an einem Frachtdienst in Europa arbeiteten, haben wir mehrere Zahlungssysteme in das Projekt integriert und einen Algorithmus geschrieben, der eine komplexe Logik der Geldgeschäfte implementiert. Wenn ein Benutzer einen Service bestellt hat, hat das System Geld vom Konto des Kunden auf das Konto des Service überwiesen, und der Algorithmus hat Transaktionen durchgeführt: Die Zahlung bei Lieferproblemen neu berechnet, in Währung umgerechnet, eine Rückerstattung und Umplanung von Zahlungen vorgenommen und den Prozentsatz für die Nutzung des Service abgeschrieben.
Mit den besten Vertretern von Zahlungssystemen können Sie auch ohne Registrierung mit der Entwicklung in der Sandbox beginnen. Viele verfügen über eine hervorragende Dokumentation und fast alle helfen bei der Lösung von Problemen, ohne dass der Support aktiv beteiligt ist. Entwickler können Rechte und Zugriff von einem persönlichen Konto aus verwalten. Zahlungssysteme verfügen über ein SDK für die meisten gängigen Plattformen, das heute der ungeschriebene Standard ist.
Um ein Zahlungssystem zu integrieren, benötigt ein Entwickler:
- Registrieren Sie sich auf der Website und erhalten Sie Zugriff auf die Sandbox.
- Laden Sie das SDK herunter und verbinden Sie es. Fügen Sie Anrufe in die Funktionen des Zahlungssystems an den richtigen Stellen der Anwendung ein.
- Testen Sie alle Szenarien und stellen Sie sicher, dass alles richtig funktioniert.
- Nehmen Sie an anderen Aufgaben teil, während der Kunde finanzielle und rechtliche Probleme löst.
- Schalten Sie zum richtigen Zeitpunkt die Zahlungsannahme in den Kampfmodus.
Was hat sich geändert?
Vor einem Jahr haben wir begonnen, auf dem heimischen Markt zu arbeiten. Eines der ersten Projekte
war die Sellsay-App . Es hilft Benutzern, Fähigkeiten in Verhandlungen zu entwickeln, und ist auch eine Plattform für gegenseitige professionelle Unterstützung.
Die Anwendung verfügt neben den Standardfunktionen über zahlreiche Funktionen: Autorisierung und Registrierung, Erstellung und Bearbeitung von Projekten. Über den Service können Sie kontaktieren
zu einem Business Coach. Wenn Sie über die erforderlichen Kenntnisse verfügen, können Sie ein Zertifikat erhalten und ein unabhängiger Trainer werden, an Veranstaltungen und Schulungen teilnehmen
Verdienen Sie mit den Erstellern der Anwendung Geld.
Um im Service bezahlen zu können, musste ein Zahlungssystem integriert werden - eines, bei dem Sie in Rubel und Dollar bezahlen, die Zahlungsfrist übertragen und eine Rückerstattung vornehmen, Karten speichern und bei wiederholten Einkäufen keine Daten eingeben, Apple und Android Pay verwenden können. Um dies zu implementieren, haben wir das Braintree-System gewählt.
Und dann haben wir einen riesigen Schleier gemacht. Wir haben die grundlegenden Funktionen der Arbeit mit dem Zahlungssystem vereinbart und implementiert, jedoch ein wichtiges Detail nicht berücksichtigt. Wir haben zwei Wochen vor der Veröffentlichung davon erfahren, als sie das Projekt für den Start vorbereiteten. Wir haben nicht berücksichtigt, dass Braintree nicht mit Unternehmen aus Russland zusammenarbeitet. Die Registrierung eines Unternehmens in den Staaten ist keine Option. Wir haben noch einen Ausweg: das Zahlungssystem so schnell wie möglich zu ersetzen.
Yandex.Kassa: Arbeiten mit der ersten Version der API
Nach der Analyse der Systeme haben wir uns für Yandex.Cash entschieden: Der Service ermöglichte es uns, fast alle Funktionen zu implementieren, war für den Kunden zu einem Preis geeignet und löste das 54-FZ-Problem beim Anschließen eines Online-Kassenschalters.
Wenig später stellten wir fest, dass sich unsere Vision der Integration grundlegend von der Vision von Yandex.Kassa und seinem Sicherheitsdienst unterscheidet. Die gesamte Phase der Integration wurde mehr durch endlose Verträge, Formulare und Telefonanrufe als durch das Schreiben von Code in Erinnerung gerufen.
Um Testschlüssel zu erhalten, müssen Sie einen Link zur Anwendung im Apple Store oder bei Google Play bereitstellen. Woher haben wir den Link, wenn die Zahlungsannahme eine Voraussetzung für die Veröffentlichung des Antrags ist? Wir haben es geschafft, dieses Problem zu lösen, aber dann gab es Situationen, in denen es notwendig war, die Funktionalität für die Aktivierung durch den Manager zu implementieren und zu veröffentlichen.
Ja, fast alle Anfragen werden durch Kommunikation mit einem persönlichen Manager gelöst. Wenn jedoch Fragen in Ihrem persönlichen Konto an Ihren persönlichen Manager gesendet werden, besteht bei Ihrem Anruf eine hohe Wahrscheinlichkeit, dass Sie einen zufälligen, kostenlosen Manager in der Leitung erreichen und eine völlig zufällige Antwort erhalten. Nach einer Weile - steigen Sie in einen anderen Manager ein und erhalten Sie die gegenteilige Antwort auf dieselbe Frage.
Ein weiterer Nachteil: Yandex unterstützt APIs mit mehreren Generationen. Sogar Yandex.Kassi verfügt über mehrere Subsysteme, die unterschiedliche Dokumentationen, Authentifizierungen usw. verwenden. Daher müssen Sie gleichzeitig nicht verwandte APIs implementieren. Sie akzeptieren beispielsweise Zahlungen, und für die Stornierung müssen Sie erneut beginnen: Anwendungen, Verträge, Anrufe, Studien und API-Integration.
Die letzten Wochen vor dem Start wurden zur Hölle. Um das Projekt pünktlich zu starten, mussten wir das Team verstärken und Überstunden leisten, und Yandex.Cash verpasste unterdessen nicht die Gelegenheit, uns nervös zu machen.
Vergleich von Yandex.Kassa mit Stripe
In der Entwicklergemeinde ist Stripe führend in Bezug auf einfache Integration und Arbeit mit dem Zahlungssystem. Sie kümmern sich als erste um die Programmierer und machen das Zahlungssystem so bequem und flexibel wie möglich. Dadurch konnten Entwickler nicht nur aufatmen, sondern auch die Kosten des Integrationsprozesses beschleunigen und senken.
Yandex.Kassa und Stripe haben viele Gemeinsamkeiten. Beispielsweise basieren beide Systeme auf REST-ähnlichen Prinzipien, verwenden HTTP-Antwortcodes, unterstützen CORS (und Antworten kommen in JSON), beide unterstützen Idempotenz. Es gibt eine „Sandbox“ - eine vollständige Kopie des realen Speichers, und der Übergang zwischen den Modi ist nur ein Ersatz der Schlüssel: Sie müssen weder die API noch die URL ändern.
Gleichzeitig sind sie sehr unterschiedlich, und um zu zeigen, wie diese Systeme unterschiedliche Ansätze haben, werden wir die Implementierung einiger Phasen anhand konkreter Beispiele betrachten.
Da der Serverteil in diesem Projekt auf Node.js implementiert wurde, werde ich Beispiele dafür geben.
Wir verbinden uns mit dem Projekt .
Streifen:
var stripe = require('stripe')('sk_test_...');
Yandex.Cash:
, ;
Kartendetails anfordernStreifen:
Verbinden Sie die Client-Bibliothek auf die gleiche Weise und fordern Sie ein Token mit der Anzeige des Formulars zur Eingabe der Karte an.
var stripe = Stripe('pk_test_6pRNASCoBOKtIshFeQd4XMUh'); var elements = stripe.elements();
Auf dem Server
stripe.charges.create({ amount: 2000, currency: "usd", source: "token from previous step",
Yandex.Cash:
: , . : <a href="https://money.yandex.ru/eshop.xml?shopId=12345&scid=1234566&sum=3000&customerNumber=73">https://money.yandex.ru/eshop.xml?shopId=12345&scid=1234566&sum=3000&customerNumber=73</a>
In Wahrheit muss es auf der Website ein Zahlungsformular geben. Wenn der Benutzer auf "Bezahlen" klickt, wird dieses Formular an die oben angegebene Adresse gesendet und übergibt die Parameter mithilfe der POST-Methode. Da wir jedoch eine mobile Anwendung haben, musste ich das Formular verlassen und mit der Öffnung in WebView einen Link auf der Serverseite erstellen.
Dieser Link wird dem Kunden gegeben, um die Kartendaten einzugeben und die Zahlung zu bestätigen. Hier standen wir jedoch vor einer weiteren Überraschung: Ende 2017 unterstützt Yandex.Kassa kein Responsive Design. Verschiedene Manipulationen mit den Einstellungen führten nicht zu Ergebnissen.
Das Design passt sich nicht für mobile Anwendungen anEs stellte sich heraus, dass Sie eine Anfrage in Ihrem persönlichen Konto hinterlassen müssen, um das Erscheinungsbild der Zahlungsseite in den adaptiven Modus zu versetzen. Wir mussten uns erneut an den technischen Support wenden.
Hurra, angepasstes Design für ein Handy im Jahr 2017!
Aber nur zur Zahlung mit KreditkarteÜberprüfen Sie die ZahlungsweiseStreifen:
Die Zahlung wird während des Zahlungsvorgangs überprüft und im Fehlerfall gibt die API-Funktion eine entsprechende Ausnahme zurück.
Yandex.Cash:
Benutzer leisten Zahlungen auf der Seite von Yandex.Cash, aber die Anwendung des Benutzers weiß noch nichts über die Tatsache der Zahlung. Daher muss Yandex.Kassa den Server darüber informieren, dass die Zahlung erfolgt ist. Zu diesem Zweck müssen Entwickler einen WebHook erstellen und Yandex.Cash konfigurieren, damit Adressen von WebHook verwendet werden können, um die Tatsache der Zahlung zu übermitteln.
Die Serverbenachrichtigung erfolgt in zwei Schritten:
- Überprüfung der Zahlungsmöglichkeit. Unser Server prüft alles, erlaubt oder verweigert den Abzug von Geldern, prüft beispielsweise den Warenbestand oder die Richtigkeit der Preise.
- Erfüllung der Zahlung. Yandex.Kassa informiert unseren Server darüber, dass das Geld abgebucht wurde und die Zahlung erfolgreich war. Zu diesem Zeitpunkt ist es notwendig, die Tatsache der Zahlung in der Datenbank zu korrigieren.
Aber hier erwarten uns Überraschungen:
- Um die Adresse zu ändern, müssen Sie eine Anfrage an den Manager senden und erneut warten.
- Es ist erforderlich, einen speziellen Algorithmus zur Überprüfung der Gültigkeit von Daten aus Yandex.Kassa zu implementieren.
- Der Server muss benutzerdefiniertes XML zurückgeben. Wir konnten ein fertiges Modul finden, um die richtige Antwort zu generieren.
Stornieren Sie die ZahlungStreifen:
stripe.refunds.create({ charge: "ch_1BTuEo2eZvKYlo2CSGqKz76n" }, function(err, refund) {
Yandex.Cash:
X.509 MWS. ., ..
Wie Sie sich vorstellen können, dauerte die Koordination und Verbindung einige Zeit. Es ging reibungslos über die Grenzen der Frist hinaus.
Karten speichernStreifen:
stripe.customers.create({ email: "paying.user@example.com", source: "src_18eYalAHEMiOZZp1l9ZTjSU0", }, function(err, customer) {
Yandex.Cash:
Wir beschreiben die Regeln zum Abbrechen des Speicherns von Karten und implementieren die Möglichkeit zum Löschen. Anschließend senden wir den Antrag zur Überprüfung an den Sicherheitsdienst von Yandex.Kassa und warten auf eine Antwort.
Wenn die Antwort Ja lautet, können Sie nach erfolgreicher Zahlung Karten speichern und wiederholte Zahlungen mit dem MWS-Protokoll ausführen.
Beispielanfrage aus der Dokumentation:
POST https:
Wie Sie den Beispielen entnehmen können, eignet sich Stripe besser für Entwickler und verfügt über eine Vielzahl von Funktionen und Fähigkeiten. Aber es gibt einen großen ABER: Stripe funktioniert wie Braintree in Russland nicht, obwohl es Zahlungen aus verschiedenen Ländern akzeptieren kann. Der Inhaber eines Kontos bei Stripe muss in den ihm zugänglichen Ländern ansässig sein - Russland gehört nicht dazu.
Was als Ergebnis
Selbst unter Berücksichtigung der Tatsache, dass wir viel zusätzliche Arbeit leisten und mit dem Support kommunizieren mussten, konnten wir nicht nur fast alles pünktlich erledigen, sondern auch zusätzliche Arbeit leisten. Eine Woche vor der Veröffentlichung wurde eine neue Version der Yandex.Kassi-API veröffentlicht. Wir haben ein NPM-Modul erstellt und den Code neu geschrieben.
Als wir die neue Version der API herausfanden, waren wir angenehm überrascht: Die Entwickler haben sich eindeutig mit ausländischen Analoga befasst und die Best Practices angewendet. Einige Probleme der vorherigen Version wurden behoben. Die Dokumentation für die neue API enthielt kein SDK für Node.js. Wir planen, weiter auf dem russischen Markt zu arbeiten, und wir werden ein solches Werkzeug brauchen. Aus diesem Grund haben wir uns entschlossen, ein NPM-Modul zu erstellen, das jeder unabhängig in sein Projekt integrieren kann.