このページでは、Swift用の公式Dodo Payments iOSチェックアウトSDKについて説明します。Dodo Paymentsのホスト型チェックアウトをネイティブブラウザビューで開き、型付きの結果を返します。
Checkout Sessions API
このSDKが開く
checkout_urlをバックエンドから作成します。Mobile Integration Guide
このSDKがモバイル決済フロー全体の中でどのように機能するかを確認します。
SFSafariViewControllerで開き、顧客がチェックアウトを完了または離脱したときに型付きのCheckoutResultを返します。APIキーを保持せず、ネットワーク通信コードも含まれていないため、Dodo Payments APIを呼び出すことはありません。チェックアウトはブラウザビューで実行されます。SDKはそのビューを表示および閉じ、リターンURLから結果を読み取ります。
要件: iOS 16以降、およびSwift 6.2以降(パッケージではswift-tools-version: 6.2が宣言されています)。SDKにサードパーティ依存関係はありません。
インストール
1
Add the Package
Xcodeで File → Add Package Dependencies に移動し、パッケージURLを入力します。バージョン1.1.0以降を選択します。外観のカスタマイズには1.1.0が必要です。代わりにライブラリプロダクトは
Package.swiftへパッケージを追加するには、次の依存関係を追加します。Package.swift
DodoCheckoutです。2
Register a Callback URL Scheme
iOSがチェックアウトのリターンURLをアプリに戻せるよう、URLスキームを登録します。Xcodeの Info → URL Types からURLタイプを追加することもできます。SDKに渡す
Info.plistにURLタイプを追加します。Info.plist
returnUrlでこのスキームを使用します。たとえばmyapp://checkout/returnです。バックエンドでセッションを作成するときは、チェックアウトセッションのreturn_urlに同じURLを設定します。SDKはスキーム、ホスト、パスに基づいてリターンURLを照合します。URLが実際のページを読み込む必要はありません。使用方法
DodoCheckout.startはメインアクター上で実行されるasync関数です。バックエンドが返すcheckout_urlから構築したURLとして、checkoutUrlを渡します。
onEventは.opened、.returnReceived、.closedイベントを受け取ります。それらのname値は、checkout.opened、checkout.return_received、checkout.closedです。イベントはロギングにのみ使用し、結果の判断には決して使用しないでください。
リターンURLの転送
SFSafariViewControllerは自身のリターンURLを捕捉できないため、iOSは代わりにアプリでURLを開きます。受信するすべてのURLをDodoCheckout.handleOpenURL(_:)に転送します。シーンを使用しないアプリでは、アプリデリゲートのapplication(_:open:options:)から呼び出します。
- SwiftUI
- SceneDelegate
すべてのURLを転送できます。
handleOpenURLは、進行中のチェックアウトのreturnUrlに一致するURLに対してのみ処理を行い、そのURLに対してtrueを返します。それ以外のURLにはfalseを返すため、そのURLはアプリ側で処理してください。結果の意味
SDKはリターンURLのクエリパラメータからCheckoutResultを構築します。
CheckoutStatus
必須
5つの値のいずれかです。
succeeded: リターンURLにstatus=succeeded(単発決済)またはstatus=active(サブスクリプション)が含まれています。failed: 支払いが拒否されました(status=failed)。cancelled: リターンURLが到着する前に顧客がシートを閉じました。SDKは結果を把握できず、支払いが成功している可能性もあるため、失敗画面を表示しないでください。代わりに放棄されたセッションを照合してください。pending: 支払いが後で確定します(status=processingまたは任意のrequires_*値)。またはstatusパラメータがないか、認識されませんでした。cancelledと同様に照合してください。expired: チェックアウトセッションの有効期限が切れました(status=expired)。
String?
subscription_idクエリパラメータです。サブスクリプションのチェックアウトで設定されます。[String]?
license_keyクエリパラメータです。チェックアウトにライセンスキー商品が含まれる場合に設定されます。String?
emailクエリパラメータです。チェックアウトでメールアドレスを取得するときに設定されます。[String: String]
リターンURLに含まれるすべてのクエリパラメータをそのまま保持します。
支払いの確認
Webhooks
支払いが成功したとき、またはサブスクリプションが有効になったとき、Dodo Paymentsはバックエンドを呼び出します。
Get Payment Detail
シークレットキーを使用して
paymentIdを検索し、ステータスを確認します。result.statusだけに依存しないでください。
外観のカスタマイズ
シートの閉じるボタン、表示スタイル、カラースキームを変更するには、BrowserCustomizationをcustomizationとしてstart(...)に渡します。すべてのフィールドは任意です。nilフィールドでは、SDKはそのオプションを設定せず、iOS独自のデフォルトが適用されます。例外はpresentationStyleで、nilはpageSheetを意味します。
DismissButtonStyle?
閉じるボタンのスタイルです。
done、close、またはcancelを指定します。ラベルとして表示するかアイコンとして表示するかはiOSが決定します。PresentationStyle?
pageSheet(デフォルト)は、顧客が下にスワイプして閉じられるカードを表示します。fullScreenは画面全体を覆い、閉じるジェスチャーはありません。Bool?
ページのスクロールに合わせてツールバーを折りたためるようにします。効果があるのは
presentationStyleがfullScreenの場合のみです。pageSheetでは、この設定に関係なくバーは固定されたままです。ColorScheme?
lightまたはdarkを指定すると、デバイスのシステム設定に関係なく、その外観が適用されます。systemはシステム設定に従います。このオプションでテーマが変更されるのは、ページ周辺のネイティブコントロールのみです。チェックアウトページ自体のライトモードまたはダークモードはチェックアウトセッションのcustomization.themeから決まり、色はcustomization.theme_configから決まります。SFSafariViewControllerのtintプロパティはiOS 26以降非推奨です。
エラー
startは、誤った使用またはプラットフォーム障害の場合にのみCheckoutErrorをスローします。理由はerror.codeから読み取ります。顧客によるキャンセルや支払いの拒否は常に結果として返され、スローされるエラーではありません。
invalidCheckoutUrl(INVALID_CHECKOUT_URL):checkoutUrlは、checkout.dodopayments.comまたはtest.checkout.dodopayments.com上の/session/で始まるパスを持つ、httpsチェックアウトセッションURLではありません。invalidReturnUrl(INVALID_RETURN_URL):returnUrlはスキームとホストを持つ絶対URLではありません。alreadyInProgress(ALREADY_IN_PROGRESS): 別のチェックアウトが実行中です。同時に実行できるチェックアウトは1つだけです。platformError(PLATFORM_ERROR): 表示元のビューコントローラーが存在しないなど、予期しないプラットフォーム障害です。
alreadyInProgressです。その場合、見つかった記録は実行中のチェックアウトに属します。
放棄されたセッション
SDKはチェックアウトを表示した時点でチェックアウトセッションを記録し、チェックアウトが
succeeded、failed、またはexpiredで終了した場合にのみ記録を削除します。チェックアウト中にアプリが終了した場合や、cancelledまたはpendingの結果が返された後も、記録は残ります。次回起動時、およびcancelledまたはpendingの結果が返るたびに確認してください。abandoned.sessionIdは、cks_で始まるチェックアウトセッションIDです。abandoned.createdAtは、チェックアウトが開始されたDateです。バックエンドではGet Checkout Sessionを使用してセッションを検索できます。これによりpayment_idとpayment_statusが返されます。支払いが最終ステータスに到達するまでは、失敗ではなく保留中として扱ってください。
関連情報
Mobile Integration Guide
Android、React Native、Flutter向けの同じコントラクトです。
React Native SDK
iOSで同じSwiftコアをラップします。