iamport-ios 1.4.2

iamport-ios 1.4.2

BingBongbingbongHyukgyu Kwon维护。



 
依赖项
那么>= 0
Swinject>= 0
Alamofire~> 5.1
RxBusForPort>= 0
RxSwift~> 6.0
RxCocoa>= 0
RxRelay>= 0
RxOptional>= 0
RxViewController>= 0
 

  • 作者:
  • bingbong

🌱iOS SDK🌱

iamport-ios

CI Status Version License Platform

说明

是帮助在 iOS 原生应用程序中简化支付开发的应用程序 iPort SDK。

  • CHAI 简单支付集成是原生绑定的。

  • 可以通过 WebView 在多个 PG 上进行支付。

  • 之后将逐步为其他简单支付进行原生绑定。



iOS Plist 设置方法

展开 iOS 设置

设置iOS

为了在iOS中使用Phoenix支付集成模块,您需要按照以下三个项目进行设置。

1. App Scheme注册

设置外部应用程序(例如)Payco,Shinhan Pay)在支付后返回时使用的URL identifier。

  1. 打开文件 [项目文件夹]/ios/[项目名称]/Info.plist,然后添加URL types属性。
  2. 展开item 0,选择URL schemes。
  3. 在item 0中写入App Scheme。

2. 外部应用程序列表注册

为了能够运行第三方的应用程序(例如简单支付应用程序),您需要注册外部应用程序列表。

  1. 打开文件 [项目文件夹]/ios/[项目名称]/Info.plist
  2. LSApplicationQueriesSchemes 属性中添加外部应用程序列表。
<key>LSApplicationQueriesSchemes</key>
<array>
  <string>kftc-bankpay</string> <!-- 계좌이체 -->
  <string>ispmobile</string> <!-- ISP모바일 -->
  <string>itms-apps</string> <!-- 앱스토어 -->
  <string>hdcardappcardansimclick</string> <!-- 현대카드-앱카드 -->
  <string>smhyundaiansimclick</string> <!-- 현대카드-공인인증서 -->
  <string>shinhan-sr-ansimclick</string> <!-- 신한카드-앱카드 -->
  <string>smshinhanansimclick</string> <!-- 신한카드-공인인증서 -->
  <string>kb-acp</string> <!-- 국민카드-앱카드 -->
  <string>mpocket.online.ansimclick</string> <!-- 삼성카드-앱카드 -->
  <string>ansimclickscard</string> <!-- 삼성카드-온라인결제 -->
  <string>ansimclickipcollect</string> <!-- 삼성카드-온라인결제 -->
  <string>vguardstart</string> <!-- 삼성카드-백신 -->
  <string>samsungpay</string> <!-- 삼성카드-삼성페이 -->
  <string>scardcertiapp</string> <!-- 삼성카드-공인인증서 -->
  <string>lottesmartpay</string> <!-- 롯데카드-모바일결제 -->
  <string>lotteappcard</string> <!-- 롯데카드-앱카드 -->
  <string>cloudpay</string> <!-- 하나카드-앱카드 -->
  <string>nhappcardansimclick</string> <!-- 농협카드-앱카드 -->
  <string>nonghyupcardansimclick</string> <!-- 농협카드-공인인증서 -->
  <string>citispay</string> <!-- 씨티카드-앱카드 -->
  <string>citicardappkr</string> <!-- 씨티카드-공인인증서 -->
  <string>citimobileapp</string> <!-- 씨티카드-간편결제 -->
  <string>kakaotalk</string> <!-- 카카오톡 -->
  <string>payco</string> <!-- 페이코 -->
  <string>lpayapp</string> <!-- (구)롯데 L페이 -->
  <string>hanamopmoasign</string> <!-- 하나카드 공인인증앱 -->
  <string>wooripay</string> <!-- (구) 우리페이 -->
  <string>nhallonepayansimclick</string> <!-- NH 올원페이 -->
  <string>hanawalletmembers</string> <!-- 하나카드(하나멤버스 월렛) -->
  <string>chaipayment</string> <!-- 차이 -->
  <string>kb-auth</string> <!-- 국민 -->
  <string>hyundaicardappcardid</string>  <!-- 현대카드 -->
  <string>com.wooricard.wcard</string>  <!-- 우리won페이 -->
  <string>lmslpay</string>  <!-- 롯데 L페이 -->
  <string>lguthepay-xpay</string>  <!-- 페이나우 -->
  <string>liivbank</string>  <!-- Liiv 국민 -->
  <string>supertoss</string>   <!-- 토스 -->
  <string>newsmartpib</string>   <!-- 우리WON뱅킹 -->
</array>

3. App Transport Security设置

  1. 打开文件 [项目文件夹]/ios/[项目名称]/Info.plist
  2. 添加属性 App Transport Security
  3. 向子属性中添加 Allow Arbitrary Loads in Web ContentAllow Arbitrary Loads,并分别将它们的值设置为 YES
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoadsInWebContent</key>
  <true/>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

示例

要运行示例项目,请克隆仓库,然后首先从Example目录运行pod install

要求

安装

iamport-ios 可通过 CocoaPods 获取。要安装它,只需将以下行添加到您的Podfile中。

[检查最新版本]

  • 使用 Cocoapods 时(使用 RxSwift 5.x)
pod 'iamport-ios', '~> 1.4.0'
  • 使用 Swift 包管理器时(使用 RxSwift 6.x)
iamport-ios 1.1.0 부터 지원

用法

  • 如果使用 UINavigationController。
    在 storyboard 的 root view controller 中,选择 Xcode 顶部 -> 编辑 -> 嵌入 -> Navigation Controller。
  • 支持 UIViewController, WKWebView。
  // 결제 요청 데이터 구성 
  let payment = IamportPayment(
                pg: PG.html5_inicis.getPgSting(pgId: ""), // PG 사
                merchant_uid: "mid_123456",                   // 주문번호                
                amount: "1000").then {                        // 가격
                  $0.pay_method = "card"                      // 결제수단
                  $0.name = "샘플 머천트에서 주문~"                // 주문명
                  $0.buyer_name = "독고독"                     
                  $0.app_scheme = "iamport"                   // 결제 후 앱으로 복귀 위한 app scheme
              }

  // I'mport SDK 에 결제 요청
  // case1 : UINavigationController 사용
  Iamport.shared.payment(navController: navigationController, // 네비게이션 컨트롤러
                         userCode: userCode, // 머천트 유저 식별 코드
                         payment: payment) // 결제 요청 데이터
                         { [weak self] iamportResponse in
                            // 결제 종료 콜백
                         }

  // case2 : UIViewController 사용
  Iamport.shared.payment(viewController: viewController, /* 이하동일.. */)

  // case3 : WebView 를 바로 넘겨 결제를 원하면, 아래 [Optional 구현사항 WebView Mode 와 MobileWeb Mode] 참조하세요.
  
  Iamport.shared.close() // sdk 종료 원할시 호출
  // AppDelegate.swift 설정
  func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
      Iamport.shared.receivedURL(url)
      return true
  }

可选实现方案 WebView Mode 与 MobileWeb Mode

展开查看

本 SDK 提供基本支付集成便利性。
通过 Iamport.payment 进行支付请求时,会打开新的 UIViewController,
内部创建 WebView,通过您传递的 parameters 打开支付窗口。

但根据请求,为提高开发的自由度,增加了 WebView Mode 和 MobileWeb Mode 两种方式。(<=1.0.0-dev08)

1. WebView Mode

说明:直接创建支付页面,将 WKWebView 传递给 iamport-sdk 进行支付。
例如:直接美化和定制支付页面。

  • 实现方式:与上述 [Usage] 部分相同进行 iamport-sdk 配置。
    在 Iamport.shared.paymentWebView 调用参数中,将 WKWebView 放入参数中即可。其他操作与之前相同。

参考 PaymentWebViewMode.swift

Iamport.shared.paymentWebView(webViewMode: wkWebView, /*이하 동일*/)

2. MobileWeb Mode

  • 说明:将加载的 Aimport 移动网页的 WebView 传递给 Aimport-sdk 以支持支付。
    例如:已经在网站使用 Aimport js sdk,希望将应用仅包装在 app 中进行发布。

  • 实现方式 Step1:在 ios 应用中按照上述 [Usage] 部分进行 Aimport-sdk 设置。
    此外,调用 Iamport.shared.pluginMobileWebSupporter(webview),参数传递 webview。
    实际的支付过程是在您的网站上进行的。

参考 mobileweb.html (示例,实际是您的 Front-End)
参考 PaymentMobileWebMode.swift

Iamport.shared.pluginMobileWebSupporter(mobileWebMode: wkWebView)
  • 实现方式 Step2:在之前使用 js sdk 的 Web 前端(html)的
    IMP.request_payIMP.certification 调用位置,添加以下代码。

  • 传递数据格式

// 1. `IMP.request_pay`를 통한 결제의 경우
const params = {
    userCode: userCode, // 가맹점 식별코드
    payment: payment,   // 결제 데이터
};

// 2. `IMP.certification`를 통한 본인인증의 경우
const params = {
    userCode: userCode,           // 가맹점 식별코드
    certification: certification, // 본인인증 데이터
};
  • 示例代码
// 예시
// start of 추가되는 부분
const isIOS = (/iphone|ipad|ipod/i.test(navigator.userAgent.toLowerCase()));
if(isIOS) {
    try {
        const params = {
          userCode : userCode,                                   // 가맹점 식별코드
          iamportRequest : data,                                 // 결제 데이터
        };
      window.webkit.messageHandlers.iamportmobilewebmode.postMessage(params)
    } catch (error) {
      console.error(error);
    }
}
// End of 추가되는 부분

// 기존의 js IMP.request_pay
IMP.request_pay(data, ... // 생략
  • Custom WKWebViewDelegate 的使用
/**
 webview url 을 통해 처리하는 로직이 있을 경우에 
 [IamportWKWebViewDelegate] 상속하여 사용 하시거나,
 [Iamport.shared.updateWebViewUrl] 의 subscribe 을 통해 변경되는 url 을 체크 가능합니다.
 */
// CASE1 : IamportWKWebViewDelegate 상속
class MyWKWebViewDelegate: IamportWKWebViewDelegate {
    override func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        if let url = navigationAction.request.url {
            // TODO : write your logic
            print("MyWKNavigationDelegate received url : \(url)")
        }

        super.webView(webView, decidePolicyFor: navigationAction, decisionHandler: decisionHandler)
    }
}

let webViewDelegate = MyWKWebViewDelegate()

class MyView: UIViewController {
    override func viewDidAppear(_ animated: Bool) {
        ..
        // IamportWKWebViewDelegate 사용
        wkWebView.navigationDelegate = webViewDelegate as WKNavigationDelegate
        
//       CASE2 : [Iamport.shared.updateWebViewUrl] 사용
        Iamport.shared.updateWebViewUrl.subscribe { [weak self] url in
            print("updateWebViewUrl received url : \(url.element)")
        }.disposed(by: disposeBag)
    }
}

可选实现方案 SwiftUI 中的使用

展开查看

使用 SwiftUI 的开发者可以选择使用上面的 WebViewMode,或者
参考以下代码来配置并使用 UIViewController。

同时,可以在 Example app 中找到相应的实现,请参考。
参考 PaymentView.swift

struct IamportPaymentView: UIViewControllerRepresentable {

  func makeUIViewController(context: Context) -> UIViewController {
    let view = IamportPaymentViewController()
    return view
  }

  func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {}
}

class IamportPaymentViewController: UIViewController {

  // 아임포트 SDK 결제 요청 
  func requestIamportPayment() {
    let userCode = "iamport" // iamport 에서 부여받은 가맹점 식별코드
    let payment = createPaymentData()
    
    Iamport.shared.payment(viewController: self,
            userCode: userCode, payment: payment) { [weak self] response in
      print("결과 : \(response)")
    }
  }

  // 아임포트 결제 데이터 생성
  func createPaymentData() -> IamportPayment {
    return IamportPayment(
            pg: PG.html5_inicis.makePgRawName(pgId: ""),
            merchant_uid: "swiftui_ios_\(Int(Date().timeIntervalSince1970))",
            amount: "1000").then {
      $0.pay_method = "card"
      $0.name = "SwiftUI 에서 주문입니다"
      $0.buyer_name = "SwiftUI"
      $0.app_scheme = "iamporttest" // 결제 후 돌아올 앱스킴
    }
  }
}

可选实现方案在 SceneDelegate 中的使用 (目标 iOS 13)

展开查看

iOS 13 开始,由于从 AppDelegate 中分离出 UIDevice 生命周期管理,
增加了 SceneDelegate。
替换使用 AppDelegate 的代码,请参考以下代码进行实现。
参考 SceneDelegate.swift

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    ..
  func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    if let url = URLContexts.first?.url {
      Iamport.shared.receivedURL(url)
    }
  }  
}

💡示例应用

  • SwiftUI 编写(目标 iOS 13)

应用源代码检查路径

执行方法

  1. git clone
  2. 通过 Xcode 打开项目
  3. 通过 USB 线连接 iPhone(或使用模拟器,使用模拟器时无法进行支付验证)
  4. 构建 示例应用

支持

PortOne 技术支持,[email protected]

许可协议

iamport-ios 在 MIT 许可协议下可用。有关更多信息,请参阅 LICENSE 文件。