개발자를 위한 필수 정보: 파키스탄 결제를 지원하는 결제 시스템을 구축하는 방법
파키스탄에서 결제를 지원하는 결제 시스템 구축: 개발자 가이드
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와 실제 네트워크 다이얼인 테스트 준비하기