決済サービスのPAY.JPが使いやすかった

PAY.JPはクレジット決済やクレジット定期課金を簡単にアプリやサイトに導入できるサービス。
ドキュメントがよく整備されててだいたいドキュメントを読めば解決する。

決済サービスは色々とあるのでベストなのかは分からないが、ほかに使ったことあるGMO-PGなんかに比べると断然シンプルで使いやすい。
GMO-PGは対応している支払い方法がたくさんあるというメリットがある(それが実装が複雑になるデメリットの元でもある)が、クレジットのみで良ければGMO-PGを選ぶ理由はないかと。

実装例

カード情報の入力フォーム

カード情報入力フォームは以下のタグを埋め込めば良い。

<script src="https://checkout.pay.jp/" class="payjp-button" data-key="{{payjp_pubkey}}"></script>

iframeのモーダルなカード情報の入力フォームが出てきて、ユーザーはそこにカード情報を入力する。
カード情報はPAY.JPのサーバーに送られて、PAY.JPのサーバーからはカード情報に紐付くトークンが返って来て、フォームのpayjp-tokenというhiddenフィールドに入る。

こちら側はまったくカード情報をハンドリングする必要が無くて安心。

支払い

Pythonのコードで。

customer = payjp.Customer.create(email=request.form['email'], card=request.form['payjp-token'])

r = payjp.Charge.create(
    customer=customer.id,
    currency='jpy',
    amount=request.form['billing_amount'],
    description='hogehoge'
)

通信エラーの可能性などあるので実際はエラー処理をきちんとする。

定期課金

customer = payjp.Customer.create(email=request.form['email'], card=request.form['payjp-token'])

r = payjp.Subscription.create(
    plan='my_subscription_plan_id',
    customer=customer.id,
)

これも実際はエラー処理をきちんとする。

定期課金のプラン(Plan)をPAY.JPの管理画面で作っておき、そのIDを指定することで定期課金を作成できる。

サポートに聞いたところ定期課金は課金日の9:00を目安に実行されるとのこと(ただし確実に9:00と保証するものではない)
課金が行われたらウェブフックでこちらの用意したエンドポイントに通知を受け取ることもできるので、それをトリガーにこちら側でも何らかの処理を行うことが可能。

一律の課金日を設けたりトライアルの設定をすることもできる。

なおプランの料金は税込み&途中で変えられないので、消費税が上がると新しいプランを作って定期課金との紐付けを全部付け替える必要があるよ。なんもかんも政治が悪い。

管理コンソール

管理コンソールもよくできていて、返金なども簡単にできる。

イレギュラー処理はこちらで作り込まなくてもとりあえずそっちでなんとかなるかんじ。
もちろん作るシステムの規模感にもよるが、スタートの立ち上がりを早くしたい場合などには助かる。

安定性など

開発したサイトの運用には関わってないので未評価。
しばらく経ったら聞いてみたい。

競合について

同じように簡単導入できる決済サービスだとStripeが今のところ一強らしい。

草分けのWebPayもLINEに買収された末にまさか無くなってしまったし、一時期話題になっていたSPIKEも間もなくサービス終了と言うことで割と新陳代謝があるので、サービス選択の際の判断は悩ましい。

参考: Stripe決済を自社サービスに導入してわかった5つの利点と2つの惜しい点

ちなみに導入を決めた人に聞いたところ、競合を比べた上でPAY.JPを選択した理由としては実装のしやすさ、日本語サポート、手数料の安さ、運営元のBASEが他に事業の柱を持っていることなどが決め手となったとのこと。

PayPalやGMO-PG、ソフトバンクペイメントなど古くからある決済サービスはちょっと導入の実装難度が高いので、同じ決済サービスでも少しカテゴリーが違うのかな?
クレジット決済のみなら選ぶ理由はないが、決済手段の多彩化やバックヤードとの統合を考えるとそちらの方がいいケースも考えられる。