兵庫県三田市でホームページ制作をしているゴリラドットです。

今回のはかなりコアでニッチでどこに需要あんねん、という話。

PAY.JPっていう決済サービスをPHPで実装するときのサンプルで出てくる、「POST支払い処理を確定する」とか「capture()」てなんなの?というのを調べてみた。という書いててもなんのこっちゃ、という内容なのである。

 

さあいこう。

 

原則captureは不要

https://github.com/payjp/payjp-php/blob/master/RequestExample.md

 

ここにPHPでPAY.JPを使う例が載ってる。…んだけれど使わせる気あるの?というくらいよくわからない。一番上の例の「POST支払いを作成」のあとにこの支払いを確定するcaptureしないとクレジットカード決済できないの?と思いがちだけれど、

 

原則capture()はしないでいい。しなくても支払いが完了する。

 

基本的にPAY.JPでクレジットカード決済をするときは、「POST支払いを作成」のところにある、

 

\Payjp\Payjp::setApiKey('sk_test_c62fade9d045b54cd76d7036');
$charge = \Payjp\Charge::create(array(
  'card' => 'token_id_by_Checkout_or_payjp-js',
  'amount' => 2000,
  'currency' => 'jpy'
));

 

これをするだけで決済がぜんぶ完了する。

繰り返しになるけど、POST支払い処理を確定するのとこに書いてある、retrieve()してcapture()して、みたいなのはいらない。

 

\Payjp\Payjp::setApiKey("sk_test_c62fade9d045b54cd76d7036");

$ch = \Payjp\Charge::retrieve("ch_fa990a4c10672a93053a774730b0a");
$ch->capture();

↑これいらない

 

んじゃなんでこんな例が?

とりあえずcapture()を呼ばなくてもcreateするだけでクレジットカード決済が完了することが分かって安心、…なんだけれどもならなんでこんな混乱するようなcapture()みたいなAPIがあるの?というのが次の疑問。

ここから下は気になる人だけ読んで欲しい。

 

支払い確定を遅らせられる

クレジットカード支払い、今まで知らなかったけど内部的に2つのステップがある。

  1. オーソリ
  2. ホントの支払い

という2ステップ。

オーソリっていうところでこのクレジットカードで支払うための”枠”を確保しているらしい。これからこのクレジットカードで○○円払うよ!っていう宣言みたいな感じ。

そしてこのオーソリがうまくいくとクレジットカードの限度額からひかれるっぽい。でもまだ支払ってないという、半支払い完了みたいなイメージだと思う。

ちょっと違うけどスーパーとかで買うかわからんけど在庫なくなると困るからとらいえず買い物カゴに入れとく的なのがオーソリ、なんだろう。

 

話が長くなったけど、PAY.JPのcreateを普通に呼ぶと「①オーソリ」「②ホントの支払い」の両方をまとめてしてくれる。だからcreate呼ぶだけでクレジットカード決済が全部終わる。

ただPAY.JPも「①オーソリ」だけやって「②ホントの支払い」は後から、っていう処理もできる。

 

やり方はcreateするときに「'capture' => false,」を追加するだけ。下の例でamountの下に追加したのがそれ。

 

\Payjp\Payjp::setApiKey('sk_test_c62fade9d045b54cd76d7036');
$charge = \Payjp\Charge::create(array(
  'card' => 'token_id_by_Checkout_or_payjp-js',
  'amount' => 2000,
  'capture' => false,
  'currency' => 'jpy'
));

 

これでオーソリだけ状態になる。いっぺんテストでやってもらうと下の画像みたいな感じでPAY.JP管理画面の「売上」内に「認証済み」のやつが追加される。

(※普通は「認証済み」じゃなくて「支払済み」になる)

 

これで「①オーソリ」だけできた状態。

ここまで来てやっと出てくるのが、例の「POST支払い処理を確定する」。オーソリだけしてあるやつに対しretrieve()してcapture()をしてやれば「支払済み」になる。

 

…んじゃそう書いてほしい。

ちなみに上記画像の「売上確定」を押してもretrieve()してcapture()と同じことができるんで、プログラムでねちねちしなくても手動で「支払済み」にすることができる。

 

まとめ

PAY.JPをPHPで利用するときの、よくわからないAPI使用例「POST支払い処理を確定する」について書いた。

PAY.JPでは基本的にcreateするだけでクレジットカード決済が完了するからすごい楽で、そもそもこの「POST支払い処理を確定する」は使わなくていい。

createだけでオーソリと支払いの確定を両方ともやってくれる。

 

ただオーソリだけしてその後支払いを確定させたい場合は、その確定させるタイミングで「POST支払い処理を確定する」の処理をする必要がある。

そういう風にかいてくれればいいのにな。