この記事の続きです。PayPay API を自分のアプリケーションで使うための準備やサンプルコード、使い方などはこちらを参照してください:
PayPay の API でアプリケーションに日本円での決済機能を実装する

こちらのエントリでは応用編というか、実際のアプリケーションの中で PayPay API を使って決済する際に意識することになるであろう事柄3点について考慮すべきポイントを紹介します。


1 作成した QR コードで実際に決済されたかどうかをアプリケーションから知る方法

前回の記事では簡単にウェブアプリケーションに PayPay による決済機能を組み込んで QR コードによる決済を実現することができる、という内容を紹介しました。ここまではよい、と。 ただ実際には QR コードを作成する所まではトラッキングできますが、作成した QR コードを使って決済が行われても、それは元のウェブアプリケーションの画面内で行われる決済ではないため「本当に決済までが行われた」のか、それとも「QRコードは表示されたけど、PayPay での決済は行われなかった」のかを識別する方法は別に考慮する必要があります。それをどうすればよいか、というのが実運用における最初のポイントです。

これは実は PayPay API 側で用意された機能を使うことで実現できます。前回の記事を参照いただくとわかるのですが、生成された QR コードを表示する際に以下のような JavaScript コードが実行されていました:
          :
          :
      success: function( result ){
        console.log( result );
        if( result && result.status && result.status == 201 && result.body && result.body.data ){
          var merchantPaymentId = result.body.data.merchantPaymentId; //. 支払いID(キャンセル時に必要)
          var codeId = result.body.data.codeId; //. QRコードID(QRコード削除時に必要)
          var url = result.body.data.url;  //. QRコードが表示されるページの URL

          if( url ){
            //. QRコードが表示されるページを別ウィンドウで開く
            window.open( url, 'PayPayWindow' );
          }
        }
      },
          :
          :

QR コードの表示は result オブジェクトの result.body.data.url の値を参照して、この値で示される URL を別ウィンドウで開くことで実現していました(別ウィンドウで開くため、これ以降の直接のトラッキングはできなくなっていました)。この時に取得できる result.body.data.merchantPaymentId という値を使って PayPay APIGetCodePaymentDetails 関数を実行すると、その QR コードのステータスを確認することができるのでした。ステータスを確認し、COMPLETED となっていればその決済は完了しており、そうでなければ完了していない、と判断できることになります。

より具体的にはこの merchantPaymentId をデータベースなどに保存しておいて、Webhook と使ったり、cron で定期的に確認したり、いずれも難しい環境下であっても例えば次回ログイン時などにステータスをチェックすることで決済の済/未済の判断ができるようになります。


2 作成した QR コードを「どのユーザーが」決済したかを判断する方法

1で QR コードが実際に決済されているかどうかを識別する方法を紹介しましたが、実運用においてはもう1点、その QR コードを「どのユーザーが」決済したのかを知る必要があります。これも決済そのものは簡単に実現してしまうのですが、別ウィンドウで開くページ内での決済のため、自分が作ったウェブアプリケーション内で決済ユーザーを識別するのが難しい、という問題を解決する必要があります。

こちらは少しコードを修正する必要がありますが可能です。現在のソースコードでは上述の merchantPaymentId をサーバーサイドで一意になるよう生成していますが、ここを変更し、クライアントサイドで「ユーザー名やユーザーIDを用いて merchantPaymentId を生成する(あるいはサーバーにユーザー ID を送信して、サーバーサイドでユーザー ID を用いた merchantPaymentId を生成する)ことで解決できそうです。つまり merchantPaymentId をただのランダムな文字列ではなく、(例えば頭にユーザーIDを付与するなどして)ここを見ることで誰が作成した QR コードなのかがわかれば、(1と合わせることで)誰が作成した QR コードが決済されたのか、も識別することができるようになります。


3 1回の QR コード決済で定期的な支払いをする方法

例えば月額課金のサブスクリプション型サービスと契約すると、毎月決まった額が引き落とされることになります。これを PayPay API の QR コード決済でも1回で実現できると、自分の作ったウェブアプリケーションのサブスク化ができるようになって便利だと思っています。

が、実はこの内容だけは現時点で実現の目処が立っていません。そもそも QR コードで分割払い契約って可能なんだろうか・・・

PayPay API や SDK のドキュメントも見ているのですが、なんとなく「現時点では未対応」なような気もしています。サブスクだと「解約」処理も必要になると思うのですが、そういう API も見当たらないような・・・ 今の時点においては毎月 QR コードを作って、その都度払ってもらう以外の方法はないのかもしれません(情報/アイデア求む)



というわけで、PayPay API を使うことでウェブアプリケーションに決済機能を簡単に付与することができるのですが、実運用までを意識すると、ここに挙げた3点についても考慮して設計・実装する必要があると思っています。ただ3番目の定期支払いはなんとか1回の処理で実現したり、それを途中で解約するような具体的な方法ないかなあ。。。