본인인증 추가
This commit is contained in:
parent
8e0a5ccc91
commit
bf7a7d69a2
|
@ -49,6 +49,7 @@ android {
|
||||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
|
||||||
buildConfigField 'String', 'BASE_URL', '"https://api.sodalive.net"'
|
buildConfigField 'String', 'BASE_URL', '"https://api.sodalive.net"'
|
||||||
|
buildConfigField 'String', 'BOOTPAY_APP_ID', '"64c35be1d25985001dc50c87"'
|
||||||
}
|
}
|
||||||
|
|
||||||
debug {
|
debug {
|
||||||
|
@ -57,6 +58,7 @@ android {
|
||||||
applicationIdSuffix '.debug'
|
applicationIdSuffix '.debug'
|
||||||
|
|
||||||
buildConfigField 'String', 'BASE_URL', '"https://test-api.sodalive.net"'
|
buildConfigField 'String', 'BASE_URL', '"https://test-api.sodalive.net"'
|
||||||
|
buildConfigField 'String', 'BOOTPAY_APP_ID', '"6242a7772701800023f68b2e"'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
compileOptions {
|
compileOptions {
|
||||||
|
@ -126,4 +128,7 @@ dependencies {
|
||||||
implementation 'com.google.firebase:firebase-analytics-ktx'
|
implementation 'com.google.firebase:firebase-analytics-ktx'
|
||||||
implementation 'com.google.firebase:firebase-messaging-ktx'
|
implementation 'com.google.firebase:firebase-messaging-ktx'
|
||||||
implementation 'com.google.firebase:firebase-config-ktx'
|
implementation 'com.google.firebase:firebase-config-ktx'
|
||||||
|
|
||||||
|
// bootpay
|
||||||
|
implementation "io.github.bootpay:android:4.3.4"
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.live.recommend.LiveRecommendRepository
|
||||||
import kr.co.vividnext.sodalive.main.MainViewModel
|
import kr.co.vividnext.sodalive.main.MainViewModel
|
||||||
import kr.co.vividnext.sodalive.mypage.MyPageViewModel
|
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.network.TokenAuthenticator
|
||||||
import kr.co.vividnext.sodalive.settings.event.EventApi
|
import kr.co.vividnext.sodalive.settings.event.EventApi
|
||||||
import kr.co.vividnext.sodalive.settings.event.EventRepository
|
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(), LiveApi::class.java) }
|
||||||
single { ApiBuilder().build(get(), EventApi::class.java) }
|
single { ApiBuilder().build(get(), EventApi::class.java) }
|
||||||
single { ApiBuilder().build(get(), LiveRecommendApi::class.java) }
|
single { ApiBuilder().build(get(), LiveRecommendApi::class.java) }
|
||||||
|
single { ApiBuilder().build(get(), AuthApi::class.java) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private val viewModelModule = module {
|
private val viewModelModule = module {
|
||||||
|
@ -78,7 +81,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) {
|
||||||
viewModel { FindPasswordViewModel(get()) }
|
viewModel { FindPasswordViewModel(get()) }
|
||||||
viewModel { MainViewModel(get()) }
|
viewModel { MainViewModel(get()) }
|
||||||
viewModel { LiveViewModel(get(), get(), get()) }
|
viewModel { LiveViewModel(get(), get(), get()) }
|
||||||
viewModel { MyPageViewModel(get()) }
|
viewModel { MyPageViewModel(get(), get()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private val repositoryModule = module {
|
private val repositoryModule = module {
|
||||||
|
@ -87,6 +90,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) {
|
||||||
factory { LiveRepository(get()) }
|
factory { LiveRepository(get()) }
|
||||||
factory { EventRepository(get()) }
|
factory { EventRepository(get()) }
|
||||||
factory { LiveRecommendRepository(get()) }
|
factory { LiveRecommendRepository(get()) }
|
||||||
|
factory { AuthRepository(get()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private val moduleList = listOf(
|
private val moduleList = listOf(
|
||||||
|
|
|
@ -9,12 +9,16 @@ import android.webkit.URLUtil
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import coil.load
|
import coil.load
|
||||||
import coil.transform.CircleCropTransformation
|
import coil.transform.CircleCropTransformation
|
||||||
|
import com.google.gson.Gson
|
||||||
import kr.co.vividnext.sodalive.R
|
import kr.co.vividnext.sodalive.R
|
||||||
import kr.co.vividnext.sodalive.base.BaseFragment
|
import kr.co.vividnext.sodalive.base.BaseFragment
|
||||||
import kr.co.vividnext.sodalive.common.LoadingDialog
|
import kr.co.vividnext.sodalive.common.LoadingDialog
|
||||||
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
|
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
|
||||||
import kr.co.vividnext.sodalive.databinding.FragmentMyBinding
|
import kr.co.vividnext.sodalive.databinding.FragmentMyBinding
|
||||||
import kr.co.vividnext.sodalive.extensions.moneyFormat
|
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 kr.co.vividnext.sodalive.settings.notification.MemberRole
|
||||||
import org.koin.android.ext.android.inject
|
import org.koin.android.ext.android.inject
|
||||||
|
|
||||||
|
@ -50,7 +54,15 @@ class MyPageFragment : BaseFragment<FragmentMyBinding>(FragmentMyBinding::inflat
|
||||||
|
|
||||||
binding.rlServiceCenter.setOnClickListener {}
|
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) {
|
if (SharedPreferenceManager.role == MemberRole.CREATOR.name) {
|
||||||
binding.tvMyChannel.visibility = View.VISIBLE
|
binding.tvMyChannel.visibility = View.VISIBLE
|
||||||
|
|
|
@ -7,11 +7,14 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
||||||
import io.reactivex.rxjava3.schedulers.Schedulers
|
import io.reactivex.rxjava3.schedulers.Schedulers
|
||||||
import kr.co.vividnext.sodalive.base.BaseViewModel
|
import kr.co.vividnext.sodalive.base.BaseViewModel
|
||||||
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
|
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
|
import kr.co.vividnext.sodalive.user.UserRepository
|
||||||
|
|
||||||
class MyPageViewModel(
|
class MyPageViewModel(
|
||||||
private val userRepository: UserRepository
|
private val userRepository: UserRepository,
|
||||||
): BaseViewModel() {
|
private val authRepository: AuthRepository
|
||||||
|
) : BaseViewModel() {
|
||||||
private val _toastLiveData = MutableLiveData<String?>()
|
private val _toastLiveData = MutableLiveData<String?>()
|
||||||
val toastLiveData: LiveData<String?>
|
val toastLiveData: LiveData<String?>
|
||||||
get() = _toastLiveData
|
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("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.")
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
}
|
||||||
|
}
|
|
@ -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>>
|
||||||
|
}
|
|
@ -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)
|
||||||
|
}
|
|
@ -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
|
||||||
|
)
|
|
@ -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,
|
||||||
|
)
|
||||||
|
}
|
Loading…
Reference in New Issue