diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt index 294ee97..8e7c901 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt @@ -1,7 +1,12 @@ package kr.co.vividnext.sodalive.can.charge import com.fasterxml.jackson.databind.ObjectMapper +import com.google.api.client.http.javanet.NetHttpTransport +import com.google.api.client.json.gson.GsonFactory import com.google.api.services.androidpublisher.AndroidPublisher +import com.google.api.services.androidpublisher.AndroidPublisherScopes +import com.google.auth.http.HttpCredentialsAdapter +import com.google.auth.oauth2.GoogleCredentials import kr.co.bootpay.Bootpay import kr.co.vividnext.sodalive.can.CanRepository import kr.co.vividnext.sodalive.can.charge.event.ChargeSpringEvent @@ -24,6 +29,7 @@ import org.springframework.http.HttpHeaders import org.springframework.security.core.userdetails.User import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional +import java.io.FileInputStream @Service @Transactional(readOnly = true) @@ -37,8 +43,6 @@ class ChargeService( private val okHttpClient: OkHttpClient, private val applicationEventPublisher: ApplicationEventPublisher, - private val androidPublisher: AndroidPublisher, - @Value("\${bootpay.application-id}") private val bootpayApplicationId: String, @Value("\${bootpay.private-key}") @@ -46,7 +50,9 @@ class ChargeService( @Value("\${apple.iap-verify-sandbox-url}") private val appleInAppVerifySandBoxUrl: String, @Value("\${apple.iap-verify-url}") - private val appleInAppVerifyUrl: String + private val appleInAppVerifyUrl: String, + @Value("\${firebase.secret-key-path}") + private val secretKeyPath: String ) { @Transactional @@ -209,11 +215,11 @@ class ChargeService( ?: throw SodaException("로그인 정보를 확인해주세요.") if (charge.payment!!.paymentGateway == PaymentGateway.GOOGLE_IAP) { - val response = androidPublisher.purchases().products() + val response = getAndroidPublisher().purchases().products() .get("kr.co.vividnext.sodalive", request.productId, request.purchaseToken) - .execute() + .execute() ?: throw SodaException("결제정보에 오류가 있습니다.") - if (response.purchaseState == 0) { + if (response.purchaseState == 0 && charge.payment?.status == PaymentStatus.REQUEST) { charge.payment?.receiptId = response.purchaseToken charge.payment?.method = "구글(인 앱 결제)" charge.payment?.status = PaymentStatus.COMPLETE @@ -298,4 +304,16 @@ class ChargeService( throw SodaException("결제를 완료하지 못했습니다.") } } + + private fun getAndroidPublisher(): AndroidPublisher { + val jsonFactory = GsonFactory.getDefaultInstance() + val httpTransport = NetHttpTransport() + + val credential = GoogleCredentials.fromStream(FileInputStream(secretKeyPath)) + .createScoped(listOf(AndroidPublisherScopes.ANDROIDPUBLISHER)) + + return AndroidPublisher.Builder(httpTransport, jsonFactory, HttpCredentialsAdapter(credential)) + .setApplicationName("소다라이브") + .build() + } }