Web Apple Payの導入で苦戦した話

# Web Apple Payの導入で苦戦した話

## はじめに
こんにちは。ナビタイムジャパン トラベル開発の T.K です。

最近、多くのキャッシュレス決済アプリが登場して来ています。
そこで弊社でも、ユーザに使い易いサイトを目指すために
クレジットカード以外にWebでの決済を増やしています。

その決済追加の中でも、苦労したApple Payの導入について、今回お話したいと思います。

## 対象読者
* クレジットなどの決済を持ち合わせている方
* Apple Payの導入検討・開発をしている方
    * 認証に苦戦している
    * Javaでうまく動かない
* 認証から、tokenの取得までを記載しています


## 対象としない範囲
* DBやJavaの設計などの詳しい内容は記載しません。
* Apple Payを使用できる決済会社と契約された事を前提に進めております。

## 目次
* 決済にいたる通信方式
* SandBoxの設定
* Apple Developerへの登録
* 開発
* Apple Pay導入したサイト


## 決済にいたる通信方式
まず、第一に苦戦したのが、決済にいたる通信方式でした。
クレジット会社同様、１つの会社に通信をし、完結すると思っていました。
ですが、Apple Payなどの決済方式ではApple Payの会社と決済代行会社の２つに通信を走らせる必要があります。

<img width="1006" alt="applepay-certificate.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426335/5b1f40b7-981e-458b-5746-b8665a33462f.png">

## SandBoxの設定
次にSandBoxの設定です。
Apple PayはiPhoneにクレジットカードを紐付けて使用します。
ですが、開発の時に自身のクレジットカードを紐付けると危険です。

そのため、Appleでは検証用のクレジットカードが用意されています。
開発の際は[こちら](https://developer.apple.com/apple-pay/sandbox-testing/)を参考にして使用してください。

悩んだポイント
* Apple DeveloperのサイトでSandBoxのメール登録が必要です。
　権限により表示されない場合があるので注意
* SandBoxに登録するメールはiTunesやApp Storeに一度も登録していない物が必要です。
　Googleで新しく作る事をおすすめします。

## Apple Developerへの登録
Apple Payサーバにアクセスする際にAppleと決済代行会社との認証が必要です。
決済代行会社の違いによって若干登録方法が異なる場合があります。ご了承ください。

Appleサイトのリニューアルもあり、ここが一番悩まされた部分です。
この登録は下記の5つに分けることができます。

1. MerchantIdの追加
2. CSRファイルを登録
3. Merchant Domainsの登録
4. Apple Pay Merchant Identity Certificateの登録
5. P12ファイル作成 

### MerchantIdの追加
[Apple Developer](https://developer.apple.com/account/)でmerchantIDを作成します。
merchantIDは決済代行会社から提供されている場合はそちらを登録してください。
これを登録することでAppleが決済した企業情報を判別できます。

1. [Apple Developer](https://developer.apple.com/account/)の「Certificates, Identifiers & Profiles/Identifiers/Merchant IDs」に遷移
2. Identifiersの「+」を押下し、「Merchant IDs」を選択、IdentifierにmerchantIdを登録。

悩んだポイント
* 「Apple DeveloperのIdentifiers」に登録権限がない際は「App Manager, Customer Support, Sales, Developer」の付与を試してみてください。
* 「Identifiers/Edit or Configure Merchant ID」に権限がない際は「アカウントホルダー」のアカウントから同意が必要です。一番強い権限を持っている方に権限を付与してもらってください

### CSRファイルを登録
決済代行会社とAppleを紐付けるために決済代行会社のCSRファイルをApple Developerに登録します。

1. Apple Developerで作成したMerchantIdから、「Apple Pay Payment Processing Certificate」に決済代行会社から提供されたからCSRファイルを登録
2.  1から「apple_pay.cer」をダウンロードし、決済代行会社に登録してもらいます。

悩んだポイント
* 2の内容を知らずに開発を行っていた所、Appleで提供されたTokenが拒否されました。追加を忘れずに。


### Merchant Domainsの登録
Apple Pay決済を導入するサイトドメインを登録します。
複数ドメインがある場合は各ドメインで登録が必要です。

1. [Apple Developer](https://developer.apple.com/account/)の「Merchant Domains」にドメインを登録します。
2. 登録後、「apple-developer-merchantid-domain-association.txt」をダウンロードすることができます。それを登録したドメインのサイトに配置します。今回は「hoge」配下に配置します。
3. apacheの設定から、下記を設定し、「/.well-known/apple-developer-merchantid-domain-association.txt」を叩くと、「apple-developer-merchantid-domain-association.txt」の中身が表示される様にします。

```
RewriteRule ^/.well-known/apple-developer-merchantid-domain-association.txt /hoge/apple-developer-merchantid-domain-association.txt [L]
```
4. Verifyを押下することで、認証が完了します。１度登録すれば、２年間有効です。

ポイント
* 検証環境などだと、Basic認証などで通信制限している場合があります。
　通信制限があると認証できないのでAppleのIPを通す様に設定してみてください。

### Apple Pay Merchant Identity Certificateの登録
Appleサイトの最後の登録です。
1. 以前作成した「apple_pay.cer」を使用し、キーチェンアクセスで「CertificateSigningRequest.certSigningRequest」ファイルをします。([参考](https://mushikago.com/i/?p=8200))
2. 作成された「CertificateSigningRequest.certSigningRequest」ファイルをAppleDeveloperの「Apple Pay Merchant Identity Certificate」に登録します。
3. 登録後、「merchant_id.cer」をダウンロードすることができます。

### P12ファイル作成 
P12ファイルは開発でのクライアント認証で使用します。
「merchant_id.cer」から「ApplePayMerchantIdentity.p12」をキーチェンアクセスで作成します（[参考](https://mushikago.com/i/?p=8200)）

## 開発
開発は[こちら](https://github.com/norfolkmustard/ApplePayJS)のGitHubを参考に開発を行いました。
Appleが提供しているApplePay.jsを使用して、Tokenを取得することができます。

開発ではjavaでクライアント認証する事に悩みました。
GitHubサイトに記載のある「apple_pay_conf.php, apple_pay_comm.php」はphpで記載があり、javaでのApple Pay導入の参考サイトがあまり見つかりませんでした。

Javaでのクライアント認証ではphpで使用しているpemは使用することができません。
なので、以前作成したp12ファイルを使用して行います。

[こちら](http://yotama.hatenablog.com/entry/2014/09/14/010759)のサイトを参考にJava作成すると認証が通り、Apple Payのtokenを使用することができます。

こちらのtokenを決済代行会社のAPIを使用することでApple Payの決済ができる様になります。

## その他悩んだポイント
### JDKのバージョン
Javaクライアント認証時、レスポンス情報を取得できるのですが、
なぜかある環境のみ表示されない現象が起きてしまいました。

差分を確認した所、JDKの差分が理由でした。
もし、動かなかった際はJDKのバージョンを上げてみてください。

## Apple Pay導入したサイト
今回LCC,ホテルのSPページにApple Payの導入をしました。
参考にして頂ければと思います。
https://travel.navitime.co.jp/ja/booking/?reserveType=lcc&cid=qiita.article
https://travel.navitime.co.jp/ja/booking/hotel?cid=qiita.article

## まとめ
長文を最後までお読みいただき、ありがとうございます。
Apple Payの導入では登録・認証周りでとても時間がかかりました。
この記事で多くの方々が決済導入をスムーズに導入できればと思います。