개발자를 위한 필수 정보: 파키스탄 결제를 지원하는 결제 시스템을 구축하는 방법

파키스탄에서 결제를 지원하는 결제 시스템 구축: 개발자 가이드

1. 파키스탄의 결제 생태계 이해하기

개발을 시작하기 전에 파키스탄 결제 환경의 특성을 이해해야 합니다:

  • 모바일 지갑 보급률예: 재즈캐시, 이지파이사 등
  • 은행 송금:: IBFT(은행 간 즉시 자금 이체) 시스템의 광범위한 사용
  • 신용/직불 카드비자/마스터카드가 우세하지만 모바일 결제보다 보급률이 낮습니다.
  • 새로운 트렌드BNPL(지금 구매 후 나중에 결제) 및 QR코드 결제의 부상

2. 규정 준수 요구 사항

파키스탄 중앙은행(SBP) 규정을 준수하는지 확인합니다:

  • PSP(결제 서비스 공급자) 라이선스 취득 또는 현지 라이선스 사용자와의 제휴
  • PECR(개인 데이터 보호 규정) 준수
  • AML/KYC 유효성 검사 요건(파키스탄 AML법, 2010)

API 통합 옵션

a. 로컬 결제 게이트웨이 API 통합 예시(JazzCash)

// JazzCash Node.js SDK 샘플 코드
const axios = require('axios');

비동기 함수 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' } } }
);

응답.데이터를 반환합니다;
} catch (error) {
console.error("JazzCash 결제 오류:", error);
오류를 발생시킵니다;
}
}

b. IBFT 은행 송금 실행 프로그램

# 파이썬 의사 코드 - IBFT 처리 흐름 예제 
def process_ibft_transfer(bank_details, amount).
"""
은행 간 즉시 이체 처리

매개변수.
bank_details - 딕셔너리에는 계좌 정보, 지점 코드 등이 포함되어 있습니다.
금액 - 유동 거래 금액

반환합니다.
딕셔너리에는 트랜잭션 상태와 참조 번호가 포함되어 있습니다.
"""

# SBP에서 지정한 표준 필드
ibft_payload = {
"channel_id": "WEB",
"트랜잭션_유형": "IBFT_OUTGOING",
"발신자_계정": 설정.
# ... 기타 필수 입력 항목

}

# PKNIC 인증 엔드포인트
응답 = 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 제공 인증서

)

응답.상태_코드 == 202.
반환 {"status": "처리 중",...}

반환 핸들_오류_응답(응답)

UI/UX 참고 사항

파키스탄 사용자를 위해 인터페이스를 최적화할 때 고려해야 할 사항입니다:

[ ] UI 요소에는 현지 언어 옵션(우르두어)이 포함되어야 합니다.
[ ] OTP 유효성 검사 프로세스는 SBP의 2단계 인증 요건에 따릅니다.
재즈캐시/이지파이사 등 주요 지갑의 눈에 잘 띄는 로고 [ ]가 표시됩니다.
[ ] IBFT 양식에는 다음 필드가 포함되어야 합니다.
은행 코드(3자리)
계정 제목(계정 이름과 정확히 일치)
CNIC/NICOP 번호(KYC용) ▸ 고객신원확인 번호

웹훅과 보안 관행

// 자바 스프링 부트 보안 웹훅 핸들러 예제 

RestController @RequestMapping("/웹훅")
public 클래스 PaymentWebhookController {

@PostMapping("/jazzcash")
공용 응답 엔티티 핸들 재즈 콜백(
요청 헤더("X-JC-서명") 문자열 서명입니다,
@RequestBody String rawPayload ) throws SecurityException {

// 1단계: HMAC 서명 확인
String computedSig = HmacUtils.hmacSha256Hex(
apiSecret.getBytes(), rawPayload.getBytes());

if(!computedSig.equals(signature)){
새로운 SecurityException("잘못된 서명")을 던집니다;
}

// 2단계: 비즈니스 로직 처리...

응답 엔티티.ok().build()를 반환합니다;
}
}

중요한 보안 조치 목록:
✔️ PCI DSS 레벨 4 이상 준수(카드 데이터가 포함된 경우)
✔️ TLS1.2+ 필수 구현(이전 SSL 비활성화)
✔️ IP 화이트리스트 액세스(특히 백엔드 관리 인터페이스의 경우)

테스트 권장 사항:

테스트 유형 도구 권장 사항 주요 점검 항목
샌드박스 테스트 Postman/JMeter 오류 코드 매핑 정확성
부하 테스트 Locust.io QPS≥50 TPS 피크 처리 성능
침투 테스트 OWASP ZAP/버프스위트 프로 SQLi/XSS 보호 효과

SBP에서 요구하는 세 가지 인증 레벨 중 첫 번째 레벨 이상을 완료해야 라이브를 시작할 수 있습니다.

파키스탄에서 결제를 지원하는 결제 시스템 구축: 고급 개발자 가이드(계속)

3. 현지화된 결제 수단의 심층 통합

a. EasyPaisa 모바일 지갑 통합 필수 사항

// PHP 샘플 - EasyPaisa 텔레노어 은행 API 호출
$easyPaisaConfig = [
'store_id' => env('EASYPAISA_STORE_ID'),
'hash_key' => env('EASYPAISA_HASH_KEY'),
'post_url' => env('EASYPAISA_POST_URL'), //프로덕션 환경은 다릅니다.
];

함수 generateEasyPaisaHash($params) {
ksort($params).
$concatenated = implode('&', array_map(
fn ($k, $v) => "$k=$v",
array_keys($params)를 사용하면
array_values($params)
));
반환 해시_hmac('sha256', $concatenated, $easyPaisaConfig['hash_key']);
}

// 결제 요청을 시작하는 예
$paymentData = [
'금액' => 1500.00,
'orderId' => uniqid('EP'),
'mobileAccountNo' => '+923001234567', //파키스탄 숫자 형식이어야 합니다.
];

주요 검증 포인트::

  • MSISDN 번호 형식 확인(+92로 시작)
  • PKR 금액 한도(일반적으로 단일 거래에 대해 50,000루피 한도)
  • 자동 만료 시간 설정(기본값 30분)

b. IBAN 은행 송금 처리 흐름

IBAN 처리 순서도:

[판매자 시스템] → [가상 IBAN 생성] → [사용자 결제]
↓ ↑
[폴링 상태 API] ← [PSP 게이트웨이] ← [자금 도착]
// Go 언어로 구현된 IBAN 상태 확인을 위한 워커 풀 패턴 예시 
func startIbanPolling(orders []string) {
workerCount := 3 // SBP는 초당 5건 이하의 쿼리를 권장합니다.

var wg sync.WaitGroup
workChan := make(chan 문자열)

for i := 0; i< workerCount; i++{{
go func() {
for iban := 범위 workChan {
status := queryIbanStatus(iban)
업데이트 결제(상태)
}
}()
}

FOR _, O:= 범위 주문{
workChan <- o.OrderIban
}

close(workChan)
wg.Wait()
}

func queryIbanStatus(iban 문자열) PaymentStatus{...}

4. SBP 규정 준수 개선 사항

a. AML 선별 체크리스트 구현

필드 유효성 검사 규칙 데이터 소스
CNIC 번호 13자리, 마지막 1자리 체크 숫자 NADRA 공식 API
계정 이름 전체 이름 일치, 공백 차이 허용 핵심 뱅킹 시스템
트랜잭션 모니터링 임계값 구성 예제(YAML).
"`yaml
aml_rules.
의심스러운_금액: >=500000 PKR # 약 1800 USD
주파수_경고: 시간당 5회 이상 동일 IP 작동
country_risk: ["AFG", "IRN"] # 고위험 국가 코드

심사_제공자.
기본: "https://sbp-screening.pak.gov"
폴백: "local_db_cache"


 b. PECR 데이터 보호 구현 프로그램

암호화된 스토리지 요구 사항:
1. 모든 개인 식별 정보(PII)의 AES-256 암호화
2. CNIC 번호는 별도의 소금에 절인 해시에 저장해야 합니다.
로그 탈감작을 위한 정규식의 예 3:
````regexp/(\b\d{5})(\d{8})(\b)/ ➔ $1$3/g````

5. 성능 최적화 전략

📊 연결 풀 구성 비교 표

| 기존 접근 방식 | 최적화된 솔루션 |
|---|---|---|
최대 연결 수 |10 |50(자동 확장)
유휴 시간 초과 | 60초 | 300초(파키스탄의 네트워크 변동에 대응하기 위해)
SSL 핸드셰이크 | 전체 프로세스 | 세션 재사용 + TLS 잘못된 시작

🔧 실용적인 튜닝 팁
'''nginx# PK 결제를 위한 Nginx 최적화 스니펫
업스트림 결제_게이트웨이 {
영역 pk_gateway64M.
서버 jazzcash.pk 해결 킵얼라이브=32;
최소_conn; #는 불균형 PK 캐리어 네트워크에 적합합니다.

KEEPALIVE_TIMEOUT 75초.
keepalive_requests1000.
}

서버 {
listen443 quic 재사용 보고서;# HTTP/3 지원
ssl_buffer_size8k;# RTT 시간 단축
...
위치 /api/v2/payments {
limit_req 영역=apilimit 버스트=20 노데이; # 스와이프 방지 설정
}
}

6. 재난 대비 및 모니터링 시스템

🛡️ 멀티 라이브 아키텍처 설계 원칙

이슬라마바드 메인 DC ↔︎ 카라치 대체 DC  
├─ MySQL 그룹 복제(지역 간 동기화 지연 시간 <800ms)
Redis CRDT 데이터 구조 충돌 해결
└─ 전용 VPN 회선 + PTCL 백업 회선 듀얼 채널

📈 프로메테우스 모니터링 주요 지표 알림 규칙 샘플.
yaml alert.rulesgroups:-name:pkr_payment_failures rules:-alert: "HighFailureRate" expr:| sum(rate(payment_failed_total{gateway_type=" jazzcash"}[5m])) by (merchant_id)/sum(rate(payment_attempted_total[5m])) by (merchant_id))>0. 15for :10mlabels :심각도:"critical" annotations :summary :description : "실패율이 높은 판매자 {{labels merchant_id }}" 설명 : "JazzCash의 실패율은 {{value}}%입니다."


제안된 다음 단계: ▶️ SBP 샌드박스 환경 접속 테스트 먼저 완료 ▶️ 약관에 대한 현지 법률 자문의 규정 준수 검토 의견 확보 ▶ PTCL, Zong 등 주요 ISP와 실제 네트워크 다이얼인 테스트 준비하기