diff --git a/android/src/main/java/com/jeongjuwon/iamport/IAmPortViewManager.java b/android/src/main/java/com/jeongjuwon/iamport/IAmPortViewManager.java index 7627f69..bf710ca 100644 --- a/android/src/main/java/com/jeongjuwon/iamport/IAmPortViewManager.java +++ b/android/src/main/java/com/jeongjuwon/iamport/IAmPortViewManager.java @@ -31,6 +31,8 @@ import com.siot.iamportsdk.KakaoWebViewClient; import com.siot.iamportsdk.NiceWebViewClient; import com.siot.iamportsdk.PaycoWebViewClient; +import com.siot.iamportsdk.KcpWebViewClient; +import com.siot.iamportsdk.CallbackWebViewClient; public class IAmPortViewManager extends SimpleViewManager { @@ -115,33 +117,47 @@ public void setPG(IAmPortWebView view, @Nullable String pg) { Log.i("iamport", "PG - " + pg); if(pg.equals("nice")){ - NiceWebViewClient webViewClient = new NiceWebViewClient(activity, view, new UrlLoadingCallBack() { @Override public void shouldOverrideUrlLoadingCallBack(String s) { - Log.i("iamport", "shouldOverrideUrlLoadingCallBack - " + s); + Log.i("iamport", "NiceWebViewClient.shouldOverrideUrlLoadingCallBack - " + s); emitPaymentEvent(s, s, s); } }); view.setWebViewClient(webViewClient); - } - else if(pg.equals("kakao")){ - + } else if(pg.equals("kakao")){ view.setWebViewClient(new KakaoWebViewClient(activity, view)); - } - else if(pg.equals("payco")){ + } else if(pg.equals("payco")){ PaycoWebViewClient webViewClient = new PaycoWebViewClient(activity, view, new UrlLoadingCallBack() { @Override public void shouldOverrideUrlLoadingCallBack(String s) { - Log.i("iamport", "shouldOverrideUrlLoadingCallBack - " + s); + Log.i("iamport", "PaycoWebViewClient.shouldOverrideUrlLoadingCallBack - " + s); emitPaymentEvent(s, s, s); } }); view.setWebViewClient(webViewClient); + } else if(pg.equals("kcp")){ + KcpWebViewClient webViewClient = new KcpWebViewClient(activity, view, new UrlLoadingCallBack() { + @Override + public void shouldOverrideUrlLoadingCallBack(String s) { + Log.i("iamport", "KcpWebViewClient.shouldOverrideUrlLoadingCallBack - " + s); + emitPaymentEvent(s, s, s); + } + }); + view.setWebViewClient(webViewClient); + } else { + CallbackWebViewClient defaultWebViewClient = new CallbackWebViewClient(activity, view, new UrlLoadingCallBack() { + @Override + public void shouldOverrideUrlLoadingCallBack(String s) { + Log.i("iamport", "CallbackWebViewClient.shouldOverrideUrlLoadingCallBack - " + s); + emitPaymentEvent(s, s, s); + } + }); + view.setWebViewClient(defaultWebViewClient); } } diff --git a/android/src/main/java/com/siot/iamportsdk/CallbackWebViewClient.java b/android/src/main/java/com/siot/iamportsdk/CallbackWebViewClient.java new file mode 100644 index 0000000..fe930e3 --- /dev/null +++ b/android/src/main/java/com/siot/iamportsdk/CallbackWebViewClient.java @@ -0,0 +1,31 @@ +package com.siot.iamportsdk; + +import android.app.Activity; +import android.util.Log; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import com.jeongjuwon.iamport.UrlLoadingCallBack; + +/** + * Created by jang on 2018. 5. 31.. + */ + +public class CallbackWebViewClient extends WebViewClient { + + private Activity activity; + UrlLoadingCallBack mCallBack; + + public CallbackWebViewClient(Activity activity, WebView target, UrlLoadingCallBack callBack) { + this.activity = activity; + this.mCallBack = callBack; + } + + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + Log.i("iamport", "CallbackWebViewClient.shouldOverrideUrlLoading: " + url); + mCallBack.shouldOverrideUrlLoadingCallBack(url); + + return super.shouldOverrideUrlLoading(view, url); + } +} \ No newline at end of file diff --git a/android/src/main/java/com/siot/iamportsdk/KakaoWebViewClient.java b/android/src/main/java/com/siot/iamportsdk/KakaoWebViewClient.java index 7838f37..6e942c2 100644 --- a/android/src/main/java/com/siot/iamportsdk/KakaoWebViewClient.java +++ b/android/src/main/java/com/siot/iamportsdk/KakaoWebViewClient.java @@ -20,6 +20,7 @@ public KakaoWebViewClient(Activity activity, WebView target) { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { + Log.i("iamport", "KakaoWebViewClient.shouldOverrideUrlLoading - " + url); if (!url.startsWith("http://") && !url.startsWith("https://") && !url.startsWith("javascript:")) { Intent intent = null; diff --git a/android/src/main/java/com/siot/iamportsdk/KcpWebViewClient.java b/android/src/main/java/com/siot/iamportsdk/KcpWebViewClient.java new file mode 100644 index 0000000..af988d4 --- /dev/null +++ b/android/src/main/java/com/siot/iamportsdk/KcpWebViewClient.java @@ -0,0 +1,93 @@ +package com.siot.iamportsdk; + +import android.app.Activity; +import android.content.ActivityNotFoundException; +import android.content.Intent; +import android.net.Uri; +import android.util.Log; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import java.io.UnsupportedEncodingException; +import java.net.URISyntaxException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.Arrays; +import java.util.List; +import java.util.Set; + +import com.jeongjuwon.iamport.UrlLoadingCallBack; + +/** + * from https://github.com/iamport/kcp-android-graddle/blob/master/app/src/main/java/kr/iamport/sdk/KcpWebViewClient.java + * Created by jang on 2017. 9. 14.. + */ + +public class KcpWebViewClient extends WebViewClient { + + private Activity activity; + private WebView target; + final String KTFC_PACKAGE = "com.kftc.bankpay.android"; + UrlLoadingCallBack mCallBack; + + public KcpWebViewClient(Activity activity, WebView target, UrlLoadingCallBack callBack) { + this.activity = activity; + this.target = target; + this.mCallBack = callBack; + } + + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + Log.i("iamport", "KcpWebViewClient.shouldOverrideUrlLoading - " + url); + mCallBack.shouldOverrideUrlLoadingCallBack(url); + + if (!url.startsWith("http://") && !url.startsWith("https://") && !url.startsWith("javascript:")) { + Intent intent = null; + + try { + intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME); //IntentURI처리 + Uri uri = Uri.parse(intent.getDataString()); + + activity.startActivity(new Intent(Intent.ACTION_VIEW, uri)); + return true; + } catch (URISyntaxException ex) { + return false; + } catch (ActivityNotFoundException e) { + if (intent == null) return false; + + if (handleNotFoundPaymentScheme(intent.getScheme())) return true; + + String packageName = intent.getPackage(); + if (packageName != null) { + activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName))); + return true; + } + + return false; + } + } + + return false; + } + + /** + * @param scheme + * @return 해당 scheme에 대해 처리를 직접 하는지 여부 + *

+ * 결제를 위한 3rd-party 앱이 아직 설치되어있지 않아 ActivityNotFoundException이 발생하는 경우 처리합니다. + * 여기서 handler되지않은 scheme에 대해서는 intent로부터 Package정보 추출이 가능하다면 다음에서 packageName으로 market이동합니다. + */ + protected boolean handleNotFoundPaymentScheme(String scheme) { + //PG사에서 호출하는 url에 package정보가 없어 ActivityNotFoundException이 난 후 market 실행이 안되는 경우 + if (PaymentScheme.ISP.equalsIgnoreCase(scheme)) { + activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + PaymentScheme.PACKAGE_ISP))); + return true; + } else if (PaymentScheme.BANKPAY.equalsIgnoreCase(scheme)) { + activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + PaymentScheme.PACKAGE_BANKPAY))); + return true; + } + + return false; + } + +} \ No newline at end of file diff --git a/android/src/main/java/com/siot/iamportsdk/NiceWebViewClient.java b/android/src/main/java/com/siot/iamportsdk/NiceWebViewClient.java index c7f6f6f..60b8c22 100644 --- a/android/src/main/java/com/siot/iamportsdk/NiceWebViewClient.java +++ b/android/src/main/java/com/siot/iamportsdk/NiceWebViewClient.java @@ -49,7 +49,7 @@ public void bankPayPostProcess(String bankpayCode, String bankpayValue) { public boolean shouldOverrideUrlLoading(WebView view, String url) { // TODO: emit event - Log.i("iamport", "shouldOverrideUrlLoading: " + url); + Log.i("iamport", "NiceWebViewClient.shouldOverrideUrlLoading: " + url); mCallBack.shouldOverrideUrlLoadingCallBack(url); if (!url.startsWith("http://") && !url.startsWith("https://") && !url.startsWith("javascript:")) { diff --git a/android/src/main/java/com/siot/iamportsdk/PaycoWebViewClient.java b/android/src/main/java/com/siot/iamportsdk/PaycoWebViewClient.java index b2c8b70..bfbc5ec 100644 --- a/android/src/main/java/com/siot/iamportsdk/PaycoWebViewClient.java +++ b/android/src/main/java/com/siot/iamportsdk/PaycoWebViewClient.java @@ -28,7 +28,7 @@ public PaycoWebViewClient(Activity activity, WebView target, UrlLoadingCallBack public boolean shouldOverrideUrlLoading(WebView view, String url) { // TODO: emit event - Log.i("iamport", "shouldOverrideUrlLoading: " + url); + Log.i("iamport", "PaycoWebViewClient.shouldOverrideUrlLoading: " + url); mCallBack.shouldOverrideUrlLoadingCallBack(url); if (!url.startsWith("http://") && !url.startsWith("https://") && !url.startsWith("javascript:")) { diff --git a/index.android.js b/index.android.js index 7345353..363846b 100644 --- a/index.android.js +++ b/index.android.js @@ -68,6 +68,7 @@ class IAmPort extends Component { let params = this.props.params; const merchant_uid = params.merchant_uid || ('merchant_' + new Date().getTime()); + const m_redirect_url = params.m_redirect_url || (params.pg == 'paypal' ? 'https://service.iamport.kr/payments/success' : null); let HTML = ` @@ -86,7 +87,7 @@ class IAmPort extends Component { pg : '${params.pg}', pay_method : '${params.pay_method}', merchant_uid : '${merchant_uid}', - m_redirect_url : '${params.m_redirect_url}', + m_redirect_url : '${m_redirect_url}', app_scheme : '${params.app_scheme}', name : '${params.name}', amount : ${params.amount},