1

ログイン後、ハッシュ値を生成していますが、「問題が発生しました!再試行してください」というエラーが引き続き発生します。

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();
}
4

1 に答える 1

0

コードで使用します:

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

そして後で:

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

おそらく唯一の問題ではありませんが、本当にこれらに 2 つの異なる値を使用したいですか (2 つの呼び出しの間で時間が変わる可能性があります)。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);
    }

}

これがどれだけ使えるか、そしてIDがとても長いかどうかはわかりません。好きなように自由に使用/変更してください。

また、何か大事なことを忘れていたのに、何も思い出せないのだろうか。

これのセキュリティ面は、4 秒以内に ID が単純な追加のようになるため、まだ非常に弱いですが、少なくとも 1、2、3... シリーズを生成していません。


いくつかの SDK ドキュメントが見つかりました。txnId の長さは 25 文字のように見えるため、接頭辞のみに 1 文字あります。または%07X、フォーマットを使用し、値を 0x0FFFFFFF でマスキングして、タイムスタンプを削減します。これにより、〜 34 年ごとに繰り返されます -> プレフィックスの 2 文字。または、カウンターを 32bintに変更しても、1秒あたり数千のトランザクションが予想される場合を除き、それでも十分なはずです->それにより8文字が削除されます。または、ID全体をbase32 / base64で短縮します(コンテンツに有効なアルファベットによって異なります)...

または何でも...これで十分な時間を費やしました。プロを雇う。

于 2016-11-10T15:34:55.343 に答える