본인인증 추가

This commit is contained in:
klaus 2023-07-28 17:39:19 +09:00
parent 8e0a5ccc91
commit bf7a7d69a2
9 changed files with 167 additions and 4 deletions

View File

@ -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"
}

View File

@ -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(

View File

@ -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>(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

View File

@ -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<String?>()
val toastLiveData: LiveData<String?>
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("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
}
)
)
}
}

View File

@ -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()
}
}

View File

@ -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<ApiResponse<Any>>
}

View File

@ -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)
}

View File

@ -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
)

View File

@ -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,
)
}