Repository files navigation

Bootpay Android

부트페이에서 지원하는 공식 Android 라이브러리 입니다

  • Android SDK 16부터 사용 가능합니다.

Gradle을 통한 설치

build.gradle (module)

android {
compileSdk 34//Android 11 지원을 위한 30 이상 버전을 추천 
defaultConfig {
...
minSdk 16//16 이상 버전 이상부터 지원 
targetSdk 34//Android 11 지원을 위한 30 이상 버전을 추천 
}
}
dependencies {
...
implementation 'io.github.bootpay:android:+'//최신 버전 추천, + 는 항상 최신 버전을 의미합니다. 
}

AndroidManifest.xml 수정

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

실행시 Webpage not available. net:ERR_CLEARTEXT_NOT_PERMITTED 에러가 나온 경우

Android 네트워크 보안 구성에 따르면 안드로이드 9(API28)부터 cleartext traffic을 기본적으로를 비활성화한다고 합니다. 따라서 API 28 이후에서 Http에 접근하려면 cleartext traffic을 활성화 시켜야 합니다.

<application
android:label="@string/app_name"
...
android:usesCleartextTraffic="true">

위젯 설정

부트페이 관리자에서 위젯을 생성하셔야만 사용이 가능합니다.

위젯 렌더링

privateFrameLayoutwebViewContainer; //위젯을 담을 레이아웃@OverrideprotectedvoidonCreate(@NullableBundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_widget); webViewContainer = findViewById(R.id.webViewContainer);
initPayload();
bindWidgetView();
renderWidget();
}
voidinitPayload() {
BootExtraextra = newBootExtra();
extra.setDisplaySuccessResult(true);
payload.setClientKey("YOUR_CLIENT_KEY")
.setOrderName("부트페이 결제테스트")
.setWidgetSandbox(true)
.setWidgetKey("default-widget")
.setWidgetUseTerms(true)
.setOrderId("1234")
.setUserToken("6667b08b04ab6d03f274d32e")
.setPrice(1000d)
.setExtra(extra);
}
//위젯을 webViewContainer에 바인딩 합니다. privatevoidbindWidgetView() {
BootpayWidget.bindViewUpdate(this, getSupportFragmentManager(), webViewContainer);
}
doublemWidgetHeight = 300.0;
//위젯을 렌더링 합니다 voidrenderWidget() {
if(BootpayWidget.getView(this, getSupportFragmentManager()).getUrl() == null) {
BootpayWidget.renderWidget(this, payload, newBootpayWidgetEventListener() {
@OverridepublicvoidonWidgetResize(doubleheight) {
//위젯 사이즈 변경 이벤트 Log.d("bootpay", "onWidgetResize: " + height);
mWidgetHeight = height;
}
@OverridepublicvoidonWidgetReady() {
//위젯이 렌더링되면 호출되는 이벤트Log.d("bootpay", "onWidgetReady: ");
}
@OverridepublicvoidonWidgetChangePayment(WidgetDatadata) {
Log.d("bootpay", "onWidgetChangePayment: " + data);
payload.mergeWidgetData(data);
updatePaymentButtonState();
}
@OverridepublicvoidonWidgetChangeAgreeTerm(WidgetDatadata) {
Log.d("bootpay", "onWidgetChangeAgreeTerm: " + data);
payload.mergeWidgetData(data);
updatePaymentButtonState();
}
@OverridepublicvoidneedReloadWidget() {
Log.d("bootpay", "needReloadWidget ");
widgetStatusReset();
}
});
}
}

위젯으로 결제 요청하기

이 방법은 위젯을 사용하여 결제하는 방법입니다. 위젯을 사용하지 않고 결제를 요청하는 방법은 별도로 제공합니다.

publicvoidgoPayment(Viewv) {
BootpayWidget.requestPayment(
this,
getSupportFragmentManager(),
payload,
newBootpayEventListener() {
@OverridepublicvoidonCancel(Stringdata) {
Log.d("bootpay", "cancel: " + data);
}
@OverridepublicvoidonError(Stringdata) {
Log.d("bootpay", "error: " + data);
}
@OverridepublicvoidonClose() {
Log.d("bootpay", "close");
BootpayWidget.removePaymentWindow();
bindWidgetView();
}
@OverridepublicvoidonIssued(Stringdata) {
Log.d("bootpay", "issued: " + data);
}
@OverridepublicbooleanonConfirm(Stringdata) {
Log.d("bootpay", "confirm: " + data);
returntrue;
}
@OverridepublicvoidonDone(Stringdata) {
Log.d("bootpay", "done: " + data);
}
});
}

결제 요청하기

이 방법은 위젯을 사용하지 않고 결제를 요청하는 방법입니다.

publicvoidPaymentTest(Viewv) {
BootUseruser = newBootUser().setPhone("010-1234-5678"); // 구매자 정보BootExtraextra = newBootExtra()
.setCardQuota("0"); // 일시불, 2개월, 3개월 할부 허용, 할부는 최대 12개월까지 사용됨 (5만원 이상 구매시 할부허용 범위)List<BootItem> items = newArrayList<>();
BootItemitem1 = newBootItem().setName("마우's 스").setId("ITEM_CODE_MOUSE").setQty(1).setPrice(500d);
BootItemitem2 = newBootItem().setName("키보드").setId("ITEM_KEYBOARD_MOUSE").setQty(1).setPrice(500d);
items.add(item1);
items.add(item2);
Payloadpayload = newPayload();
payload.setClientKey(BootpayConstants.client_key)
.setOrderName("부트페이 결제테스트")
.setPg("페이앱")
.setMethod("네이버페이")
.setOrderId("1234")
.setPrice(1000d)
.setUser(user)
.setExtra(extra)
.setItems(items);
Map<String, Object> map = newHashMap<>();
map.put("1", "abcdef");
map.put("2", "abcdef55");
map.put("3", 1234);
payload.setMetadata(map);
// payload.setMetadata(new Gson().toJson(map));Bootpay.init(getSupportFragmentManager())
.setPayload(payload)
.setEventListener(newBootpayEventListener() {
@OverridepublicvoidonCancel(Stringdata) {
Log.d("bootpay", "cancel: " + data);
}
@OverridepublicvoidonError(Stringdata) {
Log.d("bootpay", "error: " + data);
}
@OverridepublicvoidonClose() {
Log.d("bootpay", "close");
// Bootpay.removePaymentWindow();Bootpay.dismiss();
}
@OverridepublicvoidonIssued(Stringdata) {
Log.d("bootpay", "issued: " +data);
}
@OverridepublicbooleanonConfirm(Stringdata) {
if(checkClientValidation(data)) {
// Bootpay().transactionConfirm() // 승인 요청(방법 1), 이때는 return false로 해야함returntrue; //승인 요청(방법 2), return true시 내부적으로 승인을 요청함
} else {
Bootpay.dismiss(); // 결제창 닫기returnfalse; //승인하지 않음
}
}
@OverridepublicvoidonDone(Stringdata) {
Log.d("done", data);
}
}).requestPayment();
}

자동결제 - 빌링키 발급 요청하기

Payloadpayload = newPayload();
payload.setClientKey(client_key)
.setOrderName("부트페이 결제테스트")
.setPg("나이스페이")
.setMethod("카드자동")
.setSubscriptionId("1234") //정기결제용 orderId
.setMethod(method)
// .setPrice(price) 가격이 0원 이상일 경우 빌링키 발급 후 결제가 진행됩니다.
.setUser(user)
.setExtra(extra)
.setItems(items);
Bootpay.init(getSupportFragmentManager(), getApplicationContext())
.setPayload(payload)
.requestSubscription(); //정기결제 실행함수 

본인인증 요청하기

Payloadpayload = newPayload();
payload.setClientKey(client_key)
.setOrderName("부트페이 결제테스트")
.setPg("다날")
.setMethod("본인인증")
.setAuthenticationId("1234") //본인인증용 orderId
.setMethod(method)
.setPrice(price)
.setUser(user)
.setExtra(extra)
.setItems(items);
Bootpay.init(getSupportFragmentManager(), getApplicationContext())
.setPayload(payload)
.requestAuthentication(); //본인인증 실행함수

Bootpay Event Listener

결제 진행 상태에 따라 이벤트 함수가 실행됩니다. 각 이벤트에 대한 상세 설명은 아래를 참고하세요.

onError 함수

결제 진행 중 오류가 발생된 경우 호출되는 함수입니다. 진행중 에러가 발생되는 경우는 다음과 같습니다.

  1. 부트페이 관리자에서 활성화 하지 않은 PG, 결제수단을 사용하고자 할 때
  2. PG에서 보내온 결제 정보를 부트페이 관리자에 잘못 입력하거나 입력하지 않은 경우
  3. 결제 진행 도중 한도초과, 카드정지, 휴대폰소액결제 막힘, 계좌이체 불가 등의 사유로 결제가 안되는 경우
  4. PG에서 리턴된 값이 다른 Client에 의해 변조된 경우

에러가 난 경우 해당 함수를 통해 관련 에러 메세지를 사용자에게 보여줄 수 있습니다.

data 포맷은 아래와 같습니다.

{
action: "BootpayError",
message: "카드사 거절",
receipt_id: "5fffab350c20b903e88a2cff"
}

onCancel 함수

결제 진행 중 사용자가 PG 결제창에서 취소 혹은 닫기 버튼을 눌러 나온 경우 입니다. ****

data 포맷은 아래와 같습니다.

{
action: "BootpayCancel",
message: "사용자가 결제를 취소하였습니다.",
receipt_id: "5fffab350c20b903e88a2cff"
}

onIssued 함수

가상계좌 발급이 완료되면 호출되는 함수입니다(가상계좌를 위한 Done). 가상계좌는 다른 결제와 다르게 입금할 계좌 번호 발급 이후 입금 후에 Feedback URL을 통해 통지가 됩니다. 발급된 가상계좌 정보를 issued 함수를 통해 확인하실 수 있습니다.

data 포맷은 아래와 같습니다.

{
account: "T0309260001169"
accounthodler: "한국사이버결제"
action: "BootpayBankReady"
bankcode: "BK03"
bankname: "기업은행"
expiredate: "2021-01-17 00:00:00"
item_name: "테스트 아이템"
method: "vbank"
method_name: "가상계좌"
order_id: "1610591554856"
metadata: null
payment_group: "vbank"
payment_group_name: "가상계좌"
payment_name: "가상계좌"
pg: "kcp"
pg_name: "KCP"
price: 3000
purchased_at: null
ready_url: "https://dev-app.bootpay.co.kr/bank/7o044QyX7p"
receipt_id: "5fffad430c20b903e88a2d17"
requested_at: "2021-01-14 11:32:35"
status: 2
tax_free: 0
url: "https://d-cdn.bootapi.com"
username: "홍길동"
}

onConfirm 함수

결제 승인이 되기 전 호출되는 함수입니다. 승인 이전 관련 로직을 서버 혹은 클라이언트에서 수행 후 결제를 승인해도 될 경우BootPay.transactionConfirm(data); 또는 return true;

코드를 실행해주시면 PG에서 결제 승인이 진행이 됩니다.

* 페이앱, 페이레터 PG는 이 함수가 실행되지 않고 바로 결제가 승인되는 PG 입니다. 참고해주시기 바랍니다.

data 포맷은 아래와 같습니다.

{
receipt_id: "5fffc0460c20b903e88a2d2c",
action: "BootpayConfirm"
}

onDone 함수

PG에서 거래 승인 이후에 호출 되는 함수입니다. 결제 완료 후 다음 결제 결과를 호출 할 수 있는 함수 입니다.

이 함수가 호출 된 후 반드시 REST API를 통해 결제검증을 수행해야합니다. data 포맷은 아래와 같습니다.

{
action: "BootpayDone"
card_code: "CCKM",
card_name: "KB국민카드",
card_no: "0000120000000014",
card_quota: "00",
item_name: "테스트 아이템",
method: "card",
method_name: "카드결제",
order_id: "1610596422328",
payment_group: "card",
payment_group_name: "신용카드",
payment_name: "카드결제",
pg: "kcp",
pg_name: "KCP",
price: 100,
purchased_at: "2021-01-14 12:54:53",
receipt_id: "5fffc0460c20b903e88a2d2c",
receipt_url: "https://app.bootpay.co.kr/bill/UFMvZzJqSWNDNU9ERWh1YmUycU9hdnBkV29DVlJqdzUxRzZyNXRXbkNVZW81%0AQT09LS1XYlNJN1VoMDI4Q1hRdDh1LS10MEtZVmE4c1dyWHNHTXpZTVVLUk1R%0APT0%3D%0A",
requested_at: "2021-01-14 12:53:42",
status: 1,
tax_free: 0,
url: "https://d-cdn.bootapi.com"
}

Documentation

부트페이 개발매뉴얼을 참조해주세요

기술문의

채팅으로 문의

License

MIT License.

About

bootpay android libary 입니다

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Bootpay Android

부트페이에서 지원하는 공식 Android 라이브러리 입니다

  • Android SDK 16부터 사용 가능합니다.

Gradle을 통한 설치

build.gradle (module)

android {
compileSdk 34//Android 11 지원을 위한 30 이상 버전을 추천 
defaultConfig {
...
minSdk 16//16 이상 버전 이상부터 지원 
targetSdk 34//Android 11 지원을 위한 30 이상 버전을 추천 
}
}
dependencies {
...
implementation 'io.github.bootpay:android:+'//최신 버전 추천, + 는 항상 최신 버전을 의미합니다. 
}

AndroidManifest.xml 수정

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

실행시 Webpage not available. net:ERR_CLEARTEXT_NOT_PERMITTED 에러가 나온 경우

Android 네트워크 보안 구성에 따르면 안드로이드 9(API28)부터 cleartext traffic을 기본적으로를 비활성화한다고 합니다. 따라서 API 28 이후에서 Http에 접근하려면 cleartext traffic을 활성화 시켜야 합니다.

<application
android:label="@string/app_name"
...
android:usesCleartextTraffic="true">

위젯 설정

부트페이 관리자에서 위젯을 생성하셔야만 사용이 가능합니다.

위젯 렌더링

privateFrameLayoutwebViewContainer; //위젯을 담을 레이아웃@OverrideprotectedvoidonCreate(@NullableBundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_widget); webViewContainer = findViewById(R.id.webViewContainer);
initPayload();
bindWidgetView();
renderWidget();
}
voidinitPayload() {
BootExtraextra = newBootExtra();
extra.setDisplaySuccessResult(true);
payload.setClientKey("YOUR_CLIENT_KEY")
.setOrderName("부트페이 결제테스트")
.setWidgetSandbox(true)
.setWidgetKey("default-widget")
.setWidgetUseTerms(true)
.setOrderId("1234")
.setUserToken("6667b08b04ab6d03f274d32e")
.setPrice(1000d)
.setExtra(extra);
}
//위젯을 webViewContainer에 바인딩 합니다. privatevoidbindWidgetView() {
BootpayWidget.bindViewUpdate(this, getSupportFragmentManager(), webViewContainer);
}
doublemWidgetHeight = 300.0;
//위젯을 렌더링 합니다 voidrenderWidget() {
if(BootpayWidget.getView(this, getSupportFragmentManager()).getUrl() == null) {
BootpayWidget.renderWidget(this, payload, newBootpayWidgetEventListener() {
@OverridepublicvoidonWidgetResize(doubleheight) {
//위젯 사이즈 변경 이벤트 Log.d("bootpay", "onWidgetResize: " + height);
mWidgetHeight = height;
}
@OverridepublicvoidonWidgetReady() {
//위젯이 렌더링되면 호출되는 이벤트Log.d("bootpay", "onWidgetReady: ");
}
@OverridepublicvoidonWidgetChangePayment(WidgetDatadata) {
Log.d("bootpay", "onWidgetChangePayment: " + data);
payload.mergeWidgetData(data);
updatePaymentButtonState();
}
@OverridepublicvoidonWidgetChangeAgreeTerm(WidgetDatadata) {
Log.d("bootpay", "onWidgetChangeAgreeTerm: " + data);
payload.mergeWidgetData(data);
updatePaymentButtonState();
}
@OverridepublicvoidneedReloadWidget() {
Log.d("bootpay", "needReloadWidget ");
widgetStatusReset();
}
});
}
}

위젯으로 결제 요청하기

이 방법은 위젯을 사용하여 결제하는 방법입니다. 위젯을 사용하지 않고 결제를 요청하는 방법은 별도로 제공합니다.

publicvoidgoPayment(Viewv) {
BootpayWidget.requestPayment(
this,
getSupportFragmentManager(),
payload,
newBootpayEventListener() {
@OverridepublicvoidonCancel(Stringdata) {
Log.d("bootpay", "cancel: " + data);
}
@OverridepublicvoidonError(Stringdata) {
Log.d("bootpay", "error: " + data);
}
@OverridepublicvoidonClose() {
Log.d("bootpay", "close");
BootpayWidget.removePaymentWindow();
bindWidgetView();
}
@OverridepublicvoidonIssued(Stringdata) {
Log.d("bootpay", "issued: " + data);
}
@OverridepublicbooleanonConfirm(Stringdata) {
Log.d("bootpay", "confirm: " + data);
returntrue;
}
@OverridepublicvoidonDone(Stringdata) {
Log.d("bootpay", "done: " + data);
}
});
}

결제 요청하기

이 방법은 위젯을 사용하지 않고 결제를 요청하는 방법입니다.

publicvoidPaymentTest(Viewv) {
BootUseruser = newBootUser().setPhone("010-1234-5678"); // 구매자 정보BootExtraextra = newBootExtra()
.setCardQuota("0"); // 일시불, 2개월, 3개월 할부 허용, 할부는 최대 12개월까지 사용됨 (5만원 이상 구매시 할부허용 범위)List<BootItem> items = newArrayList<>();
BootItemitem1 = newBootItem().setName("마우's 스").setId("ITEM_CODE_MOUSE").setQty(1).setPrice(500d);
BootItemitem2 = newBootItem().setName("키보드").setId("ITEM_KEYBOARD_MOUSE").setQty(1).setPrice(500d);
items.add(item1);
items.add(item2);
Payloadpayload = newPayload();
payload.setClientKey(BootpayConstants.client_key)
.setOrderName("부트페이 결제테스트")
.setPg("페이앱")
.setMethod("네이버페이")
.setOrderId("1234")
.setPrice(1000d)
.setUser(user)
.setExtra(extra)
.setItems(items);
Map<String, Object> map = newHashMap<>();
map.put("1", "abcdef");
map.put("2", "abcdef55");
map.put("3", 1234);
payload.setMetadata(map);
// payload.setMetadata(new Gson().toJson(map));Bootpay.init(getSupportFragmentManager())
.setPayload(payload)
.setEventListener(newBootpayEventListener() {
@OverridepublicvoidonCancel(Stringdata) {
Log.d("bootpay", "cancel: " + data);
}
@OverridepublicvoidonError(Stringdata) {
Log.d("bootpay", "error: " + data);
}
@OverridepublicvoidonClose() {
Log.d("bootpay", "close");
// Bootpay.removePaymentWindow();Bootpay.dismiss();
}
@OverridepublicvoidonIssued(Stringdata) {
Log.d("bootpay", "issued: " +data);
}
@OverridepublicbooleanonConfirm(Stringdata) {
if(checkClientValidation(data)) {
// Bootpay().transactionConfirm() // 승인 요청(방법 1), 이때는 return false로 해야함returntrue; //승인 요청(방법 2), return true시 내부적으로 승인을 요청함
} else {
Bootpay.dismiss(); // 결제창 닫기returnfalse; //승인하지 않음
}
}
@OverridepublicvoidonDone(Stringdata) {
Log.d("done", data);
}
}).requestPayment();
}

자동결제 - 빌링키 발급 요청하기

Payloadpayload = newPayload();
payload.setClientKey(client_key)
.setOrderName("부트페이 결제테스트")
.setPg("나이스페이")
.setMethod("카드자동")
.setSubscriptionId("1234") //정기결제용 orderId
.setMethod(method)
// .setPrice(price) 가격이 0원 이상일 경우 빌링키 발급 후 결제가 진행됩니다.
.setUser(user)
.setExtra(extra)
.setItems(items);
Bootpay.init(getSupportFragmentManager(), getApplicationContext())
.setPayload(payload)
.requestSubscription(); //정기결제 실행함수 

본인인증 요청하기

Payloadpayload = newPayload();
payload.setClientKey(client_key)
.setOrderName("부트페이 결제테스트")
.setPg("다날")
.setMethod("본인인증")
.setAuthenticationId("1234") //본인인증용 orderId
.setMethod(method)
.setPrice(price)
.setUser(user)
.setExtra(extra)
.setItems(items);
Bootpay.init(getSupportFragmentManager(), getApplicationContext())
.setPayload(payload)
.requestAuthentication(); //본인인증 실행함수

Bootpay Event Listener

결제 진행 상태에 따라 이벤트 함수가 실행됩니다. 각 이벤트에 대한 상세 설명은 아래를 참고하세요.

onError 함수

결제 진행 중 오류가 발생된 경우 호출되는 함수입니다. 진행중 에러가 발생되는 경우는 다음과 같습니다.

  1. 부트페이 관리자에서 활성화 하지 않은 PG, 결제수단을 사용하고자 할 때
  2. PG에서 보내온 결제 정보를 부트페이 관리자에 잘못 입력하거나 입력하지 않은 경우
  3. 결제 진행 도중 한도초과, 카드정지, 휴대폰소액결제 막힘, 계좌이체 불가 등의 사유로 결제가 안되는 경우
  4. PG에서 리턴된 값이 다른 Client에 의해 변조된 경우

에러가 난 경우 해당 함수를 통해 관련 에러 메세지를 사용자에게 보여줄 수 있습니다.

data 포맷은 아래와 같습니다.

{
action: "BootpayError",
message: "카드사 거절",
receipt_id: "5fffab350c20b903e88a2cff"
}

onCancel 함수

결제 진행 중 사용자가 PG 결제창에서 취소 혹은 닫기 버튼을 눌러 나온 경우 입니다. ****

data 포맷은 아래와 같습니다.

{
action: "BootpayCancel",
message: "사용자가 결제를 취소하였습니다.",
receipt_id: "5fffab350c20b903e88a2cff"
}

onIssued 함수

가상계좌 발급이 완료되면 호출되는 함수입니다(가상계좌를 위한 Done). 가상계좌는 다른 결제와 다르게 입금할 계좌 번호 발급 이후 입금 후에 Feedback URL을 통해 통지가 됩니다. 발급된 가상계좌 정보를 issued 함수를 통해 확인하실 수 있습니다.

data 포맷은 아래와 같습니다.

{
account: "T0309260001169"
accounthodler: "한국사이버결제"
action: "BootpayBankReady"
bankcode: "BK03"
bankname: "기업은행"
expiredate: "2021-01-17 00:00:00"
item_name: "테스트 아이템"
method: "vbank"
method_name: "가상계좌"
order_id: "1610591554856"
metadata: null
payment_group: "vbank"
payment_group_name: "가상계좌"
payment_name: "가상계좌"
pg: "kcp"
pg_name: "KCP"
price: 3000
purchased_at: null
ready_url: "https://dev-app.bootpay.co.kr/bank/7o044QyX7p"
receipt_id: "5fffad430c20b903e88a2d17"
requested_at: "2021-01-14 11:32:35"
status: 2
tax_free: 0
url: "https://d-cdn.bootapi.com"
username: "홍길동"
}

onConfirm 함수

결제 승인이 되기 전 호출되는 함수입니다. 승인 이전 관련 로직을 서버 혹은 클라이언트에서 수행 후 결제를 승인해도 될 경우BootPay.transactionConfirm(data); 또는 return true;

코드를 실행해주시면 PG에서 결제 승인이 진행이 됩니다.

* 페이앱, 페이레터 PG는 이 함수가 실행되지 않고 바로 결제가 승인되는 PG 입니다. 참고해주시기 바랍니다.

data 포맷은 아래와 같습니다.

{
receipt_id: "5fffc0460c20b903e88a2d2c",
action: "BootpayConfirm"
}

onDone 함수

PG에서 거래 승인 이후에 호출 되는 함수입니다. 결제 완료 후 다음 결제 결과를 호출 할 수 있는 함수 입니다.

이 함수가 호출 된 후 반드시 REST API를 통해 결제검증을 수행해야합니다. data 포맷은 아래와 같습니다.

{
action: "BootpayDone"
card_code: "CCKM",
card_name: "KB국민카드",
card_no: "0000120000000014",
card_quota: "00",
item_name: "테스트 아이템",
method: "card",
method_name: "카드결제",
order_id: "1610596422328",
payment_group: "card",
payment_group_name: "신용카드",
payment_name: "카드결제",
pg: "kcp",
pg_name: "KCP",
price: 100,
purchased_at: "2021-01-14 12:54:53",
receipt_id: "5fffc0460c20b903e88a2d2c",
receipt_url: "https://app.bootpay.co.kr/bill/UFMvZzJqSWNDNU9ERWh1YmUycU9hdnBkV29DVlJqdzUxRzZyNXRXbkNVZW81%0AQT09LS1XYlNJN1VoMDI4Q1hRdDh1LS10MEtZVmE4c1dyWHNHTXpZTVVLUk1R%0APT0%3D%0A",
requested_at: "2021-01-14 12:53:42",
status: 1,
tax_free: 0,
url: "https://d-cdn.bootapi.com"
}

Documentation

부트페이 개발매뉴얼을 참조해주세요

기술문의

채팅으로 문의

License

MIT License.

About

bootpay android libary 입니다

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bootpay Android

부트페이에서 지원하는 공식 Android 라이브러리 입니다

  • Android SDK 16부터 사용 가능합니다.

Gradle을 통한 설치

build.gradle (module)

android {
compileSdk 34//Android 11 지원을 위한 30 이상 버전을 추천 
defaultConfig {
...
minSdk 16//16 이상 버전 이상부터 지원 
targetSdk 34//Android 11 지원을 위한 30 이상 버전을 추천 
}
}
dependencies {
...
implementation 'io.github.bootpay:android:+'//최신 버전 추천, + 는 항상 최신 버전을 의미합니다. 
}

AndroidManifest.xml 수정

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

실행시 Webpage not available. net:ERR_CLEARTEXT_NOT_PERMITTED 에러가 나온 경우

Android 네트워크 보안 구성에 따르면 안드로이드 9(API28)부터 cleartext traffic을 기본적으로를 비활성화한다고 합니다. 따라서 API 28 이후에서 Http에 접근하려면 cleartext traffic을 활성화 시켜야 합니다.

<application
android:label="@string/app_name"
...
android:usesCleartextTraffic="true">

위젯 설정

부트페이 관리자에서 위젯을 생성하셔야만 사용이 가능합니다.

위젯 렌더링

privateFrameLayoutwebViewContainer; //위젯을 담을 레이아웃@OverrideprotectedvoidonCreate(@NullableBundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_widget); webViewContainer = findViewById(R.id.webViewContainer);
initPayload();
bindWidgetView();
renderWidget();
}
voidinitPayload() {
BootExtraextra = newBootExtra();
extra.setDisplaySuccessResult(true);
payload.setClientKey("YOUR_CLIENT_KEY")
.setOrderName("부트페이 결제테스트")
.setWidgetSandbox(true)
.setWidgetKey("default-widget")
.setWidgetUseTerms(true)
.setOrderId("1234")
.setUserToken("6667b08b04ab6d03f274d32e")
.setPrice(1000d)
.setExtra(extra);
}
//위젯을 webViewContainer에 바인딩 합니다. privatevoidbindWidgetView() {
BootpayWidget.bindViewUpdate(this, getSupportFragmentManager(), webViewContainer);
}
doublemWidgetHeight = 300.0;
//위젯을 렌더링 합니다 voidrenderWidget() {
if(BootpayWidget.getView(this, getSupportFragmentManager()).getUrl() == null) {
BootpayWidget.renderWidget(this, payload, newBootpayWidgetEventListener() {
@OverridepublicvoidonWidgetResize(doubleheight) {
//위젯 사이즈 변경 이벤트 Log.d("bootpay", "onWidgetResize: " + height);
mWidgetHeight = height;
}
@OverridepublicvoidonWidgetReady() {
//위젯이 렌더링되면 호출되는 이벤트Log.d("bootpay", "onWidgetReady: ");
}
@OverridepublicvoidonWidgetChangePayment(WidgetDatadata) {
Log.d("bootpay", "onWidgetChangePayment: " + data);
payload.mergeWidgetData(data);
updatePaymentButtonState();
}
@OverridepublicvoidonWidgetChangeAgreeTerm(WidgetDatadata) {
Log.d("bootpay", "onWidgetChangeAgreeTerm: " + data);
payload.mergeWidgetData(data);
updatePaymentButtonState();
}
@OverridepublicvoidneedReloadWidget() {
Log.d("bootpay", "needReloadWidget ");
widgetStatusReset();
}
});
}
}

위젯으로 결제 요청하기

이 방법은 위젯을 사용하여 결제하는 방법입니다. 위젯을 사용하지 않고 결제를 요청하는 방법은 별도로 제공합니다.

publicvoidgoPayment(Viewv) {
BootpayWidget.requestPayment(
this,
getSupportFragmentManager(),
payload,
newBootpayEventListener() {
@OverridepublicvoidonCancel(Stringdata) {
Log.d("bootpay", "cancel: " + data);
}
@OverridepublicvoidonError(Stringdata) {
Log.d("bootpay", "error: " + data);
}
@OverridepublicvoidonClose() {
Log.d("bootpay", "close");
BootpayWidget.removePaymentWindow();
bindWidgetView();
}
@OverridepublicvoidonIssued(Stringdata) {
Log.d("bootpay", "issued: " + data);
}
@OverridepublicbooleanonConfirm(Stringdata) {
Log.d("bootpay", "confirm: " + data);
returntrue;
}
@OverridepublicvoidonDone(Stringdata) {
Log.d("bootpay", "done: " + data);
}
});
}

결제 요청하기

이 방법은 위젯을 사용하지 않고 결제를 요청하는 방법입니다.

publicvoidPaymentTest(Viewv) {
BootUseruser = newBootUser().setPhone("010-1234-5678"); // 구매자 정보BootExtraextra = newBootExtra()
.setCardQuota("0"); // 일시불, 2개월, 3개월 할부 허용, 할부는 최대 12개월까지 사용됨 (5만원 이상 구매시 할부허용 범위)List<BootItem> items = newArrayList<>();
BootItemitem1 = newBootItem().setName("마우's 스").setId("ITEM_CODE_MOUSE").setQty(1).setPrice(500d);
BootItemitem2 = newBootItem().setName("키보드").setId("ITEM_KEYBOARD_MOUSE").setQty(1).setPrice(500d);
items.add(item1);
items.add(item2);
Payloadpayload = newPayload();
payload.setClientKey(BootpayConstants.client_key)
.setOrderName("부트페이 결제테스트")
.setPg("페이앱")
.setMethod("네이버페이")
.setOrderId("1234")
.setPrice(1000d)
.setUser(user)
.setExtra(extra)
.setItems(items);
Map<String, Object> map = newHashMap<>();
map.put("1", "abcdef");
map.put("2", "abcdef55");
map.put("3", 1234);
payload.setMetadata(map);
// payload.setMetadata(new Gson().toJson(map));Bootpay.init(getSupportFragmentManager())
.setPayload(payload)
.setEventListener(newBootpayEventListener() {
@OverridepublicvoidonCancel(Stringdata) {
Log.d("bootpay", "cancel: " + data);
}
@OverridepublicvoidonError(Stringdata) {
Log.d("bootpay", "error: " + data);
}
@OverridepublicvoidonClose() {
Log.d("bootpay", "close");
// Bootpay.removePaymentWindow();Bootpay.dismiss();
}
@OverridepublicvoidonIssued(Stringdata) {
Log.d("bootpay", "issued: " +data);
}
@OverridepublicbooleanonConfirm(Stringdata) {
if(checkClientValidation(data)) {
// Bootpay().transactionConfirm() // 승인 요청(방법 1), 이때는 return false로 해야함returntrue; //승인 요청(방법 2), return true시 내부적으로 승인을 요청함
} else {
Bootpay.dismiss(); // 결제창 닫기returnfalse; //승인하지 않음
}
}
@OverridepublicvoidonDone(Stringdata) {
Log.d("done", data);
}
}).requestPayment();
}

자동결제 - 빌링키 발급 요청하기

Payloadpayload = newPayload();
payload.setClientKey(client_key)
.setOrderName("부트페이 결제테스트")
.setPg("나이스페이")
.setMethod("카드자동")
.setSubscriptionId("1234") //정기결제용 orderId
.setMethod(method)
// .setPrice(price) 가격이 0원 이상일 경우 빌링키 발급 후 결제가 진행됩니다.
.setUser(user)
.setExtra(extra)
.setItems(items);
Bootpay.init(getSupportFragmentManager(), getApplicationContext())
.setPayload(payload)
.requestSubscription(); //정기결제 실행함수 

본인인증 요청하기

Payloadpayload = newPayload();
payload.setClientKey(client_key)
.setOrderName("부트페이 결제테스트")
.setPg("다날")
.setMethod("본인인증")
.setAuthenticationId("1234") //본인인증용 orderId
.setMethod(method)
.setPrice(price)
.setUser(user)
.setExtra(extra)
.setItems(items);
Bootpay.init(getSupportFragmentManager(), getApplicationContext())
.setPayload(payload)
.requestAuthentication(); //본인인증 실행함수

Bootpay Event Listener

결제 진행 상태에 따라 이벤트 함수가 실행됩니다. 각 이벤트에 대한 상세 설명은 아래를 참고하세요.

onError 함수

결제 진행 중 오류가 발생된 경우 호출되는 함수입니다. 진행중 에러가 발생되는 경우는 다음과 같습니다.

  1. 부트페이 관리자에서 활성화 하지 않은 PG, 결제수단을 사용하고자 할 때
  2. PG에서 보내온 결제 정보를 부트페이 관리자에 잘못 입력하거나 입력하지 않은 경우
  3. 결제 진행 도중 한도초과, 카드정지, 휴대폰소액결제 막힘, 계좌이체 불가 등의 사유로 결제가 안되는 경우
  4. PG에서 리턴된 값이 다른 Client에 의해 변조된 경우

에러가 난 경우 해당 함수를 통해 관련 에러 메세지를 사용자에게 보여줄 수 있습니다.

data 포맷은 아래와 같습니다.

{
action: "BootpayError",
message: "카드사 거절",
receipt_id: "5fffab350c20b903e88a2cff"
}

onCancel 함수

결제 진행 중 사용자가 PG 결제창에서 취소 혹은 닫기 버튼을 눌러 나온 경우 입니다. ****

data 포맷은 아래와 같습니다.

{
action: "BootpayCancel",
message: "사용자가 결제를 취소하였습니다.",
receipt_id: "5fffab350c20b903e88a2cff"
}

onIssued 함수

가상계좌 발급이 완료되면 호출되는 함수입니다(가상계좌를 위한 Done). 가상계좌는 다른 결제와 다르게 입금할 계좌 번호 발급 이후 입금 후에 Feedback URL을 통해 통지가 됩니다. 발급된 가상계좌 정보를 issued 함수를 통해 확인하실 수 있습니다.

data 포맷은 아래와 같습니다.

{
account: "T0309260001169"
accounthodler: "한국사이버결제"
action: "BootpayBankReady"
bankcode: "BK03"
bankname: "기업은행"
expiredate: "2021-01-17 00:00:00"
item_name: "테스트 아이템"
method: "vbank"
method_name: "가상계좌"
order_id: "1610591554856"
metadata: null
payment_group: "vbank"
payment_group_name: "가상계좌"
payment_name: "가상계좌"
pg: "kcp"
pg_name: "KCP"
price: 3000
purchased_at: null
ready_url: "https://dev-app.bootpay.co.kr/bank/7o044QyX7p"
receipt_id: "5fffad430c20b903e88a2d17"
requested_at: "2021-01-14 11:32:35"
status: 2
tax_free: 0
url: "https://d-cdn.bootapi.com"
username: "홍길동"
}

onConfirm 함수

결제 승인이 되기 전 호출되는 함수입니다. 승인 이전 관련 로직을 서버 혹은 클라이언트에서 수행 후 결제를 승인해도 될 경우BootPay.transactionConfirm(data); 또는 return true;

코드를 실행해주시면 PG에서 결제 승인이 진행이 됩니다.

* 페이앱, 페이레터 PG는 이 함수가 실행되지 않고 바로 결제가 승인되는 PG 입니다. 참고해주시기 바랍니다.

data 포맷은 아래와 같습니다.

{
receipt_id: "5fffc0460c20b903e88a2d2c",
action: "BootpayConfirm"
}

onDone 함수

PG에서 거래 승인 이후에 호출 되는 함수입니다. 결제 완료 후 다음 결제 결과를 호출 할 수 있는 함수 입니다.

이 함수가 호출 된 후 반드시 REST API를 통해 결제검증을 수행해야합니다. data 포맷은 아래와 같습니다.

{
action: "BootpayDone"
card_code: "CCKM",
card_name: "KB국민카드",
card_no: "0000120000000014",
card_quota: "00",
item_name: "테스트 아이템",
method: "card",
method_name: "카드결제",
order_id: "1610596422328",
payment_group: "card",
payment_group_name: "신용카드",
payment_name: "카드결제",
pg: "kcp",
pg_name: "KCP",
price: 100,
purchased_at: "2021-01-14 12:54:53",
receipt_id: "5fffc0460c20b903e88a2d2c",
receipt_url: "https://app.bootpay.co.kr/bill/UFMvZzJqSWNDNU9ERWh1YmUycU9hdnBkV29DVlJqdzUxRzZyNXRXbkNVZW81%0AQT09LS1XYlNJN1VoMDI4Q1hRdDh1LS10MEtZVmE4c1dyWHNHTXpZTVVLUk1R%0APT0%3D%0A",
requested_at: "2021-01-14 12:53:42",
status: 1,
tax_free: 0,
url: "https://d-cdn.bootapi.com"
}

Documentation

부트페이 개발매뉴얼을 참조해주세요

기술문의

채팅으로 문의

License

MIT License.

About

bootpay android libary 입니다

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bootpay Android

부트페이에서 지원하는 공식 Android 라이브러리 입니다

  • Android SDK 16부터 사용 가능합니다.

Gradle을 통한 설치

build.gradle (module)

android {
compileSdk 34//Android 11 지원을 위한 30 이상 버전을 추천 
defaultConfig {
...
minSdk 16//16 이상 버전 이상부터 지원 
targetSdk 34//Android 11 지원을 위한 30 이상 버전을 추천 
}
}
dependencies {
...
implementation 'io.github.bootpay:android:+'//최신 버전 추천, + 는 항상 최신 버전을 의미합니다. 
}

AndroidManifest.xml 수정

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

실행시 Webpage not available. net:ERR_CLEARTEXT_NOT_PERMITTED 에러가 나온 경우

Android 네트워크 보안 구성에 따르면 안드로이드 9(API28)부터 cleartext traffic을 기본적으로를 비활성화한다고 합니다. 따라서 API 28 이후에서 Http에 접근하려면 cleartext traffic을 활성화 시켜야 합니다.

<application
android:label="@string/app_name"
...
android:usesCleartextTraffic="true">

위젯 설정

부트페이 관리자에서 위젯을 생성하셔야만 사용이 가능합니다.

위젯 렌더링

privateFrameLayoutwebViewContainer; //위젯을 담을 레이아웃@OverrideprotectedvoidonCreate(@NullableBundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_widget); webViewContainer = findViewById(R.id.webViewContainer);
initPayload();
bindWidgetView();
renderWidget();
}
voidinitPayload() {
BootExtraextra = newBootExtra();
extra.setDisplaySuccessResult(true);
payload.setClientKey("YOUR_CLIENT_KEY")
.setOrderName("부트페이 결제테스트")
.setWidgetSandbox(true)
.setWidgetKey("default-widget")
.setWidgetUseTerms(true)
.setOrderId("1234")
.setUserToken("6667b08b04ab6d03f274d32e")
.setPrice(1000d)
.setExtra(extra);
}
//위젯을 webViewContainer에 바인딩 합니다. privatevoidbindWidgetView() {
BootpayWidget.bindViewUpdate(this, getSupportFragmentManager(), webViewContainer);
}
doublemWidgetHeight = 300.0;
//위젯을 렌더링 합니다 voidrenderWidget() {
if(BootpayWidget.getView(this, getSupportFragmentManager()).getUrl() == null) {
BootpayWidget.renderWidget(this, payload, newBootpayWidgetEventListener() {
@OverridepublicvoidonWidgetResize(doubleheight) {
//위젯 사이즈 변경 이벤트 Log.d("bootpay", "onWidgetResize: " + height);
mWidgetHeight = height;
}
@OverridepublicvoidonWidgetReady() {
//위젯이 렌더링되면 호출되는 이벤트Log.d("bootpay", "onWidgetReady: ");
}
@OverridepublicvoidonWidgetChangePayment(WidgetDatadata) {
Log.d("bootpay", "onWidgetChangePayment: " + data);
payload.mergeWidgetData(data);
updatePaymentButtonState();
}
@OverridepublicvoidonWidgetChangeAgreeTerm(WidgetDatadata) {
Log.d("bootpay", "onWidgetChangeAgreeTerm: " + data);
payload.mergeWidgetData(data);
updatePaymentButtonState();
}
@OverridepublicvoidneedReloadWidget() {
Log.d("bootpay", "needReloadWidget ");
widgetStatusReset();
}
});
}
}

위젯으로 결제 요청하기

이 방법은 위젯을 사용하여 결제하는 방법입니다. 위젯을 사용하지 않고 결제를 요청하는 방법은 별도로 제공합니다.

publicvoidgoPayment(Viewv) {
BootpayWidget.requestPayment(
this,
getSupportFragmentManager(),
payload,
newBootpayEventListener() {
@OverridepublicvoidonCancel(Stringdata) {
Log.d("bootpay", "cancel: " + data);
}
@OverridepublicvoidonError(Stringdata) {
Log.d("bootpay", "error: " + data);
}
@OverridepublicvoidonClose() {
Log.d("bootpay", "close");
BootpayWidget.removePaymentWindow();
bindWidgetView();
}
@OverridepublicvoidonIssued(Stringdata) {
Log.d("bootpay", "issued: " + data);
}
@OverridepublicbooleanonConfirm(Stringdata) {
Log.d("bootpay", "confirm: " + data);
returntrue;
}
@OverridepublicvoidonDone(Stringdata) {
Log.d("bootpay", "done: " + data);
}
});
}

결제 요청하기

이 방법은 위젯을 사용하지 않고 결제를 요청하는 방법입니다.

publicvoidPaymentTest(Viewv) {
BootUseruser = newBootUser().setPhone("010-1234-5678"); // 구매자 정보BootExtraextra = newBootExtra()
.setCardQuota("0"); // 일시불, 2개월, 3개월 할부 허용, 할부는 최대 12개월까지 사용됨 (5만원 이상 구매시 할부허용 범위)List<BootItem> items = newArrayList<>();
BootItemitem1 = newBootItem().setName("마우's 스").setId("ITEM_CODE_MOUSE").setQty(1).setPrice(500d);
BootItemitem2 = newBootItem().setName("키보드").setId("ITEM_KEYBOARD_MOUSE").setQty(1).setPrice(500d);
items.add(item1);
items.add(item2);
Payloadpayload = newPayload();
payload.setClientKey(BootpayConstants.client_key)
.setOrderName("부트페이 결제테스트")
.setPg("페이앱")
.setMethod("네이버페이")
.setOrderId("1234")
.setPrice(1000d)
.setUser(user)
.setExtra(extra)
.setItems(items);
Map<String, Object> map = newHashMap<>();
map.put("1", "abcdef");
map.put("2", "abcdef55");
map.put("3", 1234);
payload.setMetadata(map);
// payload.setMetadata(new Gson().toJson(map));Bootpay.init(getSupportFragmentManager())
.setPayload(payload)
.setEventListener(newBootpayEventListener() {
@OverridepublicvoidonCancel(Stringdata) {
Log.d("bootpay", "cancel: " + data);
}
@OverridepublicvoidonError(Stringdata) {
Log.d("bootpay", "error: " + data);
}
@OverridepublicvoidonClose() {
Log.d("bootpay", "close");
// Bootpay.removePaymentWindow();Bootpay.dismiss();
}
@OverridepublicvoidonIssued(Stringdata) {
Log.d("bootpay", "issued: " +data);
}
@OverridepublicbooleanonConfirm(Stringdata) {
if(checkClientValidation(data)) {
// Bootpay().transactionConfirm() // 승인 요청(방법 1), 이때는 return false로 해야함returntrue; //승인 요청(방법 2), return true시 내부적으로 승인을 요청함
} else {
Bootpay.dismiss(); // 결제창 닫기returnfalse; //승인하지 않음
}
}
@OverridepublicvoidonDone(Stringdata) {
Log.d("done", data);
}
}).requestPayment();
}

자동결제 - 빌링키 발급 요청하기

Payloadpayload = newPayload();
payload.setClientKey(client_key)
.setOrderName("부트페이 결제테스트")
.setPg("나이스페이")
.setMethod("카드자동")
.setSubscriptionId("1234") //정기결제용 orderId
.setMethod(method)
// .setPrice(price) 가격이 0원 이상일 경우 빌링키 발급 후 결제가 진행됩니다.
.setUser(user)
.setExtra(extra)
.setItems(items);
Bootpay.init(getSupportFragmentManager(), getApplicationContext())
.setPayload(payload)
.requestSubscription(); //정기결제 실행함수 

본인인증 요청하기

Payloadpayload = newPayload();
payload.setClientKey(client_key)
.setOrderName("부트페이 결제테스트")
.setPg("다날")
.setMethod("본인인증")
.setAuthenticationId("1234") //본인인증용 orderId
.setMethod(method)
.setPrice(price)
.setUser(user)
.setExtra(extra)
.setItems(items);
Bootpay.init(getSupportFragmentManager(), getApplicationContext())
.setPayload(payload)
.requestAuthentication(); //본인인증 실행함수

Bootpay Event Listener

결제 진행 상태에 따라 이벤트 함수가 실행됩니다. 각 이벤트에 대한 상세 설명은 아래를 참고하세요.

onError 함수

결제 진행 중 오류가 발생된 경우 호출되는 함수입니다. 진행중 에러가 발생되는 경우는 다음과 같습니다.

  1. 부트페이 관리자에서 활성화 하지 않은 PG, 결제수단을 사용하고자 할 때
  2. PG에서 보내온 결제 정보를 부트페이 관리자에 잘못 입력하거나 입력하지 않은 경우
  3. 결제 진행 도중 한도초과, 카드정지, 휴대폰소액결제 막힘, 계좌이체 불가 등의 사유로 결제가 안되는 경우
  4. PG에서 리턴된 값이 다른 Client에 의해 변조된 경우

에러가 난 경우 해당 함수를 통해 관련 에러 메세지를 사용자에게 보여줄 수 있습니다.

data 포맷은 아래와 같습니다.

{
action: "BootpayError",
message: "카드사 거절",
receipt_id: "5fffab350c20b903e88a2cff"
}

onCancel 함수

결제 진행 중 사용자가 PG 결제창에서 취소 혹은 닫기 버튼을 눌러 나온 경우 입니다. ****

data 포맷은 아래와 같습니다.

{
action: "BootpayCancel",
message: "사용자가 결제를 취소하였습니다.",
receipt_id: "5fffab350c20b903e88a2cff"
}

onIssued 함수

가상계좌 발급이 완료되면 호출되는 함수입니다(가상계좌를 위한 Done). 가상계좌는 다른 결제와 다르게 입금할 계좌 번호 발급 이후 입금 후에 Feedback URL을 통해 통지가 됩니다. 발급된 가상계좌 정보를 issued 함수를 통해 확인하실 수 있습니다.

data 포맷은 아래와 같습니다.

{
account: "T0309260001169"
accounthodler: "한국사이버결제"
action: "BootpayBankReady"
bankcode: "BK03"
bankname: "기업은행"
expiredate: "2021-01-17 00:00:00"
item_name: "테스트 아이템"
method: "vbank"
method_name: "가상계좌"
order_id: "1610591554856"
metadata: null
payment_group: "vbank"
payment_group_name: "가상계좌"
payment_name: "가상계좌"
pg: "kcp"
pg_name: "KCP"
price: 3000
purchased_at: null
ready_url: "https://dev-app.bootpay.co.kr/bank/7o044QyX7p"
receipt_id: "5fffad430c20b903e88a2d17"
requested_at: "2021-01-14 11:32:35"
status: 2
tax_free: 0
url: "https://d-cdn.bootapi.com"
username: "홍길동"
}

onConfirm 함수

결제 승인이 되기 전 호출되는 함수입니다. 승인 이전 관련 로직을 서버 혹은 클라이언트에서 수행 후 결제를 승인해도 될 경우BootPay.transactionConfirm(data); 또는 return true;

코드를 실행해주시면 PG에서 결제 승인이 진행이 됩니다.

* 페이앱, 페이레터 PG는 이 함수가 실행되지 않고 바로 결제가 승인되는 PG 입니다. 참고해주시기 바랍니다.

data 포맷은 아래와 같습니다.

{
receipt_id: "5fffc0460c20b903e88a2d2c",
action: "BootpayConfirm"
}

onDone 함수

PG에서 거래 승인 이후에 호출 되는 함수입니다. 결제 완료 후 다음 결제 결과를 호출 할 수 있는 함수 입니다.

이 함수가 호출 된 후 반드시 REST API를 통해 결제검증을 수행해야합니다. data 포맷은 아래와 같습니다.

{
action: "BootpayDone"
card_code: "CCKM",
card_name: "KB국민카드",
card_no: "0000120000000014",
card_quota: "00",
item_name: "테스트 아이템",
method: "card",
method_name: "카드결제",
order_id: "1610596422328",
payment_group: "card",
payment_group_name: "신용카드",
payment_name: "카드결제",
pg: "kcp",
pg_name: "KCP",
price: 100,
purchased_at: "2021-01-14 12:54:53",
receipt_id: "5fffc0460c20b903e88a2d2c",
receipt_url: "https://app.bootpay.co.kr/bill/UFMvZzJqSWNDNU9ERWh1YmUycU9hdnBkV29DVlJqdzUxRzZyNXRXbkNVZW81%0AQT09LS1XYlNJN1VoMDI4Q1hRdDh1LS10MEtZVmE4c1dyWHNHTXpZTVVLUk1R%0APT0%3D%0A",
requested_at: "2021-01-14 12:53:42",
status: 1,
tax_free: 0,
url: "https://d-cdn.bootapi.com"
}

Documentation

부트페이 개발매뉴얼을 참조해주세요

기술문의

채팅으로 문의

License

MIT License.

About

bootpay android libary 입니다

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Bootpay Android

부트페이에서 지원하는 공식 Android 라이브러리 입니다

  • Android SDK 16부터 사용 가능합니다.

Gradle을 통한 설치

build.gradle (module)

android {
compileSdk 34//Android 11 지원을 위한 30 이상 버전을 추천 
defaultConfig {
...
minSdk 16//16 이상 버전 이상부터 지원 
targetSdk 34//Android 11 지원을 위한 30 이상 버전을 추천 
}
}
dependencies {
...
implementation 'io.github.bootpay:android:+'//최신 버전 추천, + 는 항상 최신 버전을 의미합니다. 
}

AndroidManifest.xml 수정

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

실행시 Webpage not available. net:ERR_CLEARTEXT_NOT_PERMITTED 에러가 나온 경우

Android 네트워크 보안 구성에 따르면 안드로이드 9(API28)부터 cleartext traffic을 기본적으로를 비활성화한다고 합니다. 따라서 API 28 이후에서 Http에 접근하려면 cleartext traffic을 활성화 시켜야 합니다.

<application
android:label="@string/app_name"
...
android:usesCleartextTraffic="true">

위젯 설정

부트페이 관리자에서 위젯을 생성하셔야만 사용이 가능합니다.

위젯 렌더링

privateFrameLayoutwebViewContainer; //위젯을 담을 레이아웃@OverrideprotectedvoidonCreate(@NullableBundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_widget); webViewContainer = findViewById(R.id.webViewContainer);
initPayload();
bindWidgetView();
renderWidget();
}
voidinitPayload() {
BootExtraextra = newBootExtra();
extra.setDisplaySuccessResult(true);
payload.setClientKey("YOUR_CLIENT_KEY")
.setOrderName("부트페이 결제테스트")
.setWidgetSandbox(true)
.setWidgetKey("default-widget")
.setWidgetUseTerms(true)
.setOrderId("1234")
.setUserToken("6667b08b04ab6d03f274d32e")
.setPrice(1000d)
.setExtra(extra);
}
//위젯을 webViewContainer에 바인딩 합니다. privatevoidbindWidgetView() {
BootpayWidget.bindViewUpdate(this, getSupportFragmentManager(), webViewContainer);
}
doublemWidgetHeight = 300.0;
//위젯을 렌더링 합니다 voidrenderWidget() {
if(BootpayWidget.getView(this, getSupportFragmentManager()).getUrl() == null) {
BootpayWidget.renderWidget(this, payload, newBootpayWidgetEventListener() {
@OverridepublicvoidonWidgetResize(doubleheight) {
//위젯 사이즈 변경 이벤트 Log.d("bootpay", "onWidgetResize: " + height);
mWidgetHeight = height;
}
@OverridepublicvoidonWidgetReady() {
//위젯이 렌더링되면 호출되는 이벤트Log.d("bootpay", "onWidgetReady: ");
}
@OverridepublicvoidonWidgetChangePayment(WidgetDatadata) {
Log.d("bootpay", "onWidgetChangePayment: " + data);
payload.mergeWidgetData(data);
updatePaymentButtonState();
}
@OverridepublicvoidonWidgetChangeAgreeTerm(WidgetDatadata) {
Log.d("bootpay", "onWidgetChangeAgreeTerm: " + data);
payload.mergeWidgetData(data);
updatePaymentButtonState();
}
@OverridepublicvoidneedReloadWidget() {
Log.d("bootpay", "needReloadWidget ");
widgetStatusReset();
}
});
}
}

위젯으로 결제 요청하기

이 방법은 위젯을 사용하여 결제하는 방법입니다. 위젯을 사용하지 않고 결제를 요청하는 방법은 별도로 제공합니다.

publicvoidgoPayment(Viewv) {
BootpayWidget.requestPayment(
this,
getSupportFragmentManager(),
payload,
newBootpayEventListener() {
@OverridepublicvoidonCancel(Stringdata) {
Log.d("bootpay", "cancel: " + data);
}
@OverridepublicvoidonError(Stringdata) {
Log.d("bootpay", "error: " + data);
}
@OverridepublicvoidonClose() {
Log.d("bootpay", "close");
BootpayWidget.removePaymentWindow();
bindWidgetView();
}
@OverridepublicvoidonIssued(Stringdata) {
Log.d("bootpay", "issued: " + data);
}
@OverridepublicbooleanonConfirm(Stringdata) {
Log.d("bootpay", "confirm: " + data);
returntrue;
}
@OverridepublicvoidonDone(Stringdata) {
Log.d("bootpay", "done: " + data);
}
});
}

결제 요청하기

이 방법은 위젯을 사용하지 않고 결제를 요청하는 방법입니다.

publicvoidPaymentTest(Viewv) {
BootUseruser = newBootUser().setPhone("010-1234-5678"); // 구매자 정보BootExtraextra = newBootExtra()
.setCardQuota("0"); // 일시불, 2개월, 3개월 할부 허용, 할부는 최대 12개월까지 사용됨 (5만원 이상 구매시 할부허용 범위)List<BootItem> items = newArrayList<>();
BootItemitem1 = newBootItem().setName("마우's 스").setId("ITEM_CODE_MOUSE").setQty(1).setPrice(500d);
BootItemitem2 = newBootItem().setName("키보드").setId("ITEM_KEYBOARD_MOUSE").setQty(1).setPrice(500d);
items.add(item1);
items.add(item2);
Payloadpayload = newPayload();
payload.setClientKey(BootpayConstants.client_key)
.setOrderName("부트페이 결제테스트")
.setPg("페이앱")
.setMethod("네이버페이")
.setOrderId("1234")
.setPrice(1000d)
.setUser(user)
.setExtra(extra)
.setItems(items);
Map<String, Object> map = newHashMap<>();
map.put("1", "abcdef");
map.put("2", "abcdef55");
map.put("3", 1234);
payload.setMetadata(map);
// payload.setMetadata(new Gson().toJson(map));Bootpay.init(getSupportFragmentManager())
.setPayload(payload)
.setEventListener(newBootpayEventListener() {
@OverridepublicvoidonCancel(Stringdata) {
Log.d("bootpay", "cancel: " + data);
}
@OverridepublicvoidonError(Stringdata) {
Log.d("bootpay", "error: " + data);
}
@OverridepublicvoidonClose() {
Log.d("bootpay", "close");
// Bootpay.removePaymentWindow();Bootpay.dismiss();
}
@OverridepublicvoidonIssued(Stringdata) {
Log.d("bootpay", "issued: " +data);
}
@OverridepublicbooleanonConfirm(Stringdata) {
if(checkClientValidation(data)) {
// Bootpay().transactionConfirm() // 승인 요청(방법 1), 이때는 return false로 해야함returntrue; //승인 요청(방법 2), return true시 내부적으로 승인을 요청함
} else {
Bootpay.dismiss(); // 결제창 닫기returnfalse; //승인하지 않음
}
}
@OverridepublicvoidonDone(Stringdata) {
Log.d("done", data);
}
}).requestPayment();
}

자동결제 - 빌링키 발급 요청하기

Payloadpayload = newPayload();
payload.setClientKey(client_key)
.setOrderName("부트페이 결제테스트")
.setPg("나이스페이")
.setMethod("카드자동")
.setSubscriptionId("1234") //정기결제용 orderId
.setMethod(method)
// .setPrice(price) 가격이 0원 이상일 경우 빌링키 발급 후 결제가 진행됩니다.
.setUser(user)
.setExtra(extra)
.setItems(items);
Bootpay.init(getSupportFragmentManager(), getApplicationContext())
.setPayload(payload)
.requestSubscription(); //정기결제 실행함수 

본인인증 요청하기

Payloadpayload = newPayload();
payload.setClientKey(client_key)
.setOrderName("부트페이 결제테스트")
.setPg("다날")
.setMethod("본인인증")
.setAuthenticationId("1234") //본인인증용 orderId
.setMethod(method)
.setPrice(price)
.setUser(user)
.setExtra(extra)
.setItems(items);
Bootpay.init(getSupportFragmentManager(), getApplicationContext())
.setPayload(payload)
.requestAuthentication(); //본인인증 실행함수

Bootpay Event Listener

결제 진행 상태에 따라 이벤트 함수가 실행됩니다. 각 이벤트에 대한 상세 설명은 아래를 참고하세요.

onError 함수

결제 진행 중 오류가 발생된 경우 호출되는 함수입니다. 진행중 에러가 발생되는 경우는 다음과 같습니다.

  1. 부트페이 관리자에서 활성화 하지 않은 PG, 결제수단을 사용하고자 할 때
  2. PG에서 보내온 결제 정보를 부트페이 관리자에 잘못 입력하거나 입력하지 않은 경우
  3. 결제 진행 도중 한도초과, 카드정지, 휴대폰소액결제 막힘, 계좌이체 불가 등의 사유로 결제가 안되는 경우
  4. PG에서 리턴된 값이 다른 Client에 의해 변조된 경우

에러가 난 경우 해당 함수를 통해 관련 에러 메세지를 사용자에게 보여줄 수 있습니다.

data 포맷은 아래와 같습니다.

{
action: "BootpayError",
message: "카드사 거절",
receipt_id: "5fffab350c20b903e88a2cff"
}

onCancel 함수

결제 진행 중 사용자가 PG 결제창에서 취소 혹은 닫기 버튼을 눌러 나온 경우 입니다. ****

data 포맷은 아래와 같습니다.

{
action: "BootpayCancel",
message: "사용자가 결제를 취소하였습니다.",
receipt_id: "5fffab350c20b903e88a2cff"
}

onIssued 함수

가상계좌 발급이 완료되면 호출되는 함수입니다(가상계좌를 위한 Done). 가상계좌는 다른 결제와 다르게 입금할 계좌 번호 발급 이후 입금 후에 Feedback URL을 통해 통지가 됩니다. 발급된 가상계좌 정보를 issued 함수를 통해 확인하실 수 있습니다.

data 포맷은 아래와 같습니다.

{
account: "T0309260001169"
accounthodler: "한국사이버결제"
action: "BootpayBankReady"
bankcode: "BK03"
bankname: "기업은행"
expiredate: "2021-01-17 00:00:00"
item_name: "테스트 아이템"
method: "vbank"
method_name: "가상계좌"
order_id: "1610591554856"
metadata: null
payment_group: "vbank"
payment_group_name: "가상계좌"
payment_name: "가상계좌"
pg: "kcp"
pg_name: "KCP"
price: 3000
purchased_at: null
ready_url: "https://dev-app.bootpay.co.kr/bank/7o044QyX7p"
receipt_id: "5fffad430c20b903e88a2d17"
requested_at: "2021-01-14 11:32:35"
status: 2
tax_free: 0
url: "https://d-cdn.bootapi.com"
username: "홍길동"
}

onConfirm 함수

결제 승인이 되기 전 호출되는 함수입니다. 승인 이전 관련 로직을 서버 혹은 클라이언트에서 수행 후 결제를 승인해도 될 경우BootPay.transactionConfirm(data); 또는 return true;

코드를 실행해주시면 PG에서 결제 승인이 진행이 됩니다.

* 페이앱, 페이레터 PG는 이 함수가 실행되지 않고 바로 결제가 승인되는 PG 입니다. 참고해주시기 바랍니다.

data 포맷은 아래와 같습니다.

{
receipt_id: "5fffc0460c20b903e88a2d2c",
action: "BootpayConfirm"
}

onDone 함수

PG에서 거래 승인 이후에 호출 되는 함수입니다. 결제 완료 후 다음 결제 결과를 호출 할 수 있는 함수 입니다.

이 함수가 호출 된 후 반드시 REST API를 통해 결제검증을 수행해야합니다. data 포맷은 아래와 같습니다.

{
action: "BootpayDone"
card_code: "CCKM",
card_name: "KB국민카드",
card_no: "0000120000000014",
card_quota: "00",
item_name: "테스트 아이템",
method: "card",
method_name: "카드결제",
order_id: "1610596422328",
payment_group: "card",
payment_group_name: "신용카드",
payment_name: "카드결제",
pg: "kcp",
pg_name: "KCP",
price: 100,
purchased_at: "2021-01-14 12:54:53",
receipt_id: "5fffc0460c20b903e88a2d2c",
receipt_url: "https://app.bootpay.co.kr/bill/UFMvZzJqSWNDNU9ERWh1YmUycU9hdnBkV29DVlJqdzUxRzZyNXRXbkNVZW81%0AQT09LS1XYlNJN1VoMDI4Q1hRdDh1LS10MEtZVmE4c1dyWHNHTXpZTVVLUk1R%0APT0%3D%0A",
requested_at: "2021-01-14 12:53:42",
status: 1,
tax_free: 0,
url: "https://d-cdn.bootapi.com"
}

Documentation

부트페이 개발매뉴얼을 참조해주세요

기술문의

채팅으로 문의

License

MIT License.

About

bootpay android libary 입니다

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bootpay Android

부트페이에서 지원하는 공식 Android 라이브러리 입니다

  • Android SDK 16부터 사용 가능합니다.

Gradle을 통한 설치

build.gradle (module)

android {
compileSdk 34//Android 11 지원을 위한 30 이상 버전을 추천 
defaultConfig {
...
minSdk 16//16 이상 버전 이상부터 지원 
targetSdk 34//Android 11 지원을 위한 30 이상 버전을 추천 
}
}
dependencies {
...
implementation 'io.github.bootpay:android:+'//최신 버전 추천, + 는 항상 최신 버전을 의미합니다. 
}

AndroidManifest.xml 수정

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

실행시 Webpage not available. net:ERR_CLEARTEXT_NOT_PERMITTED 에러가 나온 경우

Android 네트워크 보안 구성에 따르면 안드로이드 9(API28)부터 cleartext traffic을 기본적으로를 비활성화한다고 합니다. 따라서 API 28 이후에서 Http에 접근하려면 cleartext traffic을 활성화 시켜야 합니다.

<application
android:label="@string/app_name"
...
android:usesCleartextTraffic="true">

위젯 설정

부트페이 관리자에서 위젯을 생성하셔야만 사용이 가능합니다.

위젯 렌더링

privateFrameLayoutwebViewContainer; //위젯을 담을 레이아웃@OverrideprotectedvoidonCreate(@NullableBundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_widget); webViewContainer = findViewById(R.id.webViewContainer);
initPayload();
bindWidgetView();
renderWidget();
}
voidinitPayload() {
BootExtraextra = newBootExtra();
extra.setDisplaySuccessResult(true);
payload.setClientKey("YOUR_CLIENT_KEY")
.setOrderName("부트페이 결제테스트")
.setWidgetSandbox(true)
.setWidgetKey("default-widget")
.setWidgetUseTerms(true)
.setOrderId("1234")
.setUserToken("6667b08b04ab6d03f274d32e")
.setPrice(1000d)
.setExtra(extra);
}
//위젯을 webViewContainer에 바인딩 합니다. privatevoidbindWidgetView() {
BootpayWidget.bindViewUpdate(this, getSupportFragmentManager(), webViewContainer);
}
doublemWidgetHeight = 300.0;
//위젯을 렌더링 합니다 voidrenderWidget() {
if(BootpayWidget.getView(this, getSupportFragmentManager()).getUrl() == null) {
BootpayWidget.renderWidget(this, payload, newBootpayWidgetEventListener() {
@OverridepublicvoidonWidgetResize(doubleheight) {
//위젯 사이즈 변경 이벤트 Log.d("bootpay", "onWidgetResize: " + height);
mWidgetHeight = height;
}
@OverridepublicvoidonWidgetReady() {
//위젯이 렌더링되면 호출되는 이벤트Log.d("bootpay", "onWidgetReady: ");
}
@OverridepublicvoidonWidgetChangePayment(WidgetDatadata) {
Log.d("bootpay", "onWidgetChangePayment: " + data);
payload.mergeWidgetData(data);
updatePaymentButtonState();
}
@OverridepublicvoidonWidgetChangeAgreeTerm(WidgetDatadata) {
Log.d("bootpay", "onWidgetChangeAgreeTerm: " + data);
payload.mergeWidgetData(data);
updatePaymentButtonState();
}
@OverridepublicvoidneedReloadWidget() {
Log.d("bootpay", "needReloadWidget ");
widgetStatusReset();
}
});
}
}

위젯으로 결제 요청하기

이 방법은 위젯을 사용하여 결제하는 방법입니다. 위젯을 사용하지 않고 결제를 요청하는 방법은 별도로 제공합니다.

publicvoidgoPayment(Viewv) {
BootpayWidget.requestPayment(
this,
getSupportFragmentManager(),
payload,
newBootpayEventListener() {
@OverridepublicvoidonCancel(Stringdata) {
Log.d("bootpay", "cancel: " + data);
}
@OverridepublicvoidonError(Stringdata) {
Log.d("bootpay", "error: " + data);
}
@OverridepublicvoidonClose() {
Log.d("bootpay", "close");
BootpayWidget.removePaymentWindow();
bindWidgetView();
}
@OverridepublicvoidonIssued(Stringdata) {
Log.d("bootpay", "issued: " + data);
}
@OverridepublicbooleanonConfirm(Stringdata) {
Log.d("bootpay", "confirm: " + data);
returntrue;
}
@OverridepublicvoidonDone(Stringdata) {
Log.d("bootpay", "done: " + data);
}
});
}

결제 요청하기

이 방법은 위젯을 사용하지 않고 결제를 요청하는 방법입니다.

publicvoidPaymentTest(Viewv) {
BootUseruser = newBootUser().setPhone("010-1234-5678"); // 구매자 정보BootExtraextra = newBootExtra()
.setCardQuota("0"); // 일시불, 2개월, 3개월 할부 허용, 할부는 최대 12개월까지 사용됨 (5만원 이상 구매시 할부허용 범위)List<BootItem> items = newArrayList<>();
BootItemitem1 = newBootItem().setName("마우's 스").setId("ITEM_CODE_MOUSE").setQty(1).setPrice(500d);
BootItemitem2 = newBootItem().setName("키보드").setId("ITEM_KEYBOARD_MOUSE").setQty(1).setPrice(500d);
items.add(item1);
items.add(item2);
Payloadpayload = newPayload();
payload.setClientKey(BootpayConstants.client_key)
.setOrderName("부트페이 결제테스트")
.setPg("페이앱")
.setMethod("네이버페이")
.setOrderId("1234")
.setPrice(1000d)
.setUser(user)
.setExtra(extra)
.setItems(items);
Map<String, Object> map = newHashMap<>();
map.put("1", "abcdef");
map.put("2", "abcdef55");
map.put("3", 1234);
payload.setMetadata(map);
// payload.setMetadata(new Gson().toJson(map));Bootpay.init(getSupportFragmentManager())
.setPayload(payload)
.setEventListener(newBootpayEventListener() {
@OverridepublicvoidonCancel(Stringdata) {
Log.d("bootpay", "cancel: " + data);
}
@OverridepublicvoidonError(Stringdata) {
Log.d("bootpay", "error: " + data);
}
@OverridepublicvoidonClose() {
Log.d("bootpay", "close");
// Bootpay.removePaymentWindow();Bootpay.dismiss();
}
@OverridepublicvoidonIssued(Stringdata) {
Log.d("bootpay", "issued: " +data);
}
@OverridepublicbooleanonConfirm(Stringdata) {
if(checkClientValidation(data)) {
// Bootpay().transactionConfirm() // 승인 요청(방법 1), 이때는 return false로 해야함returntrue; //승인 요청(방법 2), return true시 내부적으로 승인을 요청함
} else {
Bootpay.dismiss(); // 결제창 닫기returnfalse; //승인하지 않음
}
}
@OverridepublicvoidonDone(Stringdata) {
Log.d("done", data);
}
}).requestPayment();
}

자동결제 - 빌링키 발급 요청하기

Payloadpayload = newPayload();
payload.setClientKey(client_key)
.setOrderName("부트페이 결제테스트")
.setPg("나이스페이")
.setMethod("카드자동")
.setSubscriptionId("1234") //정기결제용 orderId
.setMethod(method)
// .setPrice(price) 가격이 0원 이상일 경우 빌링키 발급 후 결제가 진행됩니다.
.setUser(user)
.setExtra(extra)
.setItems(items);
Bootpay.init(getSupportFragmentManager(), getApplicationContext())
.setPayload(payload)
.requestSubscription(); //정기결제 실행함수 

본인인증 요청하기

Payloadpayload = newPayload();
payload.setClientKey(client_key)
.setOrderName("부트페이 결제테스트")
.setPg("다날")
.setMethod("본인인증")
.setAuthenticationId("1234") //본인인증용 orderId
.setMethod(method)
.setPrice(price)
.setUser(user)
.setExtra(extra)
.setItems(items);
Bootpay.init(getSupportFragmentManager(), getApplicationContext())
.setPayload(payload)
.requestAuthentication(); //본인인증 실행함수

Bootpay Event Listener

결제 진행 상태에 따라 이벤트 함수가 실행됩니다. 각 이벤트에 대한 상세 설명은 아래를 참고하세요.

onError 함수

결제 진행 중 오류가 발생된 경우 호출되는 함수입니다. 진행중 에러가 발생되는 경우는 다음과 같습니다.

  1. 부트페이 관리자에서 활성화 하지 않은 PG, 결제수단을 사용하고자 할 때
  2. PG에서 보내온 결제 정보를 부트페이 관리자에 잘못 입력하거나 입력하지 않은 경우
  3. 결제 진행 도중 한도초과, 카드정지, 휴대폰소액결제 막힘, 계좌이체 불가 등의 사유로 결제가 안되는 경우
  4. PG에서 리턴된 값이 다른 Client에 의해 변조된 경우

에러가 난 경우 해당 함수를 통해 관련 에러 메세지를 사용자에게 보여줄 수 있습니다.

data 포맷은 아래와 같습니다.

{
action: "BootpayError",
message: "카드사 거절",
receipt_id: "5fffab350c20b903e88a2cff"
}

onCancel 함수

결제 진행 중 사용자가 PG 결제창에서 취소 혹은 닫기 버튼을 눌러 나온 경우 입니다. ****

data 포맷은 아래와 같습니다.

{
action: "BootpayCancel",
message: "사용자가 결제를 취소하였습니다.",
receipt_id: "5fffab350c20b903e88a2cff"
}

onIssued 함수

가상계좌 발급이 완료되면 호출되는 함수입니다(가상계좌를 위한 Done). 가상계좌는 다른 결제와 다르게 입금할 계좌 번호 발급 이후 입금 후에 Feedback URL을 통해 통지가 됩니다. 발급된 가상계좌 정보를 issued 함수를 통해 확인하실 수 있습니다.

data 포맷은 아래와 같습니다.

{
account: "T0309260001169"
accounthodler: "한국사이버결제"
action: "BootpayBankReady"
bankcode: "BK03"
bankname: "기업은행"
expiredate: "2021-01-17 00:00:00"
item_name: "테스트 아이템"
method: "vbank"
method_name: "가상계좌"
order_id: "1610591554856"
metadata: null
payment_group: "vbank"
payment_group_name: "가상계좌"
payment_name: "가상계좌"
pg: "kcp"
pg_name: "KCP"
price: 3000
purchased_at: null
ready_url: "https://dev-app.bootpay.co.kr/bank/7o044QyX7p"
receipt_id: "5fffad430c20b903e88a2d17"
requested_at: "2021-01-14 11:32:35"
status: 2
tax_free: 0
url: "https://d-cdn.bootapi.com"
username: "홍길동"
}

onConfirm 함수

결제 승인이 되기 전 호출되는 함수입니다. 승인 이전 관련 로직을 서버 혹은 클라이언트에서 수행 후 결제를 승인해도 될 경우BootPay.transactionConfirm(data); 또는 return true;

코드를 실행해주시면 PG에서 결제 승인이 진행이 됩니다.

* 페이앱, 페이레터 PG는 이 함수가 실행되지 않고 바로 결제가 승인되는 PG 입니다. 참고해주시기 바랍니다.

data 포맷은 아래와 같습니다.

{
receipt_id: "5fffc0460c20b903e88a2d2c",
action: "BootpayConfirm"
}

onDone 함수

PG에서 거래 승인 이후에 호출 되는 함수입니다. 결제 완료 후 다음 결제 결과를 호출 할 수 있는 함수 입니다.

이 함수가 호출 된 후 반드시 REST API를 통해 결제검증을 수행해야합니다. data 포맷은 아래와 같습니다.

{
action: "BootpayDone"
card_code: "CCKM",
card_name: "KB국민카드",
card_no: "0000120000000014",
card_quota: "00",
item_name: "테스트 아이템",
method: "card",
method_name: "카드결제",
order_id: "1610596422328",
payment_group: "card",
payment_group_name: "신용카드",
payment_name: "카드결제",
pg: "kcp",
pg_name: "KCP",
price: 100,
purchased_at: "2021-01-14 12:54:53",
receipt_id: "5fffc0460c20b903e88a2d2c",
receipt_url: "https://app.bootpay.co.kr/bill/UFMvZzJqSWNDNU9ERWh1YmUycU9hdnBkV29DVlJqdzUxRzZyNXRXbkNVZW81%0AQT09LS1XYlNJN1VoMDI4Q1hRdDh1LS10MEtZVmE4c1dyWHNHTXpZTVVLUk1R%0APT0%3D%0A",
requested_at: "2021-01-14 12:53:42",
status: 1,
tax_free: 0,
url: "https://d-cdn.bootapi.com"
}

Documentation

부트페이 개발매뉴얼을 참조해주세요

기술문의

채팅으로 문의

License

MIT License.

About

bootpay android libary 입니다

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bootpay Android

부트페이에서 지원하는 공식 Android 라이브러리 입니다

  • Android SDK 16부터 사용 가능합니다.

Gradle을 통한 설치

build.gradle (module)

android {
compileSdk 34//Android 11 지원을 위한 30 이상 버전을 추천 
defaultConfig {
...
minSdk 16//16 이상 버전 이상부터 지원 
targetSdk 34//Android 11 지원을 위한 30 이상 버전을 추천 
}
}
dependencies {
...
implementation 'io.github.bootpay:android:+'//최신 버전 추천, + 는 항상 최신 버전을 의미합니다. 
}

AndroidManifest.xml 수정

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

실행시 Webpage not available. net:ERR_CLEARTEXT_NOT_PERMITTED 에러가 나온 경우

Android 네트워크 보안 구성에 따르면 안드로이드 9(API28)부터 cleartext traffic을 기본적으로를 비활성화한다고 합니다. 따라서 API 28 이후에서 Http에 접근하려면 cleartext traffic을 활성화 시켜야 합니다.

<application
android:label="@string/app_name"
...
android:usesCleartextTraffic="true">

위젯 설정

부트페이 관리자에서 위젯을 생성하셔야만 사용이 가능합니다.

위젯 렌더링

privateFrameLayoutwebViewContainer; //위젯을 담을 레이아웃@OverrideprotectedvoidonCreate(@NullableBundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_widget); webViewContainer = findViewById(R.id.webViewContainer);
initPayload();
bindWidgetView();
renderWidget();
}
voidinitPayload() {
BootExtraextra = newBootExtra();
extra.setDisplaySuccessResult(true);
payload.setClientKey("YOUR_CLIENT_KEY")
.setOrderName("부트페이 결제테스트")
.setWidgetSandbox(true)
.setWidgetKey("default-widget")
.setWidgetUseTerms(true)
.setOrderId("1234")
.setUserToken("6667b08b04ab6d03f274d32e")
.setPrice(1000d)
.setExtra(extra);
}
//위젯을 webViewContainer에 바인딩 합니다. privatevoidbindWidgetView() {
BootpayWidget.bindViewUpdate(this, getSupportFragmentManager(), webViewContainer);
}
doublemWidgetHeight = 300.0;
//위젯을 렌더링 합니다 voidrenderWidget() {
if(BootpayWidget.getView(this, getSupportFragmentManager()).getUrl() == null) {
BootpayWidget.renderWidget(this, payload, newBootpayWidgetEventListener() {
@OverridepublicvoidonWidgetResize(doubleheight) {
//위젯 사이즈 변경 이벤트 Log.d("bootpay", "onWidgetResize: " + height);
mWidgetHeight = height;
}
@OverridepublicvoidonWidgetReady() {
//위젯이 렌더링되면 호출되는 이벤트Log.d("bootpay", "onWidgetReady: ");
}
@OverridepublicvoidonWidgetChangePayment(WidgetDatadata) {
Log.d("bootpay", "onWidgetChangePayment: " + data);
payload.mergeWidgetData(data);
updatePaymentButtonState();
}
@OverridepublicvoidonWidgetChangeAgreeTerm(WidgetDatadata) {
Log.d("bootpay", "onWidgetChangeAgreeTerm: " + data);
payload.mergeWidgetData(data);
updatePaymentButtonState();
}
@OverridepublicvoidneedReloadWidget() {
Log.d("bootpay", "needReloadWidget ");
widgetStatusReset();
}
});
}
}

위젯으로 결제 요청하기

이 방법은 위젯을 사용하여 결제하는 방법입니다. 위젯을 사용하지 않고 결제를 요청하는 방법은 별도로 제공합니다.

publicvoidgoPayment(Viewv) {
BootpayWidget.requestPayment(
this,
getSupportFragmentManager(),
payload,
newBootpayEventListener() {
@OverridepublicvoidonCancel(Stringdata) {
Log.d("bootpay", "cancel: " + data);
}
@OverridepublicvoidonError(Stringdata) {
Log.d("bootpay", "error: " + data);
}
@OverridepublicvoidonClose() {
Log.d("bootpay", "close");
BootpayWidget.removePaymentWindow();
bindWidgetView();
}
@OverridepublicvoidonIssued(Stringdata) {
Log.d("bootpay", "issued: " + data);
}
@OverridepublicbooleanonConfirm(Stringdata) {
Log.d("bootpay", "confirm: " + data);
returntrue;
}
@OverridepublicvoidonDone(Stringdata) {
Log.d("bootpay", "done: " + data);
}
});
}

결제 요청하기

이 방법은 위젯을 사용하지 않고 결제를 요청하는 방법입니다.

publicvoidPaymentTest(Viewv) {
BootUseruser = newBootUser().setPhone("010-1234-5678"); // 구매자 정보BootExtraextra = newBootExtra()
.setCardQuota("0"); // 일시불, 2개월, 3개월 할부 허용, 할부는 최대 12개월까지 사용됨 (5만원 이상 구매시 할부허용 범위)List<BootItem> items = newArrayList<>();
BootItemitem1 = newBootItem().setName("마우's 스").setId("ITEM_CODE_MOUSE").setQty(1).setPrice(500d);
BootItemitem2 = newBootItem().setName("키보드").setId("ITEM_KEYBOARD_MOUSE").setQty(1).setPrice(500d);
items.add(item1);
items.add(item2);
Payloadpayload = newPayload();
payload.setClientKey(BootpayConstants.client_key)
.setOrderName("부트페이 결제테스트")
.setPg("페이앱")
.setMethod("네이버페이")
.setOrderId("1234")
.setPrice(1000d)
.setUser(user)
.setExtra(extra)
.setItems(items);
Map<String, Object> map = newHashMap<>();
map.put("1", "abcdef");
map.put("2", "abcdef55");
map.put("3", 1234);
payload.setMetadata(map);
// payload.setMetadata(new Gson().toJson(map));Bootpay.init(getSupportFragmentManager())
.setPayload(payload)
.setEventListener(newBootpayEventListener() {
@OverridepublicvoidonCancel(Stringdata) {
Log.d("bootpay", "cancel: " + data);
}
@OverridepublicvoidonError(Stringdata) {
Log.d("bootpay", "error: " + data);
}
@OverridepublicvoidonClose() {
Log.d("bootpay", "close");
// Bootpay.removePaymentWindow();Bootpay.dismiss();
}
@OverridepublicvoidonIssued(Stringdata) {
Log.d("bootpay", "issued: " +data);
}
@OverridepublicbooleanonConfirm(Stringdata) {
if(checkClientValidation(data)) {
// Bootpay().transactionConfirm() // 승인 요청(방법 1), 이때는 return false로 해야함returntrue; //승인 요청(방법 2), return true시 내부적으로 승인을 요청함
} else {
Bootpay.dismiss(); // 결제창 닫기returnfalse; //승인하지 않음
}
}
@OverridepublicvoidonDone(Stringdata) {
Log.d("done", data);
}
}).requestPayment();
}

자동결제 - 빌링키 발급 요청하기

Payloadpayload = newPayload();
payload.setClientKey(client_key)
.setOrderName("부트페이 결제테스트")
.setPg("나이스페이")
.setMethod("카드자동")
.setSubscriptionId("1234") //정기결제용 orderId
.setMethod(method)
// .setPrice(price) 가격이 0원 이상일 경우 빌링키 발급 후 결제가 진행됩니다.
.setUser(user)
.setExtra(extra)
.setItems(items);
Bootpay.init(getSupportFragmentManager(), getApplicationContext())
.setPayload(payload)
.requestSubscription(); //정기결제 실행함수 

본인인증 요청하기

Payloadpayload = newPayload();
payload.setClientKey(client_key)
.setOrderName("부트페이 결제테스트")
.setPg("다날")
.setMethod("본인인증")
.setAuthenticationId("1234") //본인인증용 orderId
.setMethod(method)
.setPrice(price)
.setUser(user)
.setExtra(extra)
.setItems(items);
Bootpay.init(getSupportFragmentManager(), getApplicationContext())
.setPayload(payload)
.requestAuthentication(); //본인인증 실행함수

Bootpay Event Listener

결제 진행 상태에 따라 이벤트 함수가 실행됩니다. 각 이벤트에 대한 상세 설명은 아래를 참고하세요.

onError 함수

결제 진행 중 오류가 발생된 경우 호출되는 함수입니다. 진행중 에러가 발생되는 경우는 다음과 같습니다.

  1. 부트페이 관리자에서 활성화 하지 않은 PG, 결제수단을 사용하고자 할 때
  2. PG에서 보내온 결제 정보를 부트페이 관리자에 잘못 입력하거나 입력하지 않은 경우
  3. 결제 진행 도중 한도초과, 카드정지, 휴대폰소액결제 막힘, 계좌이체 불가 등의 사유로 결제가 안되는 경우
  4. PG에서 리턴된 값이 다른 Client에 의해 변조된 경우

에러가 난 경우 해당 함수를 통해 관련 에러 메세지를 사용자에게 보여줄 수 있습니다.

data 포맷은 아래와 같습니다.

{
action: "BootpayError",
message: "카드사 거절",
receipt_id: "5fffab350c20b903e88a2cff"
}

onCancel 함수

결제 진행 중 사용자가 PG 결제창에서 취소 혹은 닫기 버튼을 눌러 나온 경우 입니다. ****

data 포맷은 아래와 같습니다.

{
action: "BootpayCancel",
message: "사용자가 결제를 취소하였습니다.",
receipt_id: "5fffab350c20b903e88a2cff"
}

onIssued 함수

가상계좌 발급이 완료되면 호출되는 함수입니다(가상계좌를 위한 Done). 가상계좌는 다른 결제와 다르게 입금할 계좌 번호 발급 이후 입금 후에 Feedback URL을 통해 통지가 됩니다. 발급된 가상계좌 정보를 issued 함수를 통해 확인하실 수 있습니다.

data 포맷은 아래와 같습니다.

{
account: "T0309260001169"
accounthodler: "한국사이버결제"
action: "BootpayBankReady"
bankcode: "BK03"
bankname: "기업은행"
expiredate: "2021-01-17 00:00:00"
item_name: "테스트 아이템"
method: "vbank"
method_name: "가상계좌"
order_id: "1610591554856"
metadata: null
payment_group: "vbank"
payment_group_name: "가상계좌"
payment_name: "가상계좌"
pg: "kcp"
pg_name: "KCP"
price: 3000
purchased_at: null
ready_url: "https://dev-app.bootpay.co.kr/bank/7o044QyX7p"
receipt_id: "5fffad430c20b903e88a2d17"
requested_at: "2021-01-14 11:32:35"
status: 2
tax_free: 0
url: "https://d-cdn.bootapi.com"
username: "홍길동"
}

onConfirm 함수

결제 승인이 되기 전 호출되는 함수입니다. 승인 이전 관련 로직을 서버 혹은 클라이언트에서 수행 후 결제를 승인해도 될 경우BootPay.transactionConfirm(data); 또는 return true;

코드를 실행해주시면 PG에서 결제 승인이 진행이 됩니다.

* 페이앱, 페이레터 PG는 이 함수가 실행되지 않고 바로 결제가 승인되는 PG 입니다. 참고해주시기 바랍니다.

data 포맷은 아래와 같습니다.

{
receipt_id: "5fffc0460c20b903e88a2d2c",
action: "BootpayConfirm"
}

onDone 함수

PG에서 거래 승인 이후에 호출 되는 함수입니다. 결제 완료 후 다음 결제 결과를 호출 할 수 있는 함수 입니다.

이 함수가 호출 된 후 반드시 REST API를 통해 결제검증을 수행해야합니다. data 포맷은 아래와 같습니다.

{
action: "BootpayDone"
card_code: "CCKM",
card_name: "KB국민카드",
card_no: "0000120000000014",
card_quota: "00",
item_name: "테스트 아이템",
method: "card",
method_name: "카드결제",
order_id: "1610596422328",
payment_group: "card",
payment_group_name: "신용카드",
payment_name: "카드결제",
pg: "kcp",
pg_name: "KCP",
price: 100,
purchased_at: "2021-01-14 12:54:53",
receipt_id: "5fffc0460c20b903e88a2d2c",
receipt_url: "https://app.bootpay.co.kr/bill/UFMvZzJqSWNDNU9ERWh1YmUycU9hdnBkV29DVlJqdzUxRzZyNXRXbkNVZW81%0AQT09LS1XYlNJN1VoMDI4Q1hRdDh1LS10MEtZVmE4c1dyWHNHTXpZTVVLUk1R%0APT0%3D%0A",
requested_at: "2021-01-14 12:53:42",
status: 1,
tax_free: 0,
url: "https://d-cdn.bootapi.com"
}

Documentation

부트페이 개발매뉴얼을 참조해주세요

기술문의

채팅으로 문의

License

MIT License.

About

bootpay android libary 입니다

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Bootpay Android

부트페이에서 지원하는 공식 Android 라이브러리 입니다

  • Android SDK 16부터 사용 가능합니다.

Gradle을 통한 설치

build.gradle (module)

android {
compileSdk 34//Android 11 지원을 위한 30 이상 버전을 추천 
defaultConfig {
...
minSdk 16//16 이상 버전 이상부터 지원 
targetSdk 34//Android 11 지원을 위한 30 이상 버전을 추천 
}
}
dependencies {
...
implementation 'io.github.bootpay:android:+'//최신 버전 추천, + 는 항상 최신 버전을 의미합니다. 
}

AndroidManifest.xml 수정

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

실행시 Webpage not available. net:ERR_CLEARTEXT_NOT_PERMITTED 에러가 나온 경우

Android 네트워크 보안 구성에 따르면 안드로이드 9(API28)부터 cleartext traffic을 기본적으로를 비활성화한다고 합니다. 따라서 API 28 이후에서 Http에 접근하려면 cleartext traffic을 활성화 시켜야 합니다.

<application
android:label="@string/app_name"
...
android:usesCleartextTraffic="true">

위젯 설정

부트페이 관리자에서 위젯을 생성하셔야만 사용이 가능합니다.

위젯 렌더링

privateFrameLayoutwebViewContainer; //위젯을 담을 레이아웃@OverrideprotectedvoidonCreate(@NullableBundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_widget); webViewContainer = findViewById(R.id.webViewContainer);
initPayload();
bindWidgetView();
renderWidget();
}
voidinitPayload() {
BootExtraextra = newBootExtra();
extra.setDisplaySuccessResult(true);
payload.setClientKey("YOUR_CLIENT_KEY")
.setOrderName("부트페이 결제테스트")
.setWidgetSandbox(true)
.setWidgetKey("default-widget")
.setWidgetUseTerms(true)
.setOrderId("1234")
.setUserToken("6667b08b04ab6d03f274d32e")
.setPrice(1000d)
.setExtra(extra);
}
//위젯을 webViewContainer에 바인딩 합니다. privatevoidbindWidgetView() {
BootpayWidget.bindViewUpdate(this, getSupportFragmentManager(), webViewContainer);
}
doublemWidgetHeight = 300.0;
//위젯을 렌더링 합니다 voidrenderWidget() {
if(BootpayWidget.getView(this, getSupportFragmentManager()).getUrl() == null) {
BootpayWidget.renderWidget(this, payload, newBootpayWidgetEventListener() {
@OverridepublicvoidonWidgetResize(doubleheight) {
//위젯 사이즈 변경 이벤트 Log.d("bootpay", "onWidgetResize: " + height);
mWidgetHeight = height;
}
@OverridepublicvoidonWidgetReady() {
//위젯이 렌더링되면 호출되는 이벤트Log.d("bootpay", "onWidgetReady: ");
}
@OverridepublicvoidonWidgetChangePayment(WidgetDatadata) {
Log.d("bootpay", "onWidgetChangePayment: " + data);
payload.mergeWidgetData(data);
updatePaymentButtonState();
}
@OverridepublicvoidonWidgetChangeAgreeTerm(WidgetDatadata) {
Log.d("bootpay", "onWidgetChangeAgreeTerm: " + data);
payload.mergeWidgetData(data);
updatePaymentButtonState();
}
@OverridepublicvoidneedReloadWidget() {
Log.d("bootpay", "needReloadWidget ");
widgetStatusReset();
}
});
}
}

위젯으로 결제 요청하기

이 방법은 위젯을 사용하여 결제하는 방법입니다. 위젯을 사용하지 않고 결제를 요청하는 방법은 별도로 제공합니다.

publicvoidgoPayment(Viewv) {
BootpayWidget.requestPayment(
this,
getSupportFragmentManager(),
payload,
newBootpayEventListener() {
@OverridepublicvoidonCancel(Stringdata) {
Log.d("bootpay", "cancel: " + data);
}
@OverridepublicvoidonError(Stringdata) {
Log.d("bootpay", "error: " + data);
}
@OverridepublicvoidonClose() {
Log.d("bootpay", "close");
BootpayWidget.removePaymentWindow();
bindWidgetView();
}
@OverridepublicvoidonIssued(Stringdata) {
Log.d("bootpay", "issued: " + data);
}
@OverridepublicbooleanonConfirm(Stringdata) {
Log.d("bootpay", "confirm: " + data);
returntrue;
}
@OverridepublicvoidonDone(Stringdata) {
Log.d("bootpay", "done: " + data);
}
});
}

결제 요청하기

이 방법은 위젯을 사용하지 않고 결제를 요청하는 방법입니다.

publicvoidPaymentTest(Viewv) {
BootUseruser = newBootUser().setPhone("010-1234-5678"); // 구매자 정보BootExtraextra = newBootExtra()
.setCardQuota("0"); // 일시불, 2개월, 3개월 할부 허용, 할부는 최대 12개월까지 사용됨 (5만원 이상 구매시 할부허용 범위)List<BootItem> items = newArrayList<>();
BootItemitem1 = newBootItem().setName("마우's 스").setId("ITEM_CODE_MOUSE").setQty(1).setPrice(500d);
BootItemitem2 = newBootItem().setName("키보드").setId("ITEM_KEYBOARD_MOUSE").setQty(1).setPrice(500d);
items.add(item1);
items.add(item2);
Payloadpayload = newPayload();
payload.setClientKey(BootpayConstants.client_key)
.setOrderName("부트페이 결제테스트")
.setPg("페이앱")
.setMethod("네이버페이")
.setOrderId("1234")
.setPrice(1000d)
.setUser(user)
.setExtra(extra)
.setItems(items);
Map<String, Object> map = newHashMap<>();
map.put("1", "abcdef");
map.put("2", "abcdef55");
map.put("3", 1234);
payload.setMetadata(map);
// payload.setMetadata(new Gson().toJson(map));Bootpay.init(getSupportFragmentManager())
.setPayload(payload)
.setEventListener(newBootpayEventListener() {
@OverridepublicvoidonCancel(Stringdata) {
Log.d("bootpay", "cancel: " + data);
}
@OverridepublicvoidonError(Stringdata) {
Log.d("bootpay", "error: " + data);
}
@OverridepublicvoidonClose() {
Log.d("bootpay", "close");
// Bootpay.removePaymentWindow();Bootpay.dismiss();
}
@OverridepublicvoidonIssued(Stringdata) {
Log.d("bootpay", "issued: " +data);
}
@OverridepublicbooleanonConfirm(Stringdata) {
if(checkClientValidation(data)) {
// Bootpay().transactionConfirm() // 승인 요청(방법 1), 이때는 return false로 해야함returntrue; //승인 요청(방법 2), return true시 내부적으로 승인을 요청함
} else {
Bootpay.dismiss(); // 결제창 닫기returnfalse; //승인하지 않음
}
}
@OverridepublicvoidonDone(Stringdata) {
Log.d("done", data);
}
}).requestPayment();
}

자동결제 - 빌링키 발급 요청하기

Payloadpayload = newPayload();
payload.setClientKey(client_key)
.setOrderName("부트페이 결제테스트")
.setPg("나이스페이")
.setMethod("카드자동")
.setSubscriptionId("1234") //정기결제용 orderId
.setMethod(method)
// .setPrice(price) 가격이 0원 이상일 경우 빌링키 발급 후 결제가 진행됩니다.
.setUser(user)
.setExtra(extra)
.setItems(items);
Bootpay.init(getSupportFragmentManager(), getApplicationContext())
.setPayload(payload)
.requestSubscription(); //정기결제 실행함수 

본인인증 요청하기

Payloadpayload = newPayload();
payload.setClientKey(client_key)
.setOrderName("부트페이 결제테스트")
.setPg("다날")
.setMethod("본인인증")
.setAuthenticationId("1234") //본인인증용 orderId
.setMethod(method)
.setPrice(price)
.setUser(user)
.setExtra(extra)
.setItems(items);
Bootpay.init(getSupportFragmentManager(), getApplicationContext())
.setPayload(payload)
.requestAuthentication(); //본인인증 실행함수

Bootpay Event Listener

결제 진행 상태에 따라 이벤트 함수가 실행됩니다. 각 이벤트에 대한 상세 설명은 아래를 참고하세요.

onError 함수

결제 진행 중 오류가 발생된 경우 호출되는 함수입니다. 진행중 에러가 발생되는 경우는 다음과 같습니다.

  1. 부트페이 관리자에서 활성화 하지 않은 PG, 결제수단을 사용하고자 할 때
  2. PG에서 보내온 결제 정보를 부트페이 관리자에 잘못 입력하거나 입력하지 않은 경우
  3. 결제 진행 도중 한도초과, 카드정지, 휴대폰소액결제 막힘, 계좌이체 불가 등의 사유로 결제가 안되는 경우
  4. PG에서 리턴된 값이 다른 Client에 의해 변조된 경우

에러가 난 경우 해당 함수를 통해 관련 에러 메세지를 사용자에게 보여줄 수 있습니다.

data 포맷은 아래와 같습니다.

{
action: "BootpayError",
message: "카드사 거절",
receipt_id: "5fffab350c20b903e88a2cff"
}

onCancel 함수

결제 진행 중 사용자가 PG 결제창에서 취소 혹은 닫기 버튼을 눌러 나온 경우 입니다. ****

data 포맷은 아래와 같습니다.

{
action: "BootpayCancel",
message: "사용자가 결제를 취소하였습니다.",
receipt_id: "5fffab350c20b903e88a2cff"
}

onIssued 함수

가상계좌 발급이 완료되면 호출되는 함수입니다(가상계좌를 위한 Done). 가상계좌는 다른 결제와 다르게 입금할 계좌 번호 발급 이후 입금 후에 Feedback URL을 통해 통지가 됩니다. 발급된 가상계좌 정보를 issued 함수를 통해 확인하실 수 있습니다.

data 포맷은 아래와 같습니다.

{
account: "T0309260001169"
accounthodler: "한국사이버결제"
action: "BootpayBankReady"
bankcode: "BK03"
bankname: "기업은행"
expiredate: "2021-01-17 00:00:00"
item_name: "테스트 아이템"
method: "vbank"
method_name: "가상계좌"
order_id: "1610591554856"
metadata: null
payment_group: "vbank"
payment_group_name: "가상계좌"
payment_name: "가상계좌"
pg: "kcp"
pg_name: "KCP"
price: 3000
purchased_at: null
ready_url: "https://dev-app.bootpay.co.kr/bank/7o044QyX7p"
receipt_id: "5fffad430c20b903e88a2d17"
requested_at: "2021-01-14 11:32:35"
status: 2
tax_free: 0
url: "https://d-cdn.bootapi.com"
username: "홍길동"
}

onConfirm 함수

결제 승인이 되기 전 호출되는 함수입니다. 승인 이전 관련 로직을 서버 혹은 클라이언트에서 수행 후 결제를 승인해도 될 경우BootPay.transactionConfirm(data); 또는 return true;

코드를 실행해주시면 PG에서 결제 승인이 진행이 됩니다.

* 페이앱, 페이레터 PG는 이 함수가 실행되지 않고 바로 결제가 승인되는 PG 입니다. 참고해주시기 바랍니다.

data 포맷은 아래와 같습니다.

{
receipt_id: "5fffc0460c20b903e88a2d2c",
action: "BootpayConfirm"
}

onDone 함수

PG에서 거래 승인 이후에 호출 되는 함수입니다. 결제 완료 후 다음 결제 결과를 호출 할 수 있는 함수 입니다.

이 함수가 호출 된 후 반드시 REST API를 통해 결제검증을 수행해야합니다. data 포맷은 아래와 같습니다.

{
action: "BootpayDone"
card_code: "CCKM",
card_name: "KB국민카드",
card_no: "0000120000000014",
card_quota: "00",
item_name: "테스트 아이템",
method: "card",
method_name: "카드결제",
order_id: "1610596422328",
payment_group: "card",
payment_group_name: "신용카드",
payment_name: "카드결제",
pg: "kcp",
pg_name: "KCP",
price: 100,
purchased_at: "2021-01-14 12:54:53",
receipt_id: "5fffc0460c20b903e88a2d2c",
receipt_url: "https://app.bootpay.co.kr/bill/UFMvZzJqSWNDNU9ERWh1YmUycU9hdnBkV29DVlJqdzUxRzZyNXRXbkNVZW81%0AQT09LS1XYlNJN1VoMDI4Q1hRdDh1LS10MEtZVmE4c1dyWHNHTXpZTVVLUk1R%0APT0%3D%0A",
requested_at: "2021-01-14 12:53:42",
status: 1,
tax_free: 0,
url: "https://d-cdn.bootapi.com"
}

Documentation

부트페이 개발매뉴얼을 참조해주세요

기술문의

채팅으로 문의

License

MIT License.

About

bootpay android libary 입니다

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages