Ping++ SDKをCodeIgniterフレームワークに統合する | オリジナル、AI翻訳
以下は、提供された BaseController
クラスを基に、PHPアプリケーションに Pingpp (Ping++) を統合するための完全なステップバイステップの例です。このガイドは、基本的な CodeIgniter セットアップを前提としており、支払い処理の統合に焦点を当てています。例えば、ユーザーが Alipay PC Direct を通じて支払うことができるようにする方法を説明します(ただし、他のチャネルにも適応できます)。
前提条件
- Pingpp アカウント: Ping++ にサインアップし、API キー と App ID を取得してください。開発用のテストキー (
sk_test_...
) と、本番用のライブキー (sk_live_...
) があります。 - Pingpp PHP SDK: Composer を使用して Pingpp PHP SDK をインストールします:
composer require pingplusplus/pingpp-php
SDK が CodeIgniter アプリケーションで自動的に読み込まれるようにしてください(例:
application/libraries
に配置するか、Composer の自動読み込みを設定します)。 - 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();
}
}
'sk_test_your_test_key_here'
と'sk_live_your_live_key_here'
を実際の Pingpp API キーに置き換えてください。UserDao
とChargeDao
が実装されていることを確認してください(ステップ 2 を参照)。
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);
}
}
適切なフィールドを持つ対応するデータベーステーブル (users
と charges
) を作成します。
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; 必要に応じてより強力なジェネレータに置き換える
}
'app_your_test_app_id'
と'app_your_live_app_id'
を実際の Pingpp App ID に置き換えてください。'success_url'
をアプリケーションの成功ページ URL に調整してください。
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);
}
ChargeDao
にupdateStatus
メソッドを追加して請求のステータスを更新します。- Pingpp ダッシュボードでウェブフック URL を設定します(例:
http://yourdomain.com/payment/webhook
)。
完全な使用例
- ユーザーのアクション: ユーザーがログインし、POST リクエストを
/payment/checkout
に送信してチェックアウトを開始します。 - サーバーの応答: サーバーが請求を作成し、支払いの詳細を含む JSON オブジェクトを返します。
- クライアントの処理: フロントエンドがユーザーを Alipay 支払いページにリダイレクトします。
- 支払いの完了: 支払い後、ユーザーは成功 URL にリダイレクトされます。
- ウェブフックの更新: Pingpp がウェブフックエンドポイントを通じて通知し、請求のステータスを更新します。
追加の注意事項
- 支払いチャネル:
'alipay_pc_direct'
を他のチャネル(例:'wx'
は WeChat)に置き換えます。Pingpp ドキュメント を確認して、チャネル固有のextra
パラメータを確認してください。 - エラーハンドリング: 本番用にエラーハンドリングを強化します(例: リトライロジック、詳細なエラーメッセージ)。
- セキュリティ: ユーザー入力(
$amount
など)を検証し、API エンドポイントをセキュアにします。
この例は、CodeIgniter アプリケーションに Pingpp を統合するための堅牢な基盤を提供し、電子商取引や寄付など、さまざまなユースケースに適応できます。