Bootpay
Bootpay iOS
有关详细信息,请参阅Bootpay 开发集成文档。
当使用原生方式创建 iOS 应用时,请参考此页面。
PG 支付窗口默认使用 JavaScript 集成。Bootpay iOS SDK 内部使用 WebView 方式实现,使用方法如下。
从 iOS 10 版本开始,建议通过 LSApplicationQueriesSchemes 注册使用和希望使用的 URL scheme。但是,Bootpay 认为难以应对各个银行机构的 scheme 更改、新增和删除,因此在 custom URL scheme 请求时使用 WKWebView 进行应用内处理。如果您对代码感兴趣,可以参考此处。
CocoaPods 集成
pod 'Bootpay'
info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
...
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>kr.co.bootpaySample</string> // 사용하고자 하시는 앱의 bundle url name
<key>CFBundleURLSchemes</key>
<array>
<string>bootpaySample</string> // 사용하고자 하시는 앱의 bundle url scheme
</array>
</dict>
</array>
...
<key>NSFaceIDUsageDescription</key>
<string>생체인증 결제 진행시 권한이 필요합니다</string>
</dict>
</plist>
卡公司应用程序启动后无法返回到开发中的原应用程序的情况
在项目的 info.plist 设置中,请设置 CFBundleURLSchemes,以便 Bootpay SDK 读取该值,并将其填充到 extra.appScheme 中,以发送支付数据。
显示支付窗口的 iOS 代码
import UIKit
import Bootpay
class NativeController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
setUI()
}
func setUI() {
self.view.backgroundColor = .white
let btn = UIButton()
btn.setTitle("결제하기", for: .normal)
btn.addTarget(self, action: #selector(showBootpay), for: .touchUpInside)
btn.frame = CGRect(
x: self.view.frame.width/2 - 40,
y: self.view.frame.height/2 - 40,
width: 80,
height: 80
)
btn.setTitleColor(.darkGray, for: .normal)
self.view.addSubview(btn)
}
@objc func showBootpay() {
let payload = Payload()
payload.applicationId = "5b8f6a4d396fa665fdc2b5e9" //ios application id
payload.price = 1000
payload.orderId = String(NSTimeIntervalSince1970)
payload.pg = "payletter"
payload.method = "card"
payload.name = "테스트 아이템"
payload.extra = BootExtra()
payload.extra?.popup = 0
payload.extra?.quickPopup = 0
let user = BootUser()
user.username = "테스트 유저"
user.phone = "01012345678"
payload.userInfo = user
Bootpay.requestPayment(viewController: self, payload: payload)
.onCancel { data in
print("-- cancel: \(data)")
}
.onReady { data in
print("-- ready: \(data)")
}
.onConfirm { data in
print("-- confirm: \(data)")
return true //재고가 있어서 결제를 최종 승인하려 할 경우
// return false //재고가 없어서 결제를 승인하지 않을때
}
.onDone { data in
print("-- done: \(data)")
}
.onError { data in
print("-- error: \(data)")
}
.onClose {
print("-- close")
}
}
}
根据支付进度,会执行 LifeCycle 函数。以下是对每个函数的详细说明。
//MARK: Bootpay Callback Protocol
extension ViewController: BootpayRequestProtocol {
// 에러가 났을때 호출되는 부분
func onError(data: [String: Any]) {
print(data)
}
// 가상계좌 입금 계좌번호가 발급되면 호출되는 함수입니다.
func onReady(data: [String: Any]) {
print("ready")
print(data)
}
// 결제가 진행되기 바로 직전 호출되는 함수로, 주로 재고처리 등의 로직이 수행
func onConfirm(data: [String: Any]) {
print(data)
var iWantPay = true
if iWantPay == true { // 재고가 있을 경우.
Bootpay.transactionConfirm(data: data) // 결제 승인
} else { // 재고가 없어 중간에 결제창을 닫고 싶을 경우
Bootpay.dismiss() // 결제창 종료
}
}
// 결제 취소시 호출
func onCancel(data: [String: Any]) {
print(data)
}
// 결제완료시 호출
// 아이템 지급 등 데이터 동기화 로직을 수행합니다
func onDone(data: [String: Any]) {
print(data)
}
//결제창이 닫힐때 실행되는 부분
func onClose() {
print("close")
Bootpay.dismiss() // 결제창 종료
}
}
onError 函数
在支付过程中发生错误时调用。以下是一些可能导致音乐进行的错误情况:
- 当使用 Bootpay 管理员中未启用的 PG 或支付方式时
- 由于在 PG 中输入或未正确输入支付信息而导致输入错误
- 由于支付过程中出现的余额不足、卡锁定、手机小额支付阻塞、转账无法进行等原因而无法支付
- PG 返回的值被其他客户端篡改的情况
您可以通过该函数向用户显示相关错误消息。
data 格式如下。
{
action: "BootpayError",
message: "카드사 거절",
receipt_id: "5fffab350c20b903e88a2cff"
}
onCancel 函数
当用户在 PG 支付窗口中点击取消或关闭按钮时。****
data 格式如下。
{
action: "BootpayCancel",
message: "사용자가 결제를 취소하였습니다.",
receipt_id: "5fffab350c20b903e88a2cff"
}
onReady 函数
虚拟账户发放完成时会调用。与其他支付不同,一旦发放虚拟账户,就会发生以下情况:在账户发放后,存款后通过 Feedback URL 进行通知。您可以通过 ready 函数检查发放的虚拟账户信息。
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"
params: 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 中的支付将被授予权限。
注意:PayApp、PayLetter PG 等直接授权支付的 PG 不会执行此函数。
data 格式如下。
{
receipt_id: "5fffc0460c20b903e88a2d2c",
action: "BootpayConfirm"
}
{% endtab %}
{% tab title="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"
}
如有其他疑问
- 请参阅Bootpay 开发集成文档
- 请参阅Bootpay 网站首页 - 在网站右侧底部通过聊天进行技术咨询。