Ping++ SDKをCodeIgniterフレームワークに統合する | オリジナル、AI翻訳

Home PDF

以下は、提供された BaseController クラスを基に、PHPアプリケーションに Pingpp (Ping++) を統合するための完全なステップバイステップの例です。このガイドは、基本的な CodeIgniter セットアップを前提としており、支払い処理の統合に焦点を当てています。例えば、ユーザーが Alipay PC Direct を通じて支払うことができるようにする方法を説明します(ただし、他のチャネルにも適応できます)。


前提条件

  1. Pingpp アカウント: Ping++ にサインアップし、API キーApp ID を取得してください。開発用のテストキー (sk_test_...) と、本番用のライブキー (sk_live_...) があります。
  2. Pingpp PHP SDK: Composer を使用して Pingpp PHP SDK をインストールします:
    composer require pingplusplus/pingpp-php
    

    SDK が CodeIgniter アプリケーションで自動的に読み込まれるようにしてください(例: application/libraries に配置するか、Composer の自動読み込みを設定します)。

  3. CodeIgniter セットアップ: ユーザーと請求のコントローラーとデータベースモデルを持つ動作する CodeIgniter アプリケーションが必要です。

ステップバイステップの統合

1. コントローラーの設定

BaseController クラスに似たベースコントローラーを拡張するコントローラー(例: PaymentController.php)を作成し、コンストラクタで環境(開発または本番)に基づいて Pingpp API キーを設定します。

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

require_once APPPATH . '/libraries/REST_Controller.php';
require_once APPPATH . '/vendor/autoload.php'; // Composer 自動読み込みを前提

class PaymentController extends REST_Controller {

    public $userDao;
    public $chargeDao;

    public function __construct() {
        parent::__construct();

        // 環境に基づいて Pingpp API キーを設定
        $isLocalDebug = ENVIRONMENT === 'development'; // CodeIgniter 環境
        if ($isLocalDebug) {
            \Pingpp\Pingpp::setApiKey('sk_test_your_test_key_here'); // テストキーに置き換え
        } else {
            \Pingpp\Pingpp::setApiKey('sk_live_your_live_key_here'); // ライブキーに置き換え
        }

        // モデルを読み込む
        $this->load->model('UserDao');
        $this->userDao = new UserDao();
        $this->load->model('ChargeDao');
        $this->chargeDao = new ChargeDao();
    }
}

2. サポートモデルの作成

ユーザーセッションを管理し、請求の詳細を保存するためのモデルが必要です。

UserDao.php (簡略化された例):

<?php
class UserDao extends CI_Model {
    public function findUserBySessionToken($token) {
        $query = $this->db->get_where('users', ['session_token' => $token]);
        return $query->row(); // ユーザーオブジェクトまたは null を返す
    }
}

ChargeDao.php (簡略化された例):

<?php
class ChargeDao extends CI_Model {
    public function add($orderNo, $amount, $userId, $ipAddress) {
        $data = [
            'order_no' => $orderNo,
            'amount' => $amount,
            'user_id' => $userId,
            'client_ip' => $ipAddress,
            'status' => 'pending',
            'created_at' => date('Y-m-d H:i:s')
        ];
        $this->db->insert('charges', $data);
    }
}

適切なフィールドを持つ対応するデータベーステーブル (userscharges) を作成します。

3. 請求作成メソッドの実装

Pingpp 請求を作成し、クライアントに返すメソッドを追加します。この例では、支払いチャネルとして Alipay PC Direct を使用します。

public function createChargeThenResponse($amount, $subject, $body, $metaData, $user) {
    // 一意の注文番号を生成
    $orderNo = $this->generateOrderNo();

    // 環境に基づいて App ID を設定
    $isLocalDebug = ENVIRONMENT === 'development';
    $appId = $isLocalDebug ? 'app_your_test_app_id' : 'app_your_live_app_id';

    // クライアント IP アドレスを取得
    $ipAddress = $this->input->ip_address();
    if ($ipAddress === '::1') { // ローカルデバッグの場合を処理
        $ipAddress = '127.0.0.1';
    }

    // 請求を作成
    try {
        $charge = \Pingpp\Charge::create([
            'order_no' => $orderNo,
            'app' => ['id' => $appId],
            'channel' => 'alipay_pc_direct', // 他のチャネル(例: 'wx' は WeChat)に置き換える
            'amount' => $amount, // セント単位(例: 1000 = 10 CNY)
            'client_ip' => $ipAddress,
            'currency' => 'cny',
            'subject' => $subject,
            'body' => $body,
            'metadata' => $metaData,
            'extra' => [
                'success_url' => 'http://yourdomain.com/payment/success' // 成功 URL に置き換える
            ]
        ]);

        // データベースに請求の詳細を保存
        $this->chargeDao->add($orderNo, $amount, $user->id, $ipAddress);

        // 請求オブジェクトを JSON として返す
        $this->output
            ->set_status_header(200)
            ->set_content_type('application/json', 'utf-8')
            ->set_output(json_encode($charge));
    } catch (\Pingpp\Error\Base $e) {
        log_message('error', 'Pingpp Charge Failed: ' . $e->getMessage());
        $this->response(['error' => '支払いの作成に失敗しました'], 500);
    }
}

private function generateOrderNo() {
    return uniqid(); // 簡単な一意 ID; 必要に応じてより強力なジェネレータに置き換える
}

4. チェックアウトメソッドの作成

ユーザーのチェックアウトを処理し、請求作成メソッドを呼び出すパブリックメソッドを追加します。

public function checkout_post() {
    // ユーザーがログインしているか確認
    $user = $this->getSessionUser();
    if (!$user) {
        $this->response(['error' => 'ユーザーがログインしていません'], 401);
        return;
    }

    // 例の注文詳細
    $amount = 1000; // 10 CNY(例; 実際のアプリでは動的に計算)
    $subject = '注文支払い';
    $body = '注文 #123 の支払い';
    $metaData = ['order_id' => '123']; // 注文固有のデータを添付

    // 請求を作成し、応答
    $this->createChargeThenResponse($amount, $subject, $body, $metaData, $user);
}

private function getSessionUser() {
    $token = $this->input->get_request_header('Authorization', TRUE); // 認証方法に基づいて調整
    if ($token) {
        return $this->userDao->findUserBySessionToken($token);
    }
    return null;
}

5. クライアント側の応答の処理

createChargeThenResponse メソッドは JSON charge オブジェクトを返します。alipay_pc_direct の場合、支払い URL が含まれる credential フィールドがあります。これをクライアント側(例: JavaScript)で処理します。

例(フロントエンド JavaScript):

fetch('/payment/checkout', {
    method: 'POST',
    headers: { 'Authorization': 'your-session-token' }
})
.then(response => response.json())
.then(charge => {
    if (charge.credential && charge.credential.alipay_pc_direct) {
        window.location.href = charge.credential.alipay_pc_direct; // Alipay にリダイレクト
    } else {
        console.error('支払いエラー:', charge);
    }
})
.catch(error => console.error('エラー:', error));

6. 成功ページ

支払い後に確認を表示する成功ページ(例: payment/success)を作成します。必要に応じて、ここで注文のステータスを手動で更新しますが、信頼性のためにウェブフックを推奨します(ステップ 7 を参照)。

public function success_get() {
    // 任意で支払いステータスを確認
    $this->load->view('payment_success'); // ビューを読み込む
}

7. (オプション)ウェブフックの処理

Pingpp は非同期の支払いステータスの更新をウェブフックを通じて送信します。これらの通知を受け取るためのエンドポイントを設定します。

public function webhook_post() {
    $rawData = file_get_contents('php://input');
    $event = json_decode($rawData, true);

    if ($event['type'] === 'charge.succeeded') {
        $charge = $event['data']['object'];
        $orderNo = $charge['order_no'];
        $this->chargeDao->updateStatus($orderNo, 'paid');
    }

    $this->response(['status' => 'ok'], 200);
}

完全な使用例

  1. ユーザーのアクション: ユーザーがログインし、POST リクエストを /payment/checkout に送信してチェックアウトを開始します。
  2. サーバーの応答: サーバーが請求を作成し、支払いの詳細を含む JSON オブジェクトを返します。
  3. クライアントの処理: フロントエンドがユーザーを Alipay 支払いページにリダイレクトします。
  4. 支払いの完了: 支払い後、ユーザーは成功 URL にリダイレクトされます。
  5. ウェブフックの更新: Pingpp がウェブフックエンドポイントを通じて通知し、請求のステータスを更新します。

追加の注意事項

この例は、CodeIgniter アプリケーションに Pingpp を統合するための堅牢な基盤を提供し、電子商取引や寄付など、さまざまなユースケースに適応できます。


Back 2025.04.02 Donate