iamport-react-native 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/lib/commonjs/components/Certification/index.js +2 -0
- package/lib/commonjs/components/Certification/index.js.map +1 -1
- package/lib/commonjs/components/Payment/index.js +2 -0
- package/lib/commonjs/components/Payment/index.js.map +1 -1
- package/lib/module/components/Certification/index.js +2 -0
- package/lib/module/components/Certification/index.js.map +1 -1
- package/lib/module/components/Payment/index.js +2 -0
- package/lib/module/components/Payment/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/Certification/index.tsx +2 -0
- package/src/components/Payment/index.tsx +2 -0
package/README.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["index.tsx"],"names":["Certification","userCode","tierCode","data","loading","callback","isWebViewLoaded","setIsWebViewLoaded","webview","validation","Validation","redirectUrl","IMPConst","M_REDIRECT_URL","m_redirect_url","undefined","trim","getIsValid","loadingContainer","webViewContainer","viewStyles","html","WEBVIEW_SOURCE_HTML","current","injectJavaScript","JSON","stringify","e","nativeEvent","decodeURIComponent","response","parse","request","url","iamportUrl","IamportUrl","isAppUrl","launchApp","catch","code","message","imp_success","error_code","error_msg","isPaymentOver","getQuery","getMessage"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AAEA;;AACA;;AAEA;;AACA;;AAEA;;AACA;;;;;;;;AAUA,SAASA,aAAT,CAAuB;AAAEC,EAAAA,QAAF;AAAYC,EAAAA,QAAZ;AAAsBC,EAAAA,IAAtB;AAA4BC,EAAAA,OAA5B;AAAqCC,EAAAA;AAArC,CAAvB,EAA+E;AAC7E,QAAM,CAACC,eAAD,EAAkBC,kBAAlB,IAAwC,qBAAS,KAAT,CAA9C;AACA,QAAMC,OAAO,gBAAG,uBAAhB;AACA,QAAMC,UAAU,GAAG,IAAIC,sBAAJ,CAAeT,QAAf,EAAyBG,OAAzB,EAAkCC,QAAlC,EAA4CF,IAA5C,CAAnB;AACA,MAAIQ,WAAW,GAAGC,oBAASC,cAA3B;;AACA,MAAIV,IAAI,CAACW,cAAL,KAAwBC,SAAxB,IAAqCZ,IAAI,CAACW,cAAL,CAAoBE,IAApB,OAA+B,EAAxE,EAA4E;AAC1EL,IAAAA,WAAW,GAAGR,IAAI,CAACW,cAAnB;AACD;;AAED,
|
|
1
|
+
{"version":3,"sources":["index.tsx"],"names":["Certification","userCode","tierCode","data","loading","callback","isWebViewLoaded","setIsWebViewLoaded","webview","validation","Validation","redirectUrl","IMPConst","M_REDIRECT_URL","m_redirect_url","undefined","trim","getIsValid","loadingContainer","webViewContainer","viewStyles","html","WEBVIEW_SOURCE_HTML","current","injectJavaScript","JSON","stringify","e","nativeEvent","decodeURIComponent","response","parse","request","url","iamportUrl","IamportUrl","isAppUrl","launchApp","catch","code","message","imp_success","error_code","error_msg","isPaymentOver","getQuery","getMessage"],"mappings":"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","sourcesContent":["import React, { createRef, useState } from 'react';\nimport { View } from 'react-native';\nimport { WebView } from 'react-native-webview';\n\nimport Loading from '../Loading';\nimport ErrorOnParams from '../ErrorOnParams';\n\nimport { IMPData, Validation } from '../../utils/Validation';\nimport { IMPConst } from '../../constants';\n\nimport viewStyles from '../../styles';\nimport IamportUrl from '../../utils/IamportUrl';\n\ntype Props = {\n userCode: string;\n tierCode?: string;\n data: IMPData.CertificationData;\n loading?: any;\n callback: (response: any) => any;\n};\n\nfunction Certification({ userCode, tierCode, data, loading, callback }: Props) {\n const [isWebViewLoaded, setIsWebViewLoaded] = useState(false);\n const webview = createRef<WebView>();\n const validation = new Validation(userCode, loading, callback, data);\n let redirectUrl = IMPConst.M_REDIRECT_URL;\n if (data.m_redirect_url !== undefined && data.m_redirect_url.trim() !== '') {\n redirectUrl = data.m_redirect_url;\n } else {\n data.m_redirect_url = redirectUrl;\n }\n\n if (validation.getIsValid()) {\n const { loadingContainer, webViewContainer } = viewStyles;\n return (\n <>\n <WebView\n containerStyle={webViewContainer}\n ref={webview}\n source={{ html: IMPConst.WEBVIEW_SOURCE_HTML }}\n onLoadEnd={() => {\n if (!isWebViewLoaded) {\n // html이 load되고 최초 한번만 inject javascript\n if (tierCode) {\n webview.current?.injectJavaScript(`\n setTimeout(function() { IMP.agency(\"${userCode}\", \"${tierCode}\"); });\n `);\n } else {\n webview.current?.injectJavaScript(`\n setTimeout(function() { IMP.init(\"${userCode}\"); });\n `);\n }\n webview.current?.injectJavaScript(`\n setTimeout(function() {\n IMP.certification(${JSON.stringify(data)}, function(response) {\n window.ReactNativeWebView.postMessage(JSON.stringify(response));\n });\n });\n `);\n setIsWebViewLoaded(true);\n }\n }}\n onMessage={(e) => {\n let data = e.nativeEvent.data;\n if (decodeURIComponent(data) !== data) {\n data = decodeURIComponent(data);\n }\n let response = JSON.parse(data);\n\n if (typeof callback === 'function') {\n callback(response);\n }\n }}\n startInLoadingState\n renderLoading={() => (\n <View style={loadingContainer}>{loading || <Loading />}</View>\n )}\n originWhitelist={['*']} // https://github.com/facebook/react-native/issues/19986\n onShouldStartLoadWithRequest={(request) => {\n const { url } = request;\n // console.log('url: ' + url);\n const iamportUrl = new IamportUrl(url);\n if (iamportUrl.isAppUrl()) {\n /* 3rd-party 앱 오픈 */\n iamportUrl.launchApp().catch((e) => {\n const { code, message } = e;\n callback({\n imp_success: false,\n error_code: code,\n error_msg: message,\n });\n });\n\n return false;\n }\n if (iamportUrl.isPaymentOver(redirectUrl)) {\n callback(iamportUrl.getQuery());\n return false;\n }\n\n return true;\n }}\n />\n </>\n );\n }\n\n return <ErrorOnParams message={validation.getMessage()} />;\n}\n\nexport default Certification;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["index.tsx"],"names":["Payment","userCode","tierCode","data","loading","callback","webviewSource","setWebviewSource","html","IMPConst","WEBVIEW_SOURCE_HTML","isWebViewLoaded","setIsWebViewLoaded","showLoading","setShowLoading","isInicisTransPaid","setIsInicisTransPaid","webview","smilepayRef","redirectUrl","M_REDIRECT_URL","m_redirect_url","undefined","trim","pg","startsWith","Platform","OS","current","baseUrl","SMILEPAY_BASE_URL","handleOpenURL","event","pay_method","iamportUrl","IamportUrl","url","injectJavaScript","getInicisTransQuery","queryParameters","getQuery","scheme","niceTransRedirectionUrl","app_scheme","toLowerCase","callbackparam1","getStringifiedQuery","Linking","addEventListener","removeLoadingNeeded","isIframeWayPayment","customer_uid","validation","ValidationForPayment","getIsValid","loadingContainer","webViewContainer","viewStyles","popup","JSON","stringify","e","encoded","encodeURIComponent","nativeEvent","decoded","decodeURIComponent","response","parse","request","isAppUrl","launchApp","catch","code","message","imp_success","error_code","error_msg","isPaymentOver","isIframeLoaded","getMessage"],"mappings":";;;;;;;AAAA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;AAWA,SAASA,OAAT,CAAiB;AAAEC,EAAAA,QAAF;AAAYC,EAAAA,QAAZ;AAAsBC,EAAAA,IAAtB;AAA4BC,EAAAA,OAA5B;AAAqCC,EAAAA;AAArC,CAAjB,EAAyE;AACvE,QAAM,CAACC,aAAD,EAAgBC,gBAAhB,IAAoC,qBAAwB;AAChEC,IAAAA,IAAI,EAAEC,oBAASC;AADiD,GAAxB,CAA1C;AAGA,QAAM,CAACC,eAAD,EAAkBC,kBAAlB,IAAwC,qBAAS,KAAT,CAA9C;AACA,QAAM,CAACC,WAAD,EAAcC,cAAd,IAAgC,qBAAS,IAAT,CAAtC;AACA,QAAM,CAACC,iBAAD,EAAoBC,oBAApB,IAA4C,qBAAS,KAAT,CAAlD;AACA,QAAMC,OAAO,gBAAG,uBAAhB;AACA,QAAMC,WAAW,GAAG,mBAAO,KAAP,CAApB;AACA,MAAIC,WAAW,GAAGV,oBAASW,cAA3B;;AACA,MAAIjB,IAAI,CAACkB,cAAL,KAAwBC,SAAxB,IAAqCnB,IAAI,CAACkB,cAAL,CAAoBE,IAApB,OAA+B,EAAxE,EAA4E;AAC1EJ,IAAAA,WAAW,GAAGhB,IAAI,CAACkB,cAAnB;AACD;;AAED,wBAAU,MAAM;AACd,UAAM;AAAEG,MAAAA;AAAF,QAASrB,IAAf;;AACA,QACEqB,EAAE,CAACC,UAAH,CAAc,UAAd,KACAC,sBAASC,EAAT,KAAgB,KADhB,IAEA,CAACT,WAAW,CAACU,OAHf,EAIE;AACA;AACN;AACA;AACA;AACA;AACMrB,MAAAA,gBAAgB,CAAC,EACf,GAAGD,aADY;AAEfuB,QAAAA,OAAO,EAAEpB,oBAASqB;AAFH,OAAD,CAAhB;AAIAZ,MAAAA,WAAW,CAACU,OAAZ,GAAsB,IAAtB;AACD;AACF,GAlBD,EAkBG,CAACzB,IAAD,EAAOG,aAAP,CAlBH;AAoBA,wBAAU,MAAM;AACd,UAAMyB,aAAa,GAAIC,KAAD,IAA4B;AAChD,YAAM;AAAER,QAAAA,EAAF;AAAMS,QAAAA;AAAN,UAAqB9B,IAA3B;;AACA,UAAI8B,UAAU,KAAK,OAAnB,EAA4B;AAC1B,cAAMC,UAAU,GAAG,IAAIC,mBAAJ,CAAeH,KAAK,CAACI,GAArB,CAAnB;AACA;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACQ,YAAIZ,EAAE,CAACC,UAAH,CAAc,cAAd,KAAiCC,sBAASC,EAAT,KAAgB,KAArD,EAA4D;AAC1D,cAAIZ,iBAAJ,EAAuB;AAAA;;AACrB,gCAAAE,OAAO,CAACW,OAAR,sEAAiBS,gBAAjB,CAAmC;AAC/C,wCAAwClB,WAAY,IAAGe,UAAU,CAACI,mBAAX,CACzCnB,WADyC,CAEzC;AACd,aAJY;AAKD,WAND,MAMO;AACLH,YAAAA,oBAAoB,CAAC,IAAD,CAApB;AACD;AACF;AAED;;;AACA,YAAIQ,EAAE,CAACC,UAAH,CAAc,MAAd,CAAJ,EAA2B;AAAA;;AACzB,gBAAMc,eAAe,GAAGL,UAAU,CAACM,QAAX,EAAxB;AACA,gBAAMC,MAAM,GAAGP,UAAU,CAACO,MAA1B;AACA,cAAIC,uBAAJ;;AACA,cAAID,MAAM,0BAAKtC,IAAI,CAACwC,UAAV,qDAAK,iBAAiBC,WAAjB,EAAL,CAAV,EAA+C;AAC7C,gBAAIL,eAAe,CAACM,cAAhB,IAAkC,IAAtC,EAA4C;AAC1CH,cAAAA,uBAAuB,GAAGH,eAAe,CAACM,cAA1C;AACD;AACF;;AACD,+BAAA5B,OAAO,CAACW,OAAR,wEAAiBS,gBAAjB,CAAmC;AAC7C,sCAAsCK,uBAAwB,IAAGR,UAAU,CAACY,mBAAX,EAAiC;AAClG,WAFU;AAGD;AACF;AACF,KA3CD;;AA4CAC,yBAAQC,gBAAR,CAAyB,KAAzB,EAAgCjB,aAAhC;AACD,GA9CD,EA8CG,CAAC5B,IAAD,EAAOY,iBAAP,EAA0BI,WAA1B,EAAuCF,OAAvC,CA9CH;;AAgDA,QAAMgC,mBAAmB,GAAG,MAAM;AAChC,QAAIpC,WAAW,IAAIa,sBAASC,EAAT,KAAgB,SAAnC,EAA8C;AAC5C;AACA,UAAIhB,eAAJ,EAAqB;AACnB;AACA,eAAO,IAAP;AACD;;AACD,aAAOuC,kBAAkB,EAAzB;AACD,KAR+B,CAShC;;;AACA,WAAO,KAAP;AACD,GAXD;;AAaA,QAAMA,kBAAkB,GAAG,MAAM;AAC/B,UAAM;AAAE1B,MAAAA,EAAF;AAAMS,MAAAA,UAAN;AAAkBkB,MAAAA;AAAlB,QAAmChD,IAAzC;;AACA,QAAIqB,EAAE,CAACC,UAAH,CAAc,cAAd,KAAiC0B,YAArC,EAAmD;AACjD;AACA,aAAO,IAAP;AACD;;AACD,QAAI3B,EAAE,CAACC,UAAH,CAAc,WAAd,KAA8BQ,UAAU,KAAK,OAAjD,EAA0D;AACxD;AACA,aAAO,IAAP;AACD;;AACD,WACET,EAAE,CAACC,UAAH,CAAc,OAAd,KACAD,EAAE,CAACC,UAAH,CAAc,YAAd,CADA,IAEAD,EAAE,CAACC,UAAH,CAAc,UAAd,CAFA,IAGAD,EAAE,CAACC,UAAH,CAAc,OAAd,CAHA,IAIAD,EAAE,CAACC,UAAH,CAAc,YAAd,CALF;AAOD,GAjBD;;AAmBA,QAAM2B,UAAU,GAAG,IAAIC,6BAAJ,CACjBpD,QADiB,EAEjBG,OAFiB,EAGjBC,QAHiB,EAIjBF,IAJiB,CAAnB;;AAMA,MAAIiD,UAAU,CAACE,UAAX,EAAJ,EAA6B;AAC3B,UAAM;AAAEC,MAAAA,gBAAF;AAAoBC,MAAAA;AAApB,QAAyCC,eAA/C;AACA,wBACE,yEACE,6BAAC,2BAAD;AACE,MAAA,cAAc,EAAED,gBADlB;AAEE,MAAA,GAAG,EAAEvC,OAFP;AAGE,MAAA,MAAM,EAAEX,aAHV;AAIE,MAAA,SAAS,EAAE,MAAM;AACf,YAAI,CAACK,eAAL,EAAsB;AAAA;;AACpB,cAAIR,IAAI,CAACqB,EAAL,CAAQC,UAAR,CAAmB,SAAnB,CAAJ,EAAmC;AACjCtB,YAAAA,IAAI,CAACuD,KAAL,GAAa,KAAb;AACD;;AAED,cAAIxD,QAAJ,EAAc;AAAA;;AACZ,iCAAAe,OAAO,CAACW,OAAR,wEAAiBS,gBAAjB,CAAmC;AACnD,0DAA0DpC,QAAS,OAAMC,QAAS;AAClF,mBAFgB;AAGD,WAJD,MAIO;AAAA;;AACL,iCAAAe,OAAO,CAACW,OAAR,wEAAiBS,gBAAjB,CAAmC;AACnD,wDAAwDpC,QAAS;AACjE,mBAFgB;AAGD;;AACD,+BAAAgB,OAAO,CAACW,OAAR,wEAAiBS,gBAAjB,CAAmC;AACjD;AACA,sCAAsCsB,IAAI,CAACC,SAAL,CAChBzD,IADgB,CAEhB;AACtB;AACA;AACA;AACA,iBARc;AASAS,UAAAA,kBAAkB,CAAC,IAAD,CAAlB;AACD,SAzBc,CA2Bf;;;AACA,YAAIqC,mBAAmB,EAAvB,EAA2B;AACzBnC,UAAAA,cAAc,CAAC,KAAD,CAAd;AACD;AACF;AACD;AApCF;AAqCE,MAAA,SAAS,EAAG+C,CAAD,IAAO;AAChB;AACZ;AACA;AACA;AACA;AACA;AACY,cAAMC,OAAO,GAAGC,kBAAkB,CAACF,CAAC,CAACG,WAAF,CAAc7D,IAAf,CAAlC;AACA,cAAM8D,OAAO,GAAGC,kBAAkB,CAACJ,OAAD,CAAlC;AACA,cAAMK,QAAQ,GAAGR,IAAI,CAACS,KAAL,CAAWH,OAAX,CAAjB;;AACA,YAAI,OAAO5D,QAAP,KAAoB,UAAxB,EAAoC;AAClCA,UAAAA,QAAQ,CAAC8D,QAAD,CAAR;AACD;AACF,OAlDH;AAmDE,MAAA,eAAe,EAAE,CAAC,GAAD,CAnDnB,CAmD0B;AAnD1B;AAoDE,MAAA,oBAAoB,EAAE,IApDxB;AAqDE,MAAA,4BAA4B,EAAGE,OAAD,IAAa;AACzC,cAAM;AAAEjC,UAAAA;AAAF,YAAUiC,OAAhB,CADyC,CAEzC;;AACA,cAAMnC,UAAU,GAAG,IAAIC,mBAAJ,CAAeC,GAAf,CAAnB;;AACA,YAAIF,UAAU,CAACoC,QAAX,EAAJ,EAA2B;AACzB;AACApC,UAAAA,UAAU,CAACqC,SAAX,GAAuBC,KAAvB,CAA8BX,CAAD,IAAO;AAClC,kBAAM;AAAEY,cAAAA,IAAF;AAAQC,cAAAA;AAAR,gBAAoBb,CAA1B;AACAxD,YAAAA,QAAQ,CAAC;AACPsE,cAAAA,WAAW,EAAE,KADN;AAEPC,cAAAA,UAAU,EAAEH,IAFL;AAGPI,cAAAA,SAAS,EAAEH;AAHJ,aAAD,CAAR;AAKD,WAPD;AASA,iBAAO,KAAP;AACD;;AACD,YAAIxC,UAAU,CAAC4C,aAAX,CAAyB3D,WAAzB,CAAJ,EAA2C;AACzC,cAAI,OAAOd,QAAP,KAAoB,UAAxB,EAAoC;AAClCA,YAAAA,QAAQ,CAAC6B,UAAU,CAACM,QAAX,EAAD,CAAR;AACD;;AACD,iBAAO,KAAP;AACD;;AACD,YAAI7B,eAAe,IAAIE,WAAnB,IAAkCqB,UAAU,CAAC6C,cAAX,EAAtC,EAAmE;AACjE;AACd;AACA;AACA;AACA;AACcjE,UAAAA,cAAc,CAAC,KAAD,CAAd;AACD;;AACD,eAAO,IAAP;AACD;AArFH,MADF,EAwFGD,WAAW,iBACV,6BAAC,iBAAD;AAAM,MAAA,KAAK,EAAE0C;AAAb,OAAgCnD,OAAO,iBAAI,6BAAC,gBAAD,OAA3C,CAzFJ,CADF;AA8FD;;AAED,sBAAO,6BAAC,sBAAD;AAAe,IAAA,OAAO,EAAEgD,UAAU,CAAC4B,UAAX;AAAxB,IAAP;AACD;;eAEchF,O","sourcesContent":["import React, { createRef, useEffect, useRef, useState } from 'react';\nimport type { IMPData } from '../../utils/Validation';\nimport ValidationForPayment from '../../utils/ValidationForPayment';\nimport ErrorOnParams from '../ErrorOnParams';\nimport { Linking, Platform, View } from 'react-native';\nimport { IMPConst } from '../../constants';\nimport IamportUrl from '../../utils/IamportUrl';\nimport WebView from 'react-native-webview';\nimport viewStyles from '../../styles';\nimport Loading from '../Loading';\nimport type { WebViewSource } from 'react-native-webview/lib/WebViewTypes';\n\ntype Props = {\n userCode: string;\n tierCode?: string;\n data: IMPData.PaymentData;\n loading?: any;\n callback: (response: any) => any;\n};\n\nfunction Payment({ userCode, tierCode, data, loading, callback }: Props) {\n const [webviewSource, setWebviewSource] = useState<WebViewSource>({\n html: IMPConst.WEBVIEW_SOURCE_HTML,\n });\n const [isWebViewLoaded, setIsWebViewLoaded] = useState(false);\n const [showLoading, setShowLoading] = useState(true);\n const [isInicisTransPaid, setIsInicisTransPaid] = useState(false);\n const webview = createRef<WebView>();\n const smilepayRef = useRef(false);\n let redirectUrl = IMPConst.M_REDIRECT_URL;\n if (data.m_redirect_url !== undefined && data.m_redirect_url.trim() !== '') {\n redirectUrl = data.m_redirect_url;\n }\n\n useEffect(() => {\n const { pg } = data;\n if (\n pg.startsWith('smilepay') &&\n Platform.OS === 'ios' &&\n !smilepayRef.current\n ) {\n /**\n * [feature/smilepay] IOS - 스마일페이 대비 코드 작성\n * 스마일페이 결제창을 iframe 방식으로 띄우기 때문에 WKWebView에서 서드 파티 쿠키가 허용되지 않아\n * WKWebView의 baseUrl을 강제로 스마일페이 URL로 적용\n */\n setWebviewSource({\n ...webviewSource,\n baseUrl: IMPConst.SMILEPAY_BASE_URL,\n });\n smilepayRef.current = true;\n }\n }, [data, webviewSource]);\n\n useEffect(() => {\n const handleOpenURL = (event: { url: string }) => {\n const { pg, pay_method } = data;\n if (pay_method === 'trans') {\n const iamportUrl = new IamportUrl(event.url);\n /**\n * [IOS] 웹 표준 이니시스 - 실시간 계좌이체 대비\n * 아래 로직대로 동작해야 최종적으로 결제가 승인된 후 콜백 함수가 호출됨\n * 1. 사파리 앱에서 복귀(app_scheme://imp_uid=%26merchant_uid=%26m_redirect_url=)\n * 2. 최종 결제 승인을 위해 이니시스가 HTTP 리퀘스트 호출\n * 3. \"다음\" 버튼이 있는 최종 화면으로 이동\n * 4. \"다음\" 버튼을 클릭\n * 5. 1번과 마찬가지로 app_scheme://imp_uid=%26merchant_uid=%26m_redirect_url=로 HTTP 리퀘스트 호출\n * 6. 콜백 함수 호출\n * 따라서 현재 handleOpenURL이 트리거 되는 사유가 1번 때문인지 5번 때문인지 구분이 필요하여\n * 이를 위한 isInicisTransPaid 플래그 추가\n */\n if (pg.startsWith('html5_inicis') && Platform.OS === 'ios') {\n if (isInicisTransPaid) {\n webview.current?.injectJavaScript(`\n window.location.href = \"${redirectUrl}?${iamportUrl.getInicisTransQuery(\n redirectUrl\n )}\";\n `);\n } else {\n setIsInicisTransPaid(true);\n }\n }\n\n /* 나이스 - 실시간 계좌이체 대비 */\n if (pg.startsWith('nice')) {\n const queryParameters = iamportUrl.getQuery();\n const scheme = iamportUrl.scheme;\n let niceTransRedirectionUrl;\n if (scheme === data.app_scheme?.toLowerCase()) {\n if (queryParameters.callbackparam1 != null) {\n niceTransRedirectionUrl = queryParameters.callbackparam1;\n }\n }\n webview.current?.injectJavaScript(`\n window.location.href = \"${niceTransRedirectionUrl}?${iamportUrl.getStringifiedQuery()}\";\n `);\n }\n }\n };\n Linking.addEventListener('url', handleOpenURL);\n }, [data, isInicisTransPaid, redirectUrl, webview]);\n\n const removeLoadingNeeded = () => {\n if (showLoading && Platform.OS === 'android') {\n // 로딩상태. 안드로이드 플랫폼\n if (isWebViewLoaded) {\n // 웹뷰 로드 끝. 리디렉션 방식\n return true;\n }\n return isIframeWayPayment();\n }\n // IOS\n return false;\n };\n\n const isIframeWayPayment = () => {\n const { pg, pay_method, customer_uid } = data;\n if (pg.startsWith('html5_inicis') && customer_uid) {\n // 이니시스 빌링결제\n return true;\n }\n if (pg.startsWith('mobilians') && pay_method === 'phone') {\n // 모빌리언스 휴대폰 소액결제\n return true;\n }\n return (\n pg.startsWith('danal') ||\n pg.startsWith('danal_tpay') ||\n pg.startsWith('smilepay') ||\n pg.startsWith('payco') ||\n pg.startsWith('bluewalnut')\n );\n };\n\n const validation = new ValidationForPayment(\n userCode,\n loading,\n callback,\n data\n );\n if (validation.getIsValid()) {\n const { loadingContainer, webViewContainer } = viewStyles;\n return (\n <>\n <WebView\n containerStyle={webViewContainer}\n ref={webview}\n source={webviewSource}\n onLoadEnd={() => {\n if (!isWebViewLoaded) {\n if (data.pg.startsWith('eximbay')) {\n data.popup = false;\n }\n\n if (tierCode) {\n webview.current?.injectJavaScript(`\n setTimeout(function() { IMP.agency(\"${userCode}\", \"${tierCode}\"); });\n `);\n } else {\n webview.current?.injectJavaScript(`\n setTimeout(function() { IMP.init(\"${userCode}\"); });\n `);\n }\n webview.current?.injectJavaScript(`\n setTimeout(function() {\n IMP.request_pay(${JSON.stringify(\n data\n )}, function(response) {\n window.ReactNativeWebView.postMessage(JSON.stringify(response));\n });\n });\n `);\n setIsWebViewLoaded(true);\n }\n\n // only for Android\n if (removeLoadingNeeded()) {\n setShowLoading(false);\n }\n }}\n /* PG사가 callback을 지원하는 경우, 결제결과를 받아 callback을 실행한다 */\n onMessage={(e) => {\n /**\n * [v1.6.0] 다날의 경우 response에 주문명(name)이 포함되어 있는데\n * 주문명에 %가 들어갈 경우, decodeURIComponent시 URI malformed 에러가 발생하는 것 대비해\n * 우선 encodeURIComponent를 한 후, decodeURIComponent가 끝나면\n * 최종적으로 decodeURIComponent를 한 번 더 한다\n */\n const encoded = encodeURIComponent(e.nativeEvent.data);\n const decoded = decodeURIComponent(encoded);\n const response = JSON.parse(decoded);\n if (typeof callback === 'function') {\n callback(response);\n }\n }}\n originWhitelist={['*']} // https://github.com/facebook/react-native/issues/19986\n sharedCookiesEnabled={true}\n onShouldStartLoadWithRequest={(request) => {\n const { url } = request;\n // console.log(`url: ${url}`);\n const iamportUrl = new IamportUrl(url);\n if (iamportUrl.isAppUrl()) {\n /* 3rd-party 앱 오픈 */\n iamportUrl.launchApp().catch((e) => {\n const { code, message } = e;\n callback({\n imp_success: false,\n error_code: code,\n error_msg: message,\n });\n });\n\n return false;\n }\n if (iamportUrl.isPaymentOver(redirectUrl)) {\n if (typeof callback === 'function') {\n callback(iamportUrl.getQuery());\n }\n return false;\n }\n if (isWebViewLoaded && showLoading && iamportUrl.isIframeLoaded()) {\n /**\n * only for IOS\n * iframe이 load되면(url이 about:blank 또는 https://service.iamport.kr이 아니면)\n * webview의 loading 상태를 해제한다\n */\n setShowLoading(false);\n }\n return true;\n }}\n />\n {showLoading && (\n <View style={loadingContainer}>{loading || <Loading />}</View>\n )}\n </>\n );\n }\n\n return <ErrorOnParams message={validation.getMessage()} />;\n}\n\nexport default Payment;\n"]}
|
|
1
|
+
{"version":3,"sources":["index.tsx"],"names":["Payment","userCode","tierCode","data","loading","callback","webviewSource","setWebviewSource","html","IMPConst","WEBVIEW_SOURCE_HTML","isWebViewLoaded","setIsWebViewLoaded","showLoading","setShowLoading","isInicisTransPaid","setIsInicisTransPaid","webview","smilepayRef","redirectUrl","M_REDIRECT_URL","m_redirect_url","undefined","trim","pg","startsWith","Platform","OS","current","baseUrl","SMILEPAY_BASE_URL","handleOpenURL","event","pay_method","iamportUrl","IamportUrl","url","injectJavaScript","getInicisTransQuery","queryParameters","getQuery","scheme","niceTransRedirectionUrl","app_scheme","toLowerCase","callbackparam1","getStringifiedQuery","Linking","addEventListener","removeLoadingNeeded","isIframeWayPayment","customer_uid","validation","ValidationForPayment","getIsValid","loadingContainer","webViewContainer","viewStyles","popup","JSON","stringify","e","encoded","encodeURIComponent","nativeEvent","decoded","decodeURIComponent","response","parse","request","isAppUrl","launchApp","catch","code","message","imp_success","error_code","error_msg","isPaymentOver","isIframeLoaded","getMessage"],"mappings":"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","sourcesContent":["import React, { createRef, useEffect, useRef, useState } from 'react';\nimport type { IMPData } from '../../utils/Validation';\nimport ValidationForPayment from '../../utils/ValidationForPayment';\nimport ErrorOnParams from '../ErrorOnParams';\nimport { Linking, Platform, View } from 'react-native';\nimport { IMPConst } from '../../constants';\nimport IamportUrl from '../../utils/IamportUrl';\nimport WebView from 'react-native-webview';\nimport viewStyles from '../../styles';\nimport Loading from '../Loading';\nimport type { WebViewSource } from 'react-native-webview/lib/WebViewTypes';\n\ntype Props = {\n userCode: string;\n tierCode?: string;\n data: IMPData.PaymentData;\n loading?: any;\n callback: (response: any) => any;\n};\n\nfunction Payment({ userCode, tierCode, data, loading, callback }: Props) {\n const [webviewSource, setWebviewSource] = useState<WebViewSource>({\n html: IMPConst.WEBVIEW_SOURCE_HTML,\n });\n const [isWebViewLoaded, setIsWebViewLoaded] = useState(false);\n const [showLoading, setShowLoading] = useState(true);\n const [isInicisTransPaid, setIsInicisTransPaid] = useState(false);\n const webview = createRef<WebView>();\n const smilepayRef = useRef(false);\n let redirectUrl = IMPConst.M_REDIRECT_URL;\n if (data.m_redirect_url !== undefined && data.m_redirect_url.trim() !== '') {\n redirectUrl = data.m_redirect_url;\n } else {\n data.m_redirect_url = redirectUrl;\n }\n\n useEffect(() => {\n const { pg } = data;\n if (\n pg.startsWith('smilepay') &&\n Platform.OS === 'ios' &&\n !smilepayRef.current\n ) {\n /**\n * [feature/smilepay] IOS - 스마일페이 대비 코드 작성\n * 스마일페이 결제창을 iframe 방식으로 띄우기 때문에 WKWebView에서 서드 파티 쿠키가 허용되지 않아\n * WKWebView의 baseUrl을 강제로 스마일페이 URL로 적용\n */\n setWebviewSource({\n ...webviewSource,\n baseUrl: IMPConst.SMILEPAY_BASE_URL,\n });\n smilepayRef.current = true;\n }\n }, [data, webviewSource]);\n\n useEffect(() => {\n const handleOpenURL = (event: { url: string }) => {\n const { pg, pay_method } = data;\n if (pay_method === 'trans') {\n const iamportUrl = new IamportUrl(event.url);\n /**\n * [IOS] 웹 표준 이니시스 - 실시간 계좌이체 대비\n * 아래 로직대로 동작해야 최종적으로 결제가 승인된 후 콜백 함수가 호출됨\n * 1. 사파리 앱에서 복귀(app_scheme://imp_uid=%26merchant_uid=%26m_redirect_url=)\n * 2. 최종 결제 승인을 위해 이니시스가 HTTP 리퀘스트 호출\n * 3. \"다음\" 버튼이 있는 최종 화면으로 이동\n * 4. \"다음\" 버튼을 클릭\n * 5. 1번과 마찬가지로 app_scheme://imp_uid=%26merchant_uid=%26m_redirect_url=로 HTTP 리퀘스트 호출\n * 6. 콜백 함수 호출\n * 따라서 현재 handleOpenURL이 트리거 되는 사유가 1번 때문인지 5번 때문인지 구분이 필요하여\n * 이를 위한 isInicisTransPaid 플래그 추가\n */\n if (pg.startsWith('html5_inicis') && Platform.OS === 'ios') {\n if (isInicisTransPaid) {\n webview.current?.injectJavaScript(`\n window.location.href = \"${redirectUrl}?${iamportUrl.getInicisTransQuery(\n redirectUrl\n )}\";\n `);\n } else {\n setIsInicisTransPaid(true);\n }\n }\n\n /* 나이스 - 실시간 계좌이체 대비 */\n if (pg.startsWith('nice')) {\n const queryParameters = iamportUrl.getQuery();\n const scheme = iamportUrl.scheme;\n let niceTransRedirectionUrl;\n if (scheme === data.app_scheme?.toLowerCase()) {\n if (queryParameters.callbackparam1 != null) {\n niceTransRedirectionUrl = queryParameters.callbackparam1;\n }\n }\n webview.current?.injectJavaScript(`\n window.location.href = \"${niceTransRedirectionUrl}?${iamportUrl.getStringifiedQuery()}\";\n `);\n }\n }\n };\n Linking.addEventListener('url', handleOpenURL);\n }, [data, isInicisTransPaid, redirectUrl, webview]);\n\n const removeLoadingNeeded = () => {\n if (showLoading && Platform.OS === 'android') {\n // 로딩상태. 안드로이드 플랫폼\n if (isWebViewLoaded) {\n // 웹뷰 로드 끝. 리디렉션 방식\n return true;\n }\n return isIframeWayPayment();\n }\n // IOS\n return false;\n };\n\n const isIframeWayPayment = () => {\n const { pg, pay_method, customer_uid } = data;\n if (pg.startsWith('html5_inicis') && customer_uid) {\n // 이니시스 빌링결제\n return true;\n }\n if (pg.startsWith('mobilians') && pay_method === 'phone') {\n // 모빌리언스 휴대폰 소액결제\n return true;\n }\n return (\n pg.startsWith('danal') ||\n pg.startsWith('danal_tpay') ||\n pg.startsWith('smilepay') ||\n pg.startsWith('payco') ||\n pg.startsWith('bluewalnut')\n );\n };\n\n const validation = new ValidationForPayment(\n userCode,\n loading,\n callback,\n data\n );\n if (validation.getIsValid()) {\n const { loadingContainer, webViewContainer } = viewStyles;\n return (\n <>\n <WebView\n containerStyle={webViewContainer}\n ref={webview}\n source={webviewSource}\n onLoadEnd={() => {\n if (!isWebViewLoaded) {\n if (data.pg.startsWith('eximbay')) {\n data.popup = false;\n }\n\n if (tierCode) {\n webview.current?.injectJavaScript(`\n setTimeout(function() { IMP.agency(\"${userCode}\", \"${tierCode}\"); });\n `);\n } else {\n webview.current?.injectJavaScript(`\n setTimeout(function() { IMP.init(\"${userCode}\"); });\n `);\n }\n webview.current?.injectJavaScript(`\n setTimeout(function() {\n IMP.request_pay(${JSON.stringify(\n data\n )}, function(response) {\n window.ReactNativeWebView.postMessage(JSON.stringify(response));\n });\n });\n `);\n setIsWebViewLoaded(true);\n }\n\n // only for Android\n if (removeLoadingNeeded()) {\n setShowLoading(false);\n }\n }}\n /* PG사가 callback을 지원하는 경우, 결제결과를 받아 callback을 실행한다 */\n onMessage={(e) => {\n /**\n * [v1.6.0] 다날의 경우 response에 주문명(name)이 포함되어 있는데\n * 주문명에 %가 들어갈 경우, decodeURIComponent시 URI malformed 에러가 발생하는 것 대비해\n * 우선 encodeURIComponent를 한 후, decodeURIComponent가 끝나면\n * 최종적으로 decodeURIComponent를 한 번 더 한다\n */\n const encoded = encodeURIComponent(e.nativeEvent.data);\n const decoded = decodeURIComponent(encoded);\n const response = JSON.parse(decoded);\n if (typeof callback === 'function') {\n callback(response);\n }\n }}\n originWhitelist={['*']} // https://github.com/facebook/react-native/issues/19986\n sharedCookiesEnabled={true}\n onShouldStartLoadWithRequest={(request) => {\n const { url } = request;\n // console.log(`url: ${url}`);\n const iamportUrl = new IamportUrl(url);\n if (iamportUrl.isAppUrl()) {\n /* 3rd-party 앱 오픈 */\n iamportUrl.launchApp().catch((e) => {\n const { code, message } = e;\n callback({\n imp_success: false,\n error_code: code,\n error_msg: message,\n });\n });\n\n return false;\n }\n if (iamportUrl.isPaymentOver(redirectUrl)) {\n if (typeof callback === 'function') {\n callback(iamportUrl.getQuery());\n }\n return false;\n }\n if (isWebViewLoaded && showLoading && iamportUrl.isIframeLoaded()) {\n /**\n * only for IOS\n * iframe이 load되면(url이 about:blank 또는 https://service.iamport.kr이 아니면)\n * webview의 loading 상태를 해제한다\n */\n setShowLoading(false);\n }\n return true;\n }}\n />\n {showLoading && (\n <View style={loadingContainer}>{loading || <Loading />}</View>\n )}\n </>\n );\n }\n\n return <ErrorOnParams message={validation.getMessage()} />;\n}\n\nexport default Payment;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["index.tsx"],"names":["React","createRef","useState","View","WebView","Loading","ErrorOnParams","Validation","IMPConst","viewStyles","IamportUrl","Certification","userCode","tierCode","data","loading","callback","isWebViewLoaded","setIsWebViewLoaded","webview","validation","redirectUrl","M_REDIRECT_URL","m_redirect_url","undefined","trim","getIsValid","loadingContainer","webViewContainer","html","WEBVIEW_SOURCE_HTML","current","injectJavaScript","JSON","stringify","e","nativeEvent","decodeURIComponent","response","parse","request","url","iamportUrl","isAppUrl","launchApp","catch","code","message","imp_success","error_code","error_msg","isPaymentOver","getQuery","getMessage"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,SAAhB,EAA2BC,QAA3B,QAA2C,OAA3C;AACA,SAASC,IAAT,QAAqB,cAArB;AACA,SAASC,OAAT,QAAwB,sBAAxB;AAEA,OAAOC,OAAP,MAAoB,YAApB;AACA,OAAOC,aAAP,MAA0B,kBAA1B;AAEA,SAAkBC,UAAlB,QAAoC,wBAApC;AACA,SAASC,QAAT,QAAyB,iBAAzB;AAEA,OAAOC,UAAP,MAAuB,cAAvB;AACA,OAAOC,UAAP,MAAuB,wBAAvB;;AAUA,SAASC,aAAT,CAAuB;AAAEC,EAAAA,QAAF;AAAYC,EAAAA,QAAZ;AAAsBC,EAAAA,IAAtB;AAA4BC,EAAAA,OAA5B;AAAqCC,EAAAA;AAArC,CAAvB,EAA+E;AAC7E,QAAM,CAACC,eAAD,EAAkBC,kBAAlB,IAAwChB,QAAQ,CAAC,KAAD,CAAtD;AACA,QAAMiB,OAAO,gBAAGlB,SAAS,EAAzB;AACA,QAAMmB,UAAU,GAAG,IAAIb,UAAJ,CAAeK,QAAf,EAAyBG,OAAzB,EAAkCC,QAAlC,EAA4CF,IAA5C,CAAnB;AACA,MAAIO,WAAW,GAAGb,QAAQ,CAACc,cAA3B;;AACA,MAAIR,IAAI,CAACS,cAAL,KAAwBC,SAAxB,IAAqCV,IAAI,CAACS,cAAL,CAAoBE,IAApB,OAA+B,EAAxE,EAA4E;AAC1EJ,IAAAA,WAAW,GAAGP,IAAI,CAACS,cAAnB;AACD;;AAED,
|
|
1
|
+
{"version":3,"sources":["index.tsx"],"names":["React","createRef","useState","View","WebView","Loading","ErrorOnParams","Validation","IMPConst","viewStyles","IamportUrl","Certification","userCode","tierCode","data","loading","callback","isWebViewLoaded","setIsWebViewLoaded","webview","validation","redirectUrl","M_REDIRECT_URL","m_redirect_url","undefined","trim","getIsValid","loadingContainer","webViewContainer","html","WEBVIEW_SOURCE_HTML","current","injectJavaScript","JSON","stringify","e","nativeEvent","decodeURIComponent","response","parse","request","url","iamportUrl","isAppUrl","launchApp","catch","code","message","imp_success","error_code","error_msg","isPaymentOver","getQuery","getMessage"],"mappings":"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","sourcesContent":["import React, { createRef, useState } from 'react';\nimport { View } from 'react-native';\nimport { WebView } from 'react-native-webview';\n\nimport Loading from '../Loading';\nimport ErrorOnParams from '../ErrorOnParams';\n\nimport { IMPData, Validation } from '../../utils/Validation';\nimport { IMPConst } from '../../constants';\n\nimport viewStyles from '../../styles';\nimport IamportUrl from '../../utils/IamportUrl';\n\ntype Props = {\n userCode: string;\n tierCode?: string;\n data: IMPData.CertificationData;\n loading?: any;\n callback: (response: any) => any;\n};\n\nfunction Certification({ userCode, tierCode, data, loading, callback }: Props) {\n const [isWebViewLoaded, setIsWebViewLoaded] = useState(false);\n const webview = createRef<WebView>();\n const validation = new Validation(userCode, loading, callback, data);\n let redirectUrl = IMPConst.M_REDIRECT_URL;\n if (data.m_redirect_url !== undefined && data.m_redirect_url.trim() !== '') {\n redirectUrl = data.m_redirect_url;\n } else {\n data.m_redirect_url = redirectUrl;\n }\n\n if (validation.getIsValid()) {\n const { loadingContainer, webViewContainer } = viewStyles;\n return (\n <>\n <WebView\n containerStyle={webViewContainer}\n ref={webview}\n source={{ html: IMPConst.WEBVIEW_SOURCE_HTML }}\n onLoadEnd={() => {\n if (!isWebViewLoaded) {\n // html이 load되고 최초 한번만 inject javascript\n if (tierCode) {\n webview.current?.injectJavaScript(`\n setTimeout(function() { IMP.agency(\"${userCode}\", \"${tierCode}\"); });\n `);\n } else {\n webview.current?.injectJavaScript(`\n setTimeout(function() { IMP.init(\"${userCode}\"); });\n `);\n }\n webview.current?.injectJavaScript(`\n setTimeout(function() {\n IMP.certification(${JSON.stringify(data)}, function(response) {\n window.ReactNativeWebView.postMessage(JSON.stringify(response));\n });\n });\n `);\n setIsWebViewLoaded(true);\n }\n }}\n onMessage={(e) => {\n let data = e.nativeEvent.data;\n if (decodeURIComponent(data) !== data) {\n data = decodeURIComponent(data);\n }\n let response = JSON.parse(data);\n\n if (typeof callback === 'function') {\n callback(response);\n }\n }}\n startInLoadingState\n renderLoading={() => (\n <View style={loadingContainer}>{loading || <Loading />}</View>\n )}\n originWhitelist={['*']} // https://github.com/facebook/react-native/issues/19986\n onShouldStartLoadWithRequest={(request) => {\n const { url } = request;\n // console.log('url: ' + url);\n const iamportUrl = new IamportUrl(url);\n if (iamportUrl.isAppUrl()) {\n /* 3rd-party 앱 오픈 */\n iamportUrl.launchApp().catch((e) => {\n const { code, message } = e;\n callback({\n imp_success: false,\n error_code: code,\n error_msg: message,\n });\n });\n\n return false;\n }\n if (iamportUrl.isPaymentOver(redirectUrl)) {\n callback(iamportUrl.getQuery());\n return false;\n }\n\n return true;\n }}\n />\n </>\n );\n }\n\n return <ErrorOnParams message={validation.getMessage()} />;\n}\n\nexport default Certification;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["index.tsx"],"names":["React","createRef","useEffect","useRef","useState","ValidationForPayment","ErrorOnParams","Linking","Platform","View","IMPConst","IamportUrl","WebView","viewStyles","Loading","Payment","userCode","tierCode","data","loading","callback","webviewSource","setWebviewSource","html","WEBVIEW_SOURCE_HTML","isWebViewLoaded","setIsWebViewLoaded","showLoading","setShowLoading","isInicisTransPaid","setIsInicisTransPaid","webview","smilepayRef","redirectUrl","M_REDIRECT_URL","m_redirect_url","undefined","trim","pg","startsWith","OS","current","baseUrl","SMILEPAY_BASE_URL","handleOpenURL","event","pay_method","iamportUrl","url","injectJavaScript","getInicisTransQuery","queryParameters","getQuery","scheme","niceTransRedirectionUrl","app_scheme","toLowerCase","callbackparam1","getStringifiedQuery","addEventListener","removeLoadingNeeded","isIframeWayPayment","customer_uid","validation","getIsValid","loadingContainer","webViewContainer","popup","JSON","stringify","e","encoded","encodeURIComponent","nativeEvent","decoded","decodeURIComponent","response","parse","request","isAppUrl","launchApp","catch","code","message","imp_success","error_code","error_msg","isPaymentOver","isIframeLoaded","getMessage"],"mappings":"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","sourcesContent":["import React, { createRef, useEffect, useRef, useState } from 'react';\nimport type { IMPData } from '../../utils/Validation';\nimport ValidationForPayment from '../../utils/ValidationForPayment';\nimport ErrorOnParams from '../ErrorOnParams';\nimport { Linking, Platform, View } from 'react-native';\nimport { IMPConst } from '../../constants';\nimport IamportUrl from '../../utils/IamportUrl';\nimport WebView from 'react-native-webview';\nimport viewStyles from '../../styles';\nimport Loading from '../Loading';\nimport type { WebViewSource } from 'react-native-webview/lib/WebViewTypes';\n\ntype Props = {\n userCode: string;\n tierCode?: string;\n data: IMPData.PaymentData;\n loading?: any;\n callback: (response: any) => any;\n};\n\nfunction Payment({ userCode, tierCode, data, loading, callback }: Props) {\n const [webviewSource, setWebviewSource] = useState<WebViewSource>({\n html: IMPConst.WEBVIEW_SOURCE_HTML,\n });\n const [isWebViewLoaded, setIsWebViewLoaded] = useState(false);\n const [showLoading, setShowLoading] = useState(true);\n const [isInicisTransPaid, setIsInicisTransPaid] = useState(false);\n const webview = createRef<WebView>();\n const smilepayRef = useRef(false);\n let redirectUrl = IMPConst.M_REDIRECT_URL;\n if (data.m_redirect_url !== undefined && data.m_redirect_url.trim() !== '') {\n redirectUrl = data.m_redirect_url;\n }\n\n useEffect(() => {\n const { pg } = data;\n if (\n pg.startsWith('smilepay') &&\n Platform.OS === 'ios' &&\n !smilepayRef.current\n ) {\n /**\n * [feature/smilepay] IOS - 스마일페이 대비 코드 작성\n * 스마일페이 결제창을 iframe 방식으로 띄우기 때문에 WKWebView에서 서드 파티 쿠키가 허용되지 않아\n * WKWebView의 baseUrl을 강제로 스마일페이 URL로 적용\n */\n setWebviewSource({\n ...webviewSource,\n baseUrl: IMPConst.SMILEPAY_BASE_URL,\n });\n smilepayRef.current = true;\n }\n }, [data, webviewSource]);\n\n useEffect(() => {\n const handleOpenURL = (event: { url: string }) => {\n const { pg, pay_method } = data;\n if (pay_method === 'trans') {\n const iamportUrl = new IamportUrl(event.url);\n /**\n * [IOS] 웹 표준 이니시스 - 실시간 계좌이체 대비\n * 아래 로직대로 동작해야 최종적으로 결제가 승인된 후 콜백 함수가 호출됨\n * 1. 사파리 앱에서 복귀(app_scheme://imp_uid=%26merchant_uid=%26m_redirect_url=)\n * 2. 최종 결제 승인을 위해 이니시스가 HTTP 리퀘스트 호출\n * 3. \"다음\" 버튼이 있는 최종 화면으로 이동\n * 4. \"다음\" 버튼을 클릭\n * 5. 1번과 마찬가지로 app_scheme://imp_uid=%26merchant_uid=%26m_redirect_url=로 HTTP 리퀘스트 호출\n * 6. 콜백 함수 호출\n * 따라서 현재 handleOpenURL이 트리거 되는 사유가 1번 때문인지 5번 때문인지 구분이 필요하여\n * 이를 위한 isInicisTransPaid 플래그 추가\n */\n if (pg.startsWith('html5_inicis') && Platform.OS === 'ios') {\n if (isInicisTransPaid) {\n webview.current?.injectJavaScript(`\n window.location.href = \"${redirectUrl}?${iamportUrl.getInicisTransQuery(\n redirectUrl\n )}\";\n `);\n } else {\n setIsInicisTransPaid(true);\n }\n }\n\n /* 나이스 - 실시간 계좌이체 대비 */\n if (pg.startsWith('nice')) {\n const queryParameters = iamportUrl.getQuery();\n const scheme = iamportUrl.scheme;\n let niceTransRedirectionUrl;\n if (scheme === data.app_scheme?.toLowerCase()) {\n if (queryParameters.callbackparam1 != null) {\n niceTransRedirectionUrl = queryParameters.callbackparam1;\n }\n }\n webview.current?.injectJavaScript(`\n window.location.href = \"${niceTransRedirectionUrl}?${iamportUrl.getStringifiedQuery()}\";\n `);\n }\n }\n };\n Linking.addEventListener('url', handleOpenURL);\n }, [data, isInicisTransPaid, redirectUrl, webview]);\n\n const removeLoadingNeeded = () => {\n if (showLoading && Platform.OS === 'android') {\n // 로딩상태. 안드로이드 플랫폼\n if (isWebViewLoaded) {\n // 웹뷰 로드 끝. 리디렉션 방식\n return true;\n }\n return isIframeWayPayment();\n }\n // IOS\n return false;\n };\n\n const isIframeWayPayment = () => {\n const { pg, pay_method, customer_uid } = data;\n if (pg.startsWith('html5_inicis') && customer_uid) {\n // 이니시스 빌링결제\n return true;\n }\n if (pg.startsWith('mobilians') && pay_method === 'phone') {\n // 모빌리언스 휴대폰 소액결제\n return true;\n }\n return (\n pg.startsWith('danal') ||\n pg.startsWith('danal_tpay') ||\n pg.startsWith('smilepay') ||\n pg.startsWith('payco') ||\n pg.startsWith('bluewalnut')\n );\n };\n\n const validation = new ValidationForPayment(\n userCode,\n loading,\n callback,\n data\n );\n if (validation.getIsValid()) {\n const { loadingContainer, webViewContainer } = viewStyles;\n return (\n <>\n <WebView\n containerStyle={webViewContainer}\n ref={webview}\n source={webviewSource}\n onLoadEnd={() => {\n if (!isWebViewLoaded) {\n if (data.pg.startsWith('eximbay')) {\n data.popup = false;\n }\n\n if (tierCode) {\n webview.current?.injectJavaScript(`\n setTimeout(function() { IMP.agency(\"${userCode}\", \"${tierCode}\"); });\n `);\n } else {\n webview.current?.injectJavaScript(`\n setTimeout(function() { IMP.init(\"${userCode}\"); });\n `);\n }\n webview.current?.injectJavaScript(`\n setTimeout(function() {\n IMP.request_pay(${JSON.stringify(\n data\n )}, function(response) {\n window.ReactNativeWebView.postMessage(JSON.stringify(response));\n });\n });\n `);\n setIsWebViewLoaded(true);\n }\n\n // only for Android\n if (removeLoadingNeeded()) {\n setShowLoading(false);\n }\n }}\n /* PG사가 callback을 지원하는 경우, 결제결과를 받아 callback을 실행한다 */\n onMessage={(e) => {\n /**\n * [v1.6.0] 다날의 경우 response에 주문명(name)이 포함되어 있는데\n * 주문명에 %가 들어갈 경우, decodeURIComponent시 URI malformed 에러가 발생하는 것 대비해\n * 우선 encodeURIComponent를 한 후, decodeURIComponent가 끝나면\n * 최종적으로 decodeURIComponent를 한 번 더 한다\n */\n const encoded = encodeURIComponent(e.nativeEvent.data);\n const decoded = decodeURIComponent(encoded);\n const response = JSON.parse(decoded);\n if (typeof callback === 'function') {\n callback(response);\n }\n }}\n originWhitelist={['*']} // https://github.com/facebook/react-native/issues/19986\n sharedCookiesEnabled={true}\n onShouldStartLoadWithRequest={(request) => {\n const { url } = request;\n // console.log(`url: ${url}`);\n const iamportUrl = new IamportUrl(url);\n if (iamportUrl.isAppUrl()) {\n /* 3rd-party 앱 오픈 */\n iamportUrl.launchApp().catch((e) => {\n const { code, message } = e;\n callback({\n imp_success: false,\n error_code: code,\n error_msg: message,\n });\n });\n\n return false;\n }\n if (iamportUrl.isPaymentOver(redirectUrl)) {\n if (typeof callback === 'function') {\n callback(iamportUrl.getQuery());\n }\n return false;\n }\n if (isWebViewLoaded && showLoading && iamportUrl.isIframeLoaded()) {\n /**\n * only for IOS\n * iframe이 load되면(url이 about:blank 또는 https://service.iamport.kr이 아니면)\n * webview의 loading 상태를 해제한다\n */\n setShowLoading(false);\n }\n return true;\n }}\n />\n {showLoading && (\n <View style={loadingContainer}>{loading || <Loading />}</View>\n )}\n </>\n );\n }\n\n return <ErrorOnParams message={validation.getMessage()} />;\n}\n\nexport default Payment;\n"]}
|
|
1
|
+
{"version":3,"sources":["index.tsx"],"names":["React","createRef","useEffect","useRef","useState","ValidationForPayment","ErrorOnParams","Linking","Platform","View","IMPConst","IamportUrl","WebView","viewStyles","Loading","Payment","userCode","tierCode","data","loading","callback","webviewSource","setWebviewSource","html","WEBVIEW_SOURCE_HTML","isWebViewLoaded","setIsWebViewLoaded","showLoading","setShowLoading","isInicisTransPaid","setIsInicisTransPaid","webview","smilepayRef","redirectUrl","M_REDIRECT_URL","m_redirect_url","undefined","trim","pg","startsWith","OS","current","baseUrl","SMILEPAY_BASE_URL","handleOpenURL","event","pay_method","iamportUrl","url","injectJavaScript","getInicisTransQuery","queryParameters","getQuery","scheme","niceTransRedirectionUrl","app_scheme","toLowerCase","callbackparam1","getStringifiedQuery","addEventListener","removeLoadingNeeded","isIframeWayPayment","customer_uid","validation","getIsValid","loadingContainer","webViewContainer","popup","JSON","stringify","e","encoded","encodeURIComponent","nativeEvent","decoded","decodeURIComponent","response","parse","request","isAppUrl","launchApp","catch","code","message","imp_success","error_code","error_msg","isPaymentOver","isIframeLoaded","getMessage"],"mappings":"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","sourcesContent":["import React, { createRef, useEffect, useRef, useState } from 'react';\nimport type { IMPData } from '../../utils/Validation';\nimport ValidationForPayment from '../../utils/ValidationForPayment';\nimport ErrorOnParams from '../ErrorOnParams';\nimport { Linking, Platform, View } from 'react-native';\nimport { IMPConst } from '../../constants';\nimport IamportUrl from '../../utils/IamportUrl';\nimport WebView from 'react-native-webview';\nimport viewStyles from '../../styles';\nimport Loading from '../Loading';\nimport type { WebViewSource } from 'react-native-webview/lib/WebViewTypes';\n\ntype Props = {\n userCode: string;\n tierCode?: string;\n data: IMPData.PaymentData;\n loading?: any;\n callback: (response: any) => any;\n};\n\nfunction Payment({ userCode, tierCode, data, loading, callback }: Props) {\n const [webviewSource, setWebviewSource] = useState<WebViewSource>({\n html: IMPConst.WEBVIEW_SOURCE_HTML,\n });\n const [isWebViewLoaded, setIsWebViewLoaded] = useState(false);\n const [showLoading, setShowLoading] = useState(true);\n const [isInicisTransPaid, setIsInicisTransPaid] = useState(false);\n const webview = createRef<WebView>();\n const smilepayRef = useRef(false);\n let redirectUrl = IMPConst.M_REDIRECT_URL;\n if (data.m_redirect_url !== undefined && data.m_redirect_url.trim() !== '') {\n redirectUrl = data.m_redirect_url;\n } else {\n data.m_redirect_url = redirectUrl;\n }\n\n useEffect(() => {\n const { pg } = data;\n if (\n pg.startsWith('smilepay') &&\n Platform.OS === 'ios' &&\n !smilepayRef.current\n ) {\n /**\n * [feature/smilepay] IOS - 스마일페이 대비 코드 작성\n * 스마일페이 결제창을 iframe 방식으로 띄우기 때문에 WKWebView에서 서드 파티 쿠키가 허용되지 않아\n * WKWebView의 baseUrl을 강제로 스마일페이 URL로 적용\n */\n setWebviewSource({\n ...webviewSource,\n baseUrl: IMPConst.SMILEPAY_BASE_URL,\n });\n smilepayRef.current = true;\n }\n }, [data, webviewSource]);\n\n useEffect(() => {\n const handleOpenURL = (event: { url: string }) => {\n const { pg, pay_method } = data;\n if (pay_method === 'trans') {\n const iamportUrl = new IamportUrl(event.url);\n /**\n * [IOS] 웹 표준 이니시스 - 실시간 계좌이체 대비\n * 아래 로직대로 동작해야 최종적으로 결제가 승인된 후 콜백 함수가 호출됨\n * 1. 사파리 앱에서 복귀(app_scheme://imp_uid=%26merchant_uid=%26m_redirect_url=)\n * 2. 최종 결제 승인을 위해 이니시스가 HTTP 리퀘스트 호출\n * 3. \"다음\" 버튼이 있는 최종 화면으로 이동\n * 4. \"다음\" 버튼을 클릭\n * 5. 1번과 마찬가지로 app_scheme://imp_uid=%26merchant_uid=%26m_redirect_url=로 HTTP 리퀘스트 호출\n * 6. 콜백 함수 호출\n * 따라서 현재 handleOpenURL이 트리거 되는 사유가 1번 때문인지 5번 때문인지 구분이 필요하여\n * 이를 위한 isInicisTransPaid 플래그 추가\n */\n if (pg.startsWith('html5_inicis') && Platform.OS === 'ios') {\n if (isInicisTransPaid) {\n webview.current?.injectJavaScript(`\n window.location.href = \"${redirectUrl}?${iamportUrl.getInicisTransQuery(\n redirectUrl\n )}\";\n `);\n } else {\n setIsInicisTransPaid(true);\n }\n }\n\n /* 나이스 - 실시간 계좌이체 대비 */\n if (pg.startsWith('nice')) {\n const queryParameters = iamportUrl.getQuery();\n const scheme = iamportUrl.scheme;\n let niceTransRedirectionUrl;\n if (scheme === data.app_scheme?.toLowerCase()) {\n if (queryParameters.callbackparam1 != null) {\n niceTransRedirectionUrl = queryParameters.callbackparam1;\n }\n }\n webview.current?.injectJavaScript(`\n window.location.href = \"${niceTransRedirectionUrl}?${iamportUrl.getStringifiedQuery()}\";\n `);\n }\n }\n };\n Linking.addEventListener('url', handleOpenURL);\n }, [data, isInicisTransPaid, redirectUrl, webview]);\n\n const removeLoadingNeeded = () => {\n if (showLoading && Platform.OS === 'android') {\n // 로딩상태. 안드로이드 플랫폼\n if (isWebViewLoaded) {\n // 웹뷰 로드 끝. 리디렉션 방식\n return true;\n }\n return isIframeWayPayment();\n }\n // IOS\n return false;\n };\n\n const isIframeWayPayment = () => {\n const { pg, pay_method, customer_uid } = data;\n if (pg.startsWith('html5_inicis') && customer_uid) {\n // 이니시스 빌링결제\n return true;\n }\n if (pg.startsWith('mobilians') && pay_method === 'phone') {\n // 모빌리언스 휴대폰 소액결제\n return true;\n }\n return (\n pg.startsWith('danal') ||\n pg.startsWith('danal_tpay') ||\n pg.startsWith('smilepay') ||\n pg.startsWith('payco') ||\n pg.startsWith('bluewalnut')\n );\n };\n\n const validation = new ValidationForPayment(\n userCode,\n loading,\n callback,\n data\n );\n if (validation.getIsValid()) {\n const { loadingContainer, webViewContainer } = viewStyles;\n return (\n <>\n <WebView\n containerStyle={webViewContainer}\n ref={webview}\n source={webviewSource}\n onLoadEnd={() => {\n if (!isWebViewLoaded) {\n if (data.pg.startsWith('eximbay')) {\n data.popup = false;\n }\n\n if (tierCode) {\n webview.current?.injectJavaScript(`\n setTimeout(function() { IMP.agency(\"${userCode}\", \"${tierCode}\"); });\n `);\n } else {\n webview.current?.injectJavaScript(`\n setTimeout(function() { IMP.init(\"${userCode}\"); });\n `);\n }\n webview.current?.injectJavaScript(`\n setTimeout(function() {\n IMP.request_pay(${JSON.stringify(\n data\n )}, function(response) {\n window.ReactNativeWebView.postMessage(JSON.stringify(response));\n });\n });\n `);\n setIsWebViewLoaded(true);\n }\n\n // only for Android\n if (removeLoadingNeeded()) {\n setShowLoading(false);\n }\n }}\n /* PG사가 callback을 지원하는 경우, 결제결과를 받아 callback을 실행한다 */\n onMessage={(e) => {\n /**\n * [v1.6.0] 다날의 경우 response에 주문명(name)이 포함되어 있는데\n * 주문명에 %가 들어갈 경우, decodeURIComponent시 URI malformed 에러가 발생하는 것 대비해\n * 우선 encodeURIComponent를 한 후, decodeURIComponent가 끝나면\n * 최종적으로 decodeURIComponent를 한 번 더 한다\n */\n const encoded = encodeURIComponent(e.nativeEvent.data);\n const decoded = decodeURIComponent(encoded);\n const response = JSON.parse(decoded);\n if (typeof callback === 'function') {\n callback(response);\n }\n }}\n originWhitelist={['*']} // https://github.com/facebook/react-native/issues/19986\n sharedCookiesEnabled={true}\n onShouldStartLoadWithRequest={(request) => {\n const { url } = request;\n // console.log(`url: ${url}`);\n const iamportUrl = new IamportUrl(url);\n if (iamportUrl.isAppUrl()) {\n /* 3rd-party 앱 오픈 */\n iamportUrl.launchApp().catch((e) => {\n const { code, message } = e;\n callback({\n imp_success: false,\n error_code: code,\n error_msg: message,\n });\n });\n\n return false;\n }\n if (iamportUrl.isPaymentOver(redirectUrl)) {\n if (typeof callback === 'function') {\n callback(iamportUrl.getQuery());\n }\n return false;\n }\n if (isWebViewLoaded && showLoading && iamportUrl.isIframeLoaded()) {\n /**\n * only for IOS\n * iframe이 load되면(url이 about:blank 또는 https://service.iamport.kr이 아니면)\n * webview의 loading 상태를 해제한다\n */\n setShowLoading(false);\n }\n return true;\n }}\n />\n {showLoading && (\n <View style={loadingContainer}>{loading || <Loading />}</View>\n )}\n </>\n );\n }\n\n return <ErrorOnParams message={validation.getMessage()} />;\n}\n\nexport default Payment;\n"]}
|
package/package.json
CHANGED
|
@@ -26,6 +26,8 @@ function Certification({ userCode, tierCode, data, loading, callback }: Props) {
|
|
|
26
26
|
let redirectUrl = IMPConst.M_REDIRECT_URL;
|
|
27
27
|
if (data.m_redirect_url !== undefined && data.m_redirect_url.trim() !== '') {
|
|
28
28
|
redirectUrl = data.m_redirect_url;
|
|
29
|
+
} else {
|
|
30
|
+
data.m_redirect_url = redirectUrl;
|
|
29
31
|
}
|
|
30
32
|
|
|
31
33
|
if (validation.getIsValid()) {
|
|
@@ -30,6 +30,8 @@ function Payment({ userCode, tierCode, data, loading, callback }: Props) {
|
|
|
30
30
|
let redirectUrl = IMPConst.M_REDIRECT_URL;
|
|
31
31
|
if (data.m_redirect_url !== undefined && data.m_redirect_url.trim() !== '') {
|
|
32
32
|
redirectUrl = data.m_redirect_url;
|
|
33
|
+
} else {
|
|
34
|
+
data.m_redirect_url = redirectUrl;
|
|
33
35
|
}
|
|
34
36
|
|
|
35
37
|
useEffect(() => {
|