PayPayManager.php 7.78 KB
<?php
// =============================================================================
// PayPayマネージャ
// =============================================================================
require_once(__DIR__ . '/composer/vendor/autoload.php');
include(__DIR__ . "/constants.php");

use PayPay\OpenPaymentAPI\Client;
use PayPay\OpenPaymentAPI\Models\CreateQrCodePayload;

class PayPayManager {

  private $client = null;

  // =======================================================
  // コンストラクタ
  // =======================================================
  public function __construct ($api_key, $api_secret, $merchant_id) {
    $this->$client = new Client([
      'API_KEY' => $api_key,
      'API_SECRET' => $api_secret,
      'MERCHANT_ID' => $merchant_id
    ], PAYPAY_IS_STAGING); //Set True for Production Environment. By Default this is set False for Sandbox Environment.
    // ドキュメンのミス?
  }

  // =======================================================
  // コード作成
  // https://developer.paypay.ne.jp/products/docs/appinvoke#dynamic-qr-codeid
  // アプリコールを使用して支払いを受け取るには、まずコードを作成する必要があります。
  // $merchant_payment_id string(64) : 加盟店から提供された一意の支払い取引ID
  // $price integer(11) : 支払金額
  // $user_agent string(?) : トランザクションの発生元であるWebブラウザーのUser Agent
  // =======================================================
  public function create_code ($merchant_payment_id, $price, $user_agent) {
    // setup payment object
    $CQCPayload = new CreateQrCodePayload();

    // Set merchant pay identifier
    $CQCPayload->setMerchantPaymentId($merchant_payment_id);

    // Log time of request
    $CQCPayload->setRequestedAt();
    // Indicate you want QR Code
    $CQCPayload->setCodeType("ORDER_QR");

    // TODO 明細情報
    // Provide order details for invoicing
    // $OrderItems = [];
    // $OrderItems[] = (new OrderItem())
    //     ->setName('お食事代')
    //     ->setQuantity(1)
    //     ->setUnitPrice('amount' => 20, 'currency' => 'JPY']);
    // $CQCPayload->setOrderItems($OrderItems);

    // Save Cart totals
    $amount = [
        "amount" => $price,
        "currency" => "JPY"
    ];
    $CQCPayload->setAmount($amount);
    // Configure redirects
    $CQCPayload->setRedirectType('WEB_LINK');
    $CQCPayload->setRedirectUrl(PAYPAY_REDIRECT_URL);

    // User Agent
    $CQCPayload->setUserAgent($user_agent);

    // Get data for QR code
    $response = $this->$client->code->createQRCode($CQCPayload);

    return $response;
  }

  // =======================================================
  // コード削除
  // https://developer.paypay.ne.jp/products/docs/appinvoke#delete-qr-codeid
  // 生成したコードを削除したい場合こちらを利用ください。 このAPIを使用する理由として、次のことが考えられます。
  // ユーザーが注文をキャンセルした場合
  // ユーザーがPayPayアプリを開いて支払いを行わず、競合状態が発生しない目的でコードを削除する場合
  // 処理を実施する場合には、以下のパラメーターを使用してリクエストしてください。
  // $code_id string(?) : `Create a Code`メソッドのレスポンス値に含まれます。
  // =======================================================
  public function delete_code ($code_id) {
    // Calling the method to delete a QR Code
    $response = $this->$client->code->deleteQRCode($code_id);

    return $response;
  }

  // =======================================================
  // 決済情報取得
  // https://developer.paypay.ne.jp/products/docs/appinvoke#fetch-qr-code
  // 決済情報について参照をすることができます。このAPIを利用し決済が完了しているか確認してください。`create a code`の支払いプロセスは非同期で行われるため、このAPIをポーリング実装する必要があります。以下のパラメーターを設定することで、決済情報を参照することができます。
  // $merchant_payment_id string(64) : 加盟店から提供された一意の支払い取引ID
  // =======================================================
  public function get_payment_details ($merchant_payment_id) {
    // Calling the method to get payment details
    $response = $this->$client->payment->getPaymentDetails($merchant_payment_id);

    return $response;
  }

  // =======================================================
  // 決済取り消し
  // https://developer.paypay.ne.jp/products/docs/appinvoke#cancel-payment
  // 決済をキャンセルしたい場合にこちらを利用ください。通常の決済フローでは基本的には、`Cancel a payment`を使いませんが以下の場合に利用ください。
  // --Polling for Get Payment Details timeout, and you are uncertain of the status
  // 注:`Cancel a payment`は、支払いが行われた翌日の00:14:59まで使用できます。 00:15 AM以降の場合、`Refund a payment`を呼び出して支払いを払い戻します。
  // $merchant_payment_id string(64) : 加盟店から提供された一意の支払い取引ID
  // =======================================================
  public function cancel_payment ($merchant_payment_id) {
    // Calling the method to cancel a Payment
    $response = $this->$client->payment->cancelPayment($merchant_payment_id);

    return $response;
  }

  // =======================================================
  // 払い戻し処理
  // https://developer.paypay.ne.jp/products/docs/appinvoke#refund-payment
  // 決済が正常に完了しユーザーへの商品の提供後に、返品する場合に`Refund a payment`を使用ください。タイムアウトやシステム的なエラーが出て、決済処理を中止する場合には、`Cancel a payment`を活用ください。主要な項目を以下に記載しますので、以下のパラメーターを使用してリクエストしてください。
  // 
  // $merchant_refund_id string(64) : 加盟店から提供された一意の払い戻し取引ID
  // $payment_id string(64) : PayPayが決済後に発番する取引ID
  // $amount integer(11) : 返金金額
  // $reason string(255) : 返金理由
  // =======================================================
  public function refund_payment ($merchant_refund_id, $payment_id, $amount, $reason) {
    // Creating the payload to refund a Payment, additional parameters can be added basis the API Documentation
    $payload = new PaypaySdk/Payload();
    $payload->set_merchant_refund_id('merchant_refund_id');
    $payload->set_merchant_payment_id('paypay_payment_id');
    $amount = [
        "amount" => 1,
        "currency" => "JPY"
    ];
    $payload->set_amount($amount);
    $payload->set_reason("Reason for Refund");

    // Calling the method to refund a Payment
    $response = $this->$client->refund->refundPayment($payload);

    return $response;
  }

  // =======================================================
  // 払い戻しのステータスと詳細を取得する
  // https://developer.paypay.ne.jp/products/docs/appinvoke#fetch-refund-payment
  // 返金処理(`Refund a payment`)がタイムアウトをした場合には、このAPIを利用ください。処理を実施する場合には、以下のパラメーターを使用してリクエストしてください。
  // $merchant_refund_id string(64) : 加盟店から提供された一意の返品取引ID
  // =======================================================
  public function fetch_refund_status_and_details ($merchant_refund_id) {
    // Calling the method to get Refund Details
    $response = $this->$client->refund->getRefundDetails($merchant_refund_id);

    return $response;
  }
}
?>