๋ถํธํ์ด์์ ์ง์ํ๋ ๊ณต์ react native ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋๋ค. (ํด๋ผ์ด์ธํธ ์ฉ)
- PG ๊ฒฐ์ ์ฐฝ ์ฐ๋์ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ํ๋ฉ๋๋ค. (Javascript, Android, iOS, React Native, Flutter ๋ฑ)
- ๊ฒฐ์ ๊ฒ์ฆ ๋ฐ ์ทจ์, ๋น๋งํค ๋ฐ๊ธ, ๋ณธ์ธ์ธ์ฆ ๋ฑ์ ์ํ์ ์๋ฒ์ฌ์ด๋์์ ์งํ๋ฉ๋๋ค. (Java, PHP, Python, Ruby, Node.js, Go, ASP.NET ๋ฑ)
npm install react-native-bootpay-apiyarn add react-native-bootpay-api๋๋ package.json ํ์ผ์ dependencies์ ์ถ๊ฐ ํ yarn install์ ํฉ๋๋ค.
"dependencies": {
"react-native-webview-api": last_version
}
react-native-bootpay-api๋ ๋ด๋ถ์ ์ผ๋ก ์๋์ ๋ชจ๋์ ์์กดํฉ๋๋ค. ์๋๋ฅผ ์ฐธ์กฐํ์ฌ ์ค์นํด์ฃผ์ธ์.
"dependencies": {
"react-native-webview-api": last_version
},
"devDependencies": {
"react-native-webview-bootpay": last_version,
"react-native-sensitive-info": last_version,
"react-native-base64": last_version,
"react-native-device-info": last_version
},๋ฐ๋ก ์ค์ ํ์ค ๊ฒ์ด ์์ต๋๋ค.
** {your project root}/ios/Runner/Info.plist **
CFBundleURLName๊ณผ CFBundleURLSchemes์ ๊ฐ์ ๊ฐ๋ฐ์ฌ์์ ๊ณ ์ ๊ฐ์ผ๋ก ์ง์ ํด์ฃผ์
์ผ ํฉ๋๋ค. ์ธ๋ถ์ฑ(์นด๋์ฌ์ฑ)์์ ๋ค์ ๊ธฐ์กด ์ฑ์ผ๋ก ์ฑํฌ์ฑ ํธ์ถ์ ํ์ํ ์คํค๋ง ๊ฐ์
๋๋ค.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
...
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>kr.co.bootpaySample</string>
<key>CFBundleURLSchemes</key>
<array>
<string>bootpaySample</string>
</array>
</dict>
</array>
...
</dict>
</plist>
import React, { useRef } from 'react';
import {
StyleSheet,
View,
Text,
TouchableOpacity
} from 'react-native';
import { Bootpay, Extra } from 'react-native-bootpay-api';
export default function App() {
const bootpay = useRef<Bootpay>(null);
const goBootpayTest = () => {
const payload = {
pg: '๋์ด์คํ์ด', //['kcp', 'danal', 'inicis', 'nicepay', 'lgup', 'toss', 'payapp', 'easypay', 'jtnet', 'tpay', 'mobilians', 'payletter', 'onestore', 'welcome'] ์ค ํ 1
method: '์นด๋', // ['์นด๋', 'ํด๋ํฐ', '๊ณ์ข์ด์ฒด', '๊ฐ์๊ณ์ข', '์นด์นด์คํ์ด', '๋ค์ด๋ฒํ์ด', 'ํ์ด์ฝ', '์นด๋์๋'] ์ค ํ 1
order_name: '๋ง์ค์นด๋ผ', //๊ฒฐ์ ์ฐฝ์ ๋ณด์ฌ์ง ์ํ๋ช
order_id: '1234_1234', //๊ฐ๋ฐ์ฌ์ ๊ด๋ฆฌํ๋ ์ฃผ๋ฌธ๋ฒํธ
// subscription_id: '12345_21345', //๊ฐ๋ฐ์ฌ์ ๊ด๋ฆฌํ๋ ์ฃผ๋ฌธ๋ฒํธ (์ ๊ธฐ๊ฒฐ์ ์ฉ)
// authentication_id: '12345_21345', //๊ฐ๋ฐ์ฌ์ ๊ด๋ฆฌํ๋ ์ฃผ๋ฌธ๋ฒํธ (๋ณธ์ธ์ธ์ฆ์ฉ)
// method: 'card',
// methods: ['card', 'vbank', 'bank', 'phone'], // ํตํฉ๊ฒฐ์ ์ฐฝ ์งํ์ ์ฌ์ฉํ๊ณ ์ ํ๋ ๊ฒฐ์ ์๋จ ์ง์ ๊ฐ๋ฅ, method์ ํจ๊ป ์ ์ฉ ๋ถ๊ฐ
price: 1000, //๊ฒฐ์ ๊ธ์ก
// taxFree: 0, //๋ฉด์ธ๊ธ์ก
}
//๊ฒฐ์ ๋๋ ์ํ์ ๋ณด๋ค๋ก ํต๊ณ์ ์ฌ์ฉ๋๋ฉฐ, price์ ํฉ์ ๊ฒฐ์ ๊ธ์ก๊ณผ ๋์ผํด์ผํจ
const items = [
{
name: 'ํค๋ณด๋', //ํต๊ณ์ ๋ฐ์๋ ์ํ๋ช
qty: 1, //์๋
id: 'ITEM_CODE_KEYBOARD', //๊ฐ๋ฐ์ฌ์์ ๊ด๋ฆฌํ๋ ์ํ๊ณ ์ ๋ฒํธ
price: 1000, //์ํ๋จ๊ฐ
cat1: 'ํจ์
', //์นดํ
๊ณ ๋ฆฌ ์ , ์์ ๋กญ๊ฒ ๊ธฐ์
cat2: '์ฌ์ฑ์์', //์นดํ
๊ณ ๋ฆฌ ์ค, ์์ ๋กญ๊ฒ ๊ธฐ์
cat3: '๋ธ๋ผ์ฐ์ค', //์นดํ
๊ณ ๋ฆฌ ํ, ์์ ๋กญ๊ฒ ๊ธฐ์
}
]
//๊ตฌ๋งค์ ์ ๋ณด๋ก ๊ฒฐ์ ์ฐฝ์ด ๋ฏธ๋ฆฌ ์ ์ฉ๋ ์ ์์ผ๋ฉฐ, ํต๊ณ์๋ ์ฌ์ฉ๋๋ ์ ๋ณด
const user = {
id: 'user_id_1234', //๊ฐ๋ฐ์ฌ์์ ๊ด๋ฆฌํ๋ ํ์๊ณ ์ ๋ฒํธ
username: 'ํ๊ธธ๋', //๊ตฌ๋งค์๋ช
email: '[email protected]', //๊ตฌ๋งค์ ์ด๋ฉ์ผ
gender: 0, //์ฑ๋ณ, 1:๋จ์ , 0:์ฌ์
birth: '1986-10-14', //์๋
์์ผ yyyy-MM-dd
phone: '01012345678', //์ ํ๋ฒํธ, ํ์ด์ฑ ํ์
area: '์์ธ', // [์์ธ,์ธ์ฒ,๋๊ตฌ,๊ด์ฃผ,๋ถ์ฐ,์ธ์ฐ,๊ฒฝ๊ธฐ,๊ฐ์,์ถฉ์ฒญ๋ถ๋,์ถฉ๋ถ,์ถฉ์ฒญ๋จ๋,์ถฉ๋จ,์ ๋ผ๋ถ๋,์ ๋ถ,์ ๋ผ๋จ๋,์ ๋จ,๊ฒฝ์๋ถ๋,๊ฒฝ๋ถ,๊ฒฝ์๋จ๋,๊ฒฝ๋จ,์ ์ฃผ,์ธ์ข
,๋์ ] ์ค ํ 1
addr: '์์ธ์ ๋์๊ตฌ ์๋๋ก' //์ฃผ์
}
//๊ธฐํ ์ค์
const extra = {
card_quota: "0,2,3", //๊ฒฐ์ ๊ธ์ก์ด 5๋ง์ ์ด์์ ํ ๋ถ๊ฐ์ ํ์ฉ๋ฒ์๋ฅผ ์ค์ ํ ์ ์์, [0(์ผ์๋ถ), 2๊ฐ์, 3๊ฐ์] ํ์ฉ, ๋ฏธ์ค์ ์ 12๊ฐ์๊น์ง ํ์ฉ
app_scheme: "bootpayrnapi", //ios์ ๊ฒฝ์ฐ ์นด๋์ฌ ์ฑ ํธ์ถ ํ ๋๋์์ค๊ธฐ ์ํ ์ฑ ์คํค๋ง๋ช
show_close_button: false, // x ๋ซ๊ธฐ ๋ฒํผ ์ฝ์
(๋ซ๊ธฐ๋ฒํผ์ด ์๋ PG์ฌ๋ฅผ ์ํ ์ต์
)
}
if(bootpay != null && bootpay.current != null) bootpay.current.requestPayment(payload, items, user, extra);
}
const goBootpaySubscriptionTest = () => {
const payload = {
pg: '๋์ด์คํ์ด', //['kcp', 'danal', 'inicis', 'nicepay', 'lgup', 'toss', 'payapp', 'easypay', 'jtnet', 'tpay', 'mobilians', 'payletter', 'onestore', 'welcome'] ์ค ํ 1
method: '์นด๋์๋', // ['์นด๋', 'ํด๋ํฐ', '๊ณ์ข์ด์ฒด', '๊ฐ์๊ณ์ข', '์นด์นด์คํ์ด', '๋ค์ด๋ฒํ์ด', 'ํ์ด์ฝ', '์นด๋์๋'] ์ค ํ 1
order_name: '๋ง์ค์นด๋ผ', //๊ฒฐ์ ์ฐฝ์ ๋ณด์ฌ์ง ์ํ๋ช
// order_id: '1234_1234', //๊ฐ๋ฐ์ฌ์ ๊ด๋ฆฌํ๋ ์ฃผ๋ฌธ๋ฒํธ
subscription_id: '12345_21345', //๊ฐ๋ฐ์ฌ์ ๊ด๋ฆฌํ๋ ์ฃผ๋ฌธ๋ฒํธ (์นด๋์๋๊ฒฐ์ ์ฉ)
// authentication_id: '12345_21345', //๊ฐ๋ฐ์ฌ์ ๊ด๋ฆฌํ๋ ์ฃผ๋ฌธ๋ฒํธ (๋ณธ์ธ์ธ์ฆ์ฉ)
// method: 'card',
// methods: ['card', 'vbank', 'bank', 'phone'], // ํตํฉ๊ฒฐ์ ์ฐฝ ์งํ์ ์ฌ์ฉํ๊ณ ์ ํ๋ ๊ฒฐ์ ์๋จ ์ง์ ๊ฐ๋ฅ, method์ ํจ๊ป ์ ์ฉ ๋ถ๊ฐ
price: 1000, //๊ฒฐ์ ๊ธ์ก
// taxFree: 0, //๋ฉด์ธ๊ธ์ก
}
//๊ฒฐ์ ๋๋ ์ํ์ ๋ณด๋ค๋ก ํต๊ณ์ ์ฌ์ฉ๋๋ฉฐ, price์ ํฉ์ ๊ฒฐ์ ๊ธ์ก๊ณผ ๋์ผํด์ผํจ
const items = [
{
name: 'ํค๋ณด๋', //ํต๊ณ์ ๋ฐ์๋ ์ํ๋ช
qty: 1, //์๋
id: 'ITEM_CODE_KEYBOARD', //๊ฐ๋ฐ์ฌ์์ ๊ด๋ฆฌํ๋ ์ํ๊ณ ์ ๋ฒํธ
price: 1000, //์ํ๋จ๊ฐ
cat1: 'ํจ์
', //์นดํ
๊ณ ๋ฆฌ ์ , ์์ ๋กญ๊ฒ ๊ธฐ์
cat2: '์ฌ์ฑ์์', //์นดํ
๊ณ ๋ฆฌ ์ค, ์์ ๋กญ๊ฒ ๊ธฐ์
cat3: '๋ธ๋ผ์ฐ์ค', //์นดํ
๊ณ ๋ฆฌ ํ, ์์ ๋กญ๊ฒ ๊ธฐ์
}
]
//๊ตฌ๋งค์ ์ ๋ณด๋ก ๊ฒฐ์ ์ฐฝ์ด ๋ฏธ๋ฆฌ ์ ์ฉ๋ ์ ์์ผ๋ฉฐ, ํต๊ณ์๋ ์ฌ์ฉ๋๋ ์ ๋ณด
const user = {
id: 'user_id_1234', //๊ฐ๋ฐ์ฌ์์ ๊ด๋ฆฌํ๋ ํ์๊ณ ์ ๋ฒํธ
username: 'ํ๊ธธ๋', //๊ตฌ๋งค์๋ช
email: '[email protected]', //๊ตฌ๋งค์ ์ด๋ฉ์ผ
gender: 0, //์ฑ๋ณ, 1:๋จ์ , 0:์ฌ์
birth: '1986-10-14', //์๋
์์ผ yyyy-MM-dd
phone: '01012345678', //์ ํ๋ฒํธ, ํ์ด์ฑ ํ์
area: '์์ธ', // [์์ธ,์ธ์ฒ,๋๊ตฌ,๊ด์ฃผ,๋ถ์ฐ,์ธ์ฐ,๊ฒฝ๊ธฐ,๊ฐ์,์ถฉ์ฒญ๋ถ๋,์ถฉ๋ถ,์ถฉ์ฒญ๋จ๋,์ถฉ๋จ,์ ๋ผ๋ถ๋,์ ๋ถ,์ ๋ผ๋จ๋,์ ๋จ,๊ฒฝ์๋ถ๋,๊ฒฝ๋ถ,๊ฒฝ์๋จ๋,๊ฒฝ๋จ,์ ์ฃผ,์ธ์ข
,๋์ ] ์ค ํ 1
addr: '์์ธ์ ๋์๊ตฌ ์๋๋ก' //์ฃผ์
}
//๊ธฐํ ์ค์
const extra = {
card_quota: "0,2,3", //๊ฒฐ์ ๊ธ์ก์ด 5๋ง์ ์ด์์ ํ ๋ถ๊ฐ์ ํ์ฉ๋ฒ์๋ฅผ ์ค์ ํ ์ ์์, [0(์ผ์๋ถ), 2๊ฐ์, 3๊ฐ์] ํ์ฉ, ๋ฏธ์ค์ ์ 12๊ฐ์๊น์ง ํ์ฉ
app_scheme: "bootpayrnapi2", //ios์ ๊ฒฝ์ฐ ์นด๋์ฌ ์ฑ ํธ์ถ ํ ๋๋์์ค๊ธฐ ์ํ ์ฑ ์คํค๋ง๋ช
show_close_button: false, // x ๋ซ๊ธฐ ๋ฒํผ ์ฝ์
(๋ซ๊ธฐ๋ฒํผ์ด ์๋ PG์ฌ๋ฅผ ์ํ ์ต์
)
}
if(bootpay != null && bootpay.current != null) bootpay.current.requestSubscription(payload, items, user, extra);
}
const goBootpayAuthTest = () => {
const payload = {
pg: '๋ค๋ ', //['kcp', 'danal', 'inicis', 'nicepay', 'lgup', 'toss', 'payapp', 'easypay', 'jtnet', 'tpay', 'mobilians', 'payletter', 'onestore', 'welcome'] ์ค ํ 1
method: '๋ณธ์ธ์ธ์ฆ',
order_name: '๋ง์ค์นด๋ผ', //๋ณธ์ธ์ธ์ฆ ๋ช
// order_id: '1234_1234', //๊ฐ๋ฐ์ฌ์ ๊ด๋ฆฌํ๋ ์ฃผ๋ฌธ๋ฒํธ
// subscription_id: '12345_21345', //๊ฐ๋ฐ์ฌ์ ๊ด๋ฆฌํ๋ ์ฃผ๋ฌธ๋ฒํธ (์ ๊ธฐ๊ฒฐ์ ์ฉ)
authentication_id: '12345_21345', //๊ฐ๋ฐ์ฌ์ ๊ด๋ฆฌํ๋ ์ฃผ๋ฌธ๋ฒํธ (๋ณธ์ธ์ธ์ฆ์ฉ)
// method: 'card',
// methods: ['card', 'vbank', 'bank', 'phone'], // ํตํฉ๊ฒฐ์ ์ฐฝ ์งํ์ ์ฌ์ฉํ๊ณ ์ ํ๋ ๊ฒฐ์ ์๋จ ์ง์ ๊ฐ๋ฅ, method์ ํจ๊ป ์ ์ฉ ๋ถ๊ฐ
// price: 1000, //๊ฒฐ์ ๊ธ์ก
// taxFree: 0, //๋ฉด์ธ๊ธ์ก
}
//๊ธฐํ ์ค์
const extra = {
app_scheme: "bootpayrnapi", //ios์ ๊ฒฝ์ฐ ์นด๋์ฌ ์ฑ ํธ์ถ ํ ๋๋์์ค๊ธฐ ์ํ ์ฑ ์คํค๋ง๋ช
show_close_button: true, // x ๋ซ๊ธฐ ๋ฒํผ ์ฝ์
(๋ซ๊ธฐ๋ฒํผ์ด ์๋ PG์ฌ๋ฅผ ์ํ ์ต์
)
}
// const extra = new Extra();
if(bootpay != null && bootpay.current != null) bootpay.current.requestAuthentication(payload, [], {}, extra);
}
const onCancel = (data: string) => {
console.log('-- cancel', data);
}
const onError = (data: string) => {
console.log('-- error', data);
}
const onIssued = (data: string) => {
console.log('-- issued', data);
}
const onConfirm = (data: string) => {
console.log('-- confirm', data);
if(bootpay != null && bootpay.current != null) bootpay.current.transactionConfirm(data);
}
const onDone = (data: string) => {
console.log('-- done', data);
}
const onClose = () => {
console.log('-- closed');
}
// React.useEffect(() => {
// BootpayApi.multiply(3, 7).then(setResult);
// }, []);
return (
<View style={styles.container}>
<TouchableOpacity
style={styles.button}
onPress={goBootpayTest}
>
<Text>์ผ๋ฐ๊ฒฐ์ ๊ฒฐ์ ํ
์คํธ</Text>
</TouchableOpacity>
<Bootpay
ref={bootpay}
ios_application_id={'5b8f6a4d396fa665fdc2b5e9'}
android_application_id={'5b8f6a4d396fa665fdc2b5e8'}
// ios_application_id={'5b9f51264457636ab9a07cdd'}
// android_application_id={'5b9f51264457636ab9a07cdc'}
onCancel={onCancel}
onError={onError}
onIssued={onIssued}
onConfirm={onConfirm}
onDone={onDone}
onClose={onClose}
/>
<TouchableOpacity
style={styles.button}
onPress={goBootpaySubscriptionTest}
>
<Text>์ ๊ธฐ๊ฒฐ์ ํ
์คํธ</Text>
</TouchableOpacity>
<TouchableOpacity
style={styles.button}
onPress={goBootpayAuthTest}
>
<Text>๋ณธ์ธ์ธ์ฆ ํ
์คํธ</Text>
</TouchableOpacity>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
button: {
alignItems: "center",
backgroundColor: "#DDDDDD",
padding: 10,
margin: 10,
},
});
๋ถํธํ์ด ๊ฐ๋ฐ๋งค๋ด์ผ์ ์ฐธ์กฐํด์ฃผ์ธ์
์ฑํ ์ผ๋ก ๋ฌธ์