권한설정
AndroidManifast.xml 파일에 3rd 어플리케이션 호출을 위한 패키지명 정의, 권한 및 네트워크 보안 예외 설정을 합니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="sample.nicepay.co.kr.nicepayappsample">
<queries>
<!--신용카드-->
<package android:name="kr.co.samsungcard.mpocket" /> <!--삼성 앱카드, 삼성 앱카드 공동인증서-->
<package android:name="com.shcard.smartpay" /> <!--신한 페이판-->
<package android:name="com.shinhancard.smartshinhan" /> <!--신한(ARS/일반결제/Smart결제), 신한 공동인증서-->
<package android:name="com.kbcard.cxh.appcard" /> <!--KBPay-->
<package android:name="com.kbstar.liivbank" /> <!--LiiV(국민은행)-->
<package android:name="com.kbstar.reboot" /> <!--new liib-->
<package android:name="kvp.jjy.MispAndroid320" /> <!--페이북/ISP-->
<package android:name="com.hanaskcard.paycla" /> <!--하나카드 원큐페이-->
<package android:name="kr.co.hanamembers.hmscustomer" /> <!--하나멤버스-->
<package android:name="com.lcacApp" /> <!--롯데 앱카드-->
<package android:name="nh.smart.nhallonepay" /> <!--NH 올원페이, NH 올원페이 공동인증서-->
<package android:name="com.wooricard.smartapp" /> <!--우리 WON 카드-->
<package android:name="com.wooribank.smart.npib" /> <!--우리 WON 뱅킹-->
<package android:name="com.hyundaicard.appcard" /> <!--현대 앱카드-->
<package android:name="kr.co.citibank.citimobile" /> <!--씨티카드-->
<package android:name="com.shinhan.smartcaremgr" /> <!--신한슈퍼SOL-->
<package android:name="net.ib.android.smcard" /> <!--삼성 monimo-->
<!--공인인증-->
<package android:name="com.hanaskcard.rocomo.potal" /> <!--하나카드-->
<package android:name="com.lumensoft.touchenappfree" /> <!--공동인증서-->
<!--백신-->
<package android:name="com.TouchEn.mVaccine.webs" /> <!--TouchEn mVaccine(신한)-->
<package android:name="com.ahnlab.v3mobileplus" /> <!--V3(NH, 현대)-->
<package android:name="kr.co.shiftworks.vguardweb" /> <!--V-Guard(삼성)-->
<!--간편결제-->
<package android:name="com.samsung.android.spay" /> <!--삼성페이(삼성, 농협, KB)-->
<package android:name="com.samsung.android.spaylite" /> <!--삼성페이 미니(삼성, KB)-->
<package android:name="com.kakao.talk" /> <!--카카오페이-->
<package android:name="com.nhn.android.search" /> <!--네이버페이-->
<package android:name="com.ssg.serviceapp.android.egiftcertificate" /> <!--SSGPay(현대)-->
<package android:name="com.nhnent.payapp" /> <!--페이코(삼성, 농협, KB)-->
<package android:name="com.lge.lgpay" /> <!--엘지페이(삼성, KB)-->
<package android:name="com.lottemembers.android" /> <!--LPay-->
<package android:name="com.tencent.mm" /> <!-- 위챗페이-->
<package android:name="viva.republica.toss" /> <!-- 토스-->
<!--계좌이체-->
<package android:name="com.kftc.bankpay.android" /> <!--금결원-->
<package android:name="com.kbankwith.smartbank" /> <!--케이뱅크-->
<!--본인인증-->
<package android:name="com.sktelecom.tauth" /> <!--SKT-->
<package android:name="com.kt.ktauth" /> <!--KT-->
<package android:name="com.lguplus.smartotp" /> <!--LGT-->
</queries>
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
<activity android:name=".MainActivity"
android:configChanges="orientation"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".WebViewActivity"
android:label="NicePay Smart"
android:configChanges="orientation"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
</intent-filter>
</activity>
</application>
</manifest>
웹뷰 연동
public class WebViewActivity extends Activity {
private static final String TAG = "NICE";
private static final String MERCHANT_URL = "https://web.nicepay.co.kr/demo/v3/mobileReq.jsp";
private WebView mWebView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_webview);
mWebView = (WebView)findViewById(R.id.webview);
//setup default
mWebView.setWebViewClient(new WebViewClientClass());
//javascript allow
mWebView.getSettings().setJavaScriptEnabled(true);
//use local storage
mWebView.getSettings().setDomStorageEnabled(true);
//alert
mWebView.setWebChromeClient(new WebChromeClient() {
});
위 코드에 기재된 MERCHANT_URL(https://web.nicepay.co.kr/demo/v3/mobileReq.jsp)은 나이스페이의 테스트용 결제 페이지입니다.
테스트 후 반드시 가맹점 결제 URL로 변경하여 사용 바랍니다.
캐시 및 쿠키 설정
캐시 모드는 웹뷰 기본값으로 설정한다.(WebSetting.LOAD_CACHE_ELSE_NETWORK 설정 시 일부 카드사 세션 오류 발생)
쿠키 허용 설정 (Android 5.0 이상 시 third-party 쿠키 허용 추가)
//setup cache
/*
* WebView에서 캐시사용 관련 Default 설정은 WebSettings.LOAD_DEFAULT 입니다.
* ex) mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
* 가급적 캐시 사용 설정을 변경하지 않을것을 권고 드립니다.
* @중요 : 'WebSettings.LOAD_CACHE_ELSE_NETWORK' 로 변경금지.
* @중요 : Do not change the setting to 'WebSettings.LOAD_CACHE_ELSE_NETWORK'
*/
mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
//setup cookie
if( android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ) { //Android 5.0 이상
mWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.setAcceptThirdPartyCookies(mWebView, true);
} else {
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
}
결제 페이지 호출
webview.postUrl(MERCHANT_URL, null)
URI 처리 및 Intent 처리
URI에 포함된 요청 데이터를 Intent를 통해 어플리케이션 호출(startActivity)
Android 하위 버전의 경우 intent:// 방식이 아닌 scheme 호출 방식으로 들어올 수 있음
해당 경우 scheme을 수동으로 추가해야 함 (ex cloudpay://~ 로 들어올 경우 if( url.startwith(“cloudpay”)
private class WebViewClientClass extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.i(TAG,"url : " + url);
try {
if( url != null && (url.startsWith("intent:")
|| url.contains("market://")
|| url.contains("vguard")
|| url.contains("droidxantivirus")
|| url.contains("v3mobile")
|| url.contains(".apk")
|| url.contains("mvaccine")
|| url.contains("smartwall://")
|| url.contains("nidlogin://")
|| url.contains("onestore://")
|| url.contains("http://m.ahnlab.com/kr/site/download")) ) {
Intent intent = null;
try {
intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
} catch (URISyntaxException ex) {
Log.e(TAG,"[error] Bad request uri format : [" + url + "] =" + ex.getMessage());
return false;
}
if( getPackageManager().resolveActivity(intent,0) == null ) {
String pkgName = intent.getPackage();
if( pkgName != null ) {
Uri uri = Uri.parse("market://search?q=pname:" + pkgName);
intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
} else {
Uri uri = Uri.parse(intent.getDataString());
intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
} else {
view.loadUrl(url);
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
}