コロナ禍になってEコマースが成長していたり、アプリ内課金の仕組みが変わろうとするなど、決済を巡る動きが加速しています。
Web決済と言えばPayment Request APIが有名ですが、この記事ではその実装や技術的な解説を行います。
Payment Request APIでできること、できないこと
Payment Request APIは、Webブラウザ内に保存されている決済情報を取得できるAPIになります。
取得できる情報は次の通りです。
- 決済情報
- 配送先住所
- 決裁者の名前やメールアドレス
つまり、Payment Request APIで取得できるのは単純な決済情報だけになります。実際の決済は別途システム側で行う必要があります。
クレジットカード情報は取得できなくなります
Google Chrome 100より、決済情報取得の際に利用していた basic-card
が指定できなくなります。従来、この指定でカード情報が取得できていましたが、セキュリティやユーザ体験として課題があるため、使えなくなります。iOS版Chromeでは、この変更に伴ってPayment Request API自体利用できなくなっています。
Google Developers Japan: iOS 版 Chrome の Payment Request を再考する
決済種別について
basic-cardを使ったカード情報が取得できなくなりますので、別途指定が必要になります(W3C標準である点は変わっていませんが、ブラウザがサポートしなくなると使えないのと同義でしょう)。それがPayment Method Identifierです。
たとえば、Google Payを指定する場合には https://google.com/pay
を指定します。
他に、下記の決済が知られています。
- Apple Pay:
https://apple.com/apple-pay - Samsung Pay:
https://spay.samsung.com/
なお、新しい決済に対応させる場合には3つのファイルが必要になります。詳細はPayment Request APIに独自の支払い方法を追加する | フロントエンドBlog | ミツエーリンクスを参照してください。
実装方法について
Payment Methodsの作成
たとえばGoogle Payに対応する場合です。
まず利用する決済情報を指定します。
const data = {
environment: "TEST",
apiVersion: 2,
apiVersionMinor: 0,
merchantInfo: {
merchantId: "12345678901234567890",
merchantName: "Example Merchant"
},
allowedPaymentMethods: [{
type: "CARD",
parameters: {
allowedAuthMethods: ["PAN_ONLY", "CRYPTOGRAM_3DS"],
allowedCardNetworks: ["JCB", "MASTERCARD", "VISA"]
},
tokenizationSpecification: {
type: "PAYMENT_GATEWAY",
parameters: {
"gateway": "example",
"gatewayMerchantId": "exampleGatewayMerchantId"
}
}
}]
};
const paymentMethods = [{
supportedMethods: "https://google.com/pay",
data,
}];
商品情報を定義する
購入する商品情報を定義します。
const details = {
displayItems: [
{label: "商品1", amount: {currency: "JPY", value: "1000"}},
{label: "商品2", amount: {currency: "JPY", value: "2000"}},
{label: "商品3", amount: {currency: "JPY", value: "3000"}},
],
total: {label: "小計", amount: {currency: "JPY", value: "6000"}}
};
返却して欲しい情報を定義します。
const options = {
requestShipping: true, // 配送先住所を要求
requestPayerEmail: true, // メールアドレスを要求
requestPayerName: true, // 決済者名を要求
requestPayerPhone: true, // 決済者の電話番号を要求
};
PaymentRequestを作成、表示する
必要な情報を作ったら、PaymentRequestを作成して表示します。
const request = new PaymentRequest(paymentMethods, details, options);
const result = await request.canMakePayment();
const response = await request.show();
// この下でレスポンス情報を使って決済処理を行います
// 完了したらcompleteを呼びます
response.complete("success");
responseは利用するプロバイダーによって異なります。detailsにカード情報が入ってきたり、shippingAddressに住所が返ってきたりします。これは開発する際に確認してください。
役立つ情報
Google Payを使う場合、参考にしたい公式ドキュメントはこちらです。
Google Pay API PaymentRequest チュートリアル | Google Developers
Apple Payを利用する際のデモはこちらです。Payment Request APIも対象となっています。
Monacaでの利用について
Payment Request APIはHTTPS環境のみ、かつWkWebViewでは利用できないので、注意してください。Apple PayやGoogle Payが利用できるCordovaプラグインの利用を検討してください(※プラグインはサポート対象外です)。
なお、Payment Request APIにて新しい決済を追加する場合にはmanifest.jsonやService Workerが必要になります。つまり、PWA(Progressive Web Apps)である必要があります。MonacaではPWAアプリも開発できますので、PWAとして開発する場合にはPayment Request APIが利用できるでしょう。
まとめ
決済周りは強固なセキュリティが求められる反面、なるべくユーザの負担が小さい仕組みが求められます。カード番号の漏洩などは事業上のリスクに直結しますので、なるべくWeb標準の仕組みに沿っておく方がサービス提供側、利用側双方にとって安心できるものになるでしょう。