웹뷰(WebView) 결제 연동하기
모바일 웹뷰 결제는 앱투앱(App to App) 이동이 필요해요. 상점 앱에서 결제하기를 누르면 구매자가 선택한 카드사·은행 앱으로 이동하는데요. 이 과정이 바로 앱투앱 이동이에요.
앱투앱 이동이 정상적으로 동작하려면 카드사·은행 앱의 앱스킴을 미리 등록해야 해요. 아래에서 결제기관의 앱스킴 목록과 OS별 연동 방법을 확인해보세요.
앱스킴 리스트
내 상점 앱에서 인증을 위해 이동하게 되는 3rd-party 앱에는 ISP 앱, 카드사별 앱카드 등이 있어요. 필요한 앱스킴을 추가해보세요.
Android 패키지
AndroidManifest.xml 파일의 <queries> 태그 안에 등록해주세요.
카드사
| 카드사 | 패키지명 |
|---|---|
| KB국민 | com.kbcard.cxh.appcard, com.kbstar.liivbank, com.kbstar.reboot, com.kbstar.kbbank |
| 신한 | com.shcard.smartpay, com.shinhancard.smartshinhan, com.shinhan.smartcaremgr, com.shinhan.sbanking |
| 삼성 | kr.co.samsungcard.mpocket, net.ib.android.smcard |
| 현대 | com.hyundaicard.appcard |
| 롯데 | com.lcacApp, com.lotte.lpay, com.lottemembers.android |
| 하나 | com.hanaskcard.paycla, kr.co.hanamembers.hmscustomer, com.hanaskcard.rocomo.potal, com.hanabank.mzplatform |
| 농협 | nh.smart.nhallonepay, com.nh.cashcardapp |
| 우리 | com.wooricard.wpay, com.wooricard.smartapp, com.wooribank.smart.npib, com.mysmilepay.app |
| 씨티 | kr.co.citibank.citimobile, com.citibank.cardapp |
| BC/ISP | kvp.jjy.MispAndroid320 |
| 카카오뱅크 | com.kakaobank.channel |
| 새마을금고 | kr.co.kfcc.mobilebank |
| 케이뱅크 | com.kbankwith.smartbank |
| 우체국 | com.knb.psb |
간편결제
| 간편결제 | 패키지명 |
|---|---|
| 카카오페이 | com.kakao.talk |
| 네이버페이 | com.nhn.android.search |
| 토스페이 | viva.republica.toss |
| PAYCO | com.nhnent.payapp |
| LPAY | com.lottemembers.android |
| SSGPAY | com.ssg.serviceapp.android.egiftcertificate |
| 삼성페이 | com.samsung.android.spay, com.samsung.android.spaylite |
| LG페이 | com.lge.lgpay |
계좌이체
| 계좌이체 | 패키지명 |
|---|---|
| 뱅크페이 | com.kftc.bankpay.android, com.bankpay.android |
보안앱
| 보안앱 | 패키지명 |
|---|---|
| AhnLab V3 | com.ahnlab.v3mobileplus |
| TouchEn (신한) | com.TouchEn.mVaccine.webs |
| V-Guard (삼성) | kr.co.shiftworks.vguardweb |
| DROIDX3 | net.nshc.droidx3web |
| TouchEn App Free (현대) | com.lumensoft.touchenappfree |
기타
| 기타 | 패키지명 |
|---|---|
| KT 인증 | com.kt.ktauth |
| U+ 멤버십 | uplus.membership |
| 다날 다모음 (휴대폰 본인인증) | kr.danal.app.damoum |
| 페이프로토콜 | com.payprotocol.walletkr |
iOS 앱스킴
Info.plist 파일에 LSApplicationQueriesSchemes 키로 등록해주세요.
카드사
| 카드사 | 앱스킴 |
|---|---|
| KB국민 | kb-acp, newliiv, kbbank |
| 신한 | shinhan-sr-ansimclick, smshinhanansimclick |
| 삼성 | mpocket.online.ansimclick, ansimclickscard, ansimclickipcollect, vguardstart, samsungpay, scardcertiapp, monimopay, monimopayauth |
| 현대 | hdcardappcardansimclick, smhyundaiansimclick |
| 롯데 | lottesmartpay, lotteappcard |
| 하나 | cloudpay, hanawalletmembers, hanaskcardmobileportal, hanamz |
| 농협 | nhappcardansimclick, nhallonepayansimclick, nonghyupcardansimclick |
| 우리 | com.wooricard.wcard, newsmartpib |
| 씨티 | citispay, citicardappkr, citimobileapp |
| BC/ISP | ispmobile |
| 카카오뱅크 | kakaobank |
간편결제
| 간편결제 | 앱스킴 |
|---|---|
| 카카오페이 | kakaotalk |
| 네이버페이 | naverpayapp |
| 토스페이 | supertoss, servicetoss |
| PAYCO | payco |
| LPAY | lpayapp, tswansimclick |
| SSGPAY | shinsegaeeasypayment |
계좌이체
| 계좌이체 | 앱스킴 |
|---|---|
| 뱅크페이 | kftc-bankpay |
Android
Android 주의사항
1. 패키지 등록이 꼭 필요해요 (Android 11, API 30 이상)
Android 11(API 30)부터 Google의 보안정책이 강화되었어요. 앱에서 다른 앱의 설치 여부를 확인하려면 AndroidManifest.xml 파일에 <queries> 요소로 패키지를 미리 등록해야 해요.
- 카드사 앱이 설치되어 있어도 "설치되지 않음"으로 인식돼요
- 결제 앱 대신 Google Play 스토어로 이동해버려요
- 결제 진행이 중단돼요
2. WebViewClient의 shouldOverrideUrlLoading 함수를 오버라이드 해주세요
Android는 웹뷰에서 외부 앱으로 이동할 때 WebViewClient의 shouldOverrideUrlLoading 함수를 사용해요.
- 웹뷰는 기본적으로
http://,https://프로토콜만 처리할 수 있어요 - 카드사 앱은
intent://,ispmobile://같은 커스텀 스킴을 사용해요 - 이 함수를 오버라이드해야 커스텀 스킴을 처리할 수 있어요
net::ERR_UNKNOWN_URL_SCHEME에러가 발생해요- 카드사 앱으로 이동하지 못해요
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// URL이 null인 경우 처리하지 않음
if (url == null) return false;
// http://, https:// 가 아닌 경우 외부 앱 호출 처리
if (!url.startsWith("http://") && !url.startsWith("https://")) {
// intent:// 스킴 처리 (카드사 앱 호출 시 주로 사용)
if (url.startsWith("intent:")) {
Intent schemeIntent;
try {
// Intent URI를 파싱하여 Intent 객체 생성
schemeIntent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
} catch (URISyntaxException e) {
// URI 문법 오류 시 처리 중단
e.printStackTrace();
return false;
}
try {
// 해당 Intent를 처리할 수 있는 앱 실행
startActivity(schemeIntent);
return true;
} catch (ActivityNotFoundException e) {
// 앱이 설치되어 있지 않은 경우 마켓으로 이동
String pkgName = schemeIntent.getPackage();
if (pkgName != null) {
// Google Play 스토어에서 해당 패키지 검색
startActivity(new Intent(
Intent.ACTION_VIEW,
Uri.parse("market://details?id=" + pkgName)
));
return true;
}
}
}
// 일반 커스텀 스킴 처리 (예: kakaobank://, ispmobile:// 등)
else {
try {
// 해당 스킴을 처리할 수 있는 앱 실행
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
return true;
} catch (Exception e) {
// 앱 실행 실패 시 로그 출력
e.printStackTrace();
return false;
}
}
}
// http://, https:// 는 웹뷰에서 그대로 로드
return false;
}3. HTTP 통신을 허용해주세요 (Android 11, API 30 이상)
Android API 30부터 기본적으로 HTTP(비암호화) 통신이 차단돼요. 일부 카드사/기관에서 HTTP를 사용하는 경우가 있어서 허용 설정이 필요해요.
net::ERR_CLEARTEXT_NOT_PERMITTED에러가 발생해요- 특정 카드사 결제 페이지가 로드되지 않아요
해결 방법
AndroidManifest.xml 파일에 usesCleartextTraffic 속성을 추가해주세요.
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application
...
android:usesCleartextTraffic="true"
... >
...
</application>
</manifest>Android 연동방식
AndroidManifest.xml 파일의 <queries> 태그 안에 아래 패키지 목록을 등록해주세요.
<queries>
<package android:name="com.kbcard.cxh.appcard"/> <!-- KB Pay 앱카드 -->
<package android:name="com.kbstar.liivbank"/> <!-- Liiv(KB국민은행) -->
<package android:name="com.kbstar.reboot"/> <!-- Liiv Reboot(KB국민은행) -->
<package android:name="com.kbstar.kbbank"/> <!-- 스타뱅킹(KB국민은행) -->
<package android:name="com.wooricard.wpay"/> <!-- 우리페이 -->
<package android:name="com.wooricard.smartapp"/> <!-- 우리WON카드 앱 -->
<package android:name="com.wooribank.smart.npib"/> <!-- 우리WON뱅킹 앱 -->
<package android:name="com.mysmilepay.app"/> <!-- 스마일페이 (우리카드) -->
<package android:name="kr.co.citibank.citimobile"/> <!-- 씨티모바일 앱 -->
<package android:name="com.citibank.cardapp"/> <!-- 씨티카드 앱 -->
<package android:name="com.shcard.smartpay"/> <!-- 신한 앱카드 (신한페이판) -->
<package android:name="com.shinhancard.smartshinhan"/> <!-- 신한 Smart신한 앱 -->
<package android:name="com.shinhan.smartcaremgr"/> <!-- 신한 슈퍼SOL -->
<package android:name="com.shinhan.sbanking"/> <!-- 신한 SOL뱅크 -->
<package android:name="kvp.jjy.MispAndroid320"/> <!-- ISP/페이북 (BC카드) -->
<package android:name="com.hyundaicard.appcard"/> <!-- 현대카드 앱 -->
<package android:name="com.ssg.serviceapp.android.egiftcertificate"/> <!-- SSGPAY 간편결제 -->
<package android:name="kr.co.samsungcard.mpocket"/> <!-- 삼성카드 앱 -->
<package android:name="net.ib.android.smcard"/> <!-- 삼성카드 monimo -->
<package android:name="com.hanaskcard.paycla"/> <!-- 하나카드 앱 (하나페이) -->
<package android:name="kr.co.hanamembers.hmscustomer"/> <!-- 하나멤버스 앱 -->
<package android:name="com.hanaskcard.rocomo.potal"/> <!-- 하나카드 -->
<package android:name="com.hanabank.mzplatform"/> <!-- 하나은행 아이부자 -->
<package android:name="com.lcacApp"/> <!-- 롯데카드 앱 -->
<package android:name="com.lotte.lpay"/> <!-- 롯데 L.pay -->
<package android:name="com.lottemembers.android"/> <!-- 롯데 L.POINT (LPAY 간편결제) -->
<package android:name="com.kakaobank.channel"/> <!-- 카카오뱅크 카드 앱 -->
<package android:name="nh.smart.nhallonepay"/> <!-- NH올원페이 (농협 앱카드) -->
<package android:name="com.nh.cashcardapp"/> <!-- 농협카드 -->
<package android:name="kr.co.kfcc.mobilebank"/> <!-- 새마을금고 뱅킹 -->
<package android:name="com.knb.psb"/> <!-- 우체국 뱅킹 -->
<package android:name="com.kbankwith.smartbank"/> <!-- 케이뱅크 -->
<package android:name="com.kakao.talk"/> <!-- 카카오톡 (카카오페이 결제) -->
<package android:name="com.nhn.android.search"/> <!-- 네이버페이 (네이버 앱) -->
<package android:name="viva.republica.toss"/> <!-- 토스페이 (토스 앱) -->
<package android:name="com.samsung.android.spay"/> <!-- 삼성페이 -->
<package android:name="com.samsung.android.spaylite"/> <!-- 삼성페이 -->
<package android:name="com.nhnent.payapp"/> <!-- PAYCO 간편결제 -->
<package android:name="com.lge.lgpay"/> <!-- LG페이 -->
<package android:name="com.bankpay.android"/> <!-- 뱅크페이 (구버전) -->
<package android:name="com.kftc.bankpay.android"/> <!-- 뱅크페이 (금융결제원) -->
<package android:name="com.ahnlab.v3mobileplus"/> <!-- AhnLab V3 모바일 백신 -->
<package android:name="com.TouchEn.mVaccine.webs"/> <!-- TouchEn mVaccine 보안앱 (신한카드) -->
<package android:name="kr.shiftworks.vguardweb"/> <!-- VGuard 웹 보안 -->
<package android:name="kr.co.shiftworks.vguardweb" /> <!-- V-Guard (삼성) -->
<package android:name="com.lumensoft.touchenappfree"/> <!-- TouchEn App Free (현대카드 공동인증서) -->
<package android:name="net.nshc.droidx3web"/> <!-- DROIDX3 보안앱 -->
<package android:name="com.kt.ktauth"/> <!-- KT 본인인증 -->
<package android:name="uplus.membership"/> <!-- U+ 멤버십/본인인증 -->
<package android:name="kr.danal.app.damoum"/> <!-- 다날 다모음 (휴대폰 본인인증) -->
<package android:name="com.payprotocol.walletkr"/> <!-- 페이프로토콜 월렛 -->
</queries>iOS
iOS 주의사항
1. 앱스킴 등록이 꼭 필요해요 (iOS 9.0 이상)
iOS 9.0부터 Apple의 보안정책이 강화되었어요. canOpenURL() 또는 openURL() 함수로 다른 앱을 열려면 Info.plist 파일에 앱스킴을 미리 등록해야 해요.
- Apple이 앱의 프라이버시 보호를 위해 도입한 정책이에요
- 등록되지 않은 앱스킴은
canOpenURL()이 항상false를 반환해요 - 콘솔에
canOpenURL: failed for URL에러가 표시돼요
- 카드사 앱이 설치되어 있어도 열리지 않아요
- 결제 진행이 중단돼요
2. 앱스킴은 최대 50개까지만 등록할 수 있어요 (iOS 15 이상)
iOS 15부터 Apple 정책에 따라 LSApplicationQueriesSchemes 키 항목이 최대 50개로 제한돼요.
- 초과된 스킴은 무시될 수 있어요
- 앱 설치 여부 확인(canOpenURL)이 실패하여, 일부 카드사 앱이 실행되지 않는 문제가 발생할 수 있어요
- 실제로 사용하는 결제수단의 앱스킴만 등록해주세요
- 사용하지 않는 스킴은 제거하여 50개 이내로 유지해주세요
iOS 연동방식
Info.plist 파일에 LSApplicationQueriesSchemes 키로 아래 앱스킴 목록을 등록해주세요.
<key>LSApplicationQueriesSchemes</key>
<array>
<string>kb-acp</string> <!-- KB Pay 앱카드 -->
<string>newliiv</string> <!-- Liiv Next(KB국민은행) -->
<string>kbbank</string> <!-- KB스타뱅킹 -->
<string>nhappcardansimclick</string> <!-- 농협 앱카드 -->
<string>nhallonepayansimclick</string> <!-- NH올원페이 -->
<string>nonghyupcardansimclick</string> <!-- 농협 공동인증서 -->
<string>lottesmartpay</string> <!-- 롯데 스마트페이 -->
<string>lotteappcard</string> <!-- 롯데 앱카드 -->
<string>mpocket.online.ansimclick</string> <!-- 삼성 앱카드 -->
<string>ansimclickscard</string> <!-- 삼성카드 안심클릭 -->
<string>ansimclickipcollect</string> <!-- 안심클릭 IP수집 -->
<string>vguardstart</string> <!-- V-Guard 보안앱 (삼성)-->
<string>samsungpay</string> <!-- 삼성페이 -->
<string>scardcertiapp</string> <!-- 삼성카드 공동인증서 -->
<string>monimopay</string> <!-- 삼성카드 monimo -->
<string>monimopayauth</string> <!-- 삼성카드 monimo 인증 -->
<string>tswansimclick</string> <!-- Syrup 앱카드 -->
<string>shinhan-sr-ansimclick</string> <!-- 신한 앱카드 (신한페이판) -->
<string>smshinhanansimclick</string> <!-- 신한 공동인증서 -->
<string>com.wooricard.wcard</string> <!-- 우리WON카드 앱 -->
<string>newsmartpib</string> <!-- 우리WON뱅킹 앱 -->
<string>citispay</string> <!-- 씨티 간편결제 -->
<string>citicardappkr</string> <!-- 씨티카드 앱 -->
<string>citimobileapp</string> <!-- 씨티 앱카드 -->
<string>cloudpay</string> <!-- 하나 앱카드 (클라우드페이) -->
<string>hanawalletmembers</string> <!-- 하나멤버스월렛 -->
<string>hanaskcardmobileportal</string> <!-- 하나카드 공동인증서 -->
<string>hanamz</string> <!-- 하나은행 아이부자 -->
<string>hdcardappcardansimclick</string> <!-- 현대 앱카드 -->
<string>smhyundaiansimclick</string> <!-- 현대 공동인증서 -->
<string>ispmobile</string> <!-- ISP/페이북 (BC카드 인증) -->
<string>kakaobank</string> <!-- 카카오뱅크 카드 앱 -->
<string>shinsegaeeasypayment</string> <!-- SSGPAY 간편결제 -->
<string>payco</string> <!-- PAYCO 간편결제 -->
<string>lpayapp</string> <!-- LPAY 간편결제 -->
<string>naverpayapp</string> <!-- 네이버페이 -->
<string>supertoss</string> <!-- 토스페이 -->
<string>servicetoss</string> <!-- 토스 서비스 -->
<string>kakaotalk</string> <!-- 카카오페이 (카카오톡) -->
<string>kftc-bankpay</string> <!-- 뱅크페이 (금융결제원) -->
</array>