公式ドキュメントの誤りがあってなかなか順調とは行かなかったPayPayのAPIを使った開発もひと段落しましたので決済から返金までの一通りの流れをソースコードと合わせて紹介します。
細かい説明は省いてとりあえず動くのに必要そうな情報だけ抜き出して紹介しています。
PayPay OPAを使用するにはPayPay for Developersの登録が必要です。
支払い(決済)
$client = new Client([
'API_KEY' => "APIキー",
'API_SECRET'=>"APIシークレットキー",
'MERCHANT_ID'=>'MERCHAND ID' //PayPay for Developers登録後、右上の「IN」から確認可能
],true);
$id = "12345678"; //一意の文字列。好きに決めてOK。
$price = 100; //決済金額
$name = "ドリリウム"; //好きな名前。PayPayアプリ等の決済画面に表示される。
$CQCPayload = new CreateQrCodePayload();
$CQCPayload->setMerchantPaymentId($id);
$CQCPayload->setRequestedAt();
$CQCPayload->setCodeType("ORDER_QR");
$OrderItems = [];
$amount = [
"amount" => $price,
"currency" => "JPY"
];
$OrderItems[] = (new OrderItem())
->setName($name)
->setQuantity(1)
->setUnitPrice($amount);
$CQCPayload->setOrderItems($OrderItems);
$CQCPayload->setAmount($amount);
$CQCPayload->setRedirectType('WEB_LINK');
$CQCPayload->setRedirectUrl('決済完了後のリダイレクト先URL');
$response = $client->code->createQRCode($CQCPayload);
if($response['resultInfo']['code'] === "SUCCESS"){
return $response['data']['url']; //このURLにアクセスすればPayPay決済可能
}
return false;
発行したURLを削除する場合には$response[‘data’][‘codeId’]が必要になるのでこっちも返してあげると良いかも。
キャンセルと返金
キャンセルと返金はそれぞれ異なる処理で、前者が決済から24時間以内、後者はそれ以降の決済に大して行うものです。
面倒くさいのでまとめて実装してキャンセルに失敗したら返金するようにしています。
$client = new Client([
'API_KEY' => "APIキー",
'API_SECRET'=>"APIシークレットキー",
'MERCHANT_ID'=>'MERCHAND ID' //PayPay for Developers登録後、右上の「IN」から確認可能
],true);
$id = "12345678"; //決済の時に自分で指定した一意の文字列。
$price = 100; //返金金額
$response = $client->payment->cancelPayment($id);
if($response['resultInfo']['code'] === "REQUEST_ACCEPTED"){
//キャンセル成功(決済後24時間以内の場合)
return true;
}else{
//キャンセル失敗したので返金処理
$response = $client->payment->getPaymentDetails($id);
$orderId = $response['data']['paymentId']; //返金処理には決済時にPayPayから自動的に発行されるPaymentIdが必要
if($orderId != false){
$RPPayload = new RefundPaymentPayload();
$RPPayload->setMerchantRefundId($id."_ref"); //返金処理用のIDを自由に決められる
$RPPayload->setPaymentId($orderId);
$amount = [
"amount" => $price,
"currency" => "JPY"
];
$RPPayload->setAmount($amount);
$RPPayload->setRequestedAt();
$RPPayload->setReason("Cancel");
$response = $client->refund->refundPayment($RPPayload);
if($response['data']['status'] === "CREATED"){
//返金成功
return true;
}
return false;
}else{
return false;
}
}
テスト決済
テスト用のAPIキーで実装した場合、決済にもテストユーザーが必要です。
PayPay for Developersに登録して数日もするとダッシュボードにテストユーザーという項目があるのでこちらからログイン用の電話番号とパスワードを取得します。
PayPayアプリを起動して、ログイン画面でPayPayロゴを7回タップすると開発者モードでログインできるようになります。