pagseguro / pagseguro-sdk-java

Biblioteca de integração JAVA.
80 stars 60 forks source link

AuthenticatedHttpClient não inclui authorizationCode. #64

Open BrunoSilvaFreire opened 4 years ago

BrunoSilvaFreire commented 4 years ago

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 commented 4 years ago

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