웹뷰(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/ISPkvp.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
PAYCOcom.nhnent.payapp
LPAYcom.lottemembers.android
SSGPAYcom.ssg.serviceapp.android.egiftcertificate
삼성페이com.samsung.android.spay, com.samsung.android.spaylite
LG페이com.lge.lgpay

계좌이체

계좌이체패키지명
뱅크페이com.kftc.bankpay.android, com.bankpay.android

보안앱

보안앱패키지명
AhnLab V3com.ahnlab.v3mobileplus
TouchEn (신한)com.TouchEn.mVaccine.webs
V-Guard (삼성)kr.co.shiftworks.vguardweb
DROIDX3net.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/ISPispmobile
카카오뱅크kakaobank

간편결제

간편결제앱스킴
카카오페이kakaotalk
네이버페이naverpayapp
토스페이supertoss, servicetoss
PAYCOpayco
LPAYlpayapp, tswansimclick
SSGPAYshinsegaeeasypayment

계좌이체

계좌이체앱스킴
뱅크페이kftc-bankpay

Android

Android 주의사항

1. 패키지 등록이 꼭 필요해요 (Android 11, API 30 이상)

Android 11(API 30)부터 Google의 보안정책이 강화되었어요. 앱에서 다른 앱의 설치 여부를 확인하려면 AndroidManifest.xml 파일에 <queries> 요소로 패키지를 미리 등록해야 해요.

등록하지 않으면 어떤 문제가 발생하나요?
  • 카드사 앱이 설치되어 있어도 "설치되지 않음"으로 인식돼요
  • 결제 앱 대신 Google Play 스토어로 이동해버려요
  • 결제 진행이 중단돼요

2. WebViewClient의 shouldOverrideUrlLoading 함수를 오버라이드 해주세요

Android는 웹뷰에서 외부 앱으로 이동할 때 WebViewClientshouldOverrideUrlLoading 함수를 사용해요.

왜 필요한가요?
  • 웹뷰는 기본적으로 http://, https:// 프로토콜만 처리할 수 있어요
  • 카드사 앱은 intent://, ispmobile:// 같은 커스텀 스킴을 사용해요
  • 이 함수를 오버라이드해야 커스텀 스킴을 처리할 수 있어요
오버라이드하지 않으면?
  • net::ERR_UNKNOWN_URL_SCHEME 에러가 발생해요
  • 카드사 앱으로 이동하지 못해요
javaWebViewClient.java
@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 속성을 추가해주세요.

xmlAndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest ... > <application ... android:usesCleartextTraffic="true" ... > ... </application> </manifest>

Android 연동방식

AndroidManifest.xml 파일의 <queries> 태그 안에 아래 패키지 목록을 등록해주세요.

xmlAndroidManifest.xml
<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개로 제한돼요.

50개를 초과하면?
  • 초과된 스킴은 무시될 수 있어요
  • 앱 설치 여부 확인(canOpenURL)이 실패하여, 일부 카드사 앱이 실행되지 않는 문제가 발생할 수 있어요
해결 방법
  • 실제로 사용하는 결제수단의 앱스킴만 등록해주세요
  • 사용하지 않는 스킴은 제거하여 50개 이내로 유지해주세요

iOS 연동방식

Info.plist 파일에 LSApplicationQueriesSchemes 키로 아래 앱스킴 목록을 등록해주세요.

xmlInfo.plist
<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>