Issuing でデジタルウォレットを使用する
Issuing を使用してデジタルウォレットにカードを追加する方法をご紹介します。
Issuing を使用すると、ユーザーは Apple Pay や Google Pay などのデジタルウォレットにカードを追加できます。Stripe は、以下の 2 つの方法でカードの追加をサポートしています。
- 手動のプロビジョニング: カード保有者は、スマホのウォレットアプリケーションにカード情報を入力して、デジタルウォレットに追加します。
- プッシュプロビジョニング: モバイルアプリケーションでは、ユーザーがアプリから直接、デジタルウォレットにカードを追加できます。
カードがデジタルウォレットに追加されると、そのカードのトークン化された表記が作成されます。ネットワークトークンは、カードとは別に管理されます。ネットワークトークンとその仕組みについて、詳細はトークン管理をご覧ください。
手動のプロビジョニング
カード保有者は、手動のプロビジョニングを使用して、Stripe Issuing のバーチャルカードと物理カードを Apple Pay、Google Pay、Samsung Pay のウォレットに追加できます。
これを行うには、カード保有者はスマートフォンでウォレットアプリを開いてカード詳細を入力します。Stripe は、カードに関連付けられたカード保有者の phone_
または email
に 6 桁の確認コードを送信します。
カードのプロビジョニング時にカード保有者にいずれのフィールドも設定されていない場合は、「card not supported (カードがサポートされていません)」というエラーが表示されます。
手動のプロビジョニングの実装にコードは必要ありませんが、設定のプロセスは、デジタルウォレットのプロバイダーと本拠を置く国によって異なることがあります。
アメリカ
Apple Pay ウォレットには、Apple からの承認が必要です。アカウントの Apple Pay のステータスを確認するには、デジタルウォレット設定を確認します。Apple Pay のご利用前に、お申し込みの提出が必要になる場合があります。
Google Pay と Samsung Pay では、これ以外のステップは必要ありません。
ヨーロッパ/イギリス
デジタルウォレットを導入するには、Stripe パートナーシップチームからの追加承認が必要です。詳細については、アカウント代表者に連絡するか、Stripe にお問い合わせください。
Apple Pay ウォレットには、追加の承認が必要です。アカウントの Apple Pay のステータスを確認するには、デジタルウォレット設定を確認します。Apple Pay のご利用前に、申請書の提出が必要になる場合があります。
プッシュプロビジョニング
プッシュプロビジョニングでは、カード保有者が下記のように「ウォレットに追加する」ボタンを押すことにより、アプリを使用して Stripe Issuing カードをデジタルウォレットに追加できます。
アメリカでプッシュプロビジョニングを有効にするには、ユーザーが最初に手動のプロビジョニングのステップを完了する必要があります。プッシュプロビジョニングでは、手動のプロビジョニングの承認を得る以外に、Stripe SDK を導入する必要もあります。
そのためには、プッシュプロビジョニングのサポートを希望するプラットフォームごとに、Stripe の承認プロセスと、Stripe SDK によるコード実装の両方が必要になります。プラットフォームでの承認は、その連結アカウントのすべてに段階的に適用されます。
Samsung Pay のプッシュプロビジョニングは、Stripe の SDK ではサポートされていません。


アクセスをリクエスト
iOS のアクセスをリクエストする
プッシュプロビジョニングには、com.
と呼ばれる Apple からの特別なエンタイトルメントが必要です。これは support-issuing@stripe.com にメールを送信して、リクエストすることができます。メールには、以下の内容を含めてください。
- Card network—Visa or MasterCard.
- Card name—This is the name of the card displayed in the wallet.
- アプリ名: アプリの名前。
- 開発チーム ID: メンバーシップの Apple Developer アカウントに記載されています。
- ADAM ID: アプリの一意の数値 ID。App Store Connect またはアプリへの App Store リンク (
https://apps.
など) に記載されています。apple. com/app/id123456789 - バンドル ID: アプリのバンドル ID。App Store Connect (
com.
など) にも記載されています。example. yourapp
Android のアクセスをリクエストする
Stripe はプッシュプロビジョニング用にプライベート Google ライブラリで SDK ラッパーを提供しています。プッシュプロビジョニングを使用して Google Pay Store でアプリを配信するには、このライブラリへのアクセスをリクエストする必要があります。
- Google Pay へのアクセスをリクエストする
- Google の TapAndPay プライベート SDK をダウンロードする (現在互換性のあるバージョンは 17.1.2)
- アプリのプッシュプロビジョニング API へのアクセスをリクエストします。Google の許可リストに追加されるアプリケーション ID を指定する必要があります。このプロセスの詳細については、Google のドキュメントをご覧ください。
- Provide the same application ID, your app name, card network, and card name to support-issuing@stripe.com.
アプリを設定するクライアント側
React Native SDK はオープンソースであり、詳細なドキュメントが提供されています。内部では、ネイティブの iOS および Android の SDK を使用します。Stripe の React Native SDK をインストールするには、プロジェクトのディレクトリーで (使用するパッケージマネージャーによって異なる) 次のいずれかのコマンドを実行します。
次に、その他の必要な依存関係をインストールします。
- iOS の場合は、ios ディレクトリーに移動して
pod install
を実行し、必要なネイティブ依存関係もインストールします。 - Android の場合は、依存関係をインストールする必要はありません。
Stripe の初期化
React Native アプリで Stripe を初期化するには、決済画面を StripeProvider
コンポーネントでラップするか、initStripe
初期化メソッドを使用します。publishableKey
の API 公開可能キーのみが必要です。次の例は、StripeProvider
コンポーネントを使用して Stripe を初期化する方法を示しています。
import { StripeProvider } from '@stripe/stripe-react-native'; function App() { const [publishableKey, setPublishableKey] = useState(''); const fetchPublishableKey = async () => { const key = await fetchKey(); // fetch key from your server here setPublishableKey(key); }; useEffect(() => { fetchPublishableKey(); }, []); return ( <StripeProvider publishableKey={publishableKey} merchantIdentifier="merchant.identifier" // required for Apple Pay urlScheme="your-url-scheme" // required for 3D Secure and bank redirects > // Your app code here </StripeProvider> ); }
注
Android に固有の設定
Android でプッシュプロビジョニングを有効にするには、TapAndPay SDK にアクセスできるようになった後 (上記を参照)、それをネイティブ Android プロジェクトに含める必要があります。
次に、以下を android/app/build.
ファイルに追加して、Stripe のネイティブ Android プッシュプロビジョニングライブラリをインポートする必要があります。
iOS 固有の設定
iOS でプッシュプロビジョニングを有効にするには、Stripe がエンタイトルメントの付与を確認した後に、App Store Connect でプロビジョニングプロファイルにケイパビリティを追加する必要があります。
次に、新しいエンタイトルメントを ios/app.
ファイルに追加する必要があります。
"entitlements": { "com.apple.developer.payment-pass-provisioning": true }
バックエンドを更新するサーバー側
プッシュプロビジョニングの実装によって公開されるメソッドでは、お客様が自身のバックエンドとやり取りをし、Stripe の一時キーを作成してその JSON をアプリに返すことが求められます。このキーは有効期間の短い API 認証情報で、暗号化されたカード詳細の取得に使用でき、それがカードオブジェクトの単一インスタンスに使用されます。
Stripe API によって返されるオブジェクトがお使いの SDK のバージョンと互換性があることを確認するために、キーを作成する際、React Native SDK によってエクスポートされた API バージョンを Stripe API に対して明示的に渡す必要があります。
{ "id": "ephkey_1G4V6eEEs6YsaMZ2P1diLWdj", "object": "ephemeral_key", "associated_objects": [ { "id": "ic_1GWQp6EESaYspYZ9uSEZOcq9", "type": "issuing.card" } ], "created": 1586556828, "expires": 1586560428, "livemode": false, "secret": "ek_test_YWNjdF8xRmdlTjZFRHelWWxwWVo5LEtLWFk0amJ2N0JOa0htU1JzEZkd2RpYkpJdnM_00z2ftxCGG" }
<AddToWalletButton />
コンポーネントに渡す必要がある、Issuing カードの詳細を取得するためのエンドポイントも作成する必要があります。
アプリを更新するクライアント側
まず、発行されたカードの wallets.
の値 (上記のステップ 3 で作成した 2 番目のエンドポイントから取得) が true
であるかを確認して、デバイスがプッシュプロビジョニングの使用対象であるかどうかを判断します。対象である場合は、後でコンポーネントで使用するためにカード詳細を保存して続行します。wallets.
が false
の場合は、iOS で <AddToWalletButton />
を表示しないでください。表示すると、アプリの審査でアプリが拒否される可能性があります。これは、Android の wallets.
でも同様です。
import React, {useEffect, useState} from 'react'; import {Constants} from '@stripe/stripe-react-native'; import {View} from 'react-native'; export default function MyScreen() { const [key, setKey] = useState(null); const [card, setCard] = useState(null); useEffect(() => { fetchEphemeralKey(); fetchIssuingCard(); }, []); const fetchIssuingCard = async () => { const response = await fetch(`${API_URL}/issuing-card`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ ISSUING_CARD_ID: '{{ISSUING_CARD_ID}}', }), }); const card = await response.json(); if (!card.wallets.apple_pay.eligible) { // Do not show <AddToWalletButton /> component on iOS. See card.wallets.apple_pay.ineligible_reason for details } else if (!card.wallets.google_pay.eligible) { // Do not show <AddToWalletButton /> component on Android. See card.wallets.google_pay.ineligible_reason for details } else { setCard(card); } }; const fetchEphemeralKey = async () => { // See above }; return <View />; }
次に、上記のステップ 3 で作成した最初のエンドポイントから一時キーを取得して保存します。
import React, {useEffect, useState} from 'react'; import {Constants} from '@stripe/stripe-react-native'; import {View} from 'react-native'; export default function MyScreen() { const [key, setKey] = useState(null); useEffect(() => { fetchEphemeralKey(); }, []); const fetchEphemeralKey = async () => { const response = await fetch(`${API_URL}/ephemeral-key`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ ISSUING_CARD_ID: '{{ISSUING_CARD_ID}}', API_VERSION: Constants.API_VERSIONS.ISSUING, }), }); const myKey = await response.json(); setKey(myKey); }; return <View />; }
これ以上のサーバー通信は不要です。次に、ウォレットにカードを追加_「できる」_かを確認する必要があります。これは、canAddCardToWallet
メソッドで確認でき、ブール値の canAddCard
フィールドを含むオブジェクトが返されます。canAddCard
が false
の場合は、AddToWalletButton
を表示しないでください。表示すると、アプリが Apple によって拒否される可能性があります。
Android では、カードがすでにウォレットにある場合でも、不適切な状態で止まっている可能性があります。canAddCardToWallet
で返される details
オブジェクトの token
を確認することで、このようなケースに対処するロジックを追加できます。レスポンスが null 以外で、token.
が "TOKEN_
の場合は、この token
を <AddToWalletButton />
のプロパティに渡します。
import React, {useEffect, useState} from 'react'; import {Constants, canAddCardToWallet, GooglePayCardToken} from '@stripe/stripe-react-native'; import {View} from 'react-native'; export default function MyScreen() { const [key, setKey] = useState(null); const [card, setCard] = useState(null); const [showAddToWalletButton, setShowAddToWalletButton] = useState(false); const [androidCardToken, setAndroidCardToken] = useState(null); useEffect(() => { fetchEphemeralKey(); fetchIssuingCard(); }, []); const checkIfCanAddCard = async () => { const { canAddCard, details, error } = await canAddCardToWallet({ primaryAccountIdentifier: card?.wallets?.primary_account_identifier, cardLastFour: card.last4, hasPairedAppleWatch: // Pass a boolean indicating whether or not the device has a paired Apple Watch. iOS only. }); if (error) { Alert.alert(error.code, error.message); } else { setShowAddToWalletButton(canAddCard); if (details?.token?.status === 'TOKEN_STATE_NEEDS_IDENTITY_VERIFICATION') { setAndroidCardToken(details.token); } } }; const fetchIssuingCard = async () => { // See above await checkIfCanAddCard(); }; const fetchEphemeralKey = async () => { // See above }; return <View />; }
これで、ボタンを表示するために必要なすべての情報が揃いました。
import React, {useEffect, useState} from 'react'; import { Constants, canAddCardToWallet, AddToWalletButton, GooglePayCardToken, } from '@stripe/stripe-react-native'; import {View, Image, Alert, StyleSheet} from 'react-native'; import AddToGooglePayPNG from '../assets/Add-to-Google-Pay-Button-dark-no-shadow.png'; export default function MyScreen() { const [key, setKey] = useState(null); const [card, setCard] = useState(null); const [showAddToWalletButton, setShowAddToWalletButton] = useState(false); const [androidCardToken, setAndroidCardToken] = useState<null | GooglePayCardToken>(null); useEffect(() => { fetchEphemeralKey(); fetchIssuingCard(); }, []); const canAddCard = async () => { // See above }; const fetchIssuingCard = async () => { // See above }; const fetchEphemeralKey = async () => { // See above }; return ( <View> {showAddToWalletButton && ( <AddToWalletButton token={androidCardToken} androidAssetSource={Image.resolveAssetSource(AddToGooglePayPNG)} testEnv={true} style={styles.payButton} iOSButtonStyle="onLightBackground" cardDetails={{ name: card?.cardholder?.name, primaryAccountIdentifier: card?.wallets?.primary_account_identifier, // This can be null, but should still always be passed. Failing to pass the primaryAccountIdentifier can result in a failure to provision the card. lastFour: card?.last4, description: 'Added by Stripe', }} ephemeralKey={key} onComplete={({error}) => { Alert.alert( error ? error.code : 'Success', error ? error.message : 'Card was successfully added to the wallet.', ); }} /> )} </View> ); } const styles = StyleSheet.create({ payButton: { // You may add custom styles to your button, but make sure it complies // with the relevant platform guidelines: // iOS : https://developer.apple.com/wallet/add-to-apple-wallet-guidelines/ // Android : https://developers.google.com/pay/issuers/apis/push-provisioning/android/branding-guidelines }, });
ユーザーがボタンをタップすると、カードをウォレットに追加するための UI が起動します。onComplete
プロパティにコールバックを実装します。error
フィールドが null 以外の場合は、エラーが発生しておりカードはウォレットに追加されていません。error
が null である場合は、カードは正常にプロビジョニングされています。
ボタンのスタイル
iOS では、ボタンのスタイルは iOSButtonStyle
プロパティによって決定されます。このプロパティーを以下のように設定します。
onLightBackground
は、明るい色または白の背景の上にボタンを表示する場合です。onDarkBackground
は、暗い色または黒の背景の上にボタンを表示する場合です。
Android では、実際の画像のアセットを androidAssetSource
プロパティに渡す必要があります。指定できるすべてのアセットオプションを Google から直接ダウンロードすることができます。ボタンを実装する際は、Google のブランドガイドラインに従ってください。
選択した PNG を AddToWalletButton
コンポーネントに渡すには、プロジェクトに追加して、他のアセットと同様にインポートし、ソースを Image.
で解決します。
import {Image} from 'react-native'; import AddToGooglePayPNG from '../assets/Add-to-Google-Pay-Button-dark-no-shadow.png'; ... <AddToWalletButton ... androidAssetSource={Image.resolveAssetSource(AddToGooglePayPNG)} ... />
テスト
iOS
iOS では、testEnv={true}
を AddToWalletButton
コンポーネントに渡す限り、開発、シミュレーター、およびテストカードでプッシュプロビジョニングをテストできます。testEnv
プロパティがtrue
に設定されている場合、カードは実際にはデバイスのウォレットに追加されないことに注意してください。テスト環境では、com.
エンタイトルメントは必要ありません。
Android
Android では、testEnv
プロパティには効果がありません。テストはすべて、本番環境で本番の Issuing カードを実際のデバイスで使用して行ってください。
内部テストを開始する前に、必ずアプリケーション ID を Stripe に提供してください。