부트페이에서 지원하는 공식 Flutter 예제입니다.
- Android (API 16+)
- iOS (9.0+)
- Web
dependencies: bootpay: ^5.0.22 # PG 결제 bootpay_bio: ^5.0.14 # 생체인증 결제 get: ^4.6.5 # 라우팅
| 메뉴 | 설명 | 사용 메서드 |
|---|---|---|
| PG일반 결제 테스트 | 일반 PG 결제 | requestPayment() |
| 통합결제 테스트 | 여러 결제수단 통합 | requestPayment() |
| 카드자동 결제 테스트(인증) | 정기결제 빌링키 발급 | requestSubscription() |
| 카드자동 결제 테스트(비인증) | 비인증 정기결제 | requestSubscription() |
| 본인인증 테스트 | 휴대폰 본인인증 | requestAuthentication() |
| 생체인증 결제 테스트 | 지문/Face ID 결제 | bootpay_bio 패키지 |
| 비밀번호 결제 테스트 | 비밀번호 간편결제 | bootpay_bio 패키지 |
| 웹앱으로 연동하기 | WebView 기반 연동 | WebView |
부트페이 관리자에서 Application ID를 발급받으세요.
String webApplicationId = '발급받은_WEB_APPLICATION_ID'; String androidApplicationId = '발급받은_ANDROID_APPLICATION_ID'; String iosApplicationId = '발급받은_IOS_APPLICATION_ID';
import 'package:bootpay/bootpay.dart'; import 'package:bootpay/model/extra.dart'; import 'package:bootpay/model/item.dart'; import 'package:bootpay/model/payload.dart'; import 'package:bootpay/model/user.dart'; void bootpayTest(BuildContext context) { Payload payload = Payload(); // Application ID 설정 payload.webApplicationId = webApplicationId; payload.androidApplicationId = androidApplicationId; payload.iosApplicationId = iosApplicationId; // 결제 정보 payload.pg = '스마트로'; // PG사 선택 payload.orderName = "테스트 상품"; payload.price = 1000.0; payload.orderId = DateTime.now().millisecondsSinceEpoch.toString(); // 상품 정보 Item item = Item(); item.name = "상품명"; item.qty = 1; item.id = "ITEM_CODE"; item.price = 1000; payload.items = [item]; // 구매자 정보 User user = User(); user.username = "사용자 이름"; user.email = "user@example.com"; user.phone = "010-1234-5678"; user.addr = "서울시 강남구"; payload.user = user; // 결제 옵션 Extra extra = Extra(); extra.appScheme = 'bootpayFlutterExample'; // iOS 앱스킴 extra.cardQuota = '3'; // 할부 개월수 payload.extra = extra; // 결제 요청 Bootpay().requestPayment( context: context, payload: payload, showCloseButton: false, onCancel: (String data) { print('------- onCancel: $data'); }, onError: (String data) { print('------- onError: $data'); }, onClose: () { print('------- onClose'); Bootpay().dismiss(context); }, onIssued: (String data) { print('------- onIssued: $data'); }, onConfirm: (String data) { // 클라이언트 승인 Bootpay().transactionConfirm(); return false; // 또는 바로 승인: return true; // 또는 서버 승인: return false; (서버에서 승인 API 호출) }, onDone: (String data) { print('------- onDone: $data'); }, ); }
void bootpayAuthentication(BuildContext context) { Payload payload = Payload(); payload.webApplicationId = webApplicationId; payload.androidApplicationId = androidApplicationId; payload.iosApplicationId = iosApplicationId; payload.pg = '다날'; payload.method = '본인인증'; payload.orderName = "본인인증"; payload.authenticationId = DateTime.now().millisecondsSinceEpoch.toString(); User user = User(); user.username = "사용자 이름"; user.phone = "010-1234-5678"; payload.user = user; Extra extra = Extra(); extra.appScheme = 'bootpayFlutterExample'; // extra.carrier = "SKT,KT,LGT"; // 통신사 제한 // extra.ageLimit = 20; // 최소 나이 제한 payload.extra = extra; Bootpay().requestAuthentication( context: context, payload: payload, showCloseButton: false, onCancel: (String data) { print('onCancel: $data'); }, onError: (String data) { print('onError: $data'); }, onClose: () { Bootpay().dismiss(context); }, onDone: (String data) { print('onDone: $data'); }, ); }
void bootpaySubscription(BuildContext context) { Payload payload = Payload(); payload.webApplicationId = webApplicationId; payload.androidApplicationId = androidApplicationId; payload.iosApplicationId = iosApplicationId; payload.pg = '토스페이먼츠'; payload.method = '카드자동'; payload.orderName = "정기결제 등록"; payload.price = 1000.0; // 0원이면 빌링키만 발급 payload.subscriptionId = DateTime.now().millisecondsSinceEpoch.toString(); User user = User(); user.username = "사용자 이름"; user.email = "user@example.com"; user.phone = "010-1234-5678"; payload.user = user; Extra extra = Extra(); extra.appScheme = 'bootpayFlutterExample'; extra.subscribeTestPayment = payload.price != 0; // 테스트 결제 여부 payload.extra = extra; Bootpay().requestSubscription( context: context, payload: payload, showCloseButton: false, onCancel: (String data) { print('onCancel: $data'); }, onError: (String data) { print('onError: $data'); }, onClose: () { Bootpay().dismiss(context); }, onDone: (String data) { print('onDone: $data'); }, ); }
| 콜백 | 설명 |
|---|---|
onCancel |
사용자가 결제를 취소한 경우 |
onError |
결제 진행 중 에러 발생 |
onClose |
결제창이 닫힐 때 (dismiss 호출 필요) |
onIssued |
가상계좌 발급 완료 시 |
onConfirm |
결제 승인 전 확인 (true: 바로 승인, false: 수동 승인) |
onDone |
결제 완료 |
<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>bootpayFlutterExample</string> </array> </dict> </array>
<key>LSApplicationQueriesSchemes</key> <array> <string>itms-apps</string> <string>kakao</string> <string>kakaokompassauth</string> <string>kakaolink</string> <!-- 기타 필요한 앱스킴 --> </array>
<uses-permission android:name="android.permission.INTERNET"/>
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="bootpayFlutterExample"/> </intent-filter> </activity>
if (kIsWeb) { payload.extra?.openType = "popup"; // 또는 "iframe" }
# 의존성 설치 flutter pub get # Android flutter run -d <android_device_id> # iOS cd ios && pod install && cd .. flutter run -d <ios_device_id> # Web flutter run -d chrome