💳

Apple Pay を Flutter で実装してみた

2024/11/04に公開
1

はじめに

こんにちは!
株式会社アンドエーアイで Flutter エンジニアをしている Takuya です。

本記事では、Apple Pay を Flutter で実装してみたので、その手順について記載しています。

背景

Apple Pay を使用する案件が今後発生するかもしれないため、その予習としてどのように Flutter で実装できるかを調べていました。

調べると、日本語の記事が少なかったので、今回記事化しました!

必要なツール

  • pay パッケージ
    Google が出しているパッケージで、Apple Pay と Google Pay を実装するために必要な API を提供しています。

  • Apple Developer Account
    年に 99 USD(約14833円)で入れます。

  • Xcode
    Xcode 15.4を使用しました。

  • Flutter
    stable チャネルの Flutter 3.24.3 を使用しました。

  • Dart
    Dart 3.5.3を使用しました。

  • IDE
    VS Code を使用しました。

  • iPhone
    iOS Simulator で問題ないですが、実機の方がリアルなので、おすすめです!

手順

プロジェクト作成

以下コマンドで my_first_apple_pay_app という名前のプロジェクトを作成します。

$ flutter create my_apple_pay_app

プロジェクトのディレクトリへ移動し、VS Code を開きます。

$ cd my_apple_pay_app && code .

pay パッケージをインストールします。

$ flutter pub add pay

Apple Pay を Apple Developer Account と XCode で使用するための準備

公式によると、以下の3つの手順を実施する必要があります。

To set up your Apple developer account and Xcode to implement Apple Pay in your apps, you complete three steps:

  • Create a merchant identifier.
  • Create a Payment Processing certificate.
  • Enable Apple Pay in Xcode.

merchant identifier を作成

公式を参考に、まずは merchant identifier を作成します。

merchant identifier とは、以下のことです。

A merchant identifier uniquely identifies you to Apple Pay as a merchant who is able to accept payments. A merchant identifier never expires, and you can use the same one for multiple apps.

簡単にいうと、ユーザがアプリ上で何かを売る時に、Apple Pay で支払いを受け付けるので、それに必要なIDです。

公式の以下のステップを実施します。

A merchant identifier uniquely identifies you to Apple Pay as a merchant who is able to accept payments. A merchant identifier never expires, and you can use the same one for multiple apps.

  1. In Certificates, Identifiers & Profiles, click Identifiers in the sidebar, then click the add button (+) on the top left.
  2. Select Merchant IDs, then click Continue.
  3. Enter the merchant description and identifier name, then click Continue.
  4. Review the settings, then click Register.

Certificates, Identifiers & Profiles > Identifier > Register a Merchant ID で作成します。

Merchant IDs を選択。

Description と Identifier を入力。

Register します。

作成完了です!

Payment processing certificate を作成

Payment processing certificate を作成します。以下の手順を実施します。

A payment processing certificate is associated with your merchant identifier and used to encrypt payment information. The payment processing certificate expires every 25 months. If the certificate is revoked, you can recreate it.

  1. In Certificates, Identifiers & Profiles, click Identifiers in the sidebar.
  2. Under Identifiers, select Merchant IDs using the filter on the top right.
  3. On the right, select your merchant identifier.
    Note: If a banner appears at the top of the page saying that you need to accept an agreement, click the Review Agreement button and follow the instructions before continuing.
  4. Under Apple Pay Payment Processing Certificate, click Create Certificate.
  5. Create a certificate signing request on your Mac, then click Continue.
  6. Click Choose File.
  7. In the dialog that appears, select the certificate request file (a file with a .certSigningRequest file extension), then click Choose.
  8. Click Continue.
  9. Click Download.
    The certificate file (a file with a .cer file extension) appears in your Downloads folder.

Certificates, Identifiers & Profiles > Identifiers に移動します。

右上のドロップダウンで Merchant IDs を選択します。

Apple Payment Processing はトランザクションデータを暗号化するために、証明書が必要です。証明書を作成します。

Apple Pay servers use the certificate’s public key to encrypt payment data. You (or your payment service provider) use the private key to decrypt the data to process payments.

Create Certificate > No を選択 > Continue

公式を参考に Certificate signing request を作成します。

Applications/Utilities/Keychain Access を開きます。

Keychain Access > Certificate Assistant > Request a Certificate from a Certificate Authority

User Email Address、Common Name を入力します。CA Email Addressは空欄でOKです。Saved to diskを選択して、 Continue をクリックします。

Algorithm と Key Size を ECC と 256bits に設定します。

作成したCertificate signing request を選択して Continue

右上からダウンロードします。apple_pay.cer というファイルがダウンロードされますので、完了後に KeyChain の Login に保存しておくいいです。

XCodeでApple Pay capability を許可

次に、XCode で Apple Pay capability を許可します。公式の以下の手順を実施します。

After creating a merchant identifier, enable the Apple Pay capability in your Xcode project.

  1. Open your project with Xcode. In the Project navigator, select the project.
  2. Choose the target for the app from either the Project/Targets pop-up menu or in the Targets section of the outline view.
  3. Click the Signing & Capabilities tab in the project editor.
  4. In the toolbar, click the Library button (+) to open the Capabilities library and select the Apple Pay capability.
  5. Within the Apple Pay capability, click the refresh button to synchronize your merchant identifiers from the Apple Developer site.
  6. Select the merchant identifier to use with this app.

プロジェクトを Xcode で開きます。

$ open ios/Runner.xcodeproj

Debug > ツールバーの右上の+ボタンで Capabilities を開く > Apple Pay を選択します。

Merchant ID を選択します。

これで下準備完了です。あとはコードを書いていきます。

コード実装

root 直下に assets/default_apple_pay_config.json 作成し、以下記載します。こちらのコードは pay パッケージから出ているサンプルを参考にしています。
merchantIdentifierdisplayName は変更してください。

default_apple_pay_config.json
{
  "provider": "apple_pay",
  "data": {
    "merchantIdentifier": "merchant.com.takuya.myapplepayapp", // 作成したMerchantIDを入力
    "displayName": "Takuya's Product",
    "merchantCapabilities": ["3DS", "debit", "credit"],
    "supportedNetworks": ["amex", "visa", "discover", "masterCard"],
    "countryCode": "US",
    "currencyCode": "USD",
    "requiredBillingContactFields": [
      "emailAddress",
      "name",
      "phoneNumber",
      "postalAddress"
    ],
    "requiredShippingContactFields": [],
    "shippingMethods": [
      {
        "amount": "0.00",
        "detail": "Available within an hour",
        "identifier": "in_store_pickup",
        "label": "In-Store Pickup"
      },
      {
        "amount": "4.99",
        "detail": "5-8 Business Days",
        "identifier": "flat_rate_shipping_id_2",
        "label": "UPS Ground"
      },
      {
        "amount": "29.99",
        "detail": "1-3 Business Days",
        "identifier": "flat_rate_shipping_id_1",
        "label": "FedEx Priority Mail"
      }
    ]
  }
}



pubspec.yaml にassetsを加えます。

pubspec.yaml
flutter:
  assets:
    - assets/

また、main.dart は以下のようにします。

main.dart
import 'package:flutter/material.dart';
import 'package:pay/pay.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

// これが支払い内容として表示される
const _paymentItems = [
  PaymentItem(
    label: 'Total',
    amount: '99.99',
    status: PaymentItemStatus.final_price,
  )
];

// default_apple_pay_config.jsonと同じ
const String defaultApplePay = '''{
  "provider": "apple_pay",
  "data": {
    "merchantIdentifier": "merchant.com.takuya.myapplepayapp",
    "displayName": "Takuya's Product",
    "merchantCapabilities": ["3DS", "debit", "credit"],
    "supportedNetworks": ["amex", "visa", "discover", "masterCard"],
    "countryCode": "US",
    "currencyCode": "USD",
    "requiredBillingContactFields": ["emailAddress", "name", "phoneNumber", "postalAddress"],
    "requiredShippingContactFields": [],
    "shippingMethods": [
      {
        "amount": "0.00",
        "detail": "Available within an hour",
        "identifier": "in_store_pickup",
        "label": "In-Store Pickup"
      },
      {
        "amount": "4.99",
        "detail": "5-8 Business Days",
        "identifier": "flat_rate_shipping_id_2",
        "label": "UPS Ground"
      },
      {
        "amount": "29.99",
        "detail": "1-3 Business Days",
        "identifier": "flat_rate_shipping_id_1",
        "label": "FedEx Priority Mail"
      }
    ]
  }
}''';

class MyHomePage extends StatelessWidget {
  const MyHomePage({super.key});

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Apple Pay Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ApplePayButton(
              paymentConfiguration:
                  PaymentConfiguration.fromJsonString(defaultApplePay),
              paymentItems: _paymentItems,
              style: ApplePayButtonStyle.black,
              type: ApplePayButtonType.buy,
              margin: const EdgeInsets.only(top: 15.0),
              loadingIndicator: const Center(
                child: CircularProgressIndicator(),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

Sandbox テスターアカウントを追加

実際のデバイスでテストカードを使用するには、Apple Developer にテスターアカウントを追加します。
こちらを参考に実施します。

ちなみに Sandbox とは、Apple Pay をテスト用のクレジット/デビットカードでテストするための環境のことです。

The Apple Pay sandbox environment allows merchants and developers to test their implementation of Apple Pay with test credit and debit cards. Currently the sandbox supports Apple Pay testing for:

Apple Pay を Sandbox でテストするためには、以下が必要です。

You’ll need the following to test Apple Pay in the sandbox:

  • iPhone 6 or later, iPad mini 3 or later, iPad Air 2, iPad Pro, or Apple Watch
  • App Store Connect sandbox tester account
  • Supported test credentials

こちらを参考に、テストアカウントを作成します。

To create a sandbox tester account, follow these steps:

  1. Sign in to App Store Connect.
  2. On the homepage, click Users and Access.
  3. Under Sandbox, click Testers.
  4. Click “+” to set up your tester accounts.
  5. Complete the tester information form and click Invite.
  6. Sign out of your Apple ID on all testing devices and sign back in with your new sandbox tester account.

App Store Connect へログインし、Users and Access をクリック

Sandbox > Add Test Accounts

Password と Region を入力し、作成する。

実機 iPhone での下準備

iPhone 上で、iCloud からサインアウトし、作成したテストアカウントでログインします。

こちらを参考に下記のテスト用クレジットカードをApple Payへ追加します。

3717 377570 42005
Expiration Date: Any
CID: 1111

後述つまずいた点でもあるように、以下をUSに設定します。

  • 実機の Region を US にする。
  • Shipping Address を US にする。

これで準備完了です!

iPhone 実機もしくは iOS Simulator でビルドする

実機ビルドはこちらを参考にしてください。

結果

無事実機でうまく動きました!

つまずいた点

iOS Simulator では ApplePayButton が表示されるが、実機では表示されないという事象が発生したので、こちらのStackOverflowの手順を実施したところ解消しました。

要するに、ロケーションを全て US に設定した方が良いということなので、それができていればOKです。最後まで手順を踏んでいれば、全て US で設定できてるはずです。

PR

アンドエーアイでは事業拡大のため、即戦力エンジニアを募集中!Flutterだけでなく、インフラ、Web、ネイティブ開発などの知識を持つ方も歓迎します。最新技術を追い、チームに積極的に貢献できる方をお待ちしています!

採用ページ
https://iwantyou.andai.net/

エンジニア採用ページ
https://iwantyou.andai.net/engineer

参考

https://developer.apple.com/documentation/passkit_apple_pay_and_wallet/apple_pay/setting_up_apple_pay#3735191
https://hassanannajjar.medium.com/how-to-use-apple-pay-with-flutter-87b56e654313
https://www.hungrimind.com/articles/flutter-apple-pay

アンドエーアイTechBlog

Discussion