개발
flutter_inappwebview 에서 포트원 결제 연동 시 발생한 문제 해결
velca
벨바카
2024년 11월 4일 13시 48분

현재 회사에서 flutter_inappwebview를 이용한 하이브리드 앱을 개발했고 운영하고 있다. 앱 내에는 포트원을 이용해 결제 시스템을 도입해놨는데, 최근 iOS 이용 고객으로 부터 결제가 안 된다는 문의를 받기 시작했다.

그런데 확인해보니 최근 뿐만 아니라 개발한 이래로 여태까지 iOS 앱에서 결제가 된 적이 없는 것 같았다.

현재 나는 개발용 아이폰이 없고, Mac Mini와 에뮬레이터만 이용해 개발하고 있기 때문에 아이폰에서의 테스트가 어려운 상황이라 Android 위주로 개발을 하고 있다. Android의 경우 비슷하게 결제 문제가 발생했었고 이를 해결하기 위해 Intent URL 처리를 해줬었는데 iOS는 해결이 안 됐었나보다.

여튼 부랴부랴 포트원에 문의해보니 Android와 달리 iOS는 Intent URL을 사용하지 않는다는 답변을 받았다. 대신 각 앱의 Custom scheme을 이용해 외부 앱을 열어야 한다는 말을 들었다.

이후 포트원 문서를 참조해가며 info.plist 파일에 각 금융앱의 Custom scheme을 LSApplicationQueriesSchemes에 추가해줬다.

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>supertoss</string>
    <string>kb-acp</string>
    <string>liivbank</string>
    <string>newliiv</string>
    <string>kbbank</string>
    <string>nhappcardansimclick</string>
    <string>nhallonepayansimclick</string>
    <string>nonghyupcardansimclick</string>
    <string>lottesmartpay</string>
    <string>lotteappcard</string>
    <string>mpocket.online.ansimclick</string>
    <string>ansimclickscard</string>
    <string>tswansimclick</string>
    <string>ansimclickipcollect</string>
    <string>vguardstart</string>
    <string>samsungpay</string>
    <string>scardcertiapp</string>
    <string>shinhan-sr-ansimclick</string>
    <string>smshinhanansimclick</string>
    <string>com.wooricard.wcard</string>
    <string>newsmartpib</string>
    <string>citispay</string>
    <string>citicardappkr</string>
    <string>citimobileapp</string>
    <string>cloudpay</string>
    <string>hanawalletmembers</string>
    <string>hdcardappcardansimclick</string>
    <string>smhyundaiansimclick</string>
    <string>shinsegaeeasypayment</string>
    <string>payco</string>
    <string>lpayapp</string>
    <string>ispmobile</string>
    <string>tauthlink</string>
    <string>ktauthexternalcall</string>
    <string>upluscorporation</string>
    <string>kftc-bankpay</string>
    <string>kakaotalk</string>
    <string>wooripay</string>
    <string>lmslpay</string>
    <string>naversearchthirdlogin</string>
    <string>hanaskcardmobileportal</string>
    <string>kb-bankpay</string>
</array>

그리고 intent:// 로 시작하는 URL만 url_launcher 를 이용해 처리했던 부분을 다음과 같이 바꿨다.

if (Platform.isAndroid) {
  if (request.url.toString().startsWith('intent://')) {
    await openIntentUri(request.url);
  }
} else {
  if (await canLaunchUrl(request.url)) {
    await launchUrl(request.url);
  } else {
    controller.loadUrl(urlRequest: URLRequest(url: WebUri(Environment().config.host + '/store/payment-failed')));
  }
}

Android일 땐 Intent URL 처리를, iOS일 땐 url_launcher를 이용한 처리를 하게끔 변경해주니 결제가 정상적으로 진행 되었다.

웹 위주로 개발하다보니 앱은 익숙하지 않고, 게다가 iOS는 테스트조차 여의치 않다보니 종종 이런 문제가 발생하는데 결제 문제로 인해 여태까지 놓쳤을 고객들을 생각하면 마음이 아프다 ..

댓글
로그인 후 댓글을 작성하세요