2016-11-10 2 views
1

Nach der Anmeldung generiert es einen Hash-Wert, aber immer noch geben Fehler "Ein Problem trat auf! Versuchen Sie es erneut".payUmoney Integration gibt einen Fehler

PayUmoneySdkInitilizer.PaymentParam.Builder builder = 
    new PayUmoneySdkInitilizer.PaymentParam.Builder(); 

builder.setAmount(10.0) 
     .setTnxId("0nf7" + System.currentTimeMillis()) 
     .setPhone(<My phone>) 
     .setProductName("product_name") 
     .setFirstName(<My Name>) 
     .setEmail(<My email>) 
     .setsUrl("https://www.payumoney.com/mobileapp/payumoney/success.php") 
     .setfUrl("https://www.payumoney.com/mobileapp/payumoney/failure.php") 
     .setUdf1("").setUdf2("").setUdf3("").setUdf4("").setUdf5("") 
     .setIsDebug(false) 
     .setKey(<mykey>) 
     .setMerchantId(<my debug merchant id>); 

String tnxId="0nf7" + System.currentTimeMillis(); 
PayUmoneySdkInitilizer.PaymentParam paymentParam = builder.build(); 
String hashSequence = "<...>|"+tnxId+"|10.0|product_name|<My name>|<My email>|||||||||||salt"; 
String serverCalculatedHash= hashCal("SHA-512", hashSequence); 
Toast.makeText(getApplicationContext(), 
       serverCalculatedHash, Toast.LENGTH_SHORT).show(); 
paymentParam.setMerchantHash(serverCalculatedHash); 
// calculateServerSideHashAndInitiatePayment(paymentParam); 
PayUmoneySdkInitilizer.startPaymentActivityForResult(TrayActivity.this, paymentParam); 

public static String hashCal(String type, String str) { 
    byte[] hashseq = str.getBytes(); 
    StringBuffer hexString = new StringBuffer(); 
    try { 
     MessageDigest algorithm = MessageDigest.getInstance(type); 
     algorithm.reset(); 
     algorithm.update(hashseq); 
     byte messageDigest[] = algorithm.digest(); 
     for (int i = 0; i<messageDigest.length; i++) { 
      String hex = Integer.toHexString(0xFF &messageDigest[i]); 
      if (hex.length() == 1) { hexString.append("0"); } 
      hexString.append(hex); 
     } 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } return hexString.toString(); 
} 
+0

Was ist der Fehler? –

+0

Es ist ein Fehler aufgetreten .. versuchen Sie es später erneut –

Antwort

0

Sie verwenden im Code:

.setTnxId("0nf7" + System.currentTimeMillis()) 

Und dann später:

String tnxId="0nf7" + System.currentTimeMillis(); 

Wahrscheinlich nicht das einzige Problem, aber tun Sie wirklich verwenden möchten zwei verschiedene Werte für diese (die Zeit kann sich zwischen den beiden Anrufen ändern)? Wolltest du nicht in beiden Fällen das gleiche tnxId?


TransactionIdProvider.java:

import java.util.Locale; 

public class TransactionIdProvider { 

    private final static String DEFAULT_PREFIX = "ID"; 

    // Convenient prime number for incrementing the counter 
    private final static long ID_ADD = 0xF0AD; // "f*ck off and die" 

    // 64b counter with non-trivial start value 
    private static long idCounter = 0x0101F00DDEADBEEFL; 

    /** 
    * Returns ID consisting of prefix string and 64b counter interleaved 
    * with 32b per-4s-timestamp. 
    * 
    * May produce identical ID (collision) when: 
    * 1) class is reloaded within 4s 
    * (to fix: serialize "idCounter" upon shutdown/restart of VM, or 
    * modify prefix per start of VM) 
    * 2) more than 2^64 IDs are requested within 4s (no fix, unexpected) 
    * 3) more than 2^64 IDs are requested after cca. 550 years. 
    * (no fix, unexpected) 
    * 4) more than one static instance of TransactionIdProvider is used 
    * (two or more VMs running the app) (to fix put different prefix in 
    * every VM/server running this) 
    * 
    * Length of returned ID is prefix.length() + 24 alphanumeric symbols. 
    */ 
    public static synchronized String getNewId(final String prefix) { 
     idCounter += ID_ADD; // increment counter 
     // get 32b timestamp per ~4s (millis/4096) (good for ~550 years) 
     final int timeStamp = (int)(System.currentTimeMillis()>>12); 
     final int idPart1 = (int)(idCounter>>32); 
     final int idPart2 = (int)(idCounter); 
     return String.format(Locale.US, "%s%08X%08X%08X", 
          prefix, idPart1, timeStamp, idPart2); 
    } 

    public static String getNewId() { 
     return getNewId(DEFAULT_PREFIX); 
    } 

} 

nicht sicher, wie viel nutzbare dieses ist, und wenn die ID so lang sein kann. Fühlen Sie sich frei, es beliebig zu benutzen/zu modifizieren.

Auch ich frage mich, ob ich nicht etwas Wichtiges vergessen habe, aber nichts erinnern kann.

Der Sicherheitsaspekt dieser ist immer noch ziemlich schwach, da innerhalb von 4s die ID wird wie einfache Addition, aber zumindest produziert es nicht 1, 2, 3 ... Serie.


Haben einige SDK-Dokumentation gefunden, sieht aus wie txnId 25 Zeichen lang sein können, so haben Sie 1 Zeichen für Präfix nur. Oder reduzieren Sie den Zeitstempel mit %07X im Format und maskieren Wert mit 0x0FFFFFFF, das würde es alle ~ 34 Jahre wiederholen -> 2 Buchstaben für Präfix. Oder ändern Sie den Zähler auf 32b int, sollte noch mehr als genug sein, es sei denn, Sie erwarten Tausende von Transaktionen pro Sekunde -> das würde 8 Zeichen entfernen. Oder base32/base64 um die ganze ID zu verkürzen (hängt davon ab, welches Alphabet für den Inhalt legal ist) ...

Oder was auch immer ... schon genug Zeit damit verbracht. Stellen Sie einen Profi ein.

+0

Ja möchte ich .. eigentlich ist dies das erste Mal, ich versuche für Zahlung Gateway –

+0

@AdityaReja so verschieben Sie die 'String tnxId' oben, um es nur einmal zu definieren, dann verwenden Sie die gleichen Wert (pro Transaktion) überall, wo Transaktions-ID erforderlich ist. Eigentlich ist "timeMillis" als "Suffix" wahrscheinlich auch eine schlechte Idee, wenn Ihre Lösung von zwei Personen zur selben Zeit benutzt wird, werden sie eine Transaktion mit der gleichen ID erstellen. Sie sollten wahrscheinlich einige synchronisierte statische Zähler in separaten Klassen erstellen und getNewTxId() einmal pro Transaktion aufrufen. Sie möchten dennoch etwas Zeit oder Hash in den Prozess einfügen, um einfache 1,2,3,4,5 ... IDs aus Sicherheitsgründen zu vermeiden. – Ped7g

+0

@AdityaReja BTW, Ich weiß nicht "PayUmoney SDK", also habe ich keine Ahnung, was dieser Code tut und wo weitere Fehler sein können, aber das Problem mit Transaktions-IDs ist allgemein, so dass ich nur diesen einen beantworte. – Ped7g

Verwandte Themen