jdsdhp / enzona-payment-embedded

The Enzona Payment Embedded is a lightweight Kotlin library designed to simplify integration with the Enzona payment system in Android applications.
7 stars 1 forks source link

Flujo de pago #8

Closed cz9dev closed 2 months ago

cz9dev commented 3 months ago

Hola, en este ejemplo te muestro algo que he estado haciendo

binding.btnPaid.setOnClickListener {
            viewModel.creatingPaymentEnzona(listItem)
        }

viewModel.paymentR.observe(this){
            when (it){
                is ResultValue.Success -> {
                    binding.webViewEnzona.visibility = View.VISIBLE
                    binding.btnPaid.visibility = View.GONE

                    val webSettings = binding.webViewEnzona.settings
                    webSettings.javaScriptEnabled = true

                    // Estableciendo que continue si hay error en el certificado
                    binding.webViewEnzona.webViewClient = object : WebViewClient() {

                        override fun onReceivedSslError(
                            view: WebView,
                            handler: SslErrorHandler,
                            error: SslError
                        ) {
                            handler.proceed() // Ignore SSL certificate errors
                        }

                        override fun onPageStarted(view: WebView?, url: String, favicon: Bitmap?) {
                            super.onPageStarted(view, url, favicon)
                        }

                        override fun shouldOverrideUrlLoading(
                            view: WebView?,
                            url: String?
                        ): Boolean {
                            return false
                        }

                        override fun onPageFinished(view: WebView?, url: String?) {
                            super.onPageFinished(view, url)
                            Log.i("ENLACE", "onPageStarted() click en enlace: $url")
                            // manejando finalización de la carga de la página
                            if (url != null && url.contains("payment/return?transaction_uuid")) {                                
                                Toast.makeText(this@PaymentEnzonaActivity, "Pago completado con éxito", Toast.LENGTH_LONG).show()                                
                                binding.webViewEnzona.visibility = View.GONE
                            }
                        }
                    }
                    binding.webViewEnzona.loadUrl(it.data.links[0].href)
                }
                is ResultValue.Error -> Log.e("ENZONA ERROR", "Error al crear compra")
            }
            Log.i("ENZONA", it.toString())
        }

El tema es que no logro completar el pago, siempre llega fallido a enzona, tienes algún ejemplo o revizando este código ves algo.

muestra_enzona

Esta es la respuesta que llega a enzona

jdsdhp commented 3 months ago

Hola. Esto no tiene relación con la lib en cuestión. Por favor no hacer offtopic.

cz9dev commented 3 months ago

Disculpe pero si tiene relación con su lib, en la parte donde dice kotlin viewModel.creatingPaymentEnzona(listItem) llama a mi viewmodel que es donde trabajo con tu lib, disculpe si no la estoy utilizando correctamente, te muestro mi función en el viewmodel, de echo te mostrare todo mi view model y disculpe, si le escribo es por que estoy utilizando tu lib

import android.view.View
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.github.jdsdhp.enzona.payment.embedded.Enzona
import com.github.jdsdhp.enzona.payment.embedded.domain.model.CancelStatus
import com.github.jdsdhp.enzona.payment.embedded.domain.model.Item
import com.github.jdsdhp.enzona.payment.embedded.domain.model.Payment
import com.github.jdsdhp.enzona.payment.embedded.domain.model.Token
import com.github.jdsdhp.enzona.payment.embedded.util.ResultValue
import kotlinx.coroutines.launch

class PaymentViewModel: ViewModel() {
    var isLoading = MutableLiveData<Int>()
    var authenticationR = MutableLiveData<ResultValue<Token>>()
    var paymentR = MutableLiveData<ResultValue<Payment>>()

    /**
     * step 2
     * */
    fun authentication(){
        isLoading.postValue(View.VISIBLE)
        viewModelScope.launch {
            try {
                val authenticationResult: ResultValue<Token> = Enzona.getInstance().authenticate()
                authenticationR.postValue(authenticationResult)
                isLoading.postValue(View.GONE)
            } catch (e: Exception){
                isLoading.postValue(View.GONE)
                e.printStackTrace()
            }
        }
    }

    /**
     * step 3
     * */
    fun creatingPaymentEnzona(listItem: List<Item>){
        isLoading.postValue(View.VISIBLE)
        viewModelScope.launch {
            try {
                val paymentResult: ResultValue<Payment> = Enzona.getInstance().createPayment(
                    discount = 0.0,
                    shipping = 0.0,
                    tip = 0.0,
                    buyerIdentityCode = "", //no se si es esto lo que va
                    cancelUrl = "https://www.enzona.net/payment/cancel",
                    currency = "CUP",
                    description = "",
                    invoiceNumber = "",
                    merchantOpId = 1,
                    returnUrl = "https://www.enzona.net/payment/return",
                    terminalId = "",
                    items = listItem
                )
                paymentR.postValue(paymentResult)
                isLoading.postValue(View.GONE)
            } catch (e: Exception) {
                isLoading.postValue(View.GONE)
                e.printStackTrace()
            }
        }
    }

    /**
     * step 4
     * */
    fun gettingPaymentDetailsEnzona(){
        isLoading.postValue(View.VISIBLE)
        viewModelScope.launch {
            try {
                val paymentResult: ResultValue<Payment> = Enzona.getInstance().getPaymentDetails("transaction_uuid")
                paymentR.postValue(paymentResult)
                isLoading.postValue(View.GONE)
            } catch (e:Exception){
                isLoading.postValue(View.GONE)
                e.printStackTrace()
            }
        }
    }

    /**
     * step 4
     **/
    fun cancelingPaymentEnzona(){
        isLoading.postValue(View.VISIBLE)
        viewModelScope.launch {
            try {
                val paymentResult: ResultValue<CancelStatus> = Enzona.getInstance().cancelPayment("transaction_uuid")
                isLoading.postValue(View.GONE)
            } catch (e:Exception){
                isLoading.postValue(View.GONE)
                e.printStackTrace()
            }
        }
    }

    /**
     * step 5
     * */
    fun completingPaymentEnzona(){
        isLoading.postValue(View.VISIBLE)
        viewModelScope.launch {
            try {
                val completeResult: ResultValue<Payment> = Enzona.getInstance().completePayment("transaction_uuid")
                paymentR.postValue(completeResult)
                isLoading.postValue(View.GONE)
            } catch (e:Exception){
                isLoading.postValue(View.GONE)
                e.printStackTrace()
            }
        }
    }

Una ves que llamo a la función creatingPaymentEnzona que esta llama a la de tu lib no he logrado completar el pago. Una ves mas me disculpo por la pregunta, es que estoy utilizando tu lib y como yo puede que a otros le haya sucedido por temas experiencia u otro. Saludos y en espera de su ayuda

jdsdhp commented 3 months ago

@cz9dev utilizando la app de ejemplo que tiene este repo funciona con tus datos o tampoco?

cz9dev commented 3 months ago

Deja probar tu ejemplo, de veras no lo intente con tu ejemplo, fui directo por incluir tu lib y tratar de utilizarla

cz9dev commented 2 months ago

Hola @jdsdhp, disculpa que abra el hilo nuevamente pero bueno es por buen motivo, encontré mi problema y lo comparto para que a otros le sea mas fácil, en ocasiones no vemos detalles y aquí un ejemplo:

fun completingPaymentEnzona(){
        isLoading.postValue(View.VISIBLE)
        viewModelScope.launch {
            try {
                val completeResult: ResultValue<Payment> = Enzona.getInstance().completePayment("transaction_uuid")
                paymentR.postValue(completeResult)
                isLoading.postValue(View.GONE)
            } catch (e:Exception){
                isLoading.postValue(View.GONE)
                e.printStackTrace()
            }
        }
    }

Este era mi función para completar el pago, que debía ser llamada si la función de crear el pago retornaba Success, pues el problema era que en esta linea kt val completeResult: ResultValue<Payment> = Enzona.getInstance().completePayment("transaction_uuid") nunca entraba transaction_uuid sino un String "transaction_uuid", a continuación el ejemplo correcto de mi función:

fun completingPaymentEnzona(transactionUUID: String){
        isLoading.postValue(View.VISIBLE)
        viewModelScope.launch {
            try {
                //val completeResult: ResultValue<Payment> = Enzona.getInstance().completePayment("transaction_uuid")
                val completeResult: ResultValue<Payment> = Enzona.getInstance().completePayment(transactionUUID)
                completePayment.postValue(completeResult)
                isLoading.postValue(View.GONE)
            } catch (e:Exception){
                isLoading.postValue(View.GONE)
                e.printStackTrace()
            }
        }
    }

Espero le sea de ayuda este hilo a otros