【PHP】PayPalをアプリに組み込む方法【SDK】

サービス

【PHP】PayPalをアプリに 組み込む方法【SDK】

どうも、えんつかです!
PayPalのSDKを利用してアプリに組み込むことをやってみました。せっかくなのでやり方を残していきます!どなたかの参考になれば嬉しいです!

これができると個人アプリに月額課金システムを作れたり、1週間の無料トライアルを入れてみたりができちゃいます!!個人でサービス展開ができちゃいます。素晴らしい!

なお、こちらの記事はローカルで試して動作していますが、本番サーバーにあげて試しておりません。また、こちらの記事を利用して発生した損害等の責任は取れないので、実際に利用する場合は各個人でしっかりと動作検証してくださいませ!その点はご承知置き下さい…!!

【PHP】PayPalをアプリに組み込む方法【SDK】

全体構成としては次のような感じです。

  1. PayPalのSDKをダウンロード
  2. SDKの読み込み・設定
  3. PayPalアカウントの作成とAPI情報取得
  4. SDKの読み込み・設定続き
  5. テストアカウントを作成して、テスト決済をしよう
  6. 契約締結処理
  7. 決済処理の確認

作成するファイルは、「PayPal SDKの設定するファイル(paypalConfig.php)」と「決済へ移行するためのファイル(billing.php)」と「決済条件を設定するファイル(billingPlan.php)」の3種類を作成していきます。paypalConfig.phpとbillingPlan.phpは設定ファイル、billing.phpはビューファイルになります。

そんじゃ〜いくよぉ〜

1.PayPalのSDKをダウンロード

Github上のPayPalのSDKからダウンロードしてきます。以下の画像のようにクリックしてダウンロードしていきます。現時点での最新versionとしては、1.14.0のようです。これで進めます。

ダウンロードが完了したら、zipフォルダを解凍して、自分のアプリのルートディレクトリにフォルダを丸々コピーします。

2.SDKの読み込み・設定

ルートディレクトリに格納したSDKを読み込んでいきましょう!

まず、PayPalを導入するために新規PHPファイルを生成しましょう。
そして、ダウンロードしたPayPal-PHP-SDKを読み込み各種設定を行うために以下のようにコーディングしましょう。


// 新規PHPファイル PayPal設定用ファイルとして「paypalConfig.php」としましょうか。
<?php
require_once("PayPal-PHP-SDK/autoload.php");
?>

3.PayPalアカウントの作成とAPI情報取得

次にPayPal developerでアカウントを作成、もしくは既に利用しているアカウントでログインをします。

ログインしたら、以下の画像のようにCreate appからアプリを登録していきます。

次のようにご自由にApp Nameを入力して、Create Appしましょう。

そうすると、次のようにアプリのAPI情報を取得することができます。
ここの「Client ID」と「Secret」については、後ほどPHPファイルに書き込んでいく内容になります。

4.SDKの読み込み・設定続き

それではPHPファイルのコーディングに戻ります。
PayPal-SDKのページから「2. Provide the ClientId and Secret. Optionally, Replace the given one with your app clientId, and Secret」の部分をコピーします。デバックも兼ねてビュー側の「billing.php」を編集していきます。


// 新規PHPファイル 「billing.php」
<?php
require_once("paypalConfig.php"); //ここはディレクトリ構造で適宜変更必要です

// After Step 1
$apiContext = new \PayPal\Rest\ApiContext(
        new \PayPal\Auth\OAuthTokenCredential(
            '',     // ご自身のClientIDをコピペ
            ''      // ご自身のClientSecretをコピペ
        )
);
?>

この状態で、billing.phpを表示してみて特にエラー表示されなければOKです。

OKであれば、コピペしたAPIの部分はpaypalConfig.phpへ移します。


// 「paypalConfig.php」
<?php
require_once("PayPal-PHP-SDK/autoload.php");

// After Step 1
$apiContext = new \PayPal\Rest\ApiContext(
        new \PayPal\Auth\OAuthTokenCredential(
            '',     // ご自身のClientIDをコピペ
            ''      // ご自身のClientSecretをコピペ
        )
);
?>

続いて、決済条件を設定していきます。決済条件が書かれているページの「Define the billing plan object」の部分と請求書作成のページにある「Create billing agreement attribute object」と「Create billing agreement (PayPal)」からPHPコードをコピーしてbillingPlan.phpにコピペしましょう。

適宜コメントしている箇所を変更したりして、決済条件を変更することができます。


// 新規ファイル「billingPlan.php」
<?php
require_once("PayPal-PHP-SDK/autoload.php");
use PayPal\Api\ChargeModel;
use PayPal\Api\Currency;
use PayPal\Api\MerchantPreferences;
use PayPal\Api\PaymentDefinition;
use PayPal\Api\Plan;
use PayPal\Api\Patch;
use PayPal\Api\PatchRequest;
use PayPal\Common\PayPalModel;

// Create a new billing plan
$plan = new Plan();
$plan->setName('T-Shirt of the Month Club Plan') // 決済時の何を決済するかの題目
  ->setDescription('Template creation.') // 題目の補足説明
  ->setType('fixed'); // 決済状態の設定INFINITEとするとユーザーが支払いキャンセルとするまで決済は続行されます。これが一般的ですかね。

// Set billing plan definitions
$paymentDefinition = new PaymentDefinition();
$paymentDefinition->setName('Regular Payments')
  ->setType('REGULAR')
  ->setFrequency('Month')
  ->setFrequencyInterval('2') // 決済頻度の設定ですね。1にすれば毎月支払い設定となります。
  ->setCycles('12') // 上記で毎月設定にしていればこちらは削除しましょう。こちらはサイクル設定です。
  ->setAmount(new Currency(array('value' => 100, 'currency' => 'USD'))); //こちらは金額とお金の種類を設定です。お金の種類はこちらから確認してください。日本円ならJPYです。https://developer.paypal.com/docs/api/reference/currency-codes/

// 以下のSet charge modelsは出荷する際は税金設定に利用できます。
// 基本ネットコンテンツであれば不要かと思いますので、削除でもOKと思います。私は削除しました。
// Set charge models
$chargeModel = new ChargeModel();
$chargeModel->setType('SHIPPING')
  ->setAmount(new Currency(array('value' => 10, 'currency' => 'USD')));
$paymentDefinition->setChargeModels(array($chargeModel));

// 以下追記です。決済する為のビューをbilling.phpとして、決済完了後に、billing.phpへ飛ぶ、元のビューファイルに戻します。
$currentUrl = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$returnUrl = str_replace("billing.php", "決済へ遷移する元ビューページ", $currentUrl);


// Set merchant preferences
$merchantPreferences = new MerchantPreferences();
$merchantPreferences->setReturnUrl($returnUrl . "?success=true") // 決済が完了したらsuccess=trueのクエリを返すようにします。
  ->setCancelUrl($returnUrl . "?success=false") //決済をキャンセルした場合はsuccess=falseのクエリを返すようにします。
  ->setAutoBillAmount('yes')
  ->setInitialFailAmountAction('CONTINUE')
  ->setMaxFailAttempts('0')
  ->setSetupFee(new Currency(array('value' => 1, 'currency' => 'USD'))); //日本円に編集。決済時点で費用を発生させます。この部分を削除して即決済とさせず、無料トライアルのような設定も可能です。

$plan->setPaymentDefinitions(array($paymentDefinition));
$plan->setMerchantPreferences($merchantPreferences);

// Create and activate billing planの部分をコピペ
//create plan
try {
  $createdPlan = $plan->create($apiContext);

  try {
    $patch = new Patch();
    $value = new PayPalModel('{"state":"ACTIVE"}');
    $patch->setOp('replace')
      ->setPath('/')
      ->setValue($value);
    $patchRequest = new PatchRequest();
    $patchRequest->addPatch($patch);
    $createdPlan->update($patchRequest, $apiContext);
    $plan = Plan::get($createdPlan->getId(), $apiContext);

    // Output plan id
    echo $plan->getId();
  } catch (PayPal\Exception\PayPalConnectionException $ex) {
    echo $ex->getCode();
    echo $ex->getData();
    die($ex);
  } catch (Exception $ex) {
    die($ex);
  }
} catch (PayPal\Exception\PayPalConnectionException $ex) {
  echo $ex->getCode();
  echo $ex->getData();
  die($ex);
} catch (Exception $ex) {
  die($ex);
}
?>

この状態でbillingPlan.phpへアクセスすると、特にメモとかする必要はないのですが英数字(ID)が表示されれば設定OKです!

続いて、「billing.php」をさらに編集していきます〜


// 「billing.php」
<?php
require_once('paypalConfig.php');

// ここから追記
require_once('billingPlan.php');
$id = $plam->getId(); // IDの取得

// 「Create billing agreement attribute object」をコピペ
use PayPal\Api\Agreement;
use PayPal\Api\Payer;
use PayPal\Api\Plan;
use PayPal\Api\ShippingAddress;

// Create new agreement
$agreement = new Agreement();
$agreement->setName('Base Agreement') // 決済題目
  ->setDescription('Basic Agreement') // 決済題目の補足説明
  ->setStartDate('2020-06-17T9:45:04Z'); //決済スタートを設定。決済以降に発生するので必ず未来の時間になりますね。なお、既に上のbillingPlan.phpで即決済を設定しているので、さらに次のように1ヶ月決済にすれば毎月の決済になります。
// ->setStartDate(gmdate('Y-m-d\TH:i:s\Z', strtotime('+1 month', time())));
// もしくは1週間の無料トライアルのような形にする場合は次のような形です。
// ->setStartDate(gmdate('Y-m-d\TH:i:s\Z', strtotime('+7 days', time())));


// Set plan id
$plan = new Plan();
$plan->setId($id); //修正。自分のIDをここに代入するようにします。
$agreement->setPlan($plan);

// Add payer type
$payer = new Payer();
$payer->setPaymentMethod('paypal');
$agreement->setPayer($payer);

// 以下は出荷の詳細に関わる所なので、不要であれば削除でOK。
// Adding shipping details
$shippingAddress = new ShippingAddress();
$shippingAddress->setLine1('111 First Street')
  ->setCity('Saratoga')
  ->setState('CA')
  ->setPostalCode('95070')
  ->setCountryCode('US');
$agreement->setShippingAddress($shippingAddress);

// Create billing agreement (PayPal) をコピペ
try {
  // Create agreement
  $agreement = $agreement->create($apiContext);

  // Extract approval URL to redirect user
  $approvalUrl = $agreement->getApprovalLink();
  header("Location: $approvalUrl"); // 追記。承認後に遷移。

} catch (PayPal\Exception\PayPalConnectionException $ex) {
  echo $ex->getCode();
  echo $ex->getData();
  die($ex);
} catch (Exception $ex) {
  die($ex);
}

?>

この状態でbilling.phpにアクセスした際にPayPalのログイン画面が表示されればOKです!このログイン画面に次で作成するテストアカウントでログインして、上手く動作するかテスト決済を進めます。

5. テストアカウントを作成して、テスト決済をしよう

AccountページからCreate accountで進めます。

そうすると、Create Sandbox Accountのポップアップウィンドウが開くので、
– Personalにチェック
– Country/Regionを選択
して、Createしましょう!

作成すると上の画像のページに戻りアカウントが増えていますので、作成したAccount nameのManage accountsからView/Edit Accountをクリックしてアカウント情報を確認します。

確認できる内容の中に、メールアドレスとパスワードがあるので、このアカウントをテストアカウントとして利用できます。

こちらのテストアカウントはアカウント情報をみるとわかりますが、クレジットカードを含む架空の情報が入っており、決済のテストができるのがわかります。

先程、billing.phpにアクセスしてPayPalのログイン画面が出たと思いますが、ここに確認したメールアドレスとパスワードを記入してログインします。

上手くいくと、決済情報画面が出ると思います!
ここまで上手くできればあとは、自分で先程まで設定していた内容を必要に応じて修正しながら決済周りを調整できるかと思います。

決済がされたのか状態を確認するにはこちらからアクセスして、テストアカウントの支払い状態を確認をすることができます。

6.契約締結処理

途中、クエリにsuccessまたはfalseを組み込んでいたと思いますが、そこを判定として締結処理を実行します。なので条件分岐を一部編集します。

Execute billing agreementにあるコードをbilling.phpへ遷移する為のページにコピペします。


<?php

// billing.phpに遷移するPHPファイル
if (isset($_GET['success']) && $_GET['success'] == 'true') {
  $token = $_GET['token'];
  $agreement = new \PayPal\Api\Agreement();

  try {
    // Execute agreement
    $agreement->execute($token, $apiContext);
  } catch (PayPal\Exception\PayPalConnectionException $ex) {
    echo $ex->getCode();
    echo $ex->getData();
    die($ex);
  } catch (Exception $ex) {
    die($ex);
  }
} else if (isset($_GET['success']) && $_GET['success'] == 'false'){ //編集
    echo "user canceled agreement";
}

?>

これで、仮に決済が上手くいけば、success=trueとなっていば決済成功。falseであれば失敗となります。

それでは、本当に決済できて支払いは確認できたかと思いますが、入金はされているのかの確認は次の通りです。

7.決済処理の確認

アプリのページにいきます。
作成したApp nameをクリックします。そうすると、以下のようなページに遷移します。

画像のSandbox accountのメールアドレスは、アカウントページのメールアドレスと該当していると思いますので、この「メールアドレス」とアカウントページの「パスワード」を用いてログインします。

ログインできると現在の金額が確認できると思います!

エラー時のメッセージや、月額登録しているかの判定等は、ご自由にアレンジしていただければと思います!!

以上です。

ほんじゃーねー。バイチャ