프로젝트 주요 기능
- 카카오 페이 기능을 구현합니다.
- Volley를 이용한 Http 통신
- Gson을 이용한 json 데이터 파싱
프로젝트 완성 파일
* '무작정 프로젝트 Kakao API - 로그인' 파트에 Developers 설정을 한 후 진행해야 합니다.
제작 1. 프로젝트 설정 - 라이브러리
프로젝트에 필요한 라이브러리를 설정합니다.
Empty Activity로 프로젝트를 생성합니다.
// Http 통신 라이브러리
implementation 'com.android.volley:volley:1.1.1'
// Json 데이터 파싱 라이브러리
implementation 'com.google.code.gson:gson:2.8.6'
build.gradle(Module 수준)에 사용할 라이브러리를 추가하고 Sync Now 눌러 저장합니다.
제작 2. 프로젝트 설정 - XML
Pay결제창이 열릴 Activity를 새로 생성합니다.
이름은 'PayActivity'로 해주겠습니다.
activity_main.xml입니다. 간단한 상품명과 상품 가격을 입력받고 버튼을 눌러서 결제를 시도합니다.
activity_pay.xml입니다. 화면을 꽉 채운 WebView만 존재합니다.
제작 3. Pay 구현 - 결제 준비
결제를 준비하는 단계입니다. 요구하는 API를 담아 'POST'해주면 JSON 객체로 다시 돌려줍니다.
MainActivity.java입니다.
EditText의 값을 가져오기 위해 2개의 EditText변수를 선언하고 버튼 클릭 시 상품 이름, 가격을 입력받은 PayActivitiy를 생성하여 intent로 새로운 Activity를 띄워줍니다.
PayActivity.java입니다.
실질적으로 통신, 처리하는 부분은 PayActivity의 내부 클래스인 MyWebViewClient 클래스입니다.
WebViewClient를 상속받게 되면 WebView 아이템의 여러 속성을 제어할 수 있습니다.
[Android] 웹뷰를 풍부하게 활용할 수 있도록 해주는 WebViewClient
결제 준비 Request단계에선 디벨로퍼 문서에 나와있는 값을 동일하게 입력해 주면 됩니다.
위 코드를 작성 후 실행해 보면
Logcat에 Response 된 값이 출력되는데 필요한 값인 Moblie Url과 tid값을 파싱 후
WebView에는 loadUrl로 결제창을 요청하고 tid값은 변수에 저장합니다.
넘겨받은 Response 데이터에 대한 설명은 문서에 자세히 나와있습니다.
제작 4. Pay 구현 - 결제 승인
package com.jaeho;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import java.util.HashMap;
import java.util.Map;
public class PayActivity extends AppCompatActivity {
// ''''' 생략 '''''' //
public class MyWebViewClient extends WebViewClient {
// ''''' 생략 '''''' //
// 결제 요청 단계 - 통신을 받을 Response 변수
Response.Listener<String> approvalResponse = new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.e("Debug", response);
}
};
// 결제 요청 단계 - 통신을 넘겨줄 Request 변수
StringRequest approvalRequest = new StringRequest(Request.Method.POST, "https://kapi.kakao.com/v1/payment/approve", approvalResponse, errorListener) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("cid", "TC0ONETIME");
params.put("tid", tidPin);
params.put("partner_order_id", "1001");
params.put("partner_user_id", "gorany");
params.put("pg_token", pgToken);
params.put("total_amount", productPrice);
return params;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", "KakaoAK " + "dfda30650082a405be23fce878038ad4");
return headers;
}
};
// URL 변경시 발생 이벤트
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.e("Debug", "url" + url);
if (url != null && url.contains("pg_token=")) {
String pg_Token = url.substring(url.indexOf("pg_token=") + 9);
pgToken = pg_Token;
requestQueue.add(approvalRequest);
} else if (url != null && url.startsWith("intent://")) {
try {
Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
Intent existPackage = getPackageManager().getLaunchIntentForPackage(intent.getPackage());
if (existPackage != null) {
startActivity(intent);
}
return true;
} catch (Exception e) {
e.printStackTrace();
}
}
view.loadUrl(url);
return false;
}
}
}
PayActivity.java입니다.
결제 준비 단계와 동일합니다. 카카오 문서에서 요구하는 파라미터 값을 넘겨줍니다.
실행을 해주면 에디터에 입력했던 상품명과 가격으로 카카오페이 결제가 진행됩니다.
webViewClient를 상속받으면 재정의 해서 사용할 수 있는 shouldOverrideUrlLoading 메서드입니다.
Url이 변경될 때마다 실행됩니다.
위 과정이 필요한 이유는 내부 웹 뷰를 이용하여 url을 변경하게 될 시
SCHEME(스키마) 오류가 있어서 "intent://" 부분을 제거한 실제 url로 변경해 주기 위함입니다.
그리고 pg_token값 또한 결제가 완료되면 url 값으로 넘어오게 되는데 원하는 token값을 얻기 위해서 subString을 사용하여 값을 파싱 했습니다.
( * www.naver.com/success? 는 우리가 결제 준비 과정에서 넣었던 url로 진행됩니다.)
( * 애뮬레이터에선 작동하지 않는 거 같습니다. 모바일 기기로 구동해 주셔야 합니다)
끝으로..
Kakao API의 사용법을 적어봤습니다.
Rest API라고 부르는 이 방법은 웹 페이지에 요청(Request)하면 응답(Response)된 데이터를 가지고
사용할 수 있습니다.
어떤 요청을 해야 되고 값을 넘겨주어야 되는지는 카카오 디벨로퍼 문서를 읽으면서 사용해 보시면
도움이 될 거 같네요!