결제위젯

위젯 플랫폼별 API

단건결제위젯 연동의 SDK별 세부 동작을 정리합니다. 플랫폼을 고르면 그 플랫폼 본문만 보입니다.

플랫폼별 상세 코드는 공통적으로 위젯 삽입 → 콜백에서 결제수단·약관 상태 병합 → 결제 버튼 활성화 → 결제 후 재로드/종료 처리 순서입니다.

플랫폼

Web JS 상세 API

주문서 전체 구현은 주문서 전체 흐름을 기준으로 하고, 아래는 Web 전용 API입니다.

const widgetEl = document.querySelector('#bootpay-widget')

// Web JS는 위젯 상태를 DOM 이벤트로 받습니다.
widgetEl.addEventListener('bootpay-widget-ready', () => {
    console.log('위젯 준비 완료')
})

widgetEl.addEventListener('bootpay-widget-resize', (e) => {
    console.log('위젯 크기 변경:', e.detail.height)
})javascript
API 설명
BootpayWidget.render(selector, options) 위젯 렌더링
BootpayWidget.requestPayment(options) 결제 요청
BootpayWidget.update(options) 위젯 정보 업데이트 (금액 변경 등)
BootpayWidget.destroy() 위젯 제거
BootpayWidget.isRendered() 위젯 렌더링 상태 확인
BootpayWidget.currentPaymentParameters() 현재 선택된 결제 정보 조회
BootpayWidget.currentTermsCondition() 현재 약관 동의 상태 조회
BootpayWidget.selectPayment(options) 결제수단 프로그래밍 방식 선택

Android 위젯 상세

Android 위젯은 WebView 기반으로 결제 UI를 표시하며, 결제 시 전체화면으로 확장됩니다. BootpayWidgetController로 위젯 상태를 관리합니다.

콜백 설명 파라미터
setOnReady 위젯 준비 완료 없음
setOnResize 위젯 높이 변경 height: Double (dp 단위)
setOnChangePayment 결제수단 변경 data: WidgetData
setOnChangeAgreeTerm 약관동의 변경 data: WidgetData
setOnDone 결제 완료 data: String (JSON)
setOnError 결제 에러 data: String (JSON)
setOnCancel 결제 취소 data: String (JSON)
setOnConfirm 결제 확인 (검증) data: String → Boolean 반환
setOnIssued 가상계좌 발급 data: String (JSON)
setOnClose 위젯 닫기 없음
mergeWidgetData 패턴

onChangePayment과 onChangeAgreeTerm 콜백에서 payload.mergeWidgetData(data)를 호출하면, 위젯에서 선택한 결제수단/약관동의 상태가 Payload에 자동 반영됩니다. payload.widgetIsCompleted가 true이면 결제수단 선택과 약관동의가 모두 완료된 상태입니다.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <FrameLayout
            android:id="@+id/webViewContainer"
            android:layout_width="match_parent"
            android:layout_height="516dp" />
    </ScrollView>

    <Button
        android:id="@+id/payButton"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:enabled="false"
        android:text="결제하기"
        android:onClick="goPayment" />
</LinearLayout>xml
항목 핵심
WidgetCloseAction.NONE 위젯 닫기 이후 화면 이동을 앱 코드에서 직접 처리할 때 권장
collapseAndReload(activity) 취소·에러 후 축소하고 위젯을 재로드
collapseAndFinish(activity) 결제 완료 후 축소하고 Activity 종료
displaySuccessResult / displayErrorResult false가 기본값. 앱에서 결과 화면을 직접 구현할 때 권장
Android 주의사항
  1. 위젯 높이​: onResize 콜백의 높이 값은 dp 단위입니다. density를 곱하여 px로 변환 후 적용합니다.
  2. 결제 버튼​: payload.widgetIsCompleted가 true일 때만 결제 버튼을 활성화합니다.
  3. 앱 스킴​: extra.appScheme과 AndroidManifest.xml의 scheme이 일치해야 합니다.
  4. 메모리 관리​: onDestroy()에서 BootpayWidget.destroy()를 호출합니다.
  5. 뒤로가기​: onBackPressed()에서 전체화면 상태를 확인 후 적절히 처리합니다.

iOS 위젯 상세

iOS 위젯은 BootpayWidgetView(UIView 서브클래스)를 화면에 삽입하고, BootpayWidgetController로 이벤트를 관리합니다.

클래스 역할
BootpayWidgetView 결제위젯을 표시하는 UIView
BootpayWidgetController 위젯 상태 관리 및 이벤트 콜백 처리
Payload 결제 정보 데이터
콜백 설명 파라미터
onReady 위젯 준비 완료 없음
onResize 위젯 높이 변경 height: CGFloat
onChangePayment 결제수단 변경 data: WidgetData
onChangeAgreeTerm 약관동의 변경 data: WidgetData
onDone 클라이언트 자동 승인 시 결제 완료 data: [String: Any]
onError 결제 에러 data: [String: Any]
onCancel 결제 취소 data: [String: Any]
onConfirm 결제 확인 (검증) data: [String: Any] → Bool 반환
onIssued 가상계좌 발급 data: [String: Any]
onClose 위젯 닫기 없음
// 1. WidgetView 생성 및 화면에 추가
widgetView = BootpayWidgetView()
view.addSubview(widgetView)

// 2. Controller 생성 및 콜백 설정
widgetController = BootpayWidgetController()
widgetController.onChangePayment = { data in ... }

// 3. Controller를 View에 연결
widgetView.controller = widgetController

// 4. Payload 설정 후 위젯 시작
widgetView.payload = payload
widgetView.startWidget()swift
mergeWidgetData 패턴

onChangePayment과 onChangeAgreeTerm 콜백에서 payload.mergeWidgetData(data)를 호출하면, 위젯에서 선택한 결제수단/약관동의 상태가 Payload에 자동 반영됩니다. payload.widgetIsCompleted가 true이면 결제수단 선택과 약관동의가 모두 완료된 상태입니다.

iOS 주의사항
  1. 위젯 높이​: onResize 콜백에서 widgetHeightConstraint를 업데이트해야 합니다.
  2. 결제 버튼​: payload.widgetIsCompleted가 true일 때만 결제 버튼을 활성화합니다.
  3. 앱 스킴​: payload.extra?.appScheme을 설정하고 Info.plist에 URL Scheme을 등록합니다.
  4. 메모리 관리​: 클로저에서 [weak self]를 사용하여 순환 참조를 방지합니다.

Flutter 위젯 상세

Flutter 위젯은 BootpayWidget StatefulWidget을 화면에 삽입하고, BootpayWidgetController로 이벤트와 결제를 관리합니다. 위젯 전용 BootpayWidgetWebView를 내부적으로 사용합니다.

클래스 역할
BootpayWidget 결제위젯을 표시하는 StatefulWidget
BootpayWidgetController 위젯 상태 관리, 결제 요청, 이벤트 콜백
Payload 결제 정보 데이터
콜백 설명 파라미터
onWidgetReady 위젯 준비 완료 없음
onWidgetResize 위젯 높이 변경 height: double
onWidgetChangePayment 결제수단 변경 data: WidgetData
onWidgetChangeAgreeTerm 약관동의 변경 data: WidgetData
onDone 클라이언트 자동 승인 시 결제 완료 data: String (JSON)
onError 결제 에러 data: String (JSON)
onCancel 결제 취소 data: String (JSON)
onConfirm 결제 확인 (검증) data: String → bool 반환
onIssued 가상계좌 발급 data: String (JSON)
onClose 위젯 닫기 없음
double _widgetHeight = 516.0;

_controller.onWidgetResize = (height) {
    if (_widgetHeight == height) return;
    setState(() { _widgetHeight = height; });
};

SizedBox(
    height: _widgetHeight,
    child: BootpayWidget(
        payload: _payload,
        controller: _controller,
    ),
)dart
mergeWidgetData 패턴

onWidgetChangePayment과 onWidgetChangeAgreeTerm 콜백에서 _payload.mergeWidgetData(widgetData)를 호출하면, 위젯에서 선택한 결제수단/약관동의 상태가 Payload에 자동 반영됩니다. _payload.widgetIsCompleted가 true이면 결제수단 선택과 약관동의가 모두 완료된 상태입니다.

Flutter 주의사항
  1. 위젯 높이​: onWidgetResize 콜백에서 setState로 SizedBox 높이를 업데이트해야 합니다.
  2. 결제 버튼​: _payload.widgetIsCompleted가 true일 때만 결제 버튼을 활성화합니다.
  3. ScrollView: 위젯 높이가 동적으로 변경되므로 SingleChildScrollView를 사용합니다.
  4. dismiss: onClose 콜백에서 Bootpay().dismiss(context)를 호출합니다. 웹에서는 kIsWeb 체크 후 skip합니다.
  5. 앱 스킴​: Android AndroidManifest.xml과 iOS Info.plist에 모두 등록해야 합니다.

React Native 위젯 상세

React Native 위젯은 BootpayWidget 컴포넌트와 ref를 통한 명령형 API로 동작합니다. 다른 SDK와 달리 onWidgetReady 콜백에서 renderWidget()을 명시적으로 호출해야 합니다.

메서드 설명 호출 시점
renderWidget(payload) 위젯 초기 렌더링 onWidgetReady 콜백 내에서
updateWidget(payload, refresh?) 위젯 데이터 업데이트 금액/상품 변경 시
requestPayment() 결제 요청 (전체화면 전환) 결제 버튼 클릭 시
transactionConfirm() 프론트엔드 승인 확정 onConfirm 콜백 내에서. 서버 승인에서는 호출하지 않음
reloadWidget() 위젯 재로드 결제 완료/에러/취소 후
콜백 설명 파라미터
onWidgetReady 위젯 준비 완료 없음
onWidgetResize 위젯 높이 변경 height: number
onWidgetChangePayment 결제수단 변경 data: WidgetData | null
onWidgetChangeTerms 약관동의 변경 data: WidgetData | null
onDone 클라이언트 자동 승인 시 결제 완료 data: unknown (JSON)
onError 결제 에러 data: unknown (JSON)
onCancel 결제 취소 data: unknown (JSON)
onConfirm 결제 승인 확인 data: unknown → boolean 반환
onIssued 가상계좌 발급 data: unknown (JSON)
onClose 결제창 닫힘 없음

위젯 렌더링 흐름은 마운트 → onWidgetReady → renderWidget(payload) → 결제수단/약관 변경 → 버튼 활성화 → requestPayment() 순서입니다.

const widgetPlaceholderRef = useRef<View>(null);
const [widgetTop, setWidgetTop] = useState(0);

const measureWidgetPosition = useCallback(() => {
    widgetPlaceholderRef.current?.measureInWindow((x, y) => {
        if (y > 0) setWidgetTop(y);
    });
}, []);

<View ref={widgetPlaceholderRef}
    style={{ minHeight: widgetHeight }}
    onLayout={() => setTimeout(measureWidgetPosition, 100)} />

<BootpayWidget widgetTop={widgetTop} height={widgetHeight} ... />tsx
옵션 false (기본값, 권장) true
display_success_result 클라이언트 자동 승인 기준: 즉시 onDone 호출 → 앱에서 결과 처리 웹뷰 결과 화면 → 닫기 클릭 → onClose
display_error_result 즉시 onError 호출 → 위젯 재로드 가능 웹뷰 에러 화면 → 닫기 클릭 → onClose
React Native 주의사항
  1. onWidgetReady: 위젯 준비 후 renderWidget(payload)을 반드시 호출해야 합니다.
  2. widgetTop: position: absolute 기반이므로 placeholder의 measureInWindow로 Y 좌표를 측정합니다.
  3. 결제 버튼​: widgetData?.completed && widgetData?.term_passed가 모두 true일 때 활성화합니다.
  4. 서버 승인​: extra.separately_confirmed: true 사용 시 onConfirm에서 receipt_id를 서버로 전달합니다. 이 방식에서는 onDone이 호출되지 않으며, transactionConfirm()도 클라이언트에서 호출하지 않습니다.
  5. 앱 스킴​: Android AndroidManifest.xml과 iOS Info.plist에 모두 등록해야 합니다.
  6. iOS 스와이프 백​: 전체화면 결제 모드에서 좌측 스와이프 지원을 위해 react-native-gesture-handler가 필요합니다.

함께 보기