[Android/연동방법] SMS 본인인증 연동 (with iamport, 아임포트) (2)
Android/연동 방법

[Android/연동방법] SMS 본인인증 연동 (with iamport, 아임포트) (2)


📌 Android SMS 본인 인증 유저의 정보 얻어오기

 

📕 감잡기

단순한 성공과 실패의 본인 인증 결과만이 아닌, 본인 인증에 성공한 유저의 정보를 가져오고 싶다면 

아임포트에서 제공하는 rest api를 통하여 받아와야 합니다.

 

이는 

 

https://api.iamport.kr/users/getToken 로의 POST 요청으로 access_token을 받아오고,

https://api.iamport.kr/certifications/imp_xxxxxxxxxx 로의 GET 요청으로 유저 프로필을 받는

 

2단계로 가능합니다.

 

 

✉️ Full 예제 확인!

 

📗 개발 방법

/users/getToken

API 호출에 필요한 변수: imp_key, imp_secret

 

imp_key와 imp_secret은 아임포트 관리자 페이지에서 얻을 수 있는 값 입니다.

 

/certifications/{imp_uid}

API 호출에 필요한 변수: (Header) Authorization, imp_uid

 

 

Authorization의 경우 위의 getToken API에서 얻은 key이며,

imp_uid는 인증에 성공했을 시 response로 얻을 수 있는 값 입니다. 

이전글에서, 인증에 성공하였을 때에, result success값과 함께 넘겨주었던 값 중 하나입니다.

 

정리하자면

/users/getToken Api를 통하여 token을 얻고, 해당 키와 imp_uid를 통하여 결제 유저의 정보를 가져오는 식입니다.

 

 

이제 전 글과 이어서, Android에서 Api 호출을 위한 비동기 처리 진행 예시를 작성해보도록 하겠습니다.

 

📘 Android에서의 API 처리

 

Retrofit2으로 처리하였으며, MVVM 패턴을 활용하여 작업하였습니다.

 

우선 Retrofit2 Response용 3가지 클래스를 준비합니다.

getToken Api Response를 받기위한 Class입니다.

@Keep
data class SmsAuthResponse(
    @SerializedName("code") var code : Int? = null,
    @SerializedName("message") var message : String? = null,
    @SerializedName("response") var response : SmsAuthTokenResponse? = null
)
@Keep
data class SmsAuthTokenResponse(
    @SerializedName("access_token") var access_token : String? = null,
    @SerializedName("now") var now : Int? = null,
    @SerializedName("expired_at") var expired_at : Int? = null
)

 

그리고 이것은 인증 UserProfile을 받기 위한 Class입니다.

@Keep
data class SmsAuthUserProfileResponse(
    @SerializedName("birth") var birth : Int? = null,
    @SerializedName("certified") var certified : Boolean? = null,
    @SerializedName("certified_at") var certified_at : Int? = null,
    @SerializedName("gender") var gender : String? = null,
    @SerializedName("name") var name : String? = null,
    @SerializedName("phone") var phone : String? = null
)

 

위의 클래스들은, 아래의 retrofit2 interface를 위해 만든 것 입니다.

/* IMPORT */
@GET("/certifications/{imp_uid}")
suspend fun getAuthProfile(@Header("Authorization") token: String, @Path("imp_uid") imp_uid: String) : SmsAuthUserProfileResponse

@FormUrlEncoded
@POST("/users/getToken")
suspend fun postAccessToken(@Field("imp_key") imp_key: String, @Field("imp_secret") imp_secret: String) : SmsAuthResponse

 

주의하셔야 할 점은, 네트워크 도메인은 https://api.iamport.kr 라는 점입니다.

 

마지막으로, 아래는 retrofit2 과 coroutine을 이용한 네트워크 통신 소스 코드 예시입니다.

// in ViewModel.kt
fun smsAuthPostAccessToken(imp_key: String, imp_secret: String, auth_user_imp_uid: String) {
   
    viewModelScope.launch(Dispatchers.IO) {
        try {
            smsAuthApi.postAccessToken(imp_key, imp_secret).apply {
                /** 첫번째 API를 통하여 access_token을 얻고, 얻어낸 즉시 두번째 API 호출 진행 */
                this.response?.access_token?.let {
                    smsAuthGetAuthProfile(it, auth_user_imp_uid)
                }
            }
        } catch (e: Throwable) {
        	...
        }
    }
}

suspend fun smsAuthGetAuthProfile(access_token: String, auth_user_imp_uid: String) {
    smsAuthApi.getAuthProfile(access_token, auth_user_imp_uid).apply {
        /** API 호출로 얻은 name과 phone값을 통하여 가입 진행 */
        this.name?.let { name ->
            this.phone?.let { phone ->
                join(name, phone)
            }
        }
    }
}

이로써 인증 결과 및 인증 유저의 값까지 가져올 수 있게 되었습니다.