package roomescape.payment.infrastructure.client import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder import org.springframework.boot.http.client.ClientHttpRequestFactorySettings import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.web.client.RestClient import java.nio.charset.StandardCharsets import java.time.Duration import java.util.* @Configuration @EnableConfigurationProperties(PaymentProperties::class) class PaymentConfig { @Bean fun tossPaymentClientBuilder( paymentProperties: PaymentProperties, ): RestClient.Builder { val settings: ClientHttpRequestFactorySettings = ClientHttpRequestFactorySettings.defaults().also { it.withReadTimeout(Duration.ofSeconds(paymentProperties.readTimeout.toLong())) it.withConnectTimeout(Duration.ofSeconds(paymentProperties.connectTimeout.toLong())) } val requestFactory = ClientHttpRequestFactoryBuilder.jdk().build(settings) return RestClient.builder() .baseUrl(paymentProperties.apiBaseUrl) .defaultHeader("Authorization", getAuthorizations(paymentProperties.confirmSecretKey)) .requestFactory(requestFactory) } private fun getAuthorizations(secretKey: String): String { val encodedSecretKey = Base64.getEncoder() .encodeToString("$secretKey:".toByteArray(StandardCharsets.UTF_8)) return "Basic $encodedSecretKey" } }