PayPalのDelayed Chained Paymentを使って仲介サービスのようなものをやる(下準備)

友達から「暇だったらちょっと手伝って」と言われてPayPalAPIを触ってみたのでメモ書き。
友達のやりたかったことは、下のような感じ

前提:役割

  • 下記の役割がいたとして。
    1. サービス:サービスを提供する人
    2. 管理者:イベントの管理者
    3. 参加者:イベントの参加者

やりたいこと

  • 管理者はあるイベントを登録できる
  • 管理者はイベントに参加料金を設定することができる
  • 参加者はイベントに対して、参加料金を支払うことができる
  • イベントが実施されなかった場合、参加料金を返金することができる

で、全然PayPalAPIを知らなかったのだけど、その友達がMA6関連のMTL Live 10/06(1h51m辺りから発表)で直接PayPal担当の人と聞いたみたいで(多分だけど)、
そこで「Chained Paymentsってのでできるらしい」という情報を教えてくれた。



動画見るとわかるけど、PayPalAPIを調べるためにはx.comという所に行けばいい。
そこにはドキュメントやらSDKやらサンプルコードやらたくさんいろんなものがあります。
APIのドキュメントのPDFを見ると、最後の方にcurlで実行したサンプルあったりして「とりあえず触ってみようかな」って気になれます。



さて。
まず、PayPalAPIを使うためには以下の3つが必要。

  • API Username
  • API Password
  • Signature

この3つを取得するためには、developerページに行き、
左メニューのAPI Credentialsをクリックすればいい(はず。どうやったか忘れてしまった。)



次に、PayPalAPIを使ってお金の支払いを試せるsandboxのテストアカウントを取得。
今回のDelayed Chained Paymentでは3人の登場人物が必要なので3人分取得。
これは左メニューのTest AccountsからPreconfiguredリンクでポチポチ作っていけばいい。
日本円は作れないようなのでUnited Statesで適当に$を積んであげる。

こんな感じで3つ作る。
Verifiedになっていないと支払いができないので、sandboxからログインするなりしてverifiedにする。
(ログインしたら上メニューの辺にverifiedにするためのリンクがあると思う)



ここまでできたらDelayed Chained Payment APIの流れを確認する。
Chained Payment APIの機能は数ヶ月前にできた機能らしく、
簡単に言うと、「支払いを複数の相手に簡単にできる」というものみたい。
Delayed Chained Paymentはその特別な場合で、

  1. まず、あるユーザ(primary)に支払いを行う
  2. そのユーザのお金の一部を90日以内に別のユーザ(secondary)に動かす

というもの。
まさに今回やりたかったことでした。



今回のやりたいことをDelayed Chained Payment APIで行うと以下のような流れになります。

  1. [Pay API]Delayed Chained Paymentを実行するためのリクエストを投げる
  2. レスポンスでpayKeyというのが返ってくるので、それを付加したした以下のようなURLを参加者に投げる
  3. [ブラウザ]参加者はブラウザでPayPalにログインして支払いにOKを出す
    • この時点でサービス(Primary)に支払いが起こる
  4. [ExecutePayment API]90日以内に同じpayKeyを使ってリクエストを投げる
    • この時点で管理者(Secondary)に支払いが起こる

例えば管理者が参加者に100円払わそうとしていて、サービスが10円を間引く場合、
サービスに一度100円が支払われ、その後サービスから管理者に10円が動くことになります。
PayPalの手数料が0円の場合です)
Delayed Chained Paymentの詳しい流れはx.comに書いてあります



ということで、実際にDelayed Chained Payment APIを使うためにサンプルコードを触ってみます。
はじめはperlのサンプル使ってやったんですけど、なぜかエラーったので、
手軽にphp使って実行してみました。



まずサンプルコードのページに行き、
Adaptive PaymentsのNVP(keyとval渡すだけのAPI)のphpをダウンロード。
解凍して、Payment/multi_chained_nonimplicit_paymentに入ってparams.iniを修正する。

  • [HEADERS]の項目(HTTPヘッダの内容)
    1. X-PAYPAL-SECURITY-USERID
    2. X-PAYPAL-SECURITY-PASSWORD
    3. X-PAYPAL-SECURITY-SIGNATURE

これらにdeveloperページで取得したそれぞれの値を入力。

  • [BODY]の項目(POSTDATAの内容)
    1. actionTypeのPAYをPAY_PRIMARYに変更
    2. feesPayerは手数料を払わせるユーザなのでPRIMARYRECEIVERとか適当に変える
    3. senderEmailに参加者となるユーザのメールアドレスを入れる
  • [RECEIVER]の項目(POSTDATAの内容。Primaryが0、Secondaryを1とする)
    1. primary0にtrue
      • primary1にfalse
    2. email0にサービスとなるメールアドレス
      • email1に管理者となるメールアドレス
    3. amount0に参加者が支払う金額(Primaryが最終的に受け取る金額ではなく、「はじめに」受け取る金額)
      • amount1に管理者が受け取る金額

この修正後にpay.phpを実行すればpayKeyが返ってきます。
pay.phpの出力がURLになっていると思うので、それをブラウザで確認すると参加者のログイン画面が出ます。
参加者がログインして支払いを実行するとPrimaryに支払いが行われます。
amount0を$10に設定した場合は$0.45の手数料が引かれた$9.55がPrimaryに支払われます。
(元々のPrimaryの持ってたお金は$500)




次にpayKeyをPOSTDATAにしてExecutePayment APIを実行する。
HTTPヘッダの中身は変えず、POSTDATAは以下の3つだけあればいい。

  • payKey
  • requestEnvelope.errorLanguage
  • requestEnvelope.detailLevel

amount1を$5にした場合、このリクエスト実行後にSecondaryに$5が支払われる

(feesPayerをPRIMARYRECEIVERにしてるので手数料はPrimaryが被ってる)




キャンセルした場合とか、払戻しした場合とか、そういう処理についてはまだ調べてないけど、
とりあえずsandboxでお金が動いたのが楽しかったです。