首页 > 解决方案 > 通过tools-> Kotlin -> Show Kotlin Bytecode将Kotlin代码反编译成Java代码出错

问题描述

尝试将 Kotlin 文件转换为 Java 时,出现此错误。我检查了代码,它没有错误并且运行良好。但是当我尝试反编译时,它会显示此错误。我尝试过使缓存无效/重新启动和清理/重建等,但没有任何效果。我正在使用 kotlin 版本 1.4.31 和 gradle 版本 4.2.1

在此处输入图像描述

org.jetbrains.kotlin.idea.caches.resolve.KotlinIdeaResolutionException: Kotlin resolution encountered a problem while analyzing KtNameReferenceExpression
    at org.jetbrains.kotlin.idea.caches.resolve.ResolutionFacadeWithDebugInfo.analyze(ResolutionFacadeWithDebugInfo.kt:45)
    at org.jetbrains.kotlin.idea.resolve.ResolutionFacade$DefaultImpls.analyze$default(ResolutionFacade.kt:26)
    at org.jetbrains.kotlin.idea.core.util.InlineAnalysisUtillKt$analyzeElementWithInline$1.visitExpression(inlineAnalysisUtill.kt:64)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitExpression(KtVisitorVoid.java:659)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitExpression(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtVisitor.visitReferenceExpression(KtVisitor.java:198)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitReferenceExpression(KtVisitorVoid.java:185)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitReferenceExpression(KtVisitorVoid.java:683)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitReferenceExpression(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtVisitor.visitSimpleNameExpression(KtVisitor.java:194)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitSimpleNameExpression(KtVisitorVoid.java:181)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitSimpleNameExpression(KtVisitorVoid.java:677)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitSimpleNameExpression(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtNameReferenceExpression.accept(KtNameReferenceExpression.kt:59)
    at org.jetbrains.kotlin.psi.KtElementImplStub.accept(KtElementImplStub.java:60)
    at com.intellij.psi.impl.PsiElementBase.acceptChildren(PsiElementBase.java:69)
    at org.jetbrains.kotlin.psi.KtTreeVisitorVoid.visitElement(KtTreeVisitorVoid.java:25)
    at org.jetbrains.kotlin.psi.KtVisitor.visitKtElement(KtVisitor.java:24)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:25)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:447)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtVisitor.visitTypeElement(KtVisitor.java:370)
    at org.jetbrains.kotlin.psi.KtVisitor.visitUserType(KtVisitor.java:374)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitUserType(KtVisitorVoid.java:357)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitUserType(KtVisitorVoid.java:929)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitUserType(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtUserType.accept(KtUserType.java:42)
    at org.jetbrains.kotlin.psi.KtElementImplStub.accept(KtElementImplStub.java:60)
    at com.intellij.psi.impl.PsiElementBase.acceptChildren(PsiElementBase.java:69)
    at org.jetbrains.kotlin.psi.KtTreeVisitorVoid.visitElement(KtTreeVisitorVoid.java:25)
    at org.jetbrains.kotlin.psi.KtVisitor.visitKtElement(KtVisitor.java:24)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:25)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:447)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtVisitor.visitTypeReference(KtVisitor.java:170)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitTypeReference(KtVisitorVoid.java:157)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitTypeReference(KtVisitorVoid.java:641)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitTypeReference(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtTypeReference.accept(KtTypeReference.kt:38)
    at org.jetbrains.kotlin.psi.KtElementImplStub.accept(KtElementImplStub.java:60)
    at com.intellij.psi.impl.PsiElementBase.acceptChildren(PsiElementBase.java:69)
    at org.jetbrains.kotlin.psi.KtTreeVisitorVoid.visitElement(KtTreeVisitorVoid.java:25)
    at org.jetbrains.kotlin.psi.KtVisitor.visitKtElement(KtVisitor.java:24)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:25)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:447)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtVisitor.visitConstructorCalleeExpression(KtVisitor.java:118)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitConstructorCalleeExpression(KtVisitorVoid.java:105)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitConstructorCalleeExpression(KtVisitorVoid.java:561)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitConstructorCalleeExpression(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtConstructorCalleeExpression.accept(KtConstructorCalleeExpression.java:36)
    at org.jetbrains.kotlin.psi.KtElementImplStub.accept(KtElementImplStub.java:60)
    at com.intellij.psi.impl.PsiElementBase.acceptChildren(PsiElementBase.java:69)
    at org.jetbrains.kotlin.psi.KtTreeVisitorVoid.visitElement(KtTreeVisitorVoid.java:25)
    at org.jetbrains.kotlin.psi.KtVisitor.visitKtElement(KtVisitor.java:24)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:25)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:447)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtVisitor.visitSuperTypeListEntry(KtVisitor.java:146)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitSuperTypeListEntry(KtVisitorVoid.java:133)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitSuperTypeListEntry(KtVisitorVoid.java:603)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitSuperTypeListEntry(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtVisitor.visitSuperTypeCallEntry(KtVisitor.java:154)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitSuperTypeCallEntry(KtVisitorVoid.java:141)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitSuperTypeCallEntry(KtVisitorVoid.java:617)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitSuperTypeCallEntry(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtSuperTypeCallEntry.accept(KtSuperTypeCallEntry.java:40)
    at org.jetbrains.kotlin.psi.KtElementImplStub.accept(KtElementImplStub.java:60)
    at com.intellij.psi.impl.PsiElementBase.acceptChildren(PsiElementBase.java:69)
    at org.jetbrains.kotlin.psi.KtTreeVisitorVoid.visitElement(KtTreeVisitorVoid.java:25)
    at org.jetbrains.kotlin.psi.KtVisitor.visitKtElement(KtVisitor.java:24)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:25)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:447)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtVisitor.visitSuperTypeList(KtVisitor.java:142)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitSuperTypeList(KtVisitorVoid.java:129)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitSuperTypeList(KtVisitorVoid.java:597)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitSuperTypeList(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtSuperTypeList.accept(KtSuperTypeList.java:47)
    at org.jetbrains.kotlin.psi.KtElementImplStub.accept(KtElementImplStub.java:60)
    at com.intellij.psi.impl.PsiElementBase.acceptChildren(PsiElementBase.java:69)
    at org.jetbrains.kotlin.psi.KtTreeVisitorVoid.visitElement(KtTreeVisitorVoid.java:25)
    at org.jetbrains.kotlin.psi.KtVisitor.visitKtElement(KtVisitor.java:24)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:25)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:447)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtElement(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtVisitor.visitExpression(KtVisitor.java:182)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitExpression(KtVisitorVoid.java:169)
    at org.jetbrains.kotlin.idea.core.util.InlineAnalysisUtillKt$analyzeElementWithInline$1.visitExpression(inlineAnalysisUtill.kt:62)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitExpression(KtVisitorVoid.java:659)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitExpression(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtVisitor.visitDeclaration(KtVisitor.java:29)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitDeclaration(KtVisitorVoid.java:29)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitDeclaration(KtVisitorVoid.java:453)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitDeclaration(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtVisitor.visitNamedDeclaration(KtVisitor.java:398)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitNamedDeclaration(KtVisitorVoid.java:381)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitNamedDeclaration(KtVisitorVoid.java:965)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitNamedDeclaration(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtVisitor.visitClassOrObject(KtVisitor.java:41)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitClassOrObject(KtVisitorVoid.java:37)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitClassOrObject(KtVisitorVoid.java:465)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitClassOrObject(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtVisitor.visitClass(KtVisitor.java:33)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitClass(KtVisitorVoid.java:33)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitClass(KtVisitorVoid.java:459)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitClass(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtClass.accept(KtClass.kt:20)
    at org.jetbrains.kotlin.psi.KtElementImplStub.accept(KtElementImplStub.java:60)
    at com.intellij.psi.impl.source.tree.SharedImplUtil.acceptChildren(SharedImplUtil.java:185)
    at com.intellij.psi.impl.source.PsiFileImpl.acceptChildren(PsiFileImpl.java:753)
    at org.jetbrains.kotlin.psi.KtTreeVisitorVoid.visitElement(KtTreeVisitorVoid.java:25)
    at com.intellij.psi.PsiElementVisitor.visitFile(PsiElementVisitor.java:35)
    at org.jetbrains.kotlin.psi.KtVisitor.visitKtFile(KtVisitor.java:73)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtFile(KtVisitorVoid.java:69)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtFile(KtVisitorVoid.java:513)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitKtFile(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtFile.accept(KtFile.kt:243)
    at org.jetbrains.kotlin.psi.KtFile.accept(KtFile.kt:230)
    at org.jetbrains.kotlin.idea.core.util.InlineAnalysisUtillKt.analyzeElementWithInline(inlineAnalysisUtill.kt:60)
    at org.jetbrains.kotlin.idea.core.util.InlineAnalysisUtillKt.analyzeInlinedFunctions(inlineAnalysisUtill.kt:25)
    at org.jetbrains.kotlin.idea.core.KotlinCompilerIde.compile(KotlinCompilerIde.kt:109)
    at org.jetbrains.kotlin.idea.internal.KotlinBytecodeToolWindow$Companion.compileSingleFile(KotlinBytecodeToolWindow.kt:272)
    at org.jetbrains.kotlin.idea.internal.KotlinBytecodeToolWindow$Companion.getBytecodeForFile(KotlinBytecodeToolWindow.kt:235)
    at org.jetbrains.kotlin.idea.internal.KotlinBytecodeToolWindow$UpdateBytecodeToolWindowTask.processRequest(KotlinBytecodeToolWindow.kt:111)
    at org.jetbrains.kotlin.idea.internal.KotlinBytecodeToolWindow$UpdateBytecodeToolWindowTask.processRequest(KotlinBytecodeToolWindow.kt:60)
    at org.jetbrains.kotlin.idea.util.LongRunningReadTask$1$1.run(LongRunningReadTask.java:115)
    at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:846)
    at org.jetbrains.kotlin.idea.util.LongRunningReadTask.lambda$runWithWriteActionPriority$0(LongRunningReadTask.java:235)
    at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:170)

这是我需要转换的文件:

package com.payu.sampleapp

import android.app.AlertDialog
import android.os.Bundle
import android.os.SystemClock
import android.text.TextUtils
import android.util.Log
import android.view.View
import android.webkit.WebView
import android.widget.ArrayAdapter
import android.widget.CompoundButton
import android.widget.RadioGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.snackbar.Snackbar
import com.payu.base.models.*
import com.payu.checkoutpro.PayUCheckoutPro
import com.payu.checkoutpro.models.PayUCheckoutProConfig
import com.payu.checkoutpro.utils.PayUCheckoutProConstants
import com.payu.checkoutpro.utils.PayUCheckoutProConstants.CP_HASH_NAME
import com.payu.checkoutpro.utils.PayUCheckoutProConstants.CP_HASH_STRING
import com.payu.sampleapp.databinding.ActivityMainBinding
import com.payu.ui.model.listeners.PayUCheckoutProListener
import com.payu.ui.model.listeners.PayUHashGenerationListener
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.layout_si_details.*

class MainActivity : AppCompatActivity() {

    private val email: String = "snooze@payu.in"
    private val phone = "9999999999"
    private val merchantName = "RH Group"
    private val surl = "https://payuresponse.firebaseapp.com/success"
    private val furl = "https://payuresponse.firebaseapp.com/failure"
    private val amount = "1.0"

    //Test Key and Salt
    private val testKey = "IUIaFM"
    private val testSalt = "67njRYSI"
    private val merchantAccessKey = "E5ABOXOWAAZNXB6JEF5Z"
    private val merchantSecretKey = "e425e539233044146a2d185a346978794afd7c66"


    //Prod Key and Salt
    private val prodKey = "0MQaQP"
    private val prodSalt = "7tVMWdl6"

    private lateinit var binding: ActivityMainBinding

    // variable to track event time
    private var mLastClickTime: Long = 0
    private var reviewOrderAdapter: ReviewOrderRecyclerViewAdapter? = null
    private var billingCycle = arrayOf(
        "DAILY",
        "WEEKLY",
        "MONTHLY",
        "YEARLY",
        "ONCE",
        "ADHOC"
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        initializeSIView()
        setInitalData()
        initListeners()
    }

    private fun initializeSIView() {
        switch_si_on_off.setOnCheckedChangeListener { buttonView, isChecked -> if(isChecked)
        { layout_si_details.visibility = View.VISIBLE }
        else { layout_si_details.visibility = View.GONE }
        }

        val adapter: ArrayAdapter<*> = ArrayAdapter<Any?>(
            this,
            android.R.layout.simple_spinner_item,
            billingCycle
        )
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
        et_billingCycle_value.adapter = adapter
    }

    private fun setInitalData() {
        updateProdEnvDetails()
        binding.etSurl.setText(surl)
        binding.etFurl.setText(furl)
        binding.etMerchantName.setText(merchantName)
        binding.etPhone.setText(phone)
        binding.etAmount.setText(amount)
        binding.etUserCredential.setText("${binding.etKey.text}:$email")
        binding.etSurePayCount.setText("0")
    }

    private fun initListeners() {
        binding.radioGrpEnv.setOnCheckedChangeListener { radioGroup: RadioGroup, i: Int ->
            when (i) {
                R.id.radioBtnTest -> updateTestEnvDetails()
                R.id.radioBtnProduction -> updateProdEnvDetails()
                else -> updateTestEnvDetails()
            }
        }

        binding.switchEnableReviewOrder.setOnCheckedChangeListener { compoundButton: CompoundButton, b: Boolean ->
            if (b) showReviewOrderView() else hideReviewOrderView()
        }

        binding.btnAddItem.setOnClickListener { reviewOrderAdapter?.addRow() }
    }

    private fun hideReviewOrderView() {
        binding.rlReviewOrder.visibility = View.GONE
        reviewOrderAdapter = null
    }

    private fun showReviewOrderView() {
        binding.rlReviewOrder.visibility = View.VISIBLE
        reviewOrderAdapter = ReviewOrderRecyclerViewAdapter()
        binding.rvReviewOrder.layoutManager = LinearLayoutManager(this)
        binding.rvReviewOrder.adapter = reviewOrderAdapter
    }

    private fun updateTestEnvDetails() {
        //For testing
        binding.etKey.setText(testKey)
        binding.etSalt.setText(testSalt)
        binding.etMerchantAccessKey.setText(merchantAccessKey)
    }

    private fun updateProdEnvDetails() {
        //For Production
        binding.etKey.setText(prodKey)
        binding.etSalt.setText(prodSalt)
        binding.etMerchantAccessKey.setText(merchantAccessKey)
    }

    fun startPayment(view: View) {
        // Preventing multiple clicks, using threshold of 1 second
        if (SystemClock.elapsedRealtime() - mLastClickTime < 1000) {
            return
        }
        mLastClickTime = SystemClock.elapsedRealtime()

        val paymentParams = preparePayUBizParams()
        initUiSdk(paymentParams)
    }

    fun preparePayUBizParams(): PayUPaymentParams {
        val vasForMobileSdkHash = HashGenerationUtils.generateHashFromSDK(
            "${binding.etKey.text}|${PayUCheckoutProConstants.CP_VAS_FOR_MOBILE_SDK}|${PayUCheckoutProConstants.CP_DEFAULT}|",
            binding.etSalt.text.toString()
        )
        val paymenRelatedDetailsHash = HashGenerationUtils.generateHashFromSDK(
            "${binding.etKey.text}|${PayUCheckoutProConstants.CP_PAYMENT_RELATED_DETAILS_FOR_MOBILE_SDK}|${binding.etUserCredential.text}|",
            binding.etSalt.text.toString()
        )

        val additionalParamsMap: HashMap<String, Any?> = HashMap()
        additionalParamsMap[PayUCheckoutProConstants.CP_UDF1] = "udf1"
        additionalParamsMap[PayUCheckoutProConstants.CP_UDF2] = "udf2"
        additionalParamsMap[PayUCheckoutProConstants.CP_UDF3] = "udf3"
        additionalParamsMap[PayUCheckoutProConstants.CP_UDF4] = "udf4"
        additionalParamsMap[PayUCheckoutProConstants.CP_UDF5] = "udf5"

        //Below params should be passed only when integrating Multi-currency support
        //TODO Please pass your own Merchant Access Key below as provided by your Key Account Manager at PayU.
        // Merchant Access Key used here is only for testing purpose.
//        additionalParamsMap[PayUCheckoutProConstants.CP_MERCHANT_ACCESS_KEY] = binding.etMerchantAccessKey.text.toString()

        //Below hashes are static hashes and can be calculated and passed in additional params
        additionalParamsMap[PayUCheckoutProConstants.CP_VAS_FOR_MOBILE_SDK] = vasForMobileSdkHash
        additionalParamsMap[PayUCheckoutProConstants.CP_PAYMENT_RELATED_DETAILS_FOR_MOBILE_SDK] =
            paymenRelatedDetailsHash

        var siDetails: PayUSIParams? =null
        if(switch_si_on_off.isChecked) {
            siDetails  = PayUSIParams.Builder()
                .setIsFreeTrial(sp_free_trial.isChecked)
                .setBillingAmount(et_billingAmount_value.text.toString())
                .setBillingCycle(PayUBillingCycle.valueOf(et_billingCycle_value.selectedItem.toString()))
                .setBillingInterval(et_billingInterval_value.text.toString().toInt())
                .setPaymentStartDate(et_paymentStartDate_value.text.toString())
                .setPaymentEndDate(et_paymentEndDate_value.text.toString())
                .setRemarks(et_remarks_value.text.toString())
                .build()
        }

        return PayUPaymentParams.Builder().setAmount(binding.etAmount.text.toString())
            .setIsProduction(binding.radioBtnProduction.isChecked)
            .setKey(binding.etKey.text.toString())
            .setProductInfo("Macbook Pro")
            .setPhone(binding.etPhone.text.toString())
            .setTransactionId(System.currentTimeMillis().toString())
            .setFirstName("Abc")
            .setEmail(email)
            .setSurl(binding.etSurl.text.toString())
            .setFurl(binding.etFurl.text.toString())
            .setUserCredential(binding.etUserCredential.text.toString())
            .setAdditionalParams(additionalParamsMap)
            .setPayUSIParams(siDetails)
            .build()
    }

    private fun initUiSdk(payUPaymentParams: PayUPaymentParams) {
        PayUCheckoutPro.open(
            this,
            payUPaymentParams,
            getCheckoutProConfig(),
            object : PayUCheckoutProListener {

                override fun onPaymentSuccess(response: Any) {
                    processResponse(response)
                }

                override fun onPaymentFailure(response: Any) {
                    processResponse(response)
                }

                override fun onPaymentCancel(isTxnInitiated: Boolean) {
                    showSnackBar(resources.getString(R.string.transaction_cancelled_by_user))
                }

                override fun onError(errorResponse: ErrorResponse) {

                    val errorMessage: String
                    if (errorResponse != null && errorResponse.errorMessage != null && errorResponse.errorMessage!!.isNotEmpty())
                        errorMessage = errorResponse.errorMessage!!
                    else
                        errorMessage = resources.getString(R.string.some_error_occurred)
                    showSnackBar(errorMessage)
                }

                override fun generateHash(
                    map: HashMap<String, String?>,
                    hashGenerationListener: PayUHashGenerationListener
                ) {
                    if (map.containsKey(CP_HASH_STRING)
                        && map.containsKey(CP_HASH_STRING) != null
                        && map.containsKey(CP_HASH_NAME)
                        && map.containsKey(CP_HASH_NAME) != null
                    ) {

                        val hashData = map[CP_HASH_STRING]
                        val hashName = map[CP_HASH_NAME]

                        var hash: String? = null

                        //Below hash should be calculated only when integrating Multi-currency support. If not integrating MCP
                        // then no need to have this if check.
                        if (hashName.equals(PayUCheckoutProConstants.CP_LOOKUP_API_HASH, ignoreCase = true)){

                            //Calculate HmacSHA1 hash using the hashData and merchant secret key
                            hash = HashGenerationUtils.generateHashFromSDK(
                                hashData!!,
                                binding.etSalt.text.toString(),
                                merchantSecretKey
                            )
                        } else {
                            //calculate SDH-512 hash using hashData and salt
                            hash = HashGenerationUtils.generateHashFromSDK(
                                hashData!!,
                                binding.etSalt.text.toString()
                            )
                        }

                        if (!TextUtils.isEmpty(hash)) {
                            val hashMap: HashMap<String, String?> = HashMap()
                            hashMap[hashName!!] = hash!!
                            hashGenerationListener.onHashGenerated(hashMap)
                        }
                    }
                }

                override fun setWebViewProperties(webView: WebView?, bank: Any?) {
                }
            })
    }

    private fun getCheckoutProConfig(): PayUCheckoutProConfig {
        val checkoutProConfig = PayUCheckoutProConfig()
        checkoutProConfig.paymentModesOrder = getCheckoutOrderList()
        checkoutProConfig.offerDetails = getOfferDetailsList()
        checkoutProConfig.showCbToolbar = !binding.switchHideCbToolBar.isChecked
        checkoutProConfig.autoSelectOtp = binding.switchAutoSelectOtp.isChecked
        checkoutProConfig.autoApprove = binding.switchAutoApprove.isChecked
        checkoutProConfig.surePayCount = binding.etSurePayCount.text.toString().toInt()
        checkoutProConfig.cartDetails = reviewOrderAdapter?.getOrderDetailsList()
        checkoutProConfig.showExitConfirmationOnPaymentScreen =
            !binding.switchDiableCBDialog.isChecked
        checkoutProConfig.showExitConfirmationOnCheckoutScreen =
            !binding.switchDiableUiDialog.isChecked
        checkoutProConfig.merchantName = binding.etMerchantName.text.toString()
        checkoutProConfig.merchantLogo = R.drawable.merchant_logo
        return checkoutProConfig
    }

    private fun getOfferDetailsList(): ArrayList<PayUOfferDetails> {
        val offerDetails = ArrayList<PayUOfferDetails>()
        offerDetails.add(PayUOfferDetails().also {
            it.offerTitle = " Instant discount of Rs.2"
            it.offerDescription = "Get Instant dicount of Rs.2 on all Credit and Debit card transactions"
            it.offerKey = "OfferKey@9227"
            it.offerPaymentTypes = ArrayList<PaymentType>().also {
                it.add(PaymentType.CARD)
            }
        })
        offerDetails.add(PayUOfferDetails().also {
            it.offerTitle = " Instant discount of Rs.2"
            it.offerDescription = "Get Instant dicount of Rs.2 on all NetBanking transactions"
            it.offerKey = "TestOffer100@9229"
            it.offerPaymentTypes = ArrayList<PaymentType>().also {
                it.add(PaymentType.NB)
            }
        })

        return offerDetails
    }

    private fun getCheckoutOrderList(): ArrayList<PaymentMode> {
        val checkoutOrderList = ArrayList<PaymentMode>()
        if (binding.switchShowGooglePay.isChecked) checkoutOrderList.add(
            PaymentMode(
                PaymentType.UPI,
                PayUCheckoutProConstants.CP_GOOGLE_PAY
            )
        )
        if (binding.switchShowPhonePe.isChecked) checkoutOrderList.add(
            PaymentMode(
                PaymentType.WALLET,
                PayUCheckoutProConstants.CP_PHONEPE
            )
        )
        if (binding.switchShowPaytm.isChecked) checkoutOrderList.add(
            PaymentMode(
                PaymentType.WALLET,
                PayUCheckoutProConstants.CP_PAYTM
            )
        )
        return checkoutOrderList
    }

    private fun showSnackBar(message: String) {
        Snackbar.make(binding.clMain, message, Snackbar.LENGTH_LONG).show()
    }

    private fun processResponse(response: Any) {
        response as HashMap<*, *>
        Log.d(
            BaseApiLayerConstants.SDK_TAG,
            "payuResponse ; > " + response[PayUCheckoutProConstants.CP_PAYU_RESPONSE]
                    + ", merchantResponse : > " + response[PayUCheckoutProConstants.CP_MERCHANT_RESPONSE]
        )

        AlertDialog.Builder(this, R.style.Theme_AppCompat_Light_Dialog_Alert)
            .setCancelable(false)
            .setMessage(
                "Payu's Data : " + response.get(PayUCheckoutProConstants.CP_PAYU_RESPONSE) + "\n\n\n Merchant's Data: " + response.get(
                    PayUCheckoutProConstants.CP_MERCHANT_RESPONSE
                )
            )
            .setPositiveButton(
                android.R.string.ok
            ) { dialog, cancelButton -> dialog.dismiss() }.show()
    }
}

标签: javaandroid-studiokotlindecompilingpayu

解决方案


推荐阅读