🌱 iOS SDK🌱
iamport-ios
说明
是帮助在 iOS 原生应用程序中简化支付开发的应用程序 iPort SDK。
-
CHAI 简单支付集成是原生绑定的。
-
可以通过 WebView 在多个 PG 上进行支付。
-
之后将逐步为其他简单支付进行原生绑定。
iOS Plist 设置方法
展开 iOS 设置
设置iOS
为了在iOS中使用Phoenix支付集成模块,您需要按照以下三个项目进行设置。
1. App Scheme注册
设置外部应用程序(例如)Payco,Shinhan Pay)在支付后返回时使用的URL identifier。
- 打开文件
[项目文件夹]/ios/[项目名称]/Info.plist
,然后添加URL types属性。 - 展开item
0
,选择URL schemes。 - 在item
0
中写入App Scheme。
2. 外部应用程序列表注册
为了能够运行第三方的应用程序(例如简单支付应用程序),您需要注册外部应用程序列表。
- 打开文件
[项目文件夹]/ios/[项目名称]/Info.plist
。 - 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设置
- 打开文件
[项目文件夹]/ios/[项目名称]/Info.plist
。 - 添加属性
App Transport Security
。 - 向子属性中添加
Allow Arbitrary Loads in Web Content
和Allow 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 放入参数中即可。其他操作与之前相同。
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_pay
,IMP.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)
执行方法
- git clone
- 通过 Xcode 打开项目
- 通过 USB 线连接 iPhone(或使用模拟器,使用模拟器时无法进行支付验证)
- 构建 示例应用
支持
PortOne 技术支持,[email protected]
许可协议
iamport-ios 在 MIT 许可协议下可用。有关更多信息,请参阅 LICENSE 文件。