iamport서비스를 사용하는, 결제를 위한 alloy widget을 만들고 있습니다만..

제가 드디어(?ㅠㅠ) 결제를 붙여야할 일이 생겨서 iamport 서비스를 사용하는 결제 widget을 만들고 있습니다.
iamport 덕분에 pg사에 따라 서버등을 설정해야할 필요 없이 손쉽게 이용은 가능합니다.
다만 앱 내부(in app)에서 처리하려니 url scheme과 카드사별 따로 설치를 요구하는 앱들이 다르기 때문에 노가다가 많네요.

titanium sdk를 수정하지 않고 동작하게 만들려고 했으나 android의 shouldOverrideUrlLoading나 iOS의 shouldStartLoadWithRequest를 직접적으로 컨트롤하는 타이타늄 API가 없다보니 해결하지 못하는 문제가 있네요. 타이타늄의 기본 Webview에서 앞서 말한 두 함수를 수정해서 사용해야할 것 같네요.

@zzoon20 @Payfood_Bdh @yyhsix 지금까지 결제 관련해서 질문하셨던 분들의 질문을 이제야 정확히 이해가 되었습니다. 혹시 방법을 찾으신 분은 공유부탁합니다.

widget은 완료되면 조만간 다시 공유하겠습니다.

중간사항 공유합니다.

요약: 필요했던 기능이 최근 PR이 있었고 Merge가 되었습니다.

필요한 기능

국내 PG사와 카드사들의 앱들 복잡한 이 상황을 뚥기 위해 필요했던 기능은 특정 url을 완전히 사전에 막는 것입니다.
네이티브에서는 iOS는 shouldStartLoadWithRequest, 안드로이드는 shouldOverrideUrlLoading에서 return값에 따라 요청을 여부를 결정합니다.

Titanium에서 비슷한 일을 하는 방법 하지만 문제는 있다.

현재 버전(TiSDK 5.2.x)기준에서 설명해보겠습니다. beforeload이벤트에서 url을 확인하여 stopLoading을 이용할 경우 실제 request가 전달되어 버립니다. beforeload 이벤트는 UI 메인쓰레드의 흐름과 무관하게 비동기로 호출되다보니 요청을 사전에 막는게 아니라 일단 요청하고 stopLoading을 하게 됩니다.

얼마 전에 올라왔던 글이 바로 이런 내용이었습니다.

오늘 결제 위젯을 만들려고 자세히 살펴보다 이런 사항을 확실하게 알게 되었죠.

5.4.0에 추가되는 Webview의 blacklistedURLs 속성과 stopBlackListUrl 이벤트

정확히 위에서 설명한 요구사항에 맞는 기능으로 새로운 속성과 event가 추가되었습니다.
다행이네요~ 일단 현재 버전에 아래 commit 내용을 참고하여 사용해야겠습니다. :hugs:

https://jira.appcelerator.org/browse/TIMOB-23327

그 문제 때문에 어찌어찌 꽁수로 넘기고 있지만…
여전히 안드로이드에서 결제가 불안합니다~
종은님이 좋은 위젯을 만들어 주실거로 확신합니다~ 화이팅 ^^
근데 5.4.0은 언제 배포될까요?

ListView에 ListItem의 minHeight 가 30dp 라서 안드로이드에서(iOS는 상관없음)
리스트아이템 높이를 30dp 이하로 만들지 못하는 문제도 있어서 jira에서 티켓을 오픈하긴 했던데…
이것도 해결됐을까요?

사용하신 꽁수가 궁금합니다. ^^

그리고 Android에서 listView의 item minHeight 이슈도 있군요.
전에 button의 minWidth는 안드로이드 테마에서 button스타일을 정의해서 해결했었습니다.

@jazzparty Android에서 특정 카드로 결제하려 할때 cache 관련 에러는 겪지 않으셨어요? 해결 방법을 찾고 있습니다.

@codejong & @jazzparty
두분이 다 해결하시면 전 나중에 얻어 먹도록 하겠습니다ㅎㅎ

1개의 좋아요

@jazzparty 질문 하나 있습니다.
Android에서 intent://로 시작하는 주소를 Titanium 코드에서 열고 싶을 때 어떻게 하시나요?

네이티브에서는 Intent.parseUri로 Intent 만들어야 하는데 문제는 이 Intent.parseUri에 해당하는 Titanium의 API가 없다보니… 혹시 다른 방법이 있을까요?

try {
  intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
} catch (URISyntaxException ex) {
  return false;
}

Uri uri = Uri.parse(intent.getDataString());
intent = new Intent(Intent.ACTION_VIEW, uri);

try {
  activity.startActivity(intent);

검색하다보니 찾은건 결국 같은 질문이네요. 결국 모듈 하나 만들어야할까요? ㅎㅎ
https://archive.appcelerator.com/question/181488/android-intent-question

1개의 좋아요

제대로 할려면 모듈을 만드는 수밖엔 없어 보여요.

저희는 일단 ‘load’ eventListener 에서 이렇게 꽁수로 처리…ㅋ
로드된 url 을 체크해서 intent 호출이면 intent 뒤에 스키마를 대체해서 호출하는 식으로 …
문제는 beforeload에서 stoploading이 안먹어서 intent 호출을 막지 못하고 에러페이지 발생한 다음에
아래와 같이 처리하느라…에러페이지가 살짝 노출됐다가 다시 원래 페이지로 되돌아가도록 되어 있습니다.
로딩완료되기 전까지 웹뷰를 감췄다가 정상 로딩된 후 다시 보여주는 식 꼼수로 처리해볼려다가 일단은
그냥 놔둔 상태입니다.

if (e.url.indexOf(‘intent’) !== -1) {
var urlData = e.url.split("#");
var fixedUrl = urlData[0].replace(“intent”, “droidx3web”);
// Ti.API.debug("in payment, url : " + fixedUrl);

var schemeUrl = encodeURI(fixedUrl);
if (OS_IOS) {
  // Ti.API.debug("in payment, openURL : IOS");
    if (Ti.Platform.canOpenURL(schemeUrl)) {
        Ti.Platform.openURL(schemeUrl);
    } else {
        Ti.Platform.openURL("");
    }
} else {
  // Ti.API.debug("in payment, openURL : Android");
    isSuccess = Ti.Platform.openURL(schemeUrl);
    if (!isSuccess) {
        Ti.Platform.openURL("market://details?id=net.nshc.droidx3web");
    } else {
      AG.toast(L('payment_program_mount'));
    }
    webview.url = "https://drmobile.inicis.com/smart/wcard/input_resp//input_visa3d.php";
    // Ti.API.debug("in payment, openURL response : " + isSuccess);
}

}

감사합니다.
5.4.x에 추가될 것으로 보이는 blacklistedURLs을 이용하여 위젯을 만들고 있고요.
Android Intent Scheme을 제대로 parse하기 위해 parseUri 안드로이드 모듈을 만들고 있습니다.

오늘 중에 공개 가능할 것으로 보입니다.^^

1개의 좋아요