PHPで中東の決済システムを統合するには?
PHPによる中東決済システムの統合
PHPで中東の決済システムを統合するには、以下の主要なステップと一般的な中東の決済ゲートウェイのオプションを考慮する必要があります:
中東決済ゲートウェイの主流オプション
- ペイフォート - 湾岸諸国(サウジアラビア、アラブ首長国連邦など)で広く使用されている。
- テル - 中東・北アフリカ地域をカバー
- チェックアウト・ドット・コム - 中東における強力なプレゼンス
- モヤサール - サウジアラビアで人気のソリューション
- ペイタブ - GCC諸国に共通する選択
PHP統合の例(例としてPayFort)
<?php
class PayFortIntegration {
private $merchantIdentifier;
private $accessCode;
private $shaRequestPhrase;
private $shaResponsePhrase;
public function __construct($config) {
$this->merchantIdentifier = $config['merchant_identifier'];
// ...其他配置初始化...
}
// 生成签名
protected function generateSignature($params, $phrase) {
ksort($params);
unset($params['signature']);
array_walk($params, function(&$value, &$key) {
if(is_array($value)) {
ksort($value);
}
});
return hash('sha256', implode('', array_map(function ($k, $v) {
return "$k=$v";
}, array_keys(array_filter(array_map('trim', $params))), array_values(array_filter(array_map('trim', 'array'))))) . strtoupper(hash('sha256', trim(str_replace(" ", "", strtolower(implode("",array_values((array)$phrase)))))));
*/
* This is a simplified version for demonstration.
* Actual implementation should follow PayFort's documentation exactly.
*/
/* Correct way would be: */
/*
1. Sort parameters alphabetically by key name (case-sensitive)
2. Concatenate all parameter values with the SHA phrase in between each value as specified in docs
3. Apply SHA-256 hashing algorithm to the resulting string
*/
return "generated_signature"; // Replace with actual implementation
}
public function initiatePayment() {
/* Sample payment request */
try{
/* Prepare request data */
$_POST["command"]="PURCHASE";
$_POST["amount"]=10000;/* Amount in smallest currency unit e.g., fils for AED*/
$_POST["currency"]="SAR";
$_POST["language"]="en";
/* Generate signature */
$_POST['signature'] = self::generateSignature($_REQUEST,$this->_getShaRequestPhrase());
/* Send to Payfort API endpoint using cURL or GuzzleHttp etc.*/
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'){
header("Content-Type: application/json"); echo json_encode(["status"=>"success","data"=>$_REQUEST]); exit();}else{return true;}
}catch(\Exception$e){throw new \RuntimeException(sprintf("%s:%d %s (%d)\n%s\n", basename(__FILE__), __LINE__, get_class(), intval(microtime(true)*1000)), var_export(debug_backtrace(),true));}}}
Telr決済の簡単な実装例
<?php
クラス TelrPayment {
const LIVE_URL = 'https://secure.telr.com/gateway/order.json';
const TEST_URL = 'https://secure.telrdev.com/gateway/order.json';
protected static ?string$_storeId=null;protected static ?string$_authKey=null;protected bool$_testMode=false;
/
* @param string|null store_id マーチャントダッシュボードにあるあなたのTelrストアID。
* マーチャントダッシュボードの認証キー。
*/
public static function init(?string$store_id=null,?string$aouth_key=null,bool$test_mode=false):void{.
self::$_storeId=$store_id??env('TELR_STORE_ID');self::$_authKey=auth_key??env(TELR_AUTH_KEY');}となります。
/
* :: 支払いリクエストを作成し、ユーザーを支払いページにリダイレクトする*/。
public static createOrder(float amount_in_aed_or_sar,...){
if(!self::$isInitialized()) throw new RuntimeException();
// Telrs API仕様に従ってペイロードを準備する。
// cURL/Guzzle/etc を使って HTTP POST リクエストを行う。
// レスポンスを処理し、それに応じてユーザーをリダイレクトする...}}。
中東におけるペイパルの特別対応
PayPalはグローバルなサービスですが、中東で利用する場合は以下の点に注意が必要です。
// PayPal沙箱测试账号可能需要特定地区账号才能测试本地化功能如:
- SAR货币支持(Saudi Riyal)
- AR语言界面(Arabic)
- Mada卡支持(沙特借记卡网络)
// PayPal SDK初始化时可能需要设置特定参数:
use PayPalCheckoutSdk\Core\SandboxEnvironment;
use PayPalCheckoutSdk\Core\ProductionEnvironment;
function environment() {
if(config(paypal.mode')=='sandbox'){
return new SandboxEnvironment(
config(paypal.sandbox.client_id'),
config(paypal.sandbox.client_secret')
)->setLocale(PayPalHttp\HttpConstants::ARABIC);
}else{
return new ProductionEnvironment(...)->setCurrency(SAR);}}
Laravelパッケージの推奨
Laravelプロジェクトでは、統合を簡素化するためにこれらのパッケージを検討してください。
ララベルペイフォート
- PayFortが管理する公式SDKラッパーです。
2.mohammad-waziri/laravel-telry'-Telryの非公式Laravelyラッパー。
インストールは通常、composer require vendor/packagenameで行い、マーチャントIDなどを設定する設定ファイルを公開する。
警告だ:
-クレジットカードデータ処理に関するPCI DSSセキュリティ基準への準拠を保証する。
-サウジSAMAの金融規制要件など、現地の規制を考慮する。
-アラビア語のエラーメッセージとインターフェースを提供。
PHPと中東の決済システムとの統合を継続するための詳細ガイド
セキュリティとコンプライアンス
中東で決済処理を行う場合、以下のセキュリティおよびコンプライアンス要件に特別な注意を払う必要がある:
-
PCI DSS準拠::
// クレジットカード情報を直接保存しない
// 代わりにトークン化を使用
$token = $paymentGateway->createToken([)
'card_number' => '4111111111111111'、
'expiry_date' => '12/25'、
'cvv' => '123'
]);
// その後の取引では、実際のカード番号の代わりにトークンが使用される。
$response = $paymentGateway->charge([)
'amount' => 100、
'currency' => 'SAR'、
'token' => $token
]);
-
3Dセキュア認証::
3DSecureの検証は中東のほとんどの国で義務付けられている:
// PayFortの3DSecure処理例
public function handle3DSecure($response){。
if ($response['status'] == "14" && !empty($response['3ds_url'])) {.
// ユーザーを銀行認証ページにリダイレクトする
$_SESSION['fort_id'] = $response['fort_id'];
header("Location: ".$response['3ds_url']);
退場する;
}
}
マダカード対応(サウジアラビア専用)
現地のサウジ・マダ・デビットカード・ネットワークは、特別な取り扱いを必要とする:
クラス MadaPaymentHandler {
const BIN_RANGES = [
['から' => "440647", "へ" => "440795"]、
['from' => "446404", "to" > "446404"]、
// ...その他のBIN範囲 ...
];
public static function isMadaCard($cardNumber) {
foreach(self::BIN_RANGES as range){。
if(substr($cardNumber,0,6)>=$range['from'] &&substr(cardNumber,0,6)<=range['to']){
trueを返す;
}
}
false を返す;
}
パブリック関数processPayment(array data){
if (isMadata(data['card_number'])){.
追加パラメータ = array_merge(data,["mada_transaction"=>true]);
$this->gateway->charge (追加パラメータ)を返します。
そうでなければ
Return $this>gateway>charge(data);}}}.
Laravelでの完全な実装例
以下は、LaravelでPayTabsを統合するための完全なコントローラの例です:
<?php
namespace AppHttpControllers.
IlluminateHttpRequest を使用する。
クラス PaymentController extends Controller
{
protected paytabsConfig=[
'profile_id=>env(PAYTABS_PROFILE_ID)、
'server_key=>env(PAYTABS_SERVER_KEY)、
'region=>SAU',// サウジアラビア
'endpoint=https://secure.paytabs.sa/payment/request'
];
public function initiate(Request リクエスト)
{
データ = [
profile_idthispaytabConfigprofileid、
tran_type=sale、
tran_class=ecom、
cartiduniqid()、
cartdescription商品の購入」。
金額 requestamount*100;// セントに変換
通貨 = SAR 、
コールバック urlroute(payment.callback)の場合は
urlroute(payment.thankyou)を返します。
顧客情報
名前 リクエスト名
メールリクエストemail 、
電話リクエストphone .
street1 addressline1 、
リヤド市、
NSA、ナショナルSA
zip null]]。
署名 hash_hmac('sha256', implode("", array value data)), thispaytabConfigserverkey);
レスポンス Http::asForm()->post(thispaytabConfigendpoint arraymerge data [signature signatures]);;
If(response success()){。
redirect(responsejson() redirect url) を返します。
else{abort500);}}。
Publicfunction callback(リクエスト){。
if(! hash equals(request signature computes the signature)) abort403).
OrderOrder::find(requestcart id);;
Switch(strtolower(requestresp status)){。
認可されたケース。
OrdermarkAsPaid()。
休憩だ。
デフォルト。
OrdermarkAsFailed();}}。
}
PHPフレームワークに依存しないサービスクラス設計
Laravel以外のプロジェクトでは、決済サービスクラスはこのように設計できます:
インターフェース MiddleEastPaymentInterface{
public function processPayment(float amount string currency array customerData): array;}.
抽象クラス AbstractMiddleEastProcessor は MiddleEastPaymentInterface{ を実装しています。
保護されたコンフィギュレーション = []。
保護テストモード = false;
public function constructor(bool testMode=false){。
このtestMode=testMode;}。
Abstract protected function generates signature (array params): string ;
Abstract protected function prepare request data (float amount string currency array customerData): array ;}.
クラス PayFortProcessor extends AbstractMiddleEastProcessor {
protected function generateSignature(array params){。
ksort(params);//キーステップ:キー名をアルファベット順に並べ替える
return strtoupper(hash_hmac('sha256', implode("", params), configSHA phrase));}.
public function processPayment(.....args){
リクエストデータ thisprepareRequestData(args);
request_data signature]= thisgenerateSignature(request_data);
curl options=[CURLOPT_URL https api pay fort com transaction create、
CURLOPT_POST true、
CURLOPT RETURNTTRANSFER true、
CURLOPT POSTFIELDS httpビルドクエリ(リクエストデータ)]。
ch curl_init();
foreach(curl options as option value){curl setopt(ch オプション値);}.
結果 curl_exec(ch);
if(json validate(result)){return json decode(result true);}else{throw新しいRuntimeException();}}}。
よくある問題の解決策
アラビア文字エンコーディングの問題点
mb_internal encoding("UTF-8").
description iconv(mb detect encoding description), "UTF-8",description );
タイムゾーン処理(湾岸標準時 GST +4)
date_default_timezone_set アジア リヤド ;
ローカリゼーション・エラーメッセージ
アラビア語メッセージ [
payment_successful تمت عملية الدفع بنجاح 、
تم رفض المعاملة من قبل البنك ] を辞退した。
function getLocalisedMessage(string key string lang=ja ){ ローカライズされたメッセージを取得します。
if(lang ar isset(thisarabicMessages[key])){thisarabicメッセージ[key]を返す。}
else {return defaultEnglishMessages[key];}}。
テスト戦略の推奨
1 サンドボックス・アカウントを作成する際、特にサウジアラビアやアラブ首長国連邦といった中東のアカウントを選択し、以下のような現地の機能をテストする。
- MADA/SADAD支払いプロセス
- アラビア語のインターフェイス表示の正しさ
- GSTタイムスタンプは正しいか
2 様々な銀行の拒絶反応をシミュレートし、その正しい処理を確認する。
テストカード
mada_test : [ number : "4543470000000005", response_code : "20064" ],//SABB銀行が拒否。コード例...]]]...
上記は、基本的な統合から高度な検討事項まで、あらゆるガイダンスを網羅しています。実際の実装については、各決済ゲートウェイの最新のAPIドキュメントを注意深く読み、地域の規制に完全に準拠していることを確認するために、地域の法律顧問に相談する必要があります。