iOS Swift WKWebView 하이브리드앱에서 신용카드 결제

 

 

 

 

 

 

 

 

 

 

 

WKWebView에서 결제를 하는 PG사와 연동하여 신용카드등을 결제할때 처리해줘야하는 코드가 있다.

 

신용카드의 앱과 연동하는데  URL Scheme 이용하여 호출할 있도록 해야한다.

 

iOS 9 이상 에서 URL Scheme 등록을 위한 가이드

(canOpenURL 사용 )

 

  IOS9 이상 버전 주의사항

iOS 9 버전에서 처음으로 LSApplicationQueriesSchemes 라는 Info 항목이 추가되었으며, URL scheme 사용해서 외부 앱을 경우, 특별한 제한이 없던 기존 방식에서 화이트리스트에 등록된 scheme 있도록 보안 정책이 강화되었습니다. 

iOS 9 이상 버전에서 canOpenURL 사용시 화이트리스트(Info.plist) 등록되지 않은 경우, 웹뷰에서는 무조건 차단하는 정책으로 변경되었습니다. Apple에서 권장하는 해결방법도 Info.plist LSApplicationQueriesSchemes 항목에서 사용하고자 하는 URL scheme 들을 등록하는 방법입니다.

 

iPhone 에서 화이트리스트 설정 방법

plist 파일에 LSApplicationQueriesSchemes key scheme 등록하는 방법은 아래의 이미지를 참고해 주세요

 

     예시) XCODE의 Info.plist

 

<key>LSApplicationQueriesSchemes</key>

<array>

    <string>kakaotalk</string>

    <string>smilepayapp</string>

    <string>lpayapp</string>

</array>

예시) XML Info.plist

 

Scheme List

아래는 LSApplicationQueriesSchemes 등록 예시이며, 기존 스키마에서 "://" 부분을 제거 , 등록하시면 됩니다

구분

세부구분

IOS URL Scheme

PAYNOW

Paynow

lguthepay://

Paynow + SmartXPay 통합 

lguthepay-xpay://

계좌이체

SmartXPay(구버전)

smartxpay-transfer://

NH 앱캐시

nhappcash-acp://

우리은행

간편결제

위비뱅크

SmartBank2WIB://

원터치개인

SmartBank2WB://

금융센터

PortalCenterWB://

위비멤버스

woorimembers://

위비톡

wibeetalk://

현대카드

앱카드

hdcardappcardansimclick://

공인인증

smhyundaiansimclick://

우리카드

앱카드

Wooripay://

신한카드

앱카드

shinhan-sr-ansimclick://

공인인증

smshinhanansimclick://

국민카드

앱카드

kb-acp://

삼성카드

앱카드

mpocket.online.ansimclick://

온라인결제 전반

ansimclickscard://

온라인결제 전반

tswansimclick://

온라인결제 전반

ansimclickipcollect://

백신

vguardstart://

삼성카드

samsungpay 

공인인증

scardcertiapp:// 

롯데카드

모바일결제 

lottesmartpay://

앱카드 

lotteappcard://

하나카드

앱카드

cloudpay://

농협카드

앱카드

nhappcardansimclick://

올원페이

nhallonepayansimclick://

공인인증

nonghyupcardansimclick://

씨티카드

앱카드

citispay://

공인인증

citicardappkr://

ISP계열카드

(비씨,국민등)

일반

ispmobile:// 

은련카드

일반

uppay:// 

간편결제카드

SSGPay

shinsegaeeasypayment://

페이코

payco://

L.pay

lpayapp://

스마일페이

smilepayapp://

카카오페이

kakaotalk://

 

 

UIApplication.shared.open(requestURL, options: [:], completionHandler: nil)  를 호출하면  URL Scheme 에 해당되는 앱이 실행이 된다.  이때 호출되는  url 은 ispmobile  이런값이 온다.

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Swift.Void) {
        print("@@@  decidePolicyFor navigationAction")
        guard let requestURL = navigationAction.request.url else {return}
        let url = requestURL.absoluteString
        let hostAddress = navigationAction.request.url?.host
        // To connnect app store
        if hostAddress == "itunes.apple.com" {
            if UIApplication.shared.canOpenURL(requestURL) {
                UIApplication.shared.open(requestURL, options: convertToUIApplicationOpenExternalURLOptionsKeyDictionary([:]), completionHandler: nil)
                decisionHandler(.cancel)
                return
            }
        }
        #if DEBUG
        print("url = \(url), host = \(hostAddress?.description ?? "")")
        #endif
        let url_elements = url.components(separatedBy: ":")
        if url_elements[0].contains("http") == false &&
            url_elements[0].contains("https") == false {
            
            if UIApplication.shared.canOpenURL(requestURL) {
                UIApplication.shared.open(requestURL, options: convertToUIApplicationOpenExternalURLOptionsKeyDictionary([:]), completionHandler: nil)
            } else {    // 만약  Info.plist의 white list에 등록되지 않은 앱 스키마가 있는 경우를 위해 사용, 신용카드 결제화면등을 위해 필요, 해당 결제앱 스키마 호출
                if url.contains("about:blank") == true {
                   print("@@@ Browser can't be opened, about:blank !! @@@")
                }else{
                    print("@@@ Browser can't be opened, but Scheme try to call !! @@@")
                    UIApplication.shared.open(requestURL, options: [:], completionHandler: nil)
                }
                
            }
            
            decisionHandler(.cancel)
            return
   
        }
        decisionHandler(.allow)
        
}

 

Custom Scheme 참조   https://g-y-e-o-m.tistory.com/33

 

 

+ Recent posts