๋ถํธํ์ด ๊ณต์ ์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋๋ค (์๋ฒ์ฌ์ด๋ ์ฉ)
- PG ๊ฒฐ์ ์ฐฝ ์ฐ๋์ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ํ๋ฉ๋๋ค. (Javascript, Android, iOS, React Native, Flutter ๋ฑ)
- ๊ฒฐ์ ๊ฒ์ฆ ๋ฐ ์ทจ์, ๋น๋งํค ๋ฐ๊ธ, ๋ณธ์ธ์ธ์ฆ ๋ฑ์ ์ํ์ ์๋ฒ์ฌ์ด๋์์ ์งํ๋ฉ๋๋ค. (Java, PHP, Python, Ruby, Node.js, Go, ASP.NET ๋ฑ)
-
(๋ถํธํ์ด ํต์ ์ ์ํ) ํ ํฐ ๋ฐ๊ธ ์์ฒญ
-
๊ฒฐ์ ๊ฒ์ฆ
-
๊ฒฐ์ ์ทจ์ (์ ์ก ์ทจ์ / ๋ถ๋ถ ์ทจ์)
-
๋น๋งํค ๋ฐ๊ธ
4-1. ๋ฐ๊ธ๋ ๋น๋งํค๋ก ๊ฒฐ์ ์น์ธ ์์ฒญ
4-2. ๋ฐ๊ธ๋ ๋น๋งํค๋ก ๊ฒฐ์ ์น์ธ ์์ฝ ์์ฒญ
4-2-1. ๋ฐ๊ธ๋ ๋น๋งํค๋ก ๊ฒฐ์ ์น์ธ ์์ฝ - ์ทจ์ ์์ฒญ
4-3. ๋น๋งํค ์ญ์
-
(๋ถํธํ์ด ๋จ๋ ) ์ฌ์ฉ์ ํ ํฐ ๋ฐ๊ธ
-
(๋ถํธํ์ด ๋จ๋ ) ๊ฒฐ์ ๋งํฌ ์์ฑ
-
์๋ฒ ์น์ธ ์์ฒญ
-
๋ณธ์ธ ์ธ์ฆ ๊ฒฐ๊ณผ ์กฐํ
build.gradle (project)
repositories {
maven { url 'https://jitpack.io' }
mavenCentral()
}
dependencies {
implementation 'com.github.bootpay:backend-java:+'
}
BootpayExample.java
import com.google.gson.Gson;
import kr.co.bootpay.Bootpay;
import kr.co.bootpay.model.BankCode;
import kr.co.bootpay.model.request.*;
import kr.co.bootpay.model.response.ResDefault;
import kr.co.bootpay.model.response.data.*;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpResponse;
import java.util.HashMap;
public class BootpayExample {
static Bootpay bootpay;
public static void main(String[] args) {
bootpay = new Bootpay("5b8f6a4d396fa665fdc2b5ea", "rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw=");
goGetToken();
}
public static void goGetToken() {
try {
ResDefault<HashMap<String, Object>> res = bootpay.getAccessToken();
System.out.println(res.toJson());
} catch (Exception e) {
e.printStackTrace();
}
}
}
ํจ์ ๋จ์์ ์ํ ์ฝ๋๋ ์ด๊ณณ์ ์ฐธ์กฐํ์ธ์.
๋ถํธํ์ด์ ์๋ฒ๊ฐ ํต์ ์ ํ๊ธฐ ์ํด์๋ ๋ถํธํ์ด ์๋ฒ๋ก๋ถํฐ ํ ํฐ์ ๋ฐ๊ธ๋ฐ์์ผ ํฉ๋๋ค.
๋ฐ๊ธ๋ ํ ํฐ์ 30๋ถ๊ฐ ์ ํจํ๋ฉฐ, ์ต์ด ๋ฐ๊ธ์ผ๋ก๋ถํฐ 30๋ถ์ด ์ง๋ ๊ฒฝ์ฐ ํ ํฐ ๋ฐ๊ธ ํจ์๋ฅผ ์ฌํธ์ถ ํด์ฃผ์
์ผ ํฉ๋๋ค.
Bootpay bootpay = new Bootpay("5b8f6a4d396fa665fdc2b5ea", "rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw=");
try {
ResDefault<HashMap<String, Object>> res = bootpay.getAccessToken();
System.out.println(res.toJson());
} catch (Exception e) {
e.printStackTrace();
}
๊ฒฐ์ ์ฐฝ ๋ฐ ์ ๊ธฐ๊ฒฐ์ ์์ ์น์ธ/์ทจ์๋ ๊ฒฐ์ ๊ฑด์ ๋ํ์ฌ ์ฌ๋ฐ๋ฅธ ๊ฒฐ์ ๊ฑด์ธ์ง ์๋ฒ๊ฐ ํต์ ์ผ๋ก ๊ฒฐ์ ๊ฒ์ฆ์ ํฉ๋๋ค.
Bootpay bootpay = new Bootpay("5b8f6a4d396fa665fdc2b5ea", "rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw=");
try {
ResDefault<HashMap<String, Object>> res = bootpay.verify("6100e8e7019943003850f9b0");
System.out.println(res.toJson());
} catch (Exception e) {
e.printStackTrace();
}
price๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ์ ์ก์ทจ์ ๋ฉ๋๋ค.
- ํด๋ํฐ ๊ฒฐ์ ์ ๊ฒฝ์ฐ ์ด์๋ ๊ฒฝ์ฐ ์ดํต์ฌ ์ ์ฑ ์ ์ทจ์๋์ง ์์ต๋๋ค
- ์ ์ฐ๋ฐ์ผ์ค ๊ธ์ก๋ณด๋ค ์ทจ์๊ธ์ก์ด ํด ๊ฒฝ์ฐ PG์ฌ ์ ์ฑ ์ ์ทจ์๋์ง ์์ ์ ์์ต๋๋ค. ์ด๋ PG์ฌ์ ๋ฌธ์ํ์๋ฉด ๋๊ฒ ์ต๋๋ค.
- ๊ฐ์๊ณ์ข์ ๊ฒฝ์ฐ CMS ํน์ฝ์ด ๋์ด์์ง ์์ผ๋ฉด ์ทจ์๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ฒฐ์ ํ ์คํธ์์๋ ๊ฐ์๊ณ์ข๋ก ํ ์คํธ ํ์ง ์๊ธธ ์ถ์ฒํฉ๋๋ค.
๋ถ๋ถ์ทจ๋ ์นด๋๋ก ๊ฒฐ์ ๋ ๊ฑด๋ง ๊ฐ๋ฅํ๋ฉฐ, ์ผ๋ถ PG์ฌ๋ง ์ง์ํฉ๋๋ค. ์์ฒญ์ price์ ๊ธ์ก์ ์ง์ ํ์๋ฉด ๋๊ฒ ์ต๋๋ค.
- (์ง์๊ฐ๋ฅ PG์ฌ: ์ด๋์์ค, kcp, ๋ค๋ , ํ์ด๋ ํฐ, ๋์ด์คํ์ด, ์นด์นด์คํ์ด, ํ์ด์ฝ)
๊ฐํน ๊ฐ๋ฐ์ฌ์์ ์ค์๋ก ์ฌ๋ฌ๋ฒ ๋ถ๋ถ์ทจ์๋ฅผ ๋ณด๋ด์ ์ฌ๋ฌ๋ฒ ์ทจ์๋๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๋๋ฌธ์, ๋ถํธํ์ด์์๋ ๋ถ๋ถ์ทจ์ ์ค๋ณต ์์ฒญ์ ๋ง๊ธฐ ์ํด cancel_id ๋ผ๋ ํ๋๋ฅผ ์ถ๊ฐํ์ต๋๋ค. cancel_id๋ฅผ ์ง์ ํ์๋ฉด, ํด๋น ๊ฑด์ ๋ํด ์ค๋ณต ์์ฒญ๋ฐฉ์ง๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
Bootpay bootpay = new Bootpay("5b8f6a4d396fa665fdc2b5ea", "rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw=");
Cancel cancel = new Cancel();
cancel.receiptId = "6100e77a019943003650f4d5";
cancel.name = "๊ด๋ฆฌ์";
cancel.reason = "ํ
์คํธ ๊ฒฐ์ ";
//cancel.price = 1000.0; //๋ถ๋ถ์ทจ์ ์์ฒญ์
//cancel.cancelId = "12342134"; //๋ถ๋ถ์ทจ์ ์์ฒญ์, ์ค๋ณต ๋ถ๋ถ์ทจ์ ์์ฒญํ๋ ์ค์๋ฅผ ๋ฐฉ์งํ๊ณ ์ ํ ๋ ์ง์
//RefundData refund = new RefundData(); // ๊ฐ์๊ณ์ข ํ๋ถ ์์ฒญ์, ๋จ CMS ํน์ฝ์ด ๋์ด์์ด์ผ๋ง ํ๋ถ์์ฒญ์ด ๊ฐ๋ฅํ๋ค.
//refund.account = "675601012341234"; //ํ๋ถ๊ณ์ข
//refund.accountholder = "ํ๊ธธ๋"; //ํ๋ถ๊ณ์ข์ฃผ
//refund.bankcode = BankCode.getCode("๊ตญ๋ฏผ์ํ");//์ํ์ฝ๋
//cancel.refund = refund;
try {
ResDefault<HashMap<String, Object>> res = bootpay.receiptCancel(cancel);
System.out.println(res.toJson());
} catch (Exception e) {
e.printStackTrace();
}
REST API ๋ฐฉ์์ผ๋ก ๊ณ ๊ฐ์ผ๋ก๋ถํฐ ์นด๋ ์ ๋ณด๋ฅผ ์ ๋ฌํ์ฌ, PG์ฌ์๊ฒ ๋น๋งํค๋ฅผ ๋ฐ๊ธ๋ฐ์ ์ ์์ต๋๋ค. ๋ฐ๊ธ๋ฐ์ ๋น๋งํค๋ฅผ ์ ์ฅํ๊ณ ์๋ค๊ฐ, ์ํ๋ ์์ , ์ํ๋ ๊ธ์ก์ ๊ฒฐ์ ์น์ธ ์์ฒญํ์ฌ ์ข ๋ ์์ ๋ก์ด ๊ฒฐ์ ์๋๋ฆฌ์ค์ ์ ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋น์ธ์ฆ ์ ๊ธฐ๊ฒฐ์ (REST API) ๋ฐฉ์์ ์ง์ํ๋ PG์ฌ๋ง ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
Bootpay bootpay = new Bootpay("5b8f6a4d396fa665fdc2b5ea", "rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw=");
Subscribe subscribe = new Subscribe();
subscribe.itemName = "์ ๊ธฐ๊ฒฐ์ ํ
์คํธ ์์ดํ
";
subscribe.orderId = "" + (System.currentTimeMillis() / 1000);
subscribe.pg = "nicepay";
subscribe.cardNo = "5570**********1074"; //์ค์ ํ
์คํธ์์๋ *** ๋ง์คํฌ์ฒ๋ฆฌ๊ฐ ์๋ ์ซ์์ฌ์ผ ํจ
subscribe.cardPw = "**"; //์ค์ ํ
์คํธ์์๋ *** ๋ง์คํฌ์ฒ๋ฆฌ๊ฐ ์๋ ์ซ์์ฌ์ผ ํจ
subscribe.expireYear = "**"; //์ค์ ํ
์คํธ์์๋ *** ๋ง์คํฌ์ฒ๋ฆฌ๊ฐ ์๋ ์ซ์์ฌ์ผ ํจ
subscribe.expireMonth = "**"; //์ค์ ํ
์คํธ์์๋ *** ๋ง์คํฌ์ฒ๋ฆฌ๊ฐ ์๋ ์ซ์์ฌ์ผ ํจ
subscribe.identifyNumber = ""; //์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ ๋๋ ์ฌ์
์ ๋ฑ๋ก๋ฒํธ (- ์์ด ์
๋ ฅ)
try {
ResDefault<HashMap<String, Object>> res = bootpay.getBillingKey(subscribe);
System.out.println(res.toJson());
} catch (Exception e) {
e.printStackTrace();
}
๋ฐ๊ธ๋ ๋น๋งํค๋ก ์ํ๋ ์์ ์ ์ํ๋ ๊ธ์ก์ผ๋ก ๊ฒฐ์ ์น์ธ ์์ฒญ์ ํ ์ ์์ต๋๋ค. ์์ก์ด ๋ถ์กฑํ๊ฑฐ๋ ๋๋ ์นด๋ ๋ฑ์ ํน๋ณํ ๊ฑด์ด ์๋๋ฉด PG์ฌ์์ ๊ฒฐ์ ๋ฅผ ๋ฐ๋ก ์น์ธํฉ๋๋ค.
Bootpay bootpay = new Bootpay("5b8f6a4d396fa665fdc2b5ea", "rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw=");
SubscribePayload payload = new SubscribePayload();
payload.billingKey = "6100e8c80d681b001dd4e0d7";
payload.itemName = "์์ดํ
01";
payload.price = 1000;
payload.orderId = "" + (System.currentTimeMillis() / 1000);
try {
ResDefault<HashMap<String, Object>> res = bootpay.requestSubscribe(payload);
System.out.println(res.toJson());
} catch (Exception e) {
e.printStackTrace();
}
์ํ๋ ์์ ์ 4-1๋ก ๊ฒฐ์ ์น์ธ ์์ฒญ์ ๋ณด๋ด๋ ๋์ง๋ง, ๋น๋งํค ๋ฐ๊ธ ์ดํ์ ๋ฐ๋ก ๊ฒฐ์ ์์ฝ ํ ์ ์์ต๋๋ค. (๋น๋งํค๋น ์ต๋ 5๊ฑด)
Bootpay bootpay = new Bootpay("5b8f6a4d396fa665fdc2b5ea", "rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw=");
SubscribePayload payload = new SubscribePayload();
payload.billingKey = "6100e77a0d681b002ad4e5d9";
payload.itemName = "์์ดํ
01";
payload.price = 1000;
payload.orderId = "" + (System.currentTimeMillis() / 1000);
payload.executeAt = (System.currentTimeMillis() / 1000) + 10000; // ๊ฒฐ์ ์น์ธ ์์
try {
ResDefault<HashMap<String, Object>> res = bootpay.reserveSubscribe(payload);
System.out.println(res.toJson());
} catch (Exception e) {
e.printStackTrace();
}
๋น๋งํค๋ก ์์ฝ๋ ๊ฒฐ์ ๊ฑด์ ์ทจ์ํฉ๋๋ค.
Bootpay bootpay = new Bootpay("5b8f6a4d396fa665fdc2b5ea", "rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw=");
String reserveId = "6100e892019943002150fef3";
try {
ResDefault res = bootpay.reserveCancelSubscribe(reserveId);
System.out.println(res.toJson());
} catch (Exception e) {
e.printStackTrace();
}
๋ฐ๊ธ๋ ๋น๋งํค๋ก ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋๋ก, ์ญ์ ์์ฒญํฉ๋๋ค.
Bootpay bootpay = new Bootpay("5b8f6a4d396fa665fdc2b5ea", "rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw=");
try {
ResDefault res = bootpay.destroyBillingKey("6100e7ea0d681b001fd4de69");
System.out.println(res.toJson());
} catch (Exception e) {
e.printStackTrace();
}
(๋ถํธํ์ด ๋จ๋ ) ๋ถํธํ์ด์์ ์ ๊ณตํ๋ ๊ฐํธ๊ฒฐ์ ์ฐฝ, ์์ฒด์ธ์ฆ ๊ธฐ๋ฐ์ ๊ฒฐ์ ์ฌ์ฉ์ ์ํด์๋ ๊ฐ๋ฐ์ฌ์์ ํ์ ๊ณ ์ ๋ฒํธ๋ฅผ ๊ด๋ฆฌํด์ผํ๋ฉฐ, ํด๋น ํ์์ ๋ํ ์ฌ์ฉ์ ํ ํฐ์ ๋ฐ๊ธํฉ๋๋ค. ์ด ํ ํฐ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ํด๋ผ์ด์ธํธ์์ ๊ฒฐ์ ์์ฒญ ํ์๋ฉด ๋๊ฒ ์ต๋๋ค.
Bootpay bootpay = new Bootpay("5b8f6a4d396fa665fdc2b5ea", "rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw=");
UserToken userToken = new UserToken();
userToken.userId = "1234"; // ๊ฐ๋ฐ์ฌ์์ ๊ด๋ฆฌํ๋ ํ์ ๊ณ ์ ๋ฒํธ
try {
ResDefault<HashMap<String, Object>> res = bootpay.getUserToken(userToken);
System.out.println(res.toJson());
} catch (Exception e) {
e.printStackTrace();
}
(๋ถํธํ์ด ๋จ๋ ) ์์ฒญ ํ์๋ฉด ๊ฒฐ์ ๋งํฌ๊ฐ ๋ฆฌํด๋๋ฉฐ, ํด๋น url์ ๊ณ ๊ฐ์๊ฒ ์๋ด, ๊ฒฐ์ ์ ๋ํ์ฌ ๊ฒฐ์ ๋ฅผ ์งํํ ์ ์์ต๋๋ค.
Bootpay bootpay = new Bootpay("5b8f6a4d396fa665fdc2b5ea", "rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw=");
Payload payload = new Payload();
payload.orderId = "1234";
payload.price = 1000;
payload.name = "ํ
์คํธ ๊ฒฐ์ ";
payload.pg = "nicepay";
try {
ResDefault res = bootpay.requestLink(payload);
System.out.println(res.toJson());
} catch (Exception e) {
e.printStackTrace();
}
๊ฒฐ์ ์น์ธ ๋ฐฉ์์ ํด๋ผ์ด์ธํธ ์น์ธ ๋ฐฉ์๊ณผ, ์๋ฒ ์น์ธ ๋ฐฉ์์ผ๋ก ์ด 2๊ฐ์ง๊ฐ ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ ์น์ธ ๋ฐฉ์์ javascript๋ native ๋ฑ์์ confirm ํจ์์์ ์งํํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค๋ง, ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์๋ฒ ์น์ธ ๋ฐฉ์์ด ํ์ํ ์ ์์ต๋๋ค.
ํ์ํ ์ด์
- 100% ์์ ์ ์ธ ๊ฒฐ์ ํ ๊ณ ๊ฐ ์๋ด๋ฅผ ์ํด - ํด๋ผ์ด์ธํธ์์ PG๊ฒฐ์ ์งํ ํ ์น์ธ ์๋ฃ๋ ๋ onDone์ด ์ํ๋์ง ์์ (์ธํฐ๋ท ํ๊ฒฝ ๋ฑ), ๊ฒฐ์ ์ดํ ๊ณ ๊ฐ์๊ฒ ์๋ดํ์ง ๋ชปํ ์ ์์ต๋๋ค
- ๋จ์ผ ํธ๋์ญ์ ์ ๊ฐ๋ ์ด ํ์ํ ๊ฒฝ์ฐ - ์ฌ๊ณ ํ์ ์ด ์ค์ํ ์ปค๋จธ์ค๋ฅผ ์ด์ํ ๊ฒฝ์ฐ ํธ๋์ญ์ ๊ฐ๋ ์ด ํ์ํ ์ ์๊ฒ ์ผ๋ฉฐ, ์ด๋ฅผ ์ํด์๋ ์๋ฒ ์น์ธ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
Bootpay bootpay = new Bootpay("5b8f6a4d396fa665fdc2b5ea", "rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw=");
String receiptId = "6100e8e7019943003850f9b0";
try {
ResDefault<HashMap<String, Object>> res = bootpay.submit(receiptId);
System.out.println(res.toJson());
} catch (Exception e) {
e.printStackTrace();
}
๋ค๋ ๋ณธ์ธ์ธ์ฆ ํ ๊ฒฐ๊ณผ๊ฐ์ ์กฐํํฉ๋๋ค. ๋ค๋ ๋ณธ์ธ์ธ์ฆ์์ ํต์ ์ฌ, ์ธ๊ตญ์ธ์ฌ๋ถ, ์ ํ๋ฒํธ ์ด 3๊ฐ์ง ์ ๋ณด๋ ๋ค๋ ์ ์ถ๊ฐ๋ก ์์ฒญํ์ ์ผ ๋ฐ์ผ์ค ์ ์์ต๋๋ค.
Bootpay bootpay = new Bootpay("5b8f6a4d396fa665fdc2b5ea", "rm6EYECr6aroQVG2ntW0A6LpWnkTgP4uQ3H18sDDUYw=");
String receiptId = "593f8febe13f332431a8ddae";
try {
ResDefault<HashMap<String, Object>> res = bootpay.certificate(receiptId);
System.out.println(res.toJson());
} catch (Exception e) {
e.printStackTrace();
}
์ ์ฉํ ์ํ ํ๋ก์ ํธ์ ์ฐธ์กฐํด์ฃผ์ธ์
๋ถํธํ์ด ๊ฐ๋ฐ๋งค๋ด์ผ์ ์ฐธ์กฐํด์ฃผ์ธ์
๋ถํธํ์ด ํํ์ด์ง ์ฐ์ธก ํ๋จ ์ฑํ ์ ํตํด ๊ธฐ์ ๋ฌธ์ ์ฃผ์ธ์!