Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AuthenticatedHttpClient não inclui authorizationCode. #64

Open
BrunoSilvaFreire opened this issue Apr 13, 2020 · 1 comment
Open

AuthenticatedHttpClient não inclui authorizationCode. #64

BrunoSilvaFreire opened this issue Apr 13, 2020 · 1 comment

Comments

@BrunoSilvaFreire
Copy link

Comportamento esperado

A biblioteca deveria fornecer uma maneira de informar o authorizationCode para realizar checkouts via aplicação, como este documento informa.

Comportamento atual

O AuthenticatedHttpClient armazena o credentialQuery como um campo final, e nunca leva em consideração o fornecimento do parametro.

Ambiente (produção, sandbox)

Testado em sandbox, mas deve ser reproduzível em produção

Passos para reproduzir o bug

  1. Criar uma aplicação que tenha autorização para criar checkouts
  2. Tentar criar um checkout utilizando uma credencial de aplicação
  3. Pedido irá falhar por não incluir o código de autorização

Descrição Detalhada

O CheckoutsResource necessita que um authorizationCode seja fornecido pelo HttpClient, entretando o AuthenticatedHttpClient nunca informa nenhum outro paremetro alem de appId e appToken.

Possível solução

Utilizar um segundo HttpClient como wrapper para adicionar o parametro caso esteja disponível
Exemplo feito utilizando kotlin

// AuthorizationKeyPatcherClient.kt
package com.neocube.pagseguro

import br.com.uol.pagseguro.api.exception.PagSeguroLibException
import br.com.uol.pagseguro.api.http.*
import java.io.IOException
import java.io.UnsupportedEncodingException
import java.net.URI
import java.net.URISyntaxException

class AuthorizationKeyPatcherClient(
        private val httpClient: HttpClient
) : HttpClient {
    var authorizationCode: String? = null


    @Throws(IOException::class)
    override fun execute(
            method: HttpMethod?,
            targetURL: String,
            headers: Map<String, String>?,
            body: HttpRequestBody?
    ): HttpResponse {
        return try {
            httpClient.execute(method, appendParameters(targetURL), headers, body)
        } catch (e: URISyntaxException) {
            throw PagSeguroLibException(e)
        }
    }

    @Throws(IOException::class)
    override fun executeXML(method: HttpMethod, targetURL: String, headers: Map<String, String>?,
                            body: HttpXMLRequestBody?): HttpResponse {
        return try {
            httpClient.executeXML(method, appendParameters(targetURL), headers, body)
        } catch (e: URISyntaxException) {
            throw PagSeguroLibException(e)
        }
    }

    @Throws(IOException::class)
    override fun executeJson(method: HttpMethod, targetURL: String, headers: Map<String, String>,
                             body: HttpJsonRequestBody): HttpResponse {
        return try {
            httpClient.executeJson(method, appendParameters(targetURL), headers, body)
        } catch (e: URISyntaxException) {
            throw PagSeguroLibException(e)
        }
    }

    @Throws(UnsupportedEncodingException::class, URISyntaxException::class)
    private fun appendParameters(uri: String): String {
        val oldUri = URI(uri)
        val code = authorizationCode
        var newQuery = oldUri.query
        if (newQuery == null) {
            newQuery = ""
        } else if (code != null) {
            newQuery += "&"
        }
        if (code != null) {
            newQuery += "authorizationCode=$code"
        }
        return URI(oldUri.scheme, oldUri.authority, oldUri.path, newQuery,
                oldUri.fragment).toString()
    }
}
// Main
private val patcher: AuthorizationKeyPatcherClient = AuthorizationKeyPatcherClient(JSEHttpClient())
private val pagSeguro: PagSeguro = PagSeguro.instance(SimpleLoggerFactory(), patcher, credentials, PagSeguroEnv.SANDBOX)
// Após conseguir o authorizationCode
patcher.authorizationCode = candidate.code
@ioxua
Copy link

ioxua commented Jul 24, 2020

Fala Bruno!
Não mantenho o repositório, mas conseguiu resolver seu problema? Sabe me dizer se o PR #59 resolve seu problema?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants