Как интегрировать ближневосточную платежную систему в PHP?

Интеграция платежной системы Ближнего Востока с помощью PHP

Чтобы интегрировать ближневосточную платежную систему в PHP, вам необходимо рассмотреть следующие основные шаги и распространенные варианты ближневосточных платежных шлюзов:

Варианты платежных шлюзов на Ближнем Востоке

  1. PayFort - Широко используется в странах Персидского залива (Саудовская Аравия, ОАЭ и др.).
  2. Телр - Охват региона Ближнего Востока и Северной Африки
  3. Checkout.com - Сильное присутствие на Ближнем Востоке
  4. Мойасар - Популярные решения в Саудовской Аравии
  5. 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 рассмотрите эти пакеты, чтобы упростить интеграцию.

  1. laravel-payfort - Официальная SDK-обертка, поддерживаемая PayFort.
    2. `mohammad-waziri/laravel-telry'- Неофициальная обертка Laravely.

Установка обычно выполняется с помощью композитора require vendor/packagename, а затем публикуется конфигурационный файл для настройки идентификатора продавца и так далее.

Оговорки:
-Обеспечивает соответствие стандартам безопасности PCI DSS для обработки данных кредитных карт.
-Примите во внимание местные правила, такие как требования финансового регулирования Саудовской Аравии.
-Предоставляет арабские сообщения об ошибках и интерфейсы.

Подробное руководство по дальнейшей интеграции PHP с платежными системами Ближнего Востока

Соображения безопасности и соответствия нормативным требованиям

При обработке платежей на Ближнем Востоке особое внимание следует уделять следующим требованиям безопасности и соответствия:

  1. Соответствие требованиям PCI DSS::

    // Никогда не храните информацию о кредитной карте напрямую
    // Используйте токенизацию вместо этого
    $token = $paymentGateway->createToken([
    'card_number' => '411111111111111111',
    'expiry_date' => '12/25',
    'cvv' => '123'
    ]);

    // Последующие транзакции используют токен вместо реального номера карты
    $response = $paymentGateway->charge([
    'amount' => 100,
    'currency' => 'SAR',
    'token' => $token
    ]);
  2. Сертификация 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 для каждого платежного шлюза и проконсультироваться с местным юристом, чтобы обеспечить полное соответствие региональным нормам.