Home / Android-Entwicklung / Android Integration von PayTM Payment Gateway

Android Integration von PayTM Payment Gateway

PayTM ist die größte Mobile Commerce-Plattform und das größte Unternehmen für digitale Geldbörsen. Es hat eine große Benutzerbasis von rund 300 Millionen und durchschnittliche Transaktionen von 5 Millionen pro Tag. Alle digitalen Zahlungen können über PayTM abgewickelt werden, z. B. Aufladen von Mobiltelefonen, Stromrechnungen, Kreditkarten usw. Fast alles unter der Erde ist in PayTM abgesichert. PayTM ist eine schnelle, zuverlässige und leichter zugängliche Zahlungslösung.

PayTM bietet auch eine Zahlungsgateway-Lösung, die es ermöglicht Kann mit UPI Debit- / Kreditkarte NetBanking und PayTM Wallet-Zahlungsoptionen

 android-paytm-gateway-Tutorial-E-Commerce-App "width =" 720 "height =" 359 "class =" aligncenter size-full wp-image-42350 "srcset =" https: //www.androidhive. info / wp-content / uploads / 2019/02 / android-paytm-gateway-tutorial-ecommerce-app.png 720w, https://www.androidhive.info/wp-content/uploads/2019/02/android-paytm -gateway-Tutorial-E-Commerce-App-300x150.png 300w "Größen =" (maximale Breite: 720px) 100vw, 720px "/> <noscript><img src=verstehen kann.

1. Mart9-E-Commerce-App

Die von mir erstellte Beispiel-App ist sehr minimal mit sehr begrenzten Bildschirmen. Es verfügt über Datenbank- (Realm), Netzwerkschicht- (Retrofit) und Zahlungsoptionen.

  • Anmelden, Registrieren Bildschirme zum Anmelden oder Erstellen eines neuen Benutzers.
  • Startseite – Zum Auflisten der verfügbaren Produkte zusammen mit Name, Vorschaubild und Preis.
  • Warenkorb – Eine BottomSheet-Ansicht zum Verwalten der Warenkorbelemente.
  • Zahlungsbildschirm – Erforderliche Aufrufe an den Backend-Server, bevor der Benutzer zum Zahlungs-Gateway umgeleitet wird.
  • Transaktionen – Zum Anzeigen der Liste der von einem Benutzer durchgeführten Transaktionen.

Hier sind die Screenshots aus der App.

2. Übersicht über den PayTM-Zahlungslebenszyklus

Das Abschließen der Kaufabwicklung umfasst die Anzahl der Anrufe zwischen App, Backend und PayTM-Server. Im Folgenden ist der Lebenszyklus einer Transaktion von der Initiierung bis zum Abschluss der Zahlung dargestellt.

1 . Vorbereiten der Bestellung: Sobald der Kunde die Artikel auswählt, werden die Warenkorbartikel an den Backend-Server gesendet. Dadurch wird eine neue Auftragszeile eingefügt oder eine vorhandene Zeile in db aktualisiert und die eindeutige Auftrags-ID generiert. Diese Bestellnummer muss jedes Mal eindeutig sein, wenn der Benutzer zum PayTM-Zahlungsbildschirm umgeleitet wird. Andernfalls gibt PayTM einen Fehler mit doppelter Bestellnummer aus.

2 . Bestell-ID und Prüfsumme: Der nächste Schritt ist die Generierung einer Prüfsumme unter Berücksichtigung der Bestell-ID. Die Prüfsumme muss unter Berücksichtigung der Pflichtfelder und der Merchant ID .

3 erstellt werden. Weiterleiten an PayTM: Sobald die Prüfsumme generiert wurde, wird der Benutzer zum PayTM-Zahlungsbildschirm weitergeleitet, auf dem mehrere Zahlungsoptionen wie Debit / Kreditkarte Wallet angezeigt werden ] Net Banking usw., In diesem Schritt wird der Benutzer, wenn die generierte Prüfsumme falsch ist, zurück zur App mit Fehlerstatus umgeleitet.

4 . Banküberweisung: Der Benutzer schließt die Zahlung ab, indem er die angegebenen Optionen auswählt. Hier kümmert sich PayTM um die Kommunikation mit der Bank und den Abschluss der Zahlung.

5 . Überprüfung der Transaktion: Sobald die Transaktion abgeschlossen ist, muss sie im Backend überprüft werden, um auch betrügerische Transaktionen zu vermeiden. Hier sendet der Back-End-Server eine CURL -Anforderung an PayTM-Server um den Transaktionsstatus zu überprüfen.

6 . Auftragsstatus: Die Transaktion Status wird vom Backend empfangen und der entsprechende Auftragsstatus wird dem Benutzer angezeigt.

Das folgende Diagramm veranschaulicht den Kommunikationsfluss zwischen den einzelnen Parteien. Hier können Sie den Transaktionslebenszyklus detailliert sehen.

 paytm android integration php laravel flow

3. Integrieren des PayTM-Gateways

In einem realen Szenario müssen für die Erstellung einer E-Commerce-App die richtige Architektur und Sicherheitsvorkehrungen getroffen werden. Dieser Artikel soll den Ablauf so einfach wie möglich erklären. Also habe ich gebaut, was notwendig ist, um die Integration des Zahlungs-Gateways abzuschließen. Die Integration von PayTM (oder einem anderen Gateway) umfasst die folgenden Schritte:

3.1 . Registrieren Sie sich bei PayTM und erhalten Sie die erforderlichen API-Schlüssel .
3.2 Erstellen einer Backend-App mit dem erforderlichen Datenbankschema und der REST-API . Integration des PayTM Server SDK.
3.3 Integration des PayTM Mobile SDK in die Android / iOS App.

3.1 PayTM SandBox – Test API Details

Um mit PayTM zu beginnen, können Sie ein neues Konto registrieren und erhalten ein Testkonto zum Ausprobieren des Zahlungsgateways. Führen Sie die folgenden Schritte aus, um Ihre Sandbox-Anmeldeinformationen abzurufen.

1 . Gehen Sie zur PayTM-Entwicklerwebsite und führen Sie die erforderlichen Schritte aus, um ein neues Konto zu erstellen / sich in ein vorhandenes Konto einzuloggen.

2 . Navigieren Sie nach der Registrierung zu API-Tasten im linken Navigationsbereich.

3 . Sie können API-Details für Test und Produktion feststellen. Sobald die App in der Sandbox getestet wurde, können Sie sich an das PayTM-Team wenden, um die App in Betrieb zu nehmen.

 paytm-developer-test-api-keys "width =" 800 "height =" 700 "class =" aligncenter size-full wp -image-42347 "srcset =" https://www.androidhive.info/wp-content/uploads/2019/02/paytm-developer-test-api-keys.png 800w, https://www.androidhive.info /wp-content/uploads/2019/02/paytm-developer-test-api-keys-300x263.png 300w, https://www.androidhive.info/wp-content/uploads/2019/02/paytm-developer- test-api-keys-768x672.png 768w "sizes =" (maximale Breite: 800px) 100vw, 800px "/> <noscript><img src= package info.androidhive.paytmgateway.ui.paytm; android.content.Intent importieren; android.os.Bundle importieren; import android.support.v4.content.ContextCompat; import android.view.MenuItem; android.view.View importieren; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; android.widget.Toast importieren; import com.paytm.pgsdk.PaytmOrder; import com.paytm.pgsdk.PaytmPGService; import com.paytm.pgsdk.PaytmPaymentTransactionCallback; import com.wang.avi.AVLoadingIndicatorView; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import butterknife.BindView; Buttermesser importieren.ButterKnife; import butterknife.OnClick; import info.androidhive.paytmgateway.BuildConfig; import info.androidhive.paytmgateway.R; info.androidhive.paytmgateway.app.Constants importieren; import info.androidhive.paytmgateway.db.AppDatabase; import info.androidhive.paytmgateway.db.model.CartItem; import info.androidhive.paytmgateway.db.model.User; import info.androidhive.paytmgateway.networking.model.AppConfig; import info.androidhive.paytmgateway.networking.model.ChecksumResponse; import info.androidhive.paytmgateway.networking.model.Order; import info.androidhive.paytmgateway.networking.model.OrderItem; import info.androidhive.paytmgateway.networking.model.PrepareOrderRequest; import info.androidhive.paytmgateway.networking.model.PrepareOrderResponse; import info.androidhive.paytmgateway.ui.base.BaseActivity; info.androidhive.paytmgateway.ui.transactions.TransactionsActivity importieren; import io.realm.Realm; importieren retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; importieren timber.log.Timber; public class PayTMActivity erweitert BaseActivity {     @BindView (R.id.lbl_status)     TextView lblStatus;     @BindView (R.id.loader)     AVLoadingIndicatorView loader;     @BindView (R.id.icon_status)     ImageView iconStatus;     @BindView (R.id.status_message)     TextView statusMessage;     @BindView (R.id.title_status)     TextView responseTitle;     @BindView (R.id.btn_check_orders)     TextView btnCheckOrders;     @BindView (R.id.layout_order_placed)     LinearLayout layoutOrderPlaced;     privates Reich Reich;     private AppConfig appConfig;     privater Benutzer Benutzer;     / **      * Schritte zur Bestellabwicklung:      * 1. Rufen Sie den Server an, um die Bestellung vorzubereiten. Womit eine neue Bestellung in der Datenbank erstellt wird      * und gibt die eindeutige Bestellnummer zurück      *

     * 2. Sobald die Bestellnummer eingegangen ist, senden Sie die PayTM-Parameter an den Server, um die zu berechnen      * Checksum Hash      *

     * 3. Senden Sie die PayTM-Parameter zusammen mit dem Prüfsummen-Hash an das PayTM-Gateway      *

     * 4. Wenn die Zahlung abgeschlossen ist, senden Sie die Bestellnummer an den Server zurück, um die Bestätigung zu erhalten      * Transaktionsstatus      * /     @Override     protected void onCreate (Bundle savedInstanceState) {         super.onCreate (savedInstanceState);         setContentView (R.layout.activity_pay_tm);         ButterKnife.bind (this);         setToolbar ();         enableToolbarUpNavigation ();         getSupportActionBar (). setTitle (getString (R.string.title_preparing_order));         changeStatusBarColor ();         drin();     }     @Override     public int getLayoutId () {         return R.layout.activity_pay_tm;     }     private void init () {         realm = Realm.getDefaultInstance ();         realm.where (CartItem.class) .findAllAsync ()                 .addChangeListener (cartItems -> {                 });         user = AppDatabase.getUser ();         appConfig = realm.where (AppConfig.class) .findFirst ();         prepareOrder ();     }     private void setStatus (int message) {         lblStatus.setText (message);     }     / **      * SCHRITT 1: Senden Sie alle Artikel des Einkaufswagens an den Server und erhalten Sie die      * eindeutige Bestellnummer, die an PayTM gesendet werden muss      * /     private void prepareOrder () {         setStatus (R.string.msg_preparing_order);         List cartItems = realm.where (CartItem.class) .findAll ();         PrepareOrderRequest request = new PrepareOrderRequest ();         List orderItems = new ArrayList <> ();         für (CartItem cartItem: cartItems) {             OrderItem orderItem = new OrderItem ();             orderItem.productId = cartItem.product.id;             orderItem.quantity = cartItem.quantity;             orderItems.add (orderItem);         }         request.orderItems = orderItems;         getApi (). prepareOrder (request) .enqueue (neuer Callback () {             @Override             public void onResponse (Aufruf Aufruf, Antwort Antwort) {                 if (! response.isSuccessful ()) {                     handleUnknownError ();                     showOrderStatus (false);                     Rückkehr;                 }                 getChecksum (response.body ());             }             @Override             public void onFailure (Call call, Throwable t) {                 handleError (t);                 showOrderStatus (false);             }         });     }     / **      * SCHRITT 2:      * Senden Sie die Parameter an den Server, um die Prüfsumme zu generieren      * das muss an PayTM gesendet werden      * /     void getChecksum (PrepareOrderResponse-Antwort) {         setStatus (R.string.msg_fetching_checksum);         if (appConfig == null) {             Timber.e ("App config ist null! Kann die Bestellung nicht aufgeben. Dies sollte normalerweise nicht passieren");             // Benutzer zum Anmeldebildschirm navigieren             launchLogin (PayTMActivity.this);             Fertig();             Rückkehr;         }         Map paramMap = preparePayTmParams (Antwort);         Timber.d ("PayTm Params:% s", paramMap);         getApi (). getCheckSum (paramMap) .enqueue (neuer Callback () {             @Override             public void onResponse (Aufruf Aufruf, Antwort Antwort) {                 if (! response.isSuccessful ()) {                     Timber.e ("Netzwerkanruf fehlgeschlagen");                     handleUnknownError ();                     showOrderStatus (false);                     Rückkehr;                 }                 Timber.d ("Checksum Received:" + response.body (). Checksum);                 // Fügen Sie die Prüfsumme zur vorhandenen Parameterliste hinzu und senden Sie sie an PayTM                 paramMap.put ("CHECKSUMHASH", response.body (). checksum);                 placeOrder (paramMap);             }             @Override             public void onFailure (Call call, Throwable t) {                 handleError (t);                 showOrderStatus (false);             }         });     }     public Map preparePayTmParams (PrepareOrderResponse-Antwort) {         Map paramMap = new HashMap ();         paramMap.put ("CALLBACK_URL", String.format (BuildConfig.PAYTM_CALLBACK_URL, response.orderGatewayId));         paramMap.put ("CHANNEL_ID", appConfig.getChannel ());         paramMap.put ("CUST_ID", "CUSTOMER_" + user.id);         paramMap.put ("INDUSTRY_TYPE_ID", appConfig.getIndustryType ());         paramMap.put ("MID", appConfig.getMerchantId ());         paramMap.put ("WEBSITE", appConfig.getWebsite ());         paramMap.put ("ORDER_ID", response.orderGatewayId);         paramMap.put ("TXN_AMOUNT", response.amount);         return paramMap;     }     / **      * SCHRITT 3: Weiterleitung an das PayTM-Gateway mit den erforderlichen Parametern und der Prüfsumme      * Dies leitet zu PayTM Gateway weiter und gibt uns die PayTM-Transaktionsantwort      * /     public void placeOrder (Karte params) {         setStatus (R.string.msg_redirecting_to_paytm);         // Wahl zwischen PayTM-Inszenierung und Produktion         PaytmPGService pgService = BuildConfig.IS_PATM_STAGIN? PaytmPGService.getStagingService (): PaytmPGService.getProductionService ();         PaytmOrder Order = neue PaytmOrder (Parameter);         pgService.initialize (Order, null);         pgService.startPaymentTransaction (dies, wahr, wahr,                 new PaytmPaymentTransactionCallback () {                     @Override                     public void someUIErrorOccurred (String inErrorMessage) {                         Timber.e ("someUIErrorOccurred:% s", inErrorMessage);                         Fertig();                         // In der Payment Gateway-Aktivität ist ein Benutzeroberflächenfehler aufgetreten.                         // // Dies kann an der Initialisierung von Views in liegen                         // Payment Gateway-Aktivität oder möglicherweise aufgrund von //                         // initialisierung von webview. // Details zur Fehlermeldung                         // Der Fehler ist aufgetreten.                     }                     @Override                     public void onTransactionResponse (Bundle inResponse) {                         Timber.d ("PayTM Transaction Response:% s", inResponse.toString ());                         String orderId = inResponse.getString ("ORDERID");                         verifyTransactionStatus (orderId);                     }                     @Override                     public void networkNotAvailable () {// Wenn Netzwerk nicht                         Timber.e ("networkNotAvailable");                         Fertig();                         // verfügbar, dann das                         // Methode wird aufgerufen.                     }                     @Override                     public void clientAuthenticationFailed (String inErrorMessage) {                         Timber.e ("clientAuthenticationFailed:% s", inErrorMessage);                         Fertig();                         // Diese Methode wird aufgerufen, wenn die Clientauthentifizierung erfolgt                         // gescheitert. // Fehler können folgende Gründe haben //                         // 1. Serverfehler oder Ausfallzeit. // 2. Server kann nicht                         // Prüfsumme generieren oder Prüfsummenantwort ist nicht in                         // richtiges Format. // 3. Server konnte sich nicht authentifizieren                         // dieser Client. Das ist der Wert von payt_STATUS ist 2. //                         // Fehlermeldung beschreibt den Grund für den Fehler.                     }                     @Override                     public void onErrorLoadingWebPage (int iniErrorCode,                                                       String inErrorMessage, String inFailingUrl) {                         Timber.e ("onErrorLoadingWebPage:% d |% s |% s", iniErrorCode, inErrorMessage, inFailingUrl);                         Fertig();                     }                     @Override                     public void onBackPressedCancelTransaction () {                         Toast.makeText (PayTMActivity.this, "Zurück gedrückt. Transaktion abgebrochen", Toast.LENGTH_LONG) .show ();                         Fertig();                     }                     @Override                     public void onTransactionCancel (String inErrorMessage, Bundle inResponse) {                         Timber.e ("onTransactionCancel:% s |% s", inErrorMessage, inResponse);                         Fertig();                     }                 });     }     / **      * SCHRITT 4: Überprüfen des Transaktionsstatus nach Abschluss der PayTM-Transaktion      * Dies veranlasst den Aufruf von server (own) -> server (PayTM), um den Transaktionsstatus zu überprüfen      * /     private void verifyTransactionStatus (String orderId) {         setStatus (R.string.msg_verifying_status);         getApi (). checkTransactionStatus (orderId) .enqueue (neuer Callback () {             @Override             public void onResponse (Aufruf Aufruf, Antwort Antwort) {                 if (! response.isSuccessful ()) {                     Timber.e ("Netzwerkanruf fehlgeschlagen");                     handleUnknownError ();                     showOrderStatus (false);                     Rückkehr;                 }                 showOrderStatus (response.body (). status.equalsIgnoreCase (Constants.ORDER_STATUS_COMPLETED));             }             @Override             public void onFailure (Call call, Throwable t) {                 handleError (t);                 showOrderStatus (false);             }         });     }     / *      * Anzeigen des Auftragsstatus auf der Benutzeroberfläche. Dies schaltet die Benutzeroberfläche zwischen erfolgreichen und fehlgeschlagenen Fällen um      * * /     private void showOrderStatus (Boolean isSuccess) {         loader.setVisibility (View.GONE);         lblStatus.setVisibility (View.GONE);         if (isSuccess) {             iconStatus.setImageResource (R.drawable.baseline_check_black_48);             iconStatus.setColorFilter (ContextCompat.getColor (this, R.color.colorGreen));             responseTitle.setText (R.string.thank_you);             statusMessage.setText (R.string.msg_order_placed_successfully);             // Wenn die Bestellung erfolgreich aufgegeben wurde, löschen Sie den Warenkorb             AppDatabase.clearCart ();         } else {             iconStatus.setImageResource (R.drawable.baseline_close_black_48);             iconStatus.setColorFilter (ContextCompat.getColor (this, R.color.btn_remove_item));             responseTitle.setText (R.string.order_failed);             statusMessage.setText (R.string.msg_order_placed_failed);         }         layoutOrderPlaced.setVisibility (View.VISIBLE);     }     @OnClick (R.id.btn_check_orders)     void onOrdersClick () {         startActivity (neue Absicht (PayTMActivity.this, TransactionsActivity.class));         Fertig();     }     @Override     public boolean onOptionsItemSelected (Menüelement) {         if (item.getItemId () == android.R.id.home) {             Fertig();             return true;         }         return super.onOptionsItemSelected (item);     }     @Override     Geschützte Leere onDestroy () {         super.onDestroy ();         if (realm! = null) {             realm.removeAllChangeListeners ();             realm.close ();         }     } }

4. Testen der App

Nachdem Sie die PayTM-Integration abgeschlossen haben, können Sie Ihre App (oder die in diesem Artikel bereitgestellte App) mit den bereitgestellten Anmeldeinformationen für den Testmodus testen.

5. Referenzen

Nachfolgend finden Sie nützliche Links, die Sie bei der Arbeit an diesem Projekt bereithalten können.
1 . PayTM Android SDK-Dokumentation
2 . PayTM REST API-Dokumentation
3 . PayTM-Testmodus-Anmeldeinformationen

Ich hoffe, dieser Artikel hat den PayTM-Integrationsprozess vereinfacht. Wenn Sie Fragen / Vorschläge haben, posten Sie diese bitte im Kommentarbereich unten.

Happy Coding 🙂

Hi there! Ich bin Gründer bei androidhive und Programmierer. Meine Fähigkeiten umfassen Android, iOS, PHP, Ruby on Rails und vieles mehr. Wenn Sie eine Idee haben, die ich entwickeln soll? Reden wir: ravi@androidhive.info



About AndroidWeltEditor

Check Also

How to use AWS – a simple guide for beginners

Amazon Web Services (AWS) is Amazon’s powerful, market-leading solution for cloud computing. The platform offers …

Leave a Reply

Your email address will not be published. Required fields are marked *