pagseguro-sdk-java
pagseguro-sdk-java copied to clipboard
AuthenticatedHttpClient não inclui authorizationCode.
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
- Criar uma aplicação que tenha autorização para criar checkouts
- Tentar criar um checkout utilizando uma credencial de aplicação
- 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
Fala Bruno! Não mantenho o repositório, mas conseguiu resolver seu problema? Sabe me dizer se o PR #59 resolve seu problema?