【问题标题】:Paytm All in one SDK not working in release more or after publishing to Play storePaytm All in one SDK 在发布更多版本或发布到 Play 商店后无法正常工作
【发布时间】:2021-08-15 17:11:44
【问题描述】:

我已将 PAYTM ALL IN ONE SDK 集成到我的 Android 应用程序中。它在调试模式下工作正常,但在发布模式下它会抛出异常。我缺少一件小事,因为它在调试模式下工作得非常好,但是将其更改为释放它会引发异常。

存款活动

public class DepositActivity extends AppCompatActivity {

    private TextView mmbalance, mgateway, mtext_imp3;
    private DatabaseReference mmRef, mmtRef, mmbRef, mmcRef, mmcrRef, mmiRef, mmdRef, mmopRef, mmdbRef, yesRefty3, mmRefuc;
    DatabaseReference databaseReference, tdatabaseReference, yesRef, mmRefu, mmRefr;

    private ImageView mdep_back;

    public EditText mtodepo;

    private ConstraintLayout mcons_imp3;

    private String  TAG ="DepositActivity";
    private ProgressBar progressBar;
    private String midString="MY MERCHANT ID I HAVE HIDED", txnAmountString="", orderIdString="", txnTokenString="";
    private Integer ActivityRequestCode = 2;

    public CardView depobtn, depobtn2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_deposit);

        mtodepo=(EditText)findViewById(R.id.amountdepo);
        depobtn=(CardView) findViewById(R.id.depositbtn);
        depobtn2=(CardView) findViewById(R.id.depositbtn2);
        String mydep = mtodepo.getText().toString();

        mmbalance = (TextView) findViewById(R.id.dbalance);
        mgateway = (TextView) findViewById(R.id.gateway);

        mcons_imp3 = findViewById(R.id.cons_imp3);

        mtext_imp3 = findViewById(R.id.text_imp3);


        progressBar = (ProgressBar) findViewById(R.id.progressBar);
        Calendar c = Calendar.getInstance();
        SimpleDateFormat df = new SimpleDateFormat("ddMMyyyy");
        String date = df.format(c.getTime());
        Random rand = new Random();
        int min =1000, max= 9999;
// nextInt as provided by Random is exclusive of the top value so you need to add 1
        int randomNum = rand.nextInt((max - min) + 1) + min;
        orderIdString =  date+String.valueOf(randomNum);

        depobtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txnAmountString = mtodepo.getText().toString();
                String errors = "";
                if(orderIdString.equalsIgnoreCase("")){
                    errors ="Enter valid Order ID here\n";
                    Toast.makeText(DepositActivity.this, errors, Toast.LENGTH_SHORT).show();

                }else
                if(txnAmountString.equalsIgnoreCase("")){
                    errors ="Enter valid Amount here\n";
                    Toast.makeText(DepositActivity.this, errors, Toast.LENGTH_SHORT).show();

                }else{
                    int amountff = Math.round(Float.parseFloat(txnAmountString));

                    if (amountff <= 50000) {

                        if (amountff > 99) {

                            getToken();

                        } else {
                            Toast.makeText(DepositActivity.this, "Minimum amount > 100", Toast.LENGTH_SHORT).show();
                        }

                    } else {
                        Toast.makeText(DepositActivity.this, "Amount must be smaller than 50000", Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });
    }

    private  void getToken(){
        Log.e(TAG, " get token start");
        progressBar.setVisibility(View.VISIBLE);
        ServiceWrapper serviceWrapper = new ServiceWrapper(null);
        Call<Token_Res> call = serviceWrapper.getTokenCall("12345", midString, orderIdString, txnAmountString);
        call.enqueue(new Callback<Token_Res>() {
            @Override
            public void onResponse(Call<Token_Res> call, Response<Token_Res> response) {
                Log.e(TAG, " respo "+ response.isSuccessful() );
                progressBar.setVisibility(View.GONE);
                try {

                    if (response.isSuccessful() && response.body()!=null){
                        if (response.body().getBody().getTxnToken()!="") {
                            Log.e(TAG, " transaction token : "+response.body().getBody().getTxnToken());
                            startPaytmPayment(response.body().getBody().getTxnToken());
                           
                        }else {
                            Log.e(TAG, " Token status false");
                          
                        }
                    }
                }catch (Exception e){
                    Log.e(TAG, " error in Token Res "+e.toString());
                    
                }
            }

            @Override
            public void onFailure(Call<Token_Res> call, Throwable t) {
                progressBar.setVisibility(View.GONE);
                Log.e(TAG, " response error "+t.toString());
            }
        });
    }


    public void startPaytmPayment (String token){

        txnTokenString = token;
        // for test mode use it
        // String host = "https://securegw-stage.paytm.in/";
        // for production mode use it
        String host = "https://securegw.paytm.in/";
        String orderDetails = "MID: " + midString + ", OrderId: " + orderIdString + ", TxnToken: " + txnTokenString
                + ", Amount: " + txnAmountString;
        //Log.e(TAG, "order details "+ orderDetails);

        String callBackUrl = host + "theia/paytmCallback?ORDER_ID="+orderIdString;
        Log.e(TAG, " callback URL "+callBackUrl);
        PaytmOrder paytmOrder = new PaytmOrder(orderIdString, midString, txnTokenString, txnAmountString, callBackUrl);
        TransactionManager transactionManager = new TransactionManager(paytmOrder, new PaytmPaymentTransactionCallback(){
            @Override
            public void onTransactionResponse(Bundle bundle) {

            }

            @Override
            public void networkNotAvailable() {
                Log.e(TAG, "network not available ");
            }

            @Override
            public void onErrorProceed(String s) {
                Log.e(TAG, " onErrorProcess "+s.toString());
            }

            @Override
            public void clientAuthenticationFailed(String s) {
                Log.e(TAG, "Clientauth "+s);
            }

            @Override
            public void someUIErrorOccurred(String s) {
                Log.e(TAG, " UI error "+s);
            }

            @Override
            public void onErrorLoadingWebPage(int i, String s, String s1) {
                Log.e(TAG, " error loading web "+s+"--"+s1);
            }

            @Override
            public void onBackPressedCancelTransaction() {
                Log.e(TAG, "backPress ");
            }

            @Override
            public void onTransactionCancel(String s, Bundle bundle) {
                Log.e(TAG, " transaction cancel "+s);
            }
        });

        transactionManager.setShowPaymentUrl(host + "theia/api/v1/showPaymentPage");
        transactionManager.startTransaction(this, ActivityRequestCode);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.e(TAG ," result code "+resultCode);
        // -1 means successful  // 0 means failed
        // one error is - nativeSdkForMerchantMessage : networkError
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == ActivityRequestCode && data != null) {
            Bundle bundle = data.getExtras();
            if (bundle != null) {
                for (String key : bundle.keySet()) {
                    Log.e(TAG, key + " : " + (bundle.get(key) != null ? bundle.get(key) : "NULL"));
                }
            }
            /*Log.e(TAG, " data "+  data.getStringExtra("nativeSdkForMerchantMessage"));
            Log.e(TAG, " data response - "+data.getStringExtra("response"));*/

            Toast.makeText(DepositActivity.this, "Payment Cancelled", Toast.LENGTH_LONG).show();
/*
 data response - {"BANKNAME":"WALLET","BANKTXNID":"1395841115",
 "CHECKSUMHASH":"7jRCFIk6eRmrep+IhnmQrlrL43KSCSXrmMP5pH0hekXaaxjt3MEgd1N9mLtWyu4VwpWexHOILCTAhybOo5EVDmAEV33rg2VAS/p0PXdk\u003d",
 "CURRENCY":"INR","GATEWAYNAME":"WALLET","MID":"EAcR4116","ORDERID":"100620202152",
 "PAYMENTMODE":"PPI","RESPCODE":"01","RESPMSG":"Txn Success","STATUS":"TXN_SUCCESS",
 "TXNAMOUNT":"2.00","TXNDATE":"2020-06-10 16:57:45.0","TXNID":"202006101112128001101683631290118"}
  */
            /*Toast.makeText(this, data.getStringExtra("nativeSdkForMerchantMessage")
                    + data.getStringExtra("response"), Toast.LENGTH_SHORT).show();*/
        }else{
            /*Log.e(TAG, " payment failed");*/

            Toast.makeText(DepositActivity.this, "Payment Failed", Toast.LENGTH_LONG).show();
        }
    }

    public static boolean isConnectionAvailable(Context context) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivityManager != null) {
            NetworkInfo netInfo = connectivityManager.getActiveNetworkInfo();
            if (netInfo != null && netInfo.isConnected()
                    && netInfo.isConnectedOrConnecting()
                    && netInfo.isAvailable()) {
                return true;
            }
        }
        return false;
    }
}

ServiceWrapper

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.util.concurrent.TimeUnit;

import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Call;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class ServiceWrapper {

    private ServiceInterface mServiceInterface;

    public ServiceWrapper(Interceptor mInterceptorheader) {
        mServiceInterface = getRetrofit(mInterceptorheader).create(ServiceInterface.class);
    }

    public Retrofit getRetrofit(Interceptor mInterceptorheader) {
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient mOkHttpClient = null;
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.connectTimeout(1201, TimeUnit.SECONDS);
        builder.readTimeout(901, TimeUnit.SECONDS);

      if (BuildConfig.DEBUG) {
//            HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
            loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
            builder.addInterceptor(loggingInterceptor);
        }

        mOkHttpClient = builder.build();
        Gson gson = new GsonBuilder().setLenient().create();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://mywebsitei_i_have_hided.com/")
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(mOkHttpClient)
                .build();
        return retrofit;
    }

    public Call<Token_Res> getTokenCall(String code, String mid, String order_id, String amount) {
        return mServiceInterface.generateTokenCall(
                convertPlainString(code), convertPlainString(mid), convertPlainString(order_id)
                , convertPlainString(amount));
    }
    // convert aa param into plain text
    public RequestBody convertPlainString(String data){
        RequestBody plainString = RequestBody.create(MediaType.parse("text/plain"), data);
        return  plainString;
    }
}

【问题讨论】:

  • 您在 live paytm 中遇到了哪些异常?
  • 存款活动 > private void getToken() > catch (Exception e){ Log.e(TAG, "error in Token Res "+e.toString());这个。
  • Test 和 Live Paytm 都在调试模式下工作,但在发布版本中不工作
  • 你在这次捕获中得到了什么。 e.tostring 中有什么
  • 这是在 catch e.tostring - java.lang.NullPointerException: throw with null exception

标签: java android android-studio paytm


【解决方案1】:

这是因为新的 R8 代码混淆。您需要通过在 gradle.properties 文件中添加以下行来从您的项目中禁用它 -

 android.enableR8=false

您还需要在您的 proguard 规则文件中添加以下行 -

# Prevent R8 from leaving Data object members always null
-keepclassmembers,allowobfuscation class * {
@com.google.gson.annotations.SerializedName <fields>;
}

【讨论】:

  • 谢谢,但添加此解决方案后,付款失败或付款成功后显示“交易成功”。不付款显示“交易成功”。也请给我一个解决方案。
  • 如果它有效,请接受并支持答案,并为新错误添加新问题。
猜你喜欢
  • 2017-01-12
  • 2021-04-04
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多