Как интегрировать ближневосточную платежную систему в PHP?
Интеграция платежной системы Ближнего Востока с помощью PHP
Чтобы интегрировать ближневосточную платежную систему в PHP, вам необходимо рассмотреть следующие основные шаги и распространенные варианты ближневосточных платежных шлюзов:
Варианты платежных шлюзов на Ближнем Востоке
- PayFort - Широко используется в странах Персидского залива (Саудовская Аравия, ОАЭ и др.).
- Телр - Охват региона Ближнего Востока и Северной Африки
- Checkout.com - Сильное присутствие на Ближнем Востоке
- Мойасар - Популярные решения в Саудовской Аравии
- PayTabs - Общий выбор для стран Персидского залива
Пример 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 Payment
<?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 из приборной панели продавца.
* @param string|null auth_key Ваш ключ аутентификации из приборной панели торговца.
*/
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...
// Выполните HTTP POST-запрос, используя cURL/Guzzle/etc.
// Обрабатываем ответ и перенаправляем пользователя соответствующим образом...}}
Специализированное лечение PayPal на Ближнем Востоке
Несмотря на то, что 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 рассмотрите эти пакеты, чтобы упростить интеграцию.
laravel-payfort
- Официальная SDK-обертка, поддерживаемая PayFort.
2. `mohammad-waziri/laravel-telry'- Неофициальная обертка Laravely.
Установка обычно выполняется с помощью композитора require vendor/packagename, а затем публикуется конфигурационный файл для настройки идентификатора продавца и так далее.
Оговорки:
-Обеспечивает соответствие стандартам безопасности PCI DSS для обработки данных кредитных карт.
-Примите во внимание местные правила, такие как требования финансового регулирования Саудовской Аравии.
-Предоставляет арабские сообщения об ошибках и интерфейсы.
Подробное руководство по дальнейшей интеграции PHP с платежными системами Ближнего Востока
Соображения безопасности и соответствия нормативным требованиям
При обработке платежей на Ближнем Востоке особое внимание следует уделять следующим требованиям безопасности и соответствия:
-
Соответствие требованиям PCI DSS::
// Никогда не храните информацию о кредитной карте напрямую
// Используйте токенизацию вместо этого
$token = $paymentGateway->createToken([
'card_number' => '411111111111111111',
'expiry_date' => '12/25',
'cvv' => '123'
]);
// Последующие транзакции используют токен вместо реального номера карты
$response = $paymentGateway->charge([
'amount' => 100,
'currency' => 'SAR',
'token' => $token
]);
-
Сертификация 3D Secure::
Валидация 3DSecure является обязательной в большинстве стран Ближнего Востока:
// Пример обработки 3DSecure для PayFort
public function handle3DSecure($response) {
if ($response['status'] == "14" && !empty($response['3ds_url'])) {
// Перенаправление пользователей на страницу верификации банка
$_SESSION['fort_id'] = $response['fort_id'];
header("Location: ".$response['3ds_url']);
выход;
}
}
Поддержка карт Mada (специально для Саудовской Аравии)
Местная сеть дебетовых карт Saudi Mada требует особого обращения:
класс MadaPaymentHandler {
const BIN_RANGES = [
["from" => "440647", "to" => "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;
}
public function processPayment(array data){
if (isMadata(data['card_number'])){
Дополнительные параметры = array_merge(data,["mada_transaction"=>true]);
Возвращает $this->gateway->charge (дополнительный параметр).
Иначе {
Возврат $this>gateway>charge(data);}}}}
Полный пример реализации на Laravel
Ниже приведен пример полного контроллера для интеграции PayTabs в Laravel:
<?php
пространство имен App\Http\Controllers.
использовать Illuminate\Http\Request.
class 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 request)
{
Данные = [
profile_idthispaytabConfigprofileid,
tran_type=sale,
tran_class=ecom,
cartiduniqid(),
cartdescriptionПокупка продукта".
Сумма requestamount*100;//перевести в центы
Валюта = SAR ,
обратный вызов urlroute(payment.callback),.
return urlroute(payment.thankyou), the
данные о клиенте[
имя запроса.
запрос электронной почты ,
телефонный запросТелефон .
улица1 адресная линия1 ,
Город Эр-Рияд,
NSA , Национальная служба безопасности
zip null]].
Подпись hash_hmac('sha256', implode("", array value data)), thispaytabConfigserverkey);
Response Http::asForm()->post(thispaytabConfigendpoint arraymerge data [signature signature]);;
If(response success()){
Возвращает redirect(responsejson() redirect url).
}else{abort500);}}
Publicfunction callback(Request request){
Если(! 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){
This testMode=testMode;}
Абстрактная защищенная функция генерирует сигнатуру (массив params): string ;
Абстрактная защищенная функция подготовки данных запроса (float amount string currency array customerData): array ;}
class PayFortProcessor extends AbstractMiddleEastProcessor {
protected function generateSignature(array params){
ksort(params);// ключевой шаг: сортировка имен ключей в алфавитном порядке
return strtoupper(hash_hmac('sha256', implode("", params), configSHA phrase));}
public function processPayment(.... .args){
RequestData thisprepareRequestData(args);
запрос_данных подпись]= thisgenerateSignature(запрос_данных);
curl options=[CURLOPT_URL https api pay fort com transaction create,
CURLOPT_POST true,
CURLOPT RETURNTTRANSFER true,
CURLOPT POSTFIELDS http build query (request data)].
ch curl_init();
foreach(curl options as option value){curl setopt(ch option value);}
Результат curl_exec(ch);
if(json validate(result)){return json decode(result true);}else{throw new RuntimeException();}}}
Решение распространенных проблем
Проблемы с кодировкой арабских символов
mb_internal encoding("UTF-8").
описание iconv(mb detect encoding description), "UTF-8",description );
Обработка часового пояса (стандартное время Персидского залива GST +4)
date_default_timezone_set Азия Эр-Рияд ;
Сообщения об ошибках локализации
arabicMessages [
payment_successful تمت عملية الدفع بنجاح ,
отказались от تم رفض المعاملة من قبل البنك ].
function getLocalisedMessage(string key string lang=en ){
if(lang ar isset(thisarabicMessages[key])){возвращает thisarabic messages[key];}
else {return defaultEnglishMessages[key];}}
Рекомендации по стратегии тестирования
1 При создании учетной записи "песочницы" выберите учетную запись Ближнего Востока, особенно Саудовской Аравии или ОАЭ, чтобы протестировать местные функции, такие как.
- Процесс оплаты MADA/SADAD
- Корректность отображения арабского интерфейса
- Правильна ли временная метка GST
2 Смоделируйте различные реакции банка на отказ, чтобы обеспечить правильную обработку.
testCards [
mada_test : [ number : "4543470000000005", response_code : "20064" ]//Отказ банка САББ пример кода...] ]]...
Вышеперечисленное охватывает весь спектр рекомендаций, начиная с базовой интеграции и заканчивая продвинутыми аспектами. Для фактической реализации следует внимательно ознакомиться с последней документацией по API для каждого платежного шлюза и проконсультироваться с местным юристом, чтобы обеспечить полное соответствие региональным нормам.