iOS SDK - 支払いの受付
Omise iOS SDKを使用してiOSアプリケーションで支払いを受け付ける方法を学びます。このガイドでは、請求の作成、3D Secure認証の処理、およびさまざまな決済フローの実装について説明します。
概要
Omise iOS SDKは、iOSアプリケーションで支払いを受け付けるためのネイティブSwiftおよびObjective-Cインターフェースを提供します。このSDKは以下を処理します:
- 支払い情報のトークン化
- 3D Secure認証フロー
- Apple Pay統合
- カードスキャン機能
- 決済方法選択UI
主な機能
- ネイティブiOS実装 - 最適なパフォーマンスのためにSwiftで構築
- 安全なトークン作成 - PCIコンプライアンスの負担なしのクライアント側トークン化
- 3D Secure 2.0サポート - シームレスな認証処理
- Apple Pay対応 - 組み込みのApple Payサポート
- カスタマイズ可能なUI - 事前構築された決済フォームまたはカスタム実装
- オフラインサポート - 後で処理するための支払いキュー
前提条件
支払い受付を実装する前に:
- SDKのインストールを完了する(開発者ツール > iOS SDKを参照)
- 公開鍵を設定する
- 請求を作成するためのバックエンドをセットアップする
- 開発用認証情報でテストする
決済フローの概要
典型的なiOS決済フロー:
ユーザーがカード情報を入力
↓
SDKがカードをトークン化(クライアント側)
↓
トークンをバックエンドに送信
↓
バックエンドがトークンで請求を作 成
↓
3D Secure認証(必要な場合)
↓
支払い完了
基本的な請求の作成
ステップ1: カード情報の収集
import OmiseSDK
class PaymentViewController: UIViewController {
func processPayment(amount: Int64, currency: String) {
// 支払いリクエストを作成
let request = OmiseTokenRequest(
name: "John Appleseed",
number: "4242424242424242",
expirationMonth: 12,
expirationYear: 2025,
securityCode: "123"
)
// トークンを作成
let client = OmiseSDKClient(publicKey: "pkey_test_123")
client.send(request) { [weak self] result in
switch result {
case .success(let token):
self?.createCharge(with: token.id, amount: amount, currency: currency)
case .failure(let error):
self?.handleError(error)
}
}
}
func createCharge(with tokenId: String, amount: Int64, currency: String) {
// バックエンドに送信
let parameters: [String: Any] = [
"token": tokenId,
"amount": amount,
"currency": currency,
"return_uri": "myapp://payment/complete"
]
// バックエンドへのAPIコールを実行
APIClient.shared.post("/charges", parameters: parameters) { result in
switch result {
case .success(let charge):
self.handleChargeResult(charge)
case .failure(let error):
self.handleError(error)
}
}
}
}
ステップ2: 事前構築された決済フォームの使用
import OmiseSDK
class CheckoutViewController: UIViewController {
func presentPaymentForm() {
let capability = loadCapability() // バックエンドから読み込む
let paymentConfiguration = PaymentCreatorConfiguration(
publicKey: "pkey_test_123",
amount: 100000, // 最小通貨単位で1,000.00
currency: .thb,
capability: capability
)
let paymentController = PaymentCreatorController.makePaymentCreatorController(
configuration: paymentConfiguration
) { [weak self] result in
self?.handlePaymentResult(result)
}
present(paymentController, animated: true)
}
func handlePaymentResult(_ result: Result<PaymentToken, Error>) {
switch result {
case .success(let token):
// トークンをバックエンドに送信して請求を作成
createChargeOnBackend(token: token)
case .failure(let error):
showError(error.localizedDescription)
}
}
func createChargeOnBackend(token: PaymentToken) {
let parameters: [String: Any] = [
"source": token.id,
"amount": 100000,
"currency": "THB",
"return_uri": "myapp://payment/complete"
]
APIClient.shared.post("/charges", parameters: parameters) { result in
// 請求作成結果を処理
self.processChargeResponse(result)
}
}
}
3D Secure認証の処理
3D Secureフローの実装
import OmiseSDK
import SafariServices
class PaymentProcessor {
var authorizingViewController: SFSafariViewController?
func handleChargeResponse(_ charge: Charge) {
guard charge.status != .successful else {
// 3DSなしで支払いが完了
showSuccess()
return
}
// 3D Secure認証が必要かチェック
if charge.status == .pending,
let authorizeURL = charge.authorizeURL {
present3DSecure(url: authorizeURL)
}
}
func present3DSecure(url: URL) {
let safariVC = SFSafariViewController(url: url)
safariVC.delegate = self
authorizingViewController = safariVC
present(safariVC, animated: true)
}
// 3D Secureからの戻りを処理
func application(_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
guard url.scheme == "myapp",
url.host == "payment" else {
return false
}
// Safariビューコントローラーを閉じる
authorizingViewController?.dismiss(animated: true) {
// バックエンドで支払いステータスを確認
self.verifyPaymentStatus()
}
return true
}
func verifyPaymentStatus() {
// バックエンドから請求ステータスを確認
APIClient.shared.get("/charges/verify") { result in
switch result {
case .success(let charge):
if charge.status == .successful {
self.showSuccess()
} else if charge.status == .failed {
self.showError("支払いの検証に失敗しました")
}
case .failure(let error):
self.showError(error.localizedDescription)
}
}
}
}
extension PaymentProcessor: SFSafariViewControllerDelegate {
func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
// ユーザーが3DSをキャンセル
showError("認証がキャンセルされました")
}
}
URLスキームの設定
Info.plistで:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>myapp</string>
</array>
<key>CFBundleURLName</key>
<string>com.mycompany.myapp</string>
</dict>
</array>