BootpayUI 4.4.1

BootpayUI 4.4.1

SwiftyBootpay 维护。



 
依赖项
Bootpay~> 4.4.4
SCLAlertView>= 0
CryptoSwift>= 0
Alamofire>= 0
ObjectMapper>= 0
SnapKit>= 0
JGProgressHUD>= 0
SwiftyJSON>= 0
 

BootpayUI 4.4.1

  • bootpay

BootpayUI

CI Status Version License Platform

BootpayUI iOS

详细内容请参阅 Bootpay 开发集成文档

参考此页面来构建 SwiftUI 应用。

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 SwiftUI

@main
struct BootpayUIApp: App {
    var body: some Scene {
        WindowGroup {
            BootpayUIView()
//            BootpayBioView()
        }
    }
}
import SwiftUI
import WebKit
import Bootpay
import BootpayUI

struct BootpayUIView: View {
//    @State private var showModal = false
    @State private var showingBootpay = false
    private var payload = Payload()
       
    var body: some View {
        GeometryReader { geometry in
            VStack {
                
                if(self.showingBootpay) {
                    BootpayUI(payload: payload)
                        .onCancel { data in
                            print("-- cancel: \(data)")
                        }
                        .onIssued { data in
                            print("-- ready: \(data)")
                        }
                        .onConfirm { data in
                            print("-- confirm: \(data)")
                            return true //재고가 있어서 결제를 최종 승인하려 할 경우
//                            return true //재고가 없어서 결제를 승인하지 않을때
//                            return false
                        }
                        .onDone { data in
                            print("-- done: \(data)")
                        }
                        .onError { data in
                            print("-- error: \(data)")
                            self.showingBootpay = false
                        }
                        .onClose {
                            print("-- close")
                            self.showingBootpay = false
                        }
                } else {
                    Button("부트페이 결제테스트") {
                        showingBootpay = true

                        #if os(macOS)
                        payload.applicationId = "5b8f6a4d396fa665fdc2b5e7" //web application id
                        #elseif os(iOS)
                        payload.applicationId = "5b8f6a4d396fa665fdc2b5e9" //ios application id
                        #endif

                        payload.pg = "나이스페이"
                        payload.method = "네이버페이"

                        payload.price = 1000
                        payload.orderId = String(NSTimeIntervalSince1970)
                        payload.orderName = "테스트 아이템"

                        payload.extra = BootExtra()
//                        payload.extra?.cardQuota = "6"

                        let user = BootUser()
                        user.username = "테스트 유저"
                        user.phone = "01012345678"
                        payload.user = user
                    }.sheet(isPresented: self.$showingBootpay) {
                    }
                }
            }.frame(width: geometry.size.width, height: geometry.size.height)
        }
    }
}

在生物认证支付时

bootpay_bio_400 bootpay_bio_400

import SwiftUI
import Alamofire
import Bootpay
import BootpayUI


let _unique_user_id = "123456abcdffffe2345678901234561324516789122"


struct BootpayBioView: View {
    @ObservedObject private var viewModel = ViewModel()
    private var _payload = BootBioPayload()
    let user = BootUser()
    private var payload = BootBioPayload()
    
    
    
   var body: some View {
       GeometryReader { geometry in
           VStack {
//               if(self.viewModel.showingBootpay == false) {
               Button("생체인증 결제테스트") {
                   
                   user.id = _unique_user_id
                   user.area = "서울"
                   user.gender = 1
                   user.email = "[email protected]"
                   user.phone = "01012344567"
                   user.birth = "1988-06-10"
                   user.username = "홍길동"
                   
                   #if os(macOS)
                   payload.applicationId = "5b8f6a4d396fa665fdc2b5e7" //web application id
                   #elseif os(iOS)
                   payload.applicationId = "5b8f6a4d396fa665fdc2b5e9" //ios application id
                   #endif

                   payload.pg = "nicepay"

                   payload.price = 1000
                   payload.orderId = String(NSTimeIntervalSince1970)
                   //                        payload.name = "테스트 아이템"
                   payload.orderName = "Touch ID 인증 결제 테스트"

                   payload.names = ["플리츠레이어 카라숏원피스", "블랙 (COLOR)", "55 (SIZE)"]
                      
//                        payload.userToken = token
                   payload.user = user

                   payload.extra = BootExtra()
                   payload.extra?.cardQuota = "6"
                   payload.extra?.displaySuccessResult = true

                   let p1 = BootBioPrice()
                   let p2 = BootBioPrice()
                   let p3 = BootBioPrice()

                   p1.name = "상품가격"
                   p1.price = 89000

                   p2.name = "쿠폰적용"
                   p2.price = -2500

                   p3.name = "배송비"
                   p3.price = 2500

                   payload.prices = [p1, p2, p3]
                   viewModel.getUserToken(user: user)
               }
               .sheet(isPresented: self.$viewModel.showingBootpay) {
                   BootpayBioUI(payload: self.payload, userToken: self.viewModel.easyPayUserToken, showBootpay: self.$viewModel.showingBootpay)
                       .onError{ data in
                           print("-- error \(data)")
                       }.onIssued{ data in
                           print("-- ready \(data)")
                       }
                       .onConfirm { data in
                           print("-- confirm  \(data)")
                           return true
//                           BootpayBio.transactionConfirm()
//                           return false
                       }
                       .onCancel { data in
                           print("-- cancel  \(data)")
                       }
                       .onDone { data in
                           print("-- done \(data)")
                       }
                       .onClose {
                           print("-- close")
                       }
                       
               }
           }.frame(width: geometry.size.width, height: geometry.size.height)
       }
   }
}

onError 函数

在支付过程中发生错误时调用此函数。以下情况会导致正在进行的错误:

  1. 在 Bootpay 管理员中未激活的 PG,或者使用未激活的支付方式时
  2. 未正确输入或未输入PG发送的支付信息到 Bootpay 管理员时
  3. 由于余额不足、卡片停止、手机小额支付阻塞、转账不可用等原因导致支付失败的情况
  4. PG 返回的值被不同的客户端篡改的情况

通过该函数,您可以通过相关错误消息将错误通知用户。

data 格式如下所示。

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

onCancel 函数

用户在 PG 支付窗口中点击取消或关闭按钮时出现。 ****

data 格式如下所示。

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

onIssued 函数

在虚拟账户发行完毕时调用此函数。虚拟账户与其他支付不同,在发行后的银行账户号码发行后,通过 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"
  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 支付的确认过程。

* 通过 Paget App 和 Page Letter 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"
}

如有其他问题

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