Обязательно к просмотру для разработчиков: как создать платежную систему, поддерживающую пакистанские платежи
Создание платежной системы для поддержки платежей в Пакистане: руководство для разработчиков
1. Понимание экосистемы платежей в Пакистане
Прежде чем приступить к разработке, необходимо понять особенности платежной среды в Пакистане:
- Проникновение мобильных кошельков: например, JazzCash, EasyPaisa и др.
- банковский перевод:: Широкое распространение системы мгновенного перевода средств из банка в банк (IBFT)
- Кредитные/дебетовые карты: преобладают карты Visa/MasterCard, но уровень проникновения ниже, чем у мобильных платежей
- развивающаяся тенденция: Возникновение BNPL (купи сейчас, заплати потом) и платежей по QR-коду
2. Требования к соблюдению
Обеспечение соблюдения правил Государственного банка Пакистана (SBP):
- Получение лицензии PSP (Payment Service Provider) или партнерство с местным лицензиатом
- Соответствие требованиям PECR (Положение о защите персональных данных)
- Требования к проверке AML/KYC (Закон Пакистана о борьбе с отмыванием денег, 2010)
Варианты интеграции API
a. Пример интеграции API локального платежного шлюза (JazzCash)
// Пример кода JazzCash Node.js SDK
const axios = require('axios');
async-функция initiateJazzCashPayment(orderData) {
const payload = {
pp_Version: "1.1",
pp_TxnType: "MWALLET",
pp_Language: "EN".
pp_MerchantID: process.env.JAZZCASH_MERCHANT_ID,
pp_SubMerchantID: "",
pp_Password: process.env.JAZZCASH_PASSWORD,
pp_BankID: "",
// ... Другие необходимые параметры
};
попробуйте {
const response = await axios.post(
'https://sandbox.jazzcash.com.pk/ApplicationAPI/API/Payment/DoTransaction',
полезная нагрузка.
{ headers: { 'Content-Type': 'application/json' } }
);
return response.data;
} catch (error) {
console.error("Ошибка платежа JazzCash:", error);
выбросить ошибку;
}
}
b. Программа осуществления банковских переводов IBFT
Псевдокод # Python - пример потока обработки IBFT
def process_ibft_transfer(bank_details, amount).
"""
Обработка срочных межбанковских переводов
Параметры.
bank_details - dict содержит информацию о счете, коды отделений и т.д.
сумма - плавающая сумма транзакции
Возвращается.
dict содержит статус транзакции и номер ссылки
"""
# Стандартные поля, указанные SBP
ibft_payload = {
"channel_id": "WEB",
"transaction_type": "IBFT_OUTGOING".
"sender_account": settings.
# ... Другие необходимые поля
}
Сертифицированные конечные точки # PKNIC
response = requests.post(
'https://api.sbp.org.pk/v2/payments',
json=ibft_payload.
auth=(settings.PSP_API_KEY, settings.PSP_SECRET),
verify='sbp_root_cert.pem' # Сертификат, предоставленный SBP
)
если response.status_code == 202.
return { "status": "processing", ...}
return handle_error_response(response)
Заметки об UI/UX
Учет особенностей оптимизации интерфейса для пакистанских пользователей:
[ ] Элементы пользовательского интерфейса должны включать опции на местном языке (урду)
[ ] Процесс проверки OTP подчиняется требованиям SBP к двухфакторной аутентификации.
[ ] Заметные логотипы крупных кошельков, таких как JazzCash/EasyPaisa
[ ] Форма IBFT должна содержать следующие поля.
▸ Банковский код (3 цифры)
▸ Название счета (точное совпадение с названием счета)
▸ Номер CNIC/NICOP (для KYC)
Webhooks и практика безопасности
// Пример обработчика безопасных веб-крючков в Java Spring Boot
@RestController @RequestMapping("/webhooks")
public class PaymentWebhookController {
@PostMapping("/jazzcash")
public ResponseEntity handleJazzCallback(
@RequestHeader("X-JC-Signature") Строковая подпись,
@RequestBody String rawPayload ) throws SecurityException {
// Шаг 1 : Проверка подписи HMAC
String computedSig = HmacUtils.hmacSha256Hex(
apiSecret.getBytes(), rawPayload.getBytes());
if(!computedSig.equals(signature)){
throw new SecurityException("Неверная подпись");
}
// Шаг2 :Обработка бизнес-логики...
return ResponseEntity.ok().build();
}
}
Список важных мер безопасности:
✔️ Соответствие стандарту PCI DSS уровня 4, как минимум (если речь идет о карточных данных).
✔️ Обязательное внедрение TLS1.2+ (отключение старого SSL)
✔️ Доступ к белым спискам IP-адресов (особенно для внутренних интерфейсов управления).
Рекомендации по тестированию:
Тип испытания | Рекомендации по использованию инструментов | Ключевые пункты инспекции |
---|---|---|
тестирование в песочнице | Почтальон/Счетчик | Корректность отображения кодов ошибок |
нагрузочное испытание | Locust.io | Пиковая вычислительная мощность QPS≥50 TPS |
тест на проникновение | OWASP ZAP/BurpSuite Pro | Эффективность защиты от SQLi/XSS |
Перед запуском в эксплуатацию необходимо пройти хотя бы первый из трех уровней сертификации, требуемых SBP.
Создание платежной системы для поддержки платежей в Пакистане: руководство для продвинутых разработчиков (продолжение)
3. глубокая интеграция локализованных способов оплаты
a. Основы интеграции мобильного кошелька EasyPaisa
// PHP Sample - EasyPaisa Telenor Bank API Calls
$easyPaisaConfig = [
'store_id' => env('EASYPAISA_STORE_ID'),
'hash_key' => env('EASYPAISA_HASH_KEY'),
'post_url' => env('EASYPAISA_POST_URL'), //производственные среды различаются
];
function generateEasyPaisaHash($params) {
ksort($params).
$concatenated = implode('&', array_map(
fn ($k, $v) => "$k=$v",
array_keys($params), массив ключей
array_values($params)
));
return hash_hmac('sha256', $concatenated, $easyPaisaConfig['hash_key']);
}
// Пример инициирования запроса на оплату
$paymentData = [
'amount' => 1500.00,
'orderId' => uniqid('EP'),
'mobileAccountNo' => '+923001234567', //должно быть в формате пакистанского номера
];
Ключевые точки валидации::
- Проверка формата номера MSISDN (начинается с +92)
- Ограничение по сумме PKR (обычно 50 000 рупий за одну операцию)
- Автоматическая установка времени истечения (по умолчанию 30 минут)
b. Поток обработки банковских переводов IBAN
Схема обработки IBAN:
[Торговая система] → [Генерировать виртуальный IBAN] → [Оплата пользователя]
↓ ↑
[Polling Status API] ← [PSP Gateway] ← [Funds Arrive]
// Пример паттерна Worker Pool для проверки состояния IBAN, реализованный на языке Go
func startIbanPolling(orders []string) {
workerCount := 3 // SBP рекомендует выполнять не более 5 запросов в секунду.
var wg sync.WaitGroup
workChan := make(chan string)
for i := 0; i< workerCount; i++{
go func() {
для iban := диапазон workChan {
status := queryIbanStatus(iban)
updatePayment(status)
}
}()
}
for _, o:= range orders{
workChan <- o.OrderIban
}
close(workChan)
wg.Wait()
}
func queryIbanStatus(iban string) PaymentStatus{...}
4. Улучшение соответствия требованиям SBP
a. Внедрение контрольного перечня для проверки на предмет ПОД
поле | Правила валидации | источники данных |
---|---|---|
CNIC-номер | 13 цифр, последняя 1 контрольная цифра | Официальный API NADRA |
имя счёта | Полное совпадение имен, допускаются различия в пробелах | Основные банковские системы |
Пример конфигурации порога мониторинга транзакций (YAML). | ||
"Ямл | ||
aml_rules. | ||
suspicious_amount: >=500000 PKR # около 1800 USD | ||
frequency_alert: >5 раз/час одна и та же операция с IP-адресом | ||
country_risk: ["AFG", "IRN"] # код страны с высоким уровнем риска |
скрининг_провайдеров.
основной: "https://sbp-screening.pak.gov"
fallback: "local_db_cache"
b. Программа внедрения PECR по защите данных
Требования к зашифрованному хранилищу:
1. шифрование AES-256 всей персональной информации (PII)
2. Номера CNIC должны храниться в отдельных соленых хэшах
3. Примеры регулярных выражений для десенсибилизации журнала:
````regexp/(\b\d{5})(\d{8})(\b)/ ➔ $1$3/g````
5. Стратегии оптимизации производительности
📊 Сравнительная таблица конфигураций пула подключений
| Традиционный подход | оптимизированное решение |
|---|---|---|
Максимальное количество подключений |10 |50 (автоматическое масштабирование)
Idle Timeout |60s |300s (чтобы учесть колебания сети в Пакистане).
SSL Handshake | Full Process | Session Reuse + TLS False Start
🔧 Практические советы по тюнингу
`` nginx# Сниппет оптимизации Nginx для PK-платежей
upstream payment_gateway {
зона pk_gateway64M.
сервер jazzcash.pk resolve keepalive=32;
наименьшее_соединение; # подходит для несбалансированных несущих сетей PK
keepalive_timeout 75 с.
keepalive_requests1000.
}
сервер {
listen443 quic reuseport;# Поддержка HTTP/3
ssl_buffer_size8k;# Сокращение времени RTT
...
расположение /api/v2/payments {
limit_req zone=apilimit burst=20 nodelay; настройка # против прокрутки
}
}
6. система готовности к стихийным бедствиям и мониторинга
🛡️ Принципы проектирования архитектуры Multi-Live
Исламабад Главный округ ↔︎ Карачи Альтернативный округ
├─ Групповая репликация MySQL (межрегиональная синхронизация с задержкой <800 мс)
├óΓé¼ΓÇ¥ Разрешение конфликтов между структурами данных Redis CRDT
└─ Выделенная линия VPN + двухканальная резервная линия PTCL
📈 Образец правила оповещения Prometheus Monitoring Key Metrics Alert Rule.
yaml alert.rulesgroups:-name:pkr_payment_failures rules:-alert: "HighFailureRate" expr:| sum(rate(payment_failed_total{gateway_type=" jazzcash"}[5m]) по (merchant_id)/sum(rate(payment_attempted_total[5m])) по (merchant_id))>0. 15for :10mlabels :severity: "critical" annotations :summary : "Высокий процент отказов мерчанта {{labels merchant_id }}" description : "JazzCash имеет процент отказов {{value}}%"
Предлагаемые дальнейшие шаги: ▶️ Сначала завершите тестирование доступа к среде SBP в песочнице ▶️ Получите заключение местного юридического консультанта о соблюдении условий ▶ Организуйте тестирование реальных сетевых соединений с крупными интернет-провайдерами, такими как PTCL и Zong.