iamport-react-native 1.6.4 → 2.0.0-rc.2
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/LICENSE +21 -0
- package/README.md +25 -320
- package/android/build.gradle +114 -24
- package/android/gradle.properties +4 -0
- package/android/src/main/AndroidManifest.xml +1 -3
- package/android/src/main/java/com/iamportreactnative/IamportReactNativePackage.kt +17 -0
- package/android/src/main/java/com/iamportreactnative/IamportReactNativeViewManager.kt +20 -0
- package/iamport-react-native.podspec +19 -0
- package/ios/IamportReactNative-Bridging-Header.h +1 -0
- package/ios/IamportReactNative.xcodeproj/project.pbxproj +47 -20
- package/ios/IamportReactNativeViewManager.m +12 -0
- package/ios/IamportReactNativeViewManager.swift +32 -0
- package/lib/commonjs/components/Certification/index.js +154 -0
- package/lib/commonjs/components/Certification/index.js.map +1 -0
- package/lib/commonjs/components/ErrorOnParams/index.js +66 -0
- package/lib/commonjs/components/ErrorOnParams/index.js.map +1 -0
- package/lib/commonjs/components/Loading/index.js +50 -0
- package/lib/commonjs/components/Loading/index.js.map +1 -0
- package/lib/commonjs/components/Payment/index.js +288 -0
- package/lib/commonjs/components/Payment/index.js.map +1 -0
- package/lib/commonjs/constants/index.js +103 -0
- package/lib/commonjs/constants/index.js.map +1 -0
- package/{android/src/main/assets → lib/commonjs}/img/iamport-logo.png +0 -0
- package/lib/commonjs/index.js +36 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/styles.js +31 -0
- package/lib/commonjs/styles.js.map +1 -0
- package/lib/commonjs/utils/IamportUrl.js +334 -0
- package/lib/commonjs/utils/IamportUrl.js.map +1 -0
- package/lib/commonjs/utils/Validation.js +72 -0
- package/lib/commonjs/utils/Validation.js.map +1 -0
- package/lib/commonjs/utils/ValidationForPayment.js +143 -0
- package/lib/commonjs/utils/ValidationForPayment.js.map +1 -0
- package/lib/module/components/Certification/index.js +132 -0
- package/lib/module/components/Certification/index.js.map +1 -0
- package/lib/module/components/ErrorOnParams/index.js +55 -0
- package/lib/module/components/ErrorOnParams/index.js.map +1 -0
- package/lib/module/components/Loading/index.js +38 -0
- package/lib/module/components/Loading/index.js.map +1 -0
- package/lib/module/components/Payment/index.js +266 -0
- package/lib/module/components/Payment/index.js.map +1 -0
- package/lib/module/constants/index.js +98 -0
- package/lib/module/constants/index.js.map +1 -0
- package/lib/module/img/iamport-logo.png +0 -0
- package/lib/module/index.js +10 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/styles.js +21 -0
- package/lib/module/styles.js.map +1 -0
- package/lib/module/utils/IamportUrl.js +322 -0
- package/lib/module/utils/IamportUrl.js.map +1 -0
- package/{src → lib/module}/utils/Validation.js +25 -9
- package/lib/module/utils/Validation.js.map +1 -0
- package/{src → lib/module}/utils/ValidationForPayment.js +23 -13
- package/lib/module/utils/ValidationForPayment.js.map +1 -0
- package/lib/typescript/components/Certification/index.d.ts +10 -0
- package/lib/typescript/components/ErrorOnParams/index.d.ts +5 -0
- package/lib/typescript/components/Loading/index.d.ts +2 -0
- package/lib/typescript/components/Payment/index.d.ts +10 -0
- package/lib/typescript/constants/index.d.ts +76 -0
- package/lib/typescript/index.d.ts +9 -0
- package/lib/typescript/styles.d.ts +19 -0
- package/lib/typescript/utils/IamportUrl.d.ts +19 -0
- package/lib/typescript/utils/Validation.d.ts +58 -0
- package/lib/typescript/utils/ValidationForPayment.d.ts +7 -0
- package/package.json +98 -20
- package/src/components/Certification/index.tsx +112 -0
- package/src/components/ErrorOnParams/{index.js → index.tsx} +20 -25
- package/src/components/Loading/{index.js → index.tsx} +9 -10
- package/src/components/Payment/index.tsx +243 -0
- package/src/constants/index.ts +150 -0
- package/src/{index.js → index.tsx} +4 -1
- package/src/{styles.js → styles.ts} +3 -1
- package/src/utils/IamportUrl.ts +319 -0
- package/src/utils/Validation.ts +101 -0
- package/src/utils/ValidationForPayment.ts +146 -0
- package/IamportReactNative.podspec +0 -19
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +0 -6
- package/android/gradlew +0 -172
- package/android/gradlew.bat +0 -84
- package/android/src/main/java/com/iamport/IamportModule.java +0 -88
- package/android/src/main/java/com/iamport/IamportPackage.java +0 -23
- package/ios/IamportReactNative.h +0 -11
- package/ios/IamportReactNative.m +0 -23
- package/ios/IamportReactNative.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
- package/ios/IamportReactNative.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- package/ios/IamportReactNative.xcworkspace/contents.xcworkspacedata +0 -9
- package/manuals/CALLBACK.md +0 -68
- package/manuals/EXAMPLE.md +0 -175
- package/manuals/EXPO.md +0 -66
- package/manuals/INSTALL.md +0 -72
- package/manuals/SETTING.md +0 -72
- package/manuals/SUPPORT.md +0 -30
- package/manuals/TRANS.md +0 -122
- package/manuals/VERSION.md +0 -114
- package/manuals/assets/webview-peer-dependency.png +0 -0
- package/src/components/Certification/index.js +0 -99
- package/src/components/Payment/PaymentWebView.js +0 -285
- package/src/components/Payment/index.android.js +0 -51
- package/src/components/Payment/index.ios.js +0 -30
- package/src/constants/index.js +0 -83
- package/src/img/after-linking-iamport.png +0 -0
- package/src/img/after-linking-webview.png +0 -0
- package/src/img/allow-arbitrary.gif +0 -0
- package/src/img/android-studio-avd-manager.png +0 -0
- package/src/img/android-studio-build.png +0 -0
- package/src/img/app-scheme-registry.gif +0 -0
- package/src/img/expo-eject.png +0 -0
- package/src/img/ios-emulator-certification.png +0 -0
- package/src/img/ios-emulator-home.png +0 -0
- package/src/img/ios-emulator-payment.png +0 -0
- package/src/img/ios-trans-create-header-file-1.png +0 -0
- package/src/img/ios-trans-create-header-file-2.png +0 -0
- package/src/img/ios-trans-create-objectivec-file-1.png +0 -0
- package/src/img/ios-trans-create-objectivec-file-2.png +0 -0
- package/src/img/ios-trans-result.png +0 -0
- package/src/utils/IamportUrl.js +0 -103
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import React, { useRef, useState } from 'react';
|
|
2
|
+
import { View } from 'react-native';
|
|
3
|
+
import { WebView } from 'react-native-webview';
|
|
4
|
+
import Loading from '../Loading';
|
|
5
|
+
import ErrorOnParams from '../ErrorOnParams';
|
|
6
|
+
import { Validation } from '../../utils/Validation';
|
|
7
|
+
import { IMPConst } from '../../constants';
|
|
8
|
+
import viewStyles from '../../styles';
|
|
9
|
+
import IamportUrl from '../../utils/IamportUrl';
|
|
10
|
+
|
|
11
|
+
function Certification({
|
|
12
|
+
userCode,
|
|
13
|
+
tierCode,
|
|
14
|
+
data,
|
|
15
|
+
loading,
|
|
16
|
+
callback
|
|
17
|
+
}) {
|
|
18
|
+
const [isWebViewLoaded, setIsWebViewLoaded] = useState(false);
|
|
19
|
+
const webview = useRef();
|
|
20
|
+
const validation = new Validation(userCode, loading);
|
|
21
|
+
|
|
22
|
+
if (validation.getIsValid()) {
|
|
23
|
+
const {
|
|
24
|
+
wrapper,
|
|
25
|
+
loadingContainer,
|
|
26
|
+
webViewContainer
|
|
27
|
+
} = viewStyles;
|
|
28
|
+
return /*#__PURE__*/React.createElement(View, {
|
|
29
|
+
style: wrapper
|
|
30
|
+
}, /*#__PURE__*/React.createElement(View, {
|
|
31
|
+
style: webViewContainer
|
|
32
|
+
}, /*#__PURE__*/React.createElement(WebView, {
|
|
33
|
+
ref: ref => {
|
|
34
|
+
if (ref !== null) {
|
|
35
|
+
webview.current = ref;
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
useWebKit: true,
|
|
39
|
+
source: {
|
|
40
|
+
html: IMPConst.WEBVIEW_SOURCE_HTML
|
|
41
|
+
},
|
|
42
|
+
onLoadEnd: () => {
|
|
43
|
+
if (!isWebViewLoaded) {
|
|
44
|
+
var _webview$current3;
|
|
45
|
+
|
|
46
|
+
// html이 load되고 최초 한번만 inject javascript
|
|
47
|
+
if (tierCode) {
|
|
48
|
+
var _webview$current;
|
|
49
|
+
|
|
50
|
+
(_webview$current = webview.current) === null || _webview$current === void 0 ? void 0 : _webview$current.injectJavaScript(`
|
|
51
|
+
setTimeout(function() { IMP.agency("${userCode}", "${tierCode}"); });
|
|
52
|
+
`);
|
|
53
|
+
} else {
|
|
54
|
+
var _webview$current2;
|
|
55
|
+
|
|
56
|
+
(_webview$current2 = webview.current) === null || _webview$current2 === void 0 ? void 0 : _webview$current2.injectJavaScript(`
|
|
57
|
+
setTimeout(function() { IMP.init("${userCode}"); });
|
|
58
|
+
`);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
(_webview$current3 = webview.current) === null || _webview$current3 === void 0 ? void 0 : _webview$current3.injectJavaScript(`
|
|
62
|
+
setTimeout(function() {
|
|
63
|
+
IMP.certification(${JSON.stringify(data)}, function(response) {
|
|
64
|
+
window.ReactNativeWebView.postMessage(JSON.stringify(response));
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
`);
|
|
68
|
+
setIsWebViewLoaded(true);
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
onMessage: e => {
|
|
72
|
+
const {
|
|
73
|
+
data
|
|
74
|
+
} = e.nativeEvent;
|
|
75
|
+
let response = data;
|
|
76
|
+
|
|
77
|
+
while (decodeURIComponent(response) !== response) {
|
|
78
|
+
response = decodeURIComponent(response);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
response = JSON.parse(response);
|
|
82
|
+
|
|
83
|
+
if (typeof callback === 'function') {
|
|
84
|
+
callback(response);
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
startInLoadingState: true,
|
|
88
|
+
renderLoading: () => /*#__PURE__*/React.createElement(View, {
|
|
89
|
+
style: loadingContainer
|
|
90
|
+
}, loading || /*#__PURE__*/React.createElement(Loading, null)),
|
|
91
|
+
originWhitelist: ['*'] // https://github.com/facebook/react-native/issues/19986
|
|
92
|
+
,
|
|
93
|
+
onShouldStartLoadWithRequest: request => {
|
|
94
|
+
const {
|
|
95
|
+
url
|
|
96
|
+
} = request; // console.log('url: ' + url);
|
|
97
|
+
|
|
98
|
+
const iamportUrl = new IamportUrl(url);
|
|
99
|
+
|
|
100
|
+
if (iamportUrl.isAppUrl()) {
|
|
101
|
+
/* 3rd-party 앱 오픈 */
|
|
102
|
+
iamportUrl.launchApp().catch(e => {
|
|
103
|
+
const {
|
|
104
|
+
code,
|
|
105
|
+
message
|
|
106
|
+
} = e;
|
|
107
|
+
callback({
|
|
108
|
+
imp_success: false,
|
|
109
|
+
error_code: code,
|
|
110
|
+
error_msg: message
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (iamportUrl.isPaymentOver()) {
|
|
117
|
+
callback(iamportUrl.getQuery());
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
})));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return /*#__PURE__*/React.createElement(ErrorOnParams, {
|
|
127
|
+
message: validation.getMessage()
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export default Certification;
|
|
132
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["index.tsx"],"names":["React","useRef","useState","View","WebView","Loading","ErrorOnParams","Validation","IMPConst","viewStyles","IamportUrl","Certification","userCode","tierCode","data","loading","callback","isWebViewLoaded","setIsWebViewLoaded","webview","validation","getIsValid","wrapper","loadingContainer","webViewContainer","ref","current","html","WEBVIEW_SOURCE_HTML","injectJavaScript","JSON","stringify","e","nativeEvent","response","decodeURIComponent","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, { useRef, 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 = useRef<WebView>();\n\n const validation = new Validation(userCode, loading);\n if (validation.getIsValid()) {\n const { wrapper, loadingContainer, webViewContainer } = viewStyles;\n return (\n <View style={wrapper}>\n <View style={webViewContainer}>\n <WebView\n ref={(ref) => {\n if (ref !== null) {\n webview.current = ref;\n }\n }}\n useWebKit\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 const { data } = e.nativeEvent;\n let response = data;\n while (decodeURIComponent(response) !== response) {\n response = decodeURIComponent(response);\n }\n response = JSON.parse(response);\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()) {\n callback(iamportUrl.getQuery());\n return false;\n }\n\n return true;\n }}\n />\n </View>\n </View>\n );\n }\n\n return <ErrorOnParams message={validation.getMessage()} />;\n}\n\nexport default Certification;\n"]}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { View, Image, Text, // TouchableOpacity,
|
|
3
|
+
StyleSheet } from 'react-native';
|
|
4
|
+
|
|
5
|
+
const logo = require('../../img/iamport-logo.png');
|
|
6
|
+
|
|
7
|
+
function ErrorOnParams({
|
|
8
|
+
message
|
|
9
|
+
}) {
|
|
10
|
+
return /*#__PURE__*/React.createElement(View, {
|
|
11
|
+
style: styles.container
|
|
12
|
+
}, /*#__PURE__*/React.createElement(View, {
|
|
13
|
+
style: styles.contents
|
|
14
|
+
}, /*#__PURE__*/React.createElement(Image, {
|
|
15
|
+
style: styles.contents,
|
|
16
|
+
source: logo
|
|
17
|
+
}), /*#__PURE__*/React.createElement(Text, {
|
|
18
|
+
style: styles.text
|
|
19
|
+
}, message)));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const styles = StyleSheet.create({
|
|
23
|
+
container: {
|
|
24
|
+
flex: 1,
|
|
25
|
+
alignItems: 'center',
|
|
26
|
+
flexDirection: 'row',
|
|
27
|
+
justifyContent: 'center'
|
|
28
|
+
},
|
|
29
|
+
contents: {
|
|
30
|
+
flex: 1,
|
|
31
|
+
alignItems: 'center',
|
|
32
|
+
justifyContent: 'center'
|
|
33
|
+
},
|
|
34
|
+
text: {
|
|
35
|
+
fontSize: 16,
|
|
36
|
+
marginTop: 20,
|
|
37
|
+
lineHeight: 25
|
|
38
|
+
},
|
|
39
|
+
button: {
|
|
40
|
+
backgroundColor: '#fff',
|
|
41
|
+
color: '#ff0000',
|
|
42
|
+
borderColor: '#333',
|
|
43
|
+
borderWidth: 1,
|
|
44
|
+
borderRadius: 3,
|
|
45
|
+
paddingTop: 10,
|
|
46
|
+
paddingBottom: 10,
|
|
47
|
+
paddingLeft: 20,
|
|
48
|
+
paddingRight: 20,
|
|
49
|
+
fontSize: 14,
|
|
50
|
+
marginTop: 20,
|
|
51
|
+
fontWeight: 'bold'
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
export default ErrorOnParams;
|
|
55
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["index.tsx"],"names":["React","View","Image","Text","StyleSheet","logo","require","ErrorOnParams","message","styles","container","contents","text","create","flex","alignItems","flexDirection","justifyContent","fontSize","marginTop","lineHeight","button","backgroundColor","color","borderColor","borderWidth","borderRadius","paddingTop","paddingBottom","paddingLeft","paddingRight","fontWeight"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SACEC,IADF,EAEEC,KAFF,EAGEC,IAHF,EAIE;AACAC,UALF,QAMO,cANP;;AAQA,MAAMC,IAAI,GAAGC,OAAO,CAAC,4BAAD,CAApB;;AAIA,SAASC,aAAT,CAAuB;AAAEC,EAAAA;AAAF,CAAvB,EAAgD;AAC9C,sBACE,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAEC,MAAM,CAACC;AAApB,kBACE,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAED,MAAM,CAACE;AAApB,kBACE,oBAAC,KAAD;AAAO,IAAA,KAAK,EAAEF,MAAM,CAACE,QAArB;AAA+B,IAAA,MAAM,EAAEN;AAAvC,IADF,eAEE,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAEI,MAAM,CAACG;AAApB,KAA2BJ,OAA3B,CAFF,CADF,CADF;AAcD;;AAED,MAAMC,MAAM,GAAGL,UAAU,CAACS,MAAX,CAAkB;AAC/BH,EAAAA,SAAS,EAAE;AACTI,IAAAA,IAAI,EAAE,CADG;AAETC,IAAAA,UAAU,EAAE,QAFH;AAGTC,IAAAA,aAAa,EAAE,KAHN;AAITC,IAAAA,cAAc,EAAE;AAJP,GADoB;AAO/BN,EAAAA,QAAQ,EAAE;AACRG,IAAAA,IAAI,EAAE,CADE;AAERC,IAAAA,UAAU,EAAE,QAFJ;AAGRE,IAAAA,cAAc,EAAE;AAHR,GAPqB;AAY/BL,EAAAA,IAAI,EAAE;AACJM,IAAAA,QAAQ,EAAE,EADN;AAEJC,IAAAA,SAAS,EAAE,EAFP;AAGJC,IAAAA,UAAU,EAAE;AAHR,GAZyB;AAiB/BC,EAAAA,MAAM,EAAE;AACNC,IAAAA,eAAe,EAAE,MADX;AAENC,IAAAA,KAAK,EAAE,SAFD;AAGNC,IAAAA,WAAW,EAAE,MAHP;AAINC,IAAAA,WAAW,EAAE,CAJP;AAKNC,IAAAA,YAAY,EAAE,CALR;AAMNC,IAAAA,UAAU,EAAE,EANN;AAONC,IAAAA,aAAa,EAAE,EAPT;AAQNC,IAAAA,WAAW,EAAE,EARP;AASNC,IAAAA,YAAY,EAAE,EATR;AAUNZ,IAAAA,QAAQ,EAAE,EAVJ;AAWNC,IAAAA,SAAS,EAAE,EAXL;AAYNY,IAAAA,UAAU,EAAE;AAZN;AAjBuB,CAAlB,CAAf;AAiCA,eAAexB,aAAf","sourcesContent":["import React from 'react';\nimport {\n View,\n Image,\n Text,\n // TouchableOpacity,\n StyleSheet,\n} from 'react-native';\n\nconst logo = require('../../img/iamport-logo.png');\n\ntype ErrorProps = { message: string };\n\nfunction ErrorOnParams({ message }: ErrorProps) {\n return (\n <View style={styles.container}>\n <View style={styles.contents}>\n <Image style={styles.contents} source={logo} />\n <Text style={styles.text}>{message}</Text>\n {/*<TouchableOpacity\n style={button}\n onPress={}\n >\n <Text>돌아가기</Text>\n </TouchableOpacity>*/}\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n alignItems: 'center',\n flexDirection: 'row',\n justifyContent: 'center',\n },\n contents: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n text: {\n fontSize: 16,\n marginTop: 20,\n lineHeight: 25,\n },\n button: {\n backgroundColor: '#fff',\n color: '#ff0000',\n borderColor: '#333',\n borderWidth: 1,\n borderRadius: 3,\n paddingTop: 10,\n paddingBottom: 10,\n paddingLeft: 20,\n paddingRight: 20,\n fontSize: 14,\n marginTop: 20,\n fontWeight: 'bold',\n },\n});\n\nexport default ErrorOnParams;\n"]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { View, Image, Text, StyleSheet } from 'react-native';
|
|
3
|
+
|
|
4
|
+
const logo = require('../../img/iamport-logo.png');
|
|
5
|
+
|
|
6
|
+
function Loading() {
|
|
7
|
+
return /*#__PURE__*/React.createElement(View, {
|
|
8
|
+
style: styles.container
|
|
9
|
+
}, /*#__PURE__*/React.createElement(View, {
|
|
10
|
+
style: styles.contents
|
|
11
|
+
}, /*#__PURE__*/React.createElement(Image, {
|
|
12
|
+
style: styles.contents,
|
|
13
|
+
source: logo
|
|
14
|
+
}), /*#__PURE__*/React.createElement(Text, {
|
|
15
|
+
style: styles.text
|
|
16
|
+
}, "\uC7A0\uC2DC\uB9CC \uAE30\uB2E4\uB824\uC8FC\uC138\uC694...")));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const styles = StyleSheet.create({
|
|
20
|
+
container: { ...StyleSheet.absoluteFillObject,
|
|
21
|
+
flex: 1,
|
|
22
|
+
alignItems: 'center',
|
|
23
|
+
flexDirection: 'row',
|
|
24
|
+
justifyContent: 'center'
|
|
25
|
+
},
|
|
26
|
+
contents: {
|
|
27
|
+
flex: 1,
|
|
28
|
+
alignItems: 'center',
|
|
29
|
+
justifyContent: 'center'
|
|
30
|
+
},
|
|
31
|
+
text: {
|
|
32
|
+
fontSize: 20,
|
|
33
|
+
marginTop: 20,
|
|
34
|
+
lineHeight: 25
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
export default Loading;
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["index.tsx"],"names":["React","View","Image","Text","StyleSheet","logo","require","Loading","styles","container","contents","text","create","absoluteFillObject","flex","alignItems","flexDirection","justifyContent","fontSize","marginTop","lineHeight"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,IAAT,EAAeC,KAAf,EAAsBC,IAAtB,EAA4BC,UAA5B,QAA8C,cAA9C;;AAEA,MAAMC,IAAI,GAAGC,OAAO,CAAC,4BAAD,CAApB;;AAEA,SAASC,OAAT,GAAmB;AACjB,sBACE,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAEC,MAAM,CAACC;AAApB,kBACE,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAED,MAAM,CAACE;AAApB,kBACE,oBAAC,KAAD;AAAO,IAAA,KAAK,EAAEF,MAAM,CAACE,QAArB;AAA+B,IAAA,MAAM,EAAEL;AAAvC,IADF,eAEE,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAEG,MAAM,CAACG;AAApB,kEAFF,CADF,CADF;AAQD;;AAED,MAAMH,MAAM,GAAGJ,UAAU,CAACQ,MAAX,CAAkB;AAC/BH,EAAAA,SAAS,EAAE,EACT,GAAGL,UAAU,CAACS,kBADL;AAETC,IAAAA,IAAI,EAAE,CAFG;AAGTC,IAAAA,UAAU,EAAE,QAHH;AAITC,IAAAA,aAAa,EAAE,KAJN;AAKTC,IAAAA,cAAc,EAAE;AALP,GADoB;AAQ/BP,EAAAA,QAAQ,EAAE;AACRI,IAAAA,IAAI,EAAE,CADE;AAERC,IAAAA,UAAU,EAAE,QAFJ;AAGRE,IAAAA,cAAc,EAAE;AAHR,GARqB;AAa/BN,EAAAA,IAAI,EAAE;AACJO,IAAAA,QAAQ,EAAE,EADN;AAEJC,IAAAA,SAAS,EAAE,EAFP;AAGJC,IAAAA,UAAU,EAAE;AAHR;AAbyB,CAAlB,CAAf;AAoBA,eAAeb,OAAf","sourcesContent":["import React from 'react';\nimport { View, Image, Text, StyleSheet } from 'react-native';\n\nconst logo = require('../../img/iamport-logo.png');\n\nfunction Loading() {\n return (\n <View style={styles.container}>\n <View style={styles.contents}>\n <Image style={styles.contents} source={logo} />\n <Text style={styles.text}>잠시만 기다려주세요...</Text>\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n ...StyleSheet.absoluteFillObject,\n flex: 1,\n alignItems: 'center',\n flexDirection: 'row',\n justifyContent: 'center',\n },\n contents: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n text: {\n fontSize: 20,\n marginTop: 20,\n lineHeight: 25,\n },\n});\n\nexport default Loading;\n"]}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import React, { createRef, useEffect, useRef, useState } from 'react';
|
|
2
|
+
import ValidationForPayment from '../../utils/ValidationForPayment';
|
|
3
|
+
import ErrorOnParams from '../ErrorOnParams';
|
|
4
|
+
import { Linking, Platform, View } from 'react-native';
|
|
5
|
+
import { IMPConst } from '../../constants';
|
|
6
|
+
import IamportUrl from '../../utils/IamportUrl';
|
|
7
|
+
import WebView from 'react-native-webview';
|
|
8
|
+
import viewStyles from '../../styles';
|
|
9
|
+
import Loading from '../Loading';
|
|
10
|
+
|
|
11
|
+
function Payment({
|
|
12
|
+
userCode,
|
|
13
|
+
tierCode,
|
|
14
|
+
data,
|
|
15
|
+
loading,
|
|
16
|
+
callback
|
|
17
|
+
}) {
|
|
18
|
+
const [webviewSource, setWebviewSource] = useState({
|
|
19
|
+
html: IMPConst.WEBVIEW_SOURCE_HTML
|
|
20
|
+
});
|
|
21
|
+
const [isWebViewLoaded, setIsWebViewLoaded] = useState(false);
|
|
22
|
+
const [showLoading, setShowLoading] = useState(true);
|
|
23
|
+
const [isInicisTransPaid, setIsInicisTransPaid] = useState(false);
|
|
24
|
+
const webview = /*#__PURE__*/createRef();
|
|
25
|
+
const smilepayRef = useRef(false);
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
const {
|
|
28
|
+
pg
|
|
29
|
+
} = data;
|
|
30
|
+
|
|
31
|
+
if (pg.startsWith('smilepay') && Platform.OS === 'ios' && !smilepayRef.current) {
|
|
32
|
+
/**
|
|
33
|
+
* [feature/smilepay] IOS - 스마일페이 대비 코드 작성
|
|
34
|
+
* 스마일페이 결제창을 iframe 방식으로 띄우기 때문에 WKWebView에서 서드 파티 쿠키가 허용되지 않아
|
|
35
|
+
* WKWebView의 baseUrl을 강제로 스마일페이 URL로 적용
|
|
36
|
+
*/
|
|
37
|
+
setWebviewSource({ ...webviewSource,
|
|
38
|
+
baseUrl: IMPConst.SMILEPAY_BASE_URL
|
|
39
|
+
});
|
|
40
|
+
smilepayRef.current = true;
|
|
41
|
+
}
|
|
42
|
+
}, [data, webviewSource]);
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
const handleOpenURL = event => {
|
|
45
|
+
const {
|
|
46
|
+
pg,
|
|
47
|
+
pay_method
|
|
48
|
+
} = data;
|
|
49
|
+
|
|
50
|
+
if (pay_method === 'trans') {
|
|
51
|
+
const iamportUrl = new IamportUrl(event.url);
|
|
52
|
+
/**
|
|
53
|
+
* [IOS] 웹 표준 이니시스 - 실시간 계좌이체 대비
|
|
54
|
+
* 아래 로직대로 동작해야 최종적으로 결제가 승인된 후 콜백 함수가 호출됨
|
|
55
|
+
* 1. 사파리 앱에서 복귀(app_scheme://imp_uid=%26merchant_uid=%26m_redirect_url=)
|
|
56
|
+
* 2. 최종 결제 승인을 위해 이니시스가 HTTP 리퀘스트 호출
|
|
57
|
+
* 3. "다음" 버튼이 있는 최종 화면으로 이동
|
|
58
|
+
* 4. "다음" 버튼을 클릭
|
|
59
|
+
* 5. 1번과 마찬가지로 app_scheme://imp_uid=%26merchant_uid=%26m_redirect_url=로 HTTP 리퀘스트 호출
|
|
60
|
+
* 6. 콜백 함수 호출
|
|
61
|
+
* 따라서 현재 handleOpenURL이 트리거 되는 사유가 1번 때문인지 5번 때문인지 구분이 필요하여
|
|
62
|
+
* 이를 위한 isInicisTransPaid 플래그 추가
|
|
63
|
+
*/
|
|
64
|
+
|
|
65
|
+
if (pg.startsWith('html5_inicis') && Platform.OS === 'ios') {
|
|
66
|
+
if (isInicisTransPaid) {
|
|
67
|
+
var _webview$current;
|
|
68
|
+
|
|
69
|
+
(_webview$current = webview.current) === null || _webview$current === void 0 ? void 0 : _webview$current.injectJavaScript(`
|
|
70
|
+
window.location.href = "${IMPConst.M_REDIRECT_URL}?${iamportUrl.getInicisTransQuery()}";
|
|
71
|
+
`);
|
|
72
|
+
} else {
|
|
73
|
+
setIsInicisTransPaid(true);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/* 나이스 - 실시간 계좌이체 대비 */
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
if (pg.startsWith('nice')) {
|
|
80
|
+
var _data$app_scheme, _webview$current2;
|
|
81
|
+
|
|
82
|
+
const queryParameters = iamportUrl.getQuery();
|
|
83
|
+
const scheme = iamportUrl.scheme;
|
|
84
|
+
let niceTransRedirectionUrl;
|
|
85
|
+
|
|
86
|
+
if (scheme === ((_data$app_scheme = data.app_scheme) === null || _data$app_scheme === void 0 ? void 0 : _data$app_scheme.toLowerCase())) {
|
|
87
|
+
if (queryParameters.callbackparam1 != null) {
|
|
88
|
+
niceTransRedirectionUrl = queryParameters.callbackparam1;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
(_webview$current2 = webview.current) === null || _webview$current2 === void 0 ? void 0 : _webview$current2.injectJavaScript(`
|
|
93
|
+
window.location.href = "${niceTransRedirectionUrl}?${iamportUrl.getStringifiedQuery()}";
|
|
94
|
+
`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
Linking.addEventListener('url', handleOpenURL);
|
|
100
|
+
}, [data, isInicisTransPaid, webview]);
|
|
101
|
+
|
|
102
|
+
const removeLoadingNeeded = () => {
|
|
103
|
+
if (showLoading && Platform.OS === 'android') {
|
|
104
|
+
// 로딩상태. 안드로이드 플랫폼
|
|
105
|
+
if (isWebViewLoaded) {
|
|
106
|
+
// 웹뷰 로드 끝. 리디렉션 방식
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return isIframeWayPayment();
|
|
111
|
+
} // IOS
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
return false;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
const isIframeWayPayment = () => {
|
|
118
|
+
const {
|
|
119
|
+
pg,
|
|
120
|
+
pay_method,
|
|
121
|
+
customer_uid
|
|
122
|
+
} = data;
|
|
123
|
+
|
|
124
|
+
if (pg.startsWith('html5_inicis') && customer_uid) {
|
|
125
|
+
// 이니시스 빌링결제
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (pg.startsWith('mobilians') && pay_method === 'phone') {
|
|
130
|
+
// 모빌리언스 휴대폰 소액결제
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return pg.startsWith('danal') || pg.startsWith('danal_tpay') || pg.startsWith('smilepay') || pg.startsWith('payco') || pg.startsWith('bluewalnut');
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
const validation = new ValidationForPayment(userCode, loading, callback, data);
|
|
138
|
+
|
|
139
|
+
if (validation.getIsValid()) {
|
|
140
|
+
const {
|
|
141
|
+
wrapper,
|
|
142
|
+
loadingContainer,
|
|
143
|
+
webViewContainer
|
|
144
|
+
} = viewStyles;
|
|
145
|
+
return /*#__PURE__*/React.createElement(View, {
|
|
146
|
+
style: wrapper
|
|
147
|
+
}, /*#__PURE__*/React.createElement(View, {
|
|
148
|
+
style: webViewContainer
|
|
149
|
+
}, /*#__PURE__*/React.createElement(WebView, {
|
|
150
|
+
ref: webview,
|
|
151
|
+
source: webviewSource,
|
|
152
|
+
onLoadEnd: () => {
|
|
153
|
+
if (!isWebViewLoaded) {
|
|
154
|
+
var _webview$current5;
|
|
155
|
+
|
|
156
|
+
data.m_redirect_url = IMPConst.M_REDIRECT_URL;
|
|
157
|
+
|
|
158
|
+
if (data.pg.startsWith('eximbay')) {
|
|
159
|
+
data.popup = false;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (tierCode) {
|
|
163
|
+
var _webview$current3;
|
|
164
|
+
|
|
165
|
+
(_webview$current3 = webview.current) === null || _webview$current3 === void 0 ? void 0 : _webview$current3.injectJavaScript(`
|
|
166
|
+
setTimeout(function() { IMP.agency("${userCode}", "${tierCode}"); });
|
|
167
|
+
`);
|
|
168
|
+
} else {
|
|
169
|
+
var _webview$current4;
|
|
170
|
+
|
|
171
|
+
(_webview$current4 = webview.current) === null || _webview$current4 === void 0 ? void 0 : _webview$current4.injectJavaScript(`
|
|
172
|
+
setTimeout(function() { IMP.init("${userCode}"); });
|
|
173
|
+
`);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
(_webview$current5 = webview.current) === null || _webview$current5 === void 0 ? void 0 : _webview$current5.injectJavaScript(`
|
|
177
|
+
setTimeout(function() {
|
|
178
|
+
IMP.request_pay(${JSON.stringify(data)}, function(response) {
|
|
179
|
+
window.ReactNativeWebView.postMessage(JSON.stringify(response));
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
`);
|
|
183
|
+
setIsWebViewLoaded(true);
|
|
184
|
+
} // only for Android
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
if (removeLoadingNeeded()) {
|
|
188
|
+
setShowLoading(false);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/* PG사가 callback을 지원하는 경우, 결제결과를 받아 callback을 실행한다 */
|
|
192
|
+
,
|
|
193
|
+
onMessage: e => {
|
|
194
|
+
const {
|
|
195
|
+
data
|
|
196
|
+
} = e.nativeEvent;
|
|
197
|
+
/**
|
|
198
|
+
* [v1.6.0] 다날의 경우 response에 주문명(name)이 포함되어 있는데
|
|
199
|
+
* 주문명에 %가 들어갈 경우, decodeURIComponent시 URI malformed 에러가 발생하는 것 대비해
|
|
200
|
+
* 우선 encodeURIComponent를 한 후, decodeURIComponent가 끝나면
|
|
201
|
+
* 최종적으로 decodeURIComponent를 한 번 더 한다
|
|
202
|
+
*/
|
|
203
|
+
|
|
204
|
+
let response = encodeURIComponent(data);
|
|
205
|
+
|
|
206
|
+
while (decodeURIComponent(response) !== data) {
|
|
207
|
+
response = decodeURIComponent(response);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
response = decodeURIComponent(response);
|
|
211
|
+
response = JSON.parse(response);
|
|
212
|
+
callback(response);
|
|
213
|
+
},
|
|
214
|
+
originWhitelist: ['*'] // https://github.com/facebook/react-native/issues/19986
|
|
215
|
+
,
|
|
216
|
+
sharedCookiesEnabled: true,
|
|
217
|
+
onShouldStartLoadWithRequest: request => {
|
|
218
|
+
const {
|
|
219
|
+
url
|
|
220
|
+
} = request;
|
|
221
|
+
const iamportUrl = new IamportUrl(url);
|
|
222
|
+
|
|
223
|
+
if (iamportUrl.isAppUrl()) {
|
|
224
|
+
/* 3rd-party 앱 오픈 */
|
|
225
|
+
iamportUrl.launchApp().catch(e => {
|
|
226
|
+
const {
|
|
227
|
+
code,
|
|
228
|
+
message
|
|
229
|
+
} = e;
|
|
230
|
+
callback({
|
|
231
|
+
imp_success: false,
|
|
232
|
+
error_code: code,
|
|
233
|
+
error_msg: message
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
if (iamportUrl.isPaymentOver()) {
|
|
240
|
+
callback(iamportUrl.getQuery());
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if (isWebViewLoaded && showLoading && iamportUrl.isIframeLoaded()) {
|
|
245
|
+
/**
|
|
246
|
+
* only for IOS
|
|
247
|
+
* iframe이 load되면(url이 about:blank 또는 https://service.iamport.kr이 아니면)
|
|
248
|
+
* webview의 loading 상태를 해제한다
|
|
249
|
+
*/
|
|
250
|
+
setShowLoading(false);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return true;
|
|
254
|
+
}
|
|
255
|
+
})), showLoading && /*#__PURE__*/React.createElement(View, {
|
|
256
|
+
style: loadingContainer
|
|
257
|
+
}, loading || /*#__PURE__*/React.createElement(Loading, null)));
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
return /*#__PURE__*/React.createElement(ErrorOnParams, {
|
|
261
|
+
message: validation.getMessage()
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
export default Payment;
|
|
266
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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","pg","startsWith","OS","current","baseUrl","SMILEPAY_BASE_URL","handleOpenURL","event","pay_method","iamportUrl","url","injectJavaScript","M_REDIRECT_URL","getInicisTransQuery","queryParameters","getQuery","scheme","niceTransRedirectionUrl","app_scheme","toLowerCase","callbackparam1","getStringifiedQuery","addEventListener","removeLoadingNeeded","isIframeWayPayment","customer_uid","validation","getIsValid","wrapper","loadingContainer","webViewContainer","m_redirect_url","popup","JSON","stringify","e","nativeEvent","response","encodeURIComponent","decodeURIComponent","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\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 = \"${\n IMPConst.M_REDIRECT_URL\n }?${iamportUrl.getInicisTransQuery()}\";\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, 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 { wrapper, loadingContainer, webViewContainer } = viewStyles;\n return (\n <View style={wrapper}>\n <View style={webViewContainer}>\n <WebView\n ref={webview}\n source={webviewSource}\n onLoadEnd={() => {\n if (!isWebViewLoaded) {\n data.m_redirect_url = IMPConst.M_REDIRECT_URL;\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 const { data } = e.nativeEvent;\n /**\n * [v1.6.0] 다날의 경우 response에 주문명(name)이 포함되어 있는데\n * 주문명에 %가 들어갈 경우, decodeURIComponent시 URI malformed 에러가 발생하는 것 대비해\n * 우선 encodeURIComponent를 한 후, decodeURIComponent가 끝나면\n * 최종적으로 decodeURIComponent를 한 번 더 한다\n */\n let response = encodeURIComponent(data);\n while (decodeURIComponent(response) !== data) {\n response = decodeURIComponent(response);\n }\n response = decodeURIComponent(response);\n response = JSON.parse(response);\n callback(response);\n }}\n originWhitelist={['*']} // https://github.com/facebook/react-native/issues/19986\n sharedCookiesEnabled={true}\n onShouldStartLoadWithRequest={(request) => {\n const { url } = request;\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()) {\n callback(iamportUrl.getQuery());\n return false;\n }\n if (\n isWebViewLoaded &&\n showLoading &&\n iamportUrl.isIframeLoaded()\n ) {\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 </View>\n {showLoading && (\n <View style={loadingContainer}>{loading || <Loading />}</View>\n )}\n </View>\n );\n }\n\n return <ErrorOnParams message={validation.getMessage()} />;\n}\n\nexport default Payment;\n"]}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
let IMPConst;
|
|
2
|
+
|
|
3
|
+
(function (_IMPConst) {
|
|
4
|
+
const PG = _IMPConst.PG = ['html5_inicis', 'inicis', 'uplus', 'kcp', 'kcp_billing', 'nice', 'jtnet', 'kakao', 'kakaopay', 'danal', 'danal_tpay', 'kicc', 'settle', 'mobilians', 'payco', 'eximbay', 'paypal', 'naverco', 'naverpay', 'smilepay', 'chai', 'payple', 'alipay', 'bluewalnut', 'tosspay', 'smartro'];
|
|
5
|
+
const PAY_METHOD = _IMPConst.PAY_METHOD = ['card', 'trans', 'vbank', 'phone', 'samsung', 'kpay', 'cultureland', 'smartculture', 'happymoney', 'booknlife', 'kakaopay', 'lpay', 'payco', 'ssgpay', 'tosspay', // 엑심베이 전용
|
|
6
|
+
'unionpay', // 유니온페이
|
|
7
|
+
'alipay', // 알리페이
|
|
8
|
+
'tenpay', // 텐페이
|
|
9
|
+
'wechat', // 위챗페이
|
|
10
|
+
'molpay', // 몰페이
|
|
11
|
+
'paysbuy' // 태국 paysbuy
|
|
12
|
+
];
|
|
13
|
+
const CURRENCY = _IMPConst.CURRENCY = ['KRW', 'USD', 'EUR', 'JPY'];
|
|
14
|
+
const LANGUAGE = _IMPConst.LANGUAGE = ['ko', 'en'];
|
|
15
|
+
const EN_AVAILABLE_PG = _IMPConst.EN_AVAILABLE_PG = ['inicis', 'html5_inicis', 'uplus', 'nice', 'eximbay'];
|
|
16
|
+
const CARRIERS = _IMPConst.CARRIERS = ['SKT', 'KTF', 'LGT', 'MVNO'];
|
|
17
|
+
const ANDROID_MARKET_PREFIX = _IMPConst.ANDROID_MARKET_PREFIX = 'market://details?id=';
|
|
18
|
+
const IOS_MARKET_PREFIX = _IMPConst.IOS_MARKET_PREFIX = 'https://apps.apple.com/app/';
|
|
19
|
+
const M_REDIRECT_URL = _IMPConst.M_REDIRECT_URL = 'http://detectchangingwebview/iamport/rn';
|
|
20
|
+
const NICE_TRANS_URL = _IMPConst.NICE_TRANS_URL = 'https://web.nicepay.co.kr/smart/bank/payTrans.jsp';
|
|
21
|
+
const IMP_SDK_URL = _IMPConst.IMP_SDK_URL = 'https://service.iamport.kr';
|
|
22
|
+
const SMILEPAY_BASE_URL = _IMPConst.SMILEPAY_BASE_URL = 'https://www.mysmilepay.com';
|
|
23
|
+
const WEBVIEW_SOURCE_HTML = _IMPConst.WEBVIEW_SOURCE_HTML = `
|
|
24
|
+
<html>
|
|
25
|
+
<head>
|
|
26
|
+
<meta http-equiv='content-type' content='text/html; charset=utf-8'>
|
|
27
|
+
<meta name='viewport' content='width=device-width, initial-scale=1.0'>
|
|
28
|
+
|
|
29
|
+
<script type='text/javascript' src='https://code.jquery.com/jquery-latest.min.js' ></script>
|
|
30
|
+
<script type='text/javascript' src='https://cdn.iamport.kr/js/iamport.payment-1.1.8.js'></script>
|
|
31
|
+
</head>
|
|
32
|
+
<body></body>
|
|
33
|
+
</html>
|
|
34
|
+
`;
|
|
35
|
+
const ANDROID_APPSCHEME = _IMPConst.ANDROID_APPSCHEME = {
|
|
36
|
+
ISP: 'ispmobile',
|
|
37
|
+
BANKPAY: 'kftc-bankpay',
|
|
38
|
+
KB_BANKPAY: 'kb-bankpay',
|
|
39
|
+
NH_BANKPAY: 'nhb-bankpay',
|
|
40
|
+
MG_BANKPAY: 'mg-bankpay',
|
|
41
|
+
KN_BANKPAY: 'kn-bankpay',
|
|
42
|
+
KAKAOPAY: 'kakaotalk',
|
|
43
|
+
SMILEPAY: 'smilepayapp',
|
|
44
|
+
CHAIPAY: 'chaipayment',
|
|
45
|
+
PAYCO: 'payco',
|
|
46
|
+
HYUNDAICARD: 'hdcardappcardansimclick',
|
|
47
|
+
TOSS: 'supertoss',
|
|
48
|
+
SHINHANCARD: 'shinhan-sr-ansimclick',
|
|
49
|
+
HANACARD: 'cloudpay',
|
|
50
|
+
SAMSUNGCARD: 'mpocket.online.ansimclick',
|
|
51
|
+
KBCARD: 'kb-acp',
|
|
52
|
+
NHCARD: 'nhallonepayansimclick',
|
|
53
|
+
CITICARD: 'citimobileapp',
|
|
54
|
+
LOTTECARD: 'lotteappcard',
|
|
55
|
+
LPAY: 'lpayapp',
|
|
56
|
+
SSGPAY: 'shinsegaeeasypayment',
|
|
57
|
+
KPAY: 'kpay',
|
|
58
|
+
PAYNOW: 'lguthepay-xpay',
|
|
59
|
+
WOORIWONCARD: 'com.wooricard.smartapp',
|
|
60
|
+
LPOINT: 'lmslpay',
|
|
61
|
+
KTFAUTH: 'ktauthexternalcall',
|
|
62
|
+
LGTAUTH: 'upluscorporation',
|
|
63
|
+
SKTAUTH: 'tauthlink'
|
|
64
|
+
};
|
|
65
|
+
const ANDROID_PACKAGE = _IMPConst.ANDROID_PACKAGE = {
|
|
66
|
+
PACKAGE_ISP: 'kvp.jjy.MispAndroid320',
|
|
67
|
+
PACKAGE_BANKPAY: 'com.kftc.bankpay.android',
|
|
68
|
+
PACKAGE_KB_BANKPAY: 'com.kbstar.liivbank',
|
|
69
|
+
PACKAGE_NH_BANKPAY: 'com.nh.cashcardapp',
|
|
70
|
+
PACKAGE_MG_BANKPAY: 'kr.co.kfcc.mobilebank',
|
|
71
|
+
PACKAGE_KN_BANKPAY: 'com.knb.psb',
|
|
72
|
+
PACKAGE_KAKAOPAY: 'com.kakao.talk',
|
|
73
|
+
PACKAGE_SMILEPAY: 'com.mysmilepay.app',
|
|
74
|
+
PACKAGE_CHAIPAY: 'finance.chai.app',
|
|
75
|
+
PACKAGE_PAYCO: 'com.nhnent.payapp',
|
|
76
|
+
PACKAGE_HYUNDAICARD: 'com.hyundaicard.appcard',
|
|
77
|
+
PACKAGE_TOSS: 'viva.republica.toss',
|
|
78
|
+
PACKAGE_SHINHANCARD: 'com.shcard.smartpay',
|
|
79
|
+
PACKAGE_HANACARD: 'com.hanaskard.paycla',
|
|
80
|
+
PACKAGE_SAMSUNGCARD: 'kr.co.samsungcard.mpocket',
|
|
81
|
+
PACKAGE_KBCARD: 'com.kbcard.cxh.appcard',
|
|
82
|
+
PACKAGE_NHCARD: 'nh.smart.nhallonepay',
|
|
83
|
+
PACKAGE_CITICARD: 'kr.co.citibank.citimobile',
|
|
84
|
+
PACKAGE_LOTTECARD: 'com.lcacApp',
|
|
85
|
+
PACKAGE_LPAY: 'com.lotte.lpay',
|
|
86
|
+
PACKAGE_SSGPAY: 'com.ssg.serviceapp.android.egiftcertificate',
|
|
87
|
+
PACKAGE_KPAY: 'com.inicis.kpay',
|
|
88
|
+
PACKAGE_PAYNOW: 'com.lguplus.paynow',
|
|
89
|
+
PACKAGE_WOORIWONCARD: 'com.wooricard.smartapp',
|
|
90
|
+
PACKAGE_LPOINT: 'com.lottemembers.android',
|
|
91
|
+
PACKAGE_KTFAUTH: 'com.kt.ktauth',
|
|
92
|
+
PACKAGE_LGTAUTH: 'com.lguplus.smartotp',
|
|
93
|
+
PACKAGE_SKTAUTH: 'com.sktelecom.tauth'
|
|
94
|
+
};
|
|
95
|
+
})(IMPConst || (IMPConst = {}));
|
|
96
|
+
|
|
97
|
+
export { IMPConst };
|
|
98
|
+
//# sourceMappingURL=index.js.map
|