From bf7a7d69a2a28ae6af148178de30a0269b72aa08 Mon Sep 17 00:00:00 2001 From: klaus Date: Fri, 28 Jul 2023 17:39:19 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B3=B8=EC=9D=B8=EC=9D=B8=EC=A6=9D=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 5 ++ .../java/kr/co/vividnext/sodalive/di/AppDI.kt | 6 +- .../sodalive/mypage/MyPageFragment.kt | 14 ++++- .../sodalive/mypage/MyPageViewModel.kt | 41 ++++++++++++- .../co/vividnext/sodalive/mypage/auth/Auth.kt | 60 +++++++++++++++++++ .../vividnext/sodalive/mypage/auth/AuthApi.kt | 15 +++++ .../sodalive/mypage/auth/AuthRepository.kt | 5 ++ .../sodalive/mypage/auth/AuthVerifyRequest.kt | 8 +++ .../sodalive/mypage/auth/BootpayResponse.kt | 17 ++++++ 9 files changed, 167 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/mypage/auth/Auth.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/mypage/auth/AuthApi.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/mypage/auth/AuthRepository.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/mypage/auth/AuthVerifyRequest.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/mypage/auth/BootpayResponse.kt diff --git a/app/build.gradle b/app/build.gradle index dda3c75..9d8c574 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -49,6 +49,7 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' buildConfigField 'String', 'BASE_URL', '"https://api.sodalive.net"' + buildConfigField 'String', 'BOOTPAY_APP_ID', '"64c35be1d25985001dc50c87"' } debug { @@ -57,6 +58,7 @@ android { applicationIdSuffix '.debug' buildConfigField 'String', 'BASE_URL', '"https://test-api.sodalive.net"' + buildConfigField 'String', 'BOOTPAY_APP_ID', '"6242a7772701800023f68b2e"' } } compileOptions { @@ -126,4 +128,7 @@ dependencies { implementation 'com.google.firebase:firebase-analytics-ktx' implementation 'com.google.firebase:firebase-messaging-ktx' implementation 'com.google.firebase:firebase-config-ktx' + + // bootpay + implementation "io.github.bootpay:android:4.3.4" } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt b/app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt index 0593086..f71409c 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/di/AppDI.kt @@ -11,6 +11,8 @@ import kr.co.vividnext.sodalive.live.recommend.LiveRecommendApi import kr.co.vividnext.sodalive.live.recommend.LiveRecommendRepository import kr.co.vividnext.sodalive.main.MainViewModel import kr.co.vividnext.sodalive.mypage.MyPageViewModel +import kr.co.vividnext.sodalive.mypage.auth.AuthApi +import kr.co.vividnext.sodalive.mypage.auth.AuthRepository import kr.co.vividnext.sodalive.network.TokenAuthenticator import kr.co.vividnext.sodalive.settings.event.EventApi import kr.co.vividnext.sodalive.settings.event.EventRepository @@ -69,6 +71,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) { single { ApiBuilder().build(get(), LiveApi::class.java) } single { ApiBuilder().build(get(), EventApi::class.java) } single { ApiBuilder().build(get(), LiveRecommendApi::class.java) } + single { ApiBuilder().build(get(), AuthApi::class.java) } } private val viewModelModule = module { @@ -78,7 +81,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) { viewModel { FindPasswordViewModel(get()) } viewModel { MainViewModel(get()) } viewModel { LiveViewModel(get(), get(), get()) } - viewModel { MyPageViewModel(get()) } + viewModel { MyPageViewModel(get(), get()) } } private val repositoryModule = module { @@ -87,6 +90,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) { factory { LiveRepository(get()) } factory { EventRepository(get()) } factory { LiveRecommendRepository(get()) } + factory { AuthRepository(get()) } } private val moduleList = listOf( diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt index 9737c68..a2ecde9 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageFragment.kt @@ -9,12 +9,16 @@ import android.webkit.URLUtil import android.widget.Toast import coil.load import coil.transform.CircleCropTransformation +import com.google.gson.Gson import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.base.BaseFragment import kr.co.vividnext.sodalive.common.LoadingDialog import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.databinding.FragmentMyBinding import kr.co.vividnext.sodalive.extensions.moneyFormat +import kr.co.vividnext.sodalive.mypage.auth.Auth +import kr.co.vividnext.sodalive.mypage.auth.AuthVerifyRequest +import kr.co.vividnext.sodalive.mypage.auth.BootpayResponse import kr.co.vividnext.sodalive.settings.notification.MemberRole import org.koin.android.ext.android.inject @@ -50,7 +54,15 @@ class MyPageFragment : BaseFragment(FragmentMyBinding::inflat binding.rlServiceCenter.setOnClickListener {} - binding.tvAuth.setOnClickListener {} + binding.tvAuth.setOnClickListener { + Auth.auth(requireActivity(), requireContext()) { + val bootpayResponse = Gson().fromJson(it, BootpayResponse::class.java) + val request = AuthVerifyRequest(receiptId = bootpayResponse.data.receiptId) + requireActivity().runOnUiThread { + viewModel.authVerify(request) + } + } + } if (SharedPreferenceManager.role == MemberRole.CREATOR.name) { binding.tvMyChannel.visibility = View.VISIBLE diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageViewModel.kt index 2714089..2293c52 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/MyPageViewModel.kt @@ -7,11 +7,14 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.schedulers.Schedulers import kr.co.vividnext.sodalive.base.BaseViewModel import kr.co.vividnext.sodalive.common.SharedPreferenceManager +import kr.co.vividnext.sodalive.mypage.auth.AuthRepository +import kr.co.vividnext.sodalive.mypage.auth.AuthVerifyRequest import kr.co.vividnext.sodalive.user.UserRepository class MyPageViewModel( - private val userRepository: UserRepository -): BaseViewModel() { + private val userRepository: UserRepository, + private val authRepository: AuthRepository +) : BaseViewModel() { private val _toastLiveData = MutableLiveData() val toastLiveData: LiveData get() = _toastLiveData @@ -56,4 +59,38 @@ class MyPageViewModel( ) ) } + + fun authVerify(request: AuthVerifyRequest) { + if (!_isLoading.value!!) { + _isLoading.value = true + } + + compositeDisposable.add( + authRepository.verify(request, "Bearer ${SharedPreferenceManager.token}") + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { + if (it.success) { + getUserInfo() + } else { + if (it.message != null) { + _toastLiveData.postValue(it.message) + } else { + _toastLiveData.postValue( + "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요." + ) + } + + _isLoading.value = false + } + }, + { + _isLoading.value = false + it.message?.let { message -> Logger.e(message) } + _toastLiveData.postValue("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + } + ) + ) + } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/auth/Auth.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/auth/Auth.kt new file mode 100644 index 0000000..39d8be3 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/auth/Auth.kt @@ -0,0 +1,60 @@ +package kr.co.vividnext.sodalive.mypage.auth + +import android.app.Activity +import android.content.Context +import android.widget.Toast +import com.orhanobut.logger.Logger +import kr.co.bootpay.android.Bootpay +import kr.co.bootpay.android.events.BootpayEventListener +import kr.co.bootpay.android.models.Payload +import kr.co.vividnext.sodalive.BuildConfig +import kr.co.vividnext.sodalive.common.SharedPreferenceManager +import java.util.Date + +object Auth { + fun auth(activity: Activity, context: Context, verifyAuth: (String) -> Unit) { + val authenticationId = "soda_${SharedPreferenceManager.userId}_" + + "${SharedPreferenceManager.nickname}_${Date().time}" + + val payload = Payload() + .setApplicationId(BuildConfig.BOOTPAY_APP_ID) + .setOrderName("본인인증") + .setPg("다날") + .setMethod("본인인증") + .setAuthenticationId(authenticationId) + .setPrice(0.toDouble()) + + Bootpay.init(activity, context) + .setPayload(payload) + .setEventListener(object : BootpayEventListener { + override fun onCancel(data: String) { + Logger.e("onCancel: $data") + } + + override fun onError(data: String) { + Logger.e("onError: $data") + Toast.makeText(activity, data, Toast.LENGTH_LONG).show() + } + + override fun onClose() { + Logger.e("onClose") + Bootpay.removePaymentWindow() + } + + override fun onIssued(data: String) { + Logger.e("onIssued: $data") + } + + override fun onConfirm(data: String): Boolean { + Logger.e("onConfirm: $data") + return true + } + + override fun onDone(data: String) { + Logger.e("onDone: $data") + verifyAuth(data) + Bootpay.removePaymentWindow() + } + }).requestAuthentication() + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/auth/AuthApi.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/auth/AuthApi.kt new file mode 100644 index 0000000..81d083d --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/auth/AuthApi.kt @@ -0,0 +1,15 @@ +package kr.co.vividnext.sodalive.mypage.auth + +import io.reactivex.rxjava3.core.Single +import kr.co.vividnext.sodalive.common.ApiResponse +import retrofit2.http.Body +import retrofit2.http.Header +import retrofit2.http.POST + +interface AuthApi { + @POST("/auth") + fun verify( + @Body request: AuthVerifyRequest, + @Header("Authorization") authHeader: String + ): Single> +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/auth/AuthRepository.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/auth/AuthRepository.kt new file mode 100644 index 0000000..221c85e --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/auth/AuthRepository.kt @@ -0,0 +1,5 @@ +package kr.co.vividnext.sodalive.mypage.auth + +class AuthRepository(private val api: AuthApi) { + fun verify(request: AuthVerifyRequest, token: String) = api.verify(request, token) +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/auth/AuthVerifyRequest.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/auth/AuthVerifyRequest.kt new file mode 100644 index 0000000..fa1c8d3 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/auth/AuthVerifyRequest.kt @@ -0,0 +1,8 @@ +package kr.co.vividnext.sodalive.mypage.auth + +import com.google.gson.annotations.SerializedName + +data class AuthVerifyRequest( + @SerializedName("receipt_id") + val receiptId: String +) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/auth/BootpayResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/auth/BootpayResponse.kt new file mode 100644 index 0000000..cd26f4d --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/auth/BootpayResponse.kt @@ -0,0 +1,17 @@ +package kr.co.vividnext.sodalive.mypage.auth + +import com.google.gson.annotations.SerializedName + +data class BootpayResponse( + @SerializedName("event") + val event: String, + @SerializedName("data") + val data: BootpayResponseData +) { + data class BootpayResponseData( + @SerializedName("receipt_id") + val receiptId: String, + @SerializedName("order_id") + val orderId: String, + ) +}