Bootpay 4.4.4

Bootpay 4.4.4

SwiftyBootpay 维护。



 
依赖项
CryptoSwift>= 0
ObjectMapper>= 0
NVActivityIndicatorView>= 0
 

Bootpay 4.4.4

  • bootpay

Bootpay

CI Status Version License Platform

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 函数

在支付过程中发生错误时调用。以下是一些可能导致音乐进行的错误情况:

  1. 当使用 Bootpay 管理员中未启用的 PG 或支付方式时
  2. 由于在 PG 中输入或未正确输入支付信息而导致输入错误
  3. 由于支付过程中出现的余额不足、卡锁定、手机小额支付阻塞、转账无法进行等原因而无法支付
  4. 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"
}

如有其他疑问

  1. 请参阅Bootpay 开发集成文档
  2. 请参阅Bootpay 网站首页 - 在网站右侧底部通过聊天进行技术咨询。