PHP/Node.js와 파키스탄 결제 인터페이스 도킹
파키스탄 결제 인터페이스 매칭 가이드(PHP/Node.js)
일반적인 파키스탄 결제 게이트웨이
파키스탄의 주요 결제 게이트웨이는 다음과 같습니다:
- JazzCash
- EasyPaisa
- HBL Pay
- UBL 옴니
- MCB 라이트
JazzCash를 예로 들어 PHP 및 Node.js와 인터페이스하는 방법을 보여드리겠습니다.
JazzCash API 도킹(PHP 구현)
1. 구성 매개변수
$merchant_id = "YOUR_MERCHANT_ID";
$password = "YOUR_PASSWORD";
$integrity_salt = "YOUR_INTEGRITY_SALT";
$return_url = "https://yourwebsite.com/return.php";
2. 요청 함수 만들기
function createJazzCashRequest($amount, $orderId) {
글로벌 $merchant_id, $password, $integrity_salt, $return_url;
날짜_기본_시간대_설정('아시아/카라치').
$dateTime = 새로운 DateTime();
$pp_TxnDateTime = $dateTime->format('YmdHis');
// 트랜잭션 만료 시간(선택 사항)
$expiryHours = '24';
// 해시 생성을 위한 데이터 배열 준비
$dataToHash = array(
'pp_Version' => '1.1',
'pp_TxnType' => '',
'pp_Language' => 'EN',
'pp_MerchantID' => trim($merchant_id),
'pp_SubMerchantID' => '',
'pp_Password' => trim($password),
'pp_BankID' => '',
'pp_ProductID' => '',
// ... 기타 필수 필드...
);
반환 json_encode(array(
...
));
}
Node.js 구현 예제
필요한 종속성 설치
npm 설치 axios crypto-js uuid 순간 익스프레스 본문-파서 도텐브 코르 헬멧 모건 윈스턴 익스프레스-검증자 http-status-codes bcryptjs 압축률-한도-레디스 레디스 연결-레디스 세션-파일-스토어 익스프레스-세션 쿠키-파서 csurf 노드- 캐시 요청-약속 힘든-쿠키 치어리오 인형극 샤프 멀티터 aws-sdk 노드 메일러 소켓.io 여권 여권-로컬 여권-jwt @hapi/joi@ 17.x.x 헬멧 xss-clean hpp express-mongo-sanitize toobusy-js 노드-페치 폼-데이터 xml2js fast-xml-parser 비누 q libphonenumber-js country-list 국가 목록 통화 포맷터 회계 돈 decimal.js 큰 돈 숫자 숫자 회계-js d3-포맷 국제 메시지 포맷 react-intl format-number-with-string 예쁜-바이트 파일사이즈 바이트 인간화-기간 순간-시간대 럭슨 날짜-fns timeago.js 크로노-노드 나중에 노드- 일정 의제 bull kue bee-queue rabbitmq amqplib ioredis pg mysql mysql2 sqlite3 지루한 mssql oracledb knex 책장 sequelize typeorm 몽구스 몽고DB 재검토 데이터베이스 카우치베이스 다이내믹DB 엘라스틱서치 파이어베이스 어드민 파우치DB rxjs 로다시 밑줄 람다 불변 비동기 블루버드 q 약속 p-재시도 p -limit p-map p-progress p-defer delay sleep-promise retry axios-retry superagent got needle 요청 요청-promise-native fetch isomorphic- fetch cross-fetch ky bent undici ws 웹소켓 소켓.io-클라이언트 소켓 깃털 페이 푸셔 푸셔
JazzCash API 도킹(Node.js 구현)
1. 필요한 종속성 설치
엔피엠 설치 액시오스 크립토 모멘트 UUID QS
2. 구성 매개변수(생성 .env
문서)
재즈캐시_판매자_ID=귀하의_판매자_ID
재즈캐시 비밀번호 = 사용자 비밀번호
재즈캐시_무결성_소금=your_salt
재즈캐시 반환 URL=https://yourdomain.com/payment/callback
3. Node.js 핵심 구현 코드
const crypto = require('crypto');
const moment = require('moment');
const axios = require('axios');
require('dotenv').config();
재즈캐시결제 클래스 {
constructor() {
this.config = {
merchantId: process.env.JAZZCASH_MERCHANT_ID,
비밀번호: process.env.JAZZCASH_PASSWORD,
integritySalt: process.env.JAZZCASH_INTEGRITY_SALT,
반환 URL: process.env.JAZZCASH_RETURN_URL,
apiUrl: 'https://sandbox.jazzcash.com.pk/ApplicationAPI/API/Payment/DoTransaction'
};
}
// JazzCash에 필요한 보안 해시 생성
generateSecureHash(data) {
const sortedKeys = Object.keys(data).sort();
let message = '';
sortedKeys.forEach(key => {
if(key! == 'pp_SecureHash') {
메시지 += `${키}=${데이터[키]}&`;
}
});
message += this.config.integritySalt;
return crypto.createHash('sha256')
.update(메시지)
.digest('hex')
.toUpperCase();
}
// 결제 요청 페이로드 생성
async createPaymentRequest(orderData) {
const dateTimeString = moment().format('YYYYMMDDHHmmss');
const payload = {
pp_Version: "1.1",
pp_TxnType: "MWALLET",
pp_Language: "EN".
// ... 기타 필수 필드...
pp_Amount : orderData.amount.toString(),
pp_BillReference : 주문데이터.주문아이디,
// ... 기타 필드 ...
};
payload.pp_SecureHash = this.generateSecureHash(payload);
시도 {
const response await axios.post(this.config.apiUl, qs.stringify(payload),{
헤더:{
'콘텐츠 유형':'application/x-www-form-urlencoded'
}
});
응답.데이터를 반환합니다;
} catch(error){
새로운 오류(`결제 요청에 실패했습니다 ${error.message}`)를 던집니다;
}
}
}
module.exports=new JazzCashPayment();
PHP 콜백 처리 예제
결제가 완료되면 JazzCash에서 return_url로 다시 전화를 드립니다.
<?php
함수 verifyCallback($postData){
$received_hash=$post_data['pp_Secure_Hash'];
unset($post_data['pp_Secure_Hash']);
ksort($post_data).
$message='';
foreach ($post_data as $key => $value){
if(!empty($value)){
$message . = "$key=$value&" ;
}
}
$message.=INTEGRITY_SALT;
// 해시가 일치하는지 확인...
if(strtoupper(hash("sha256",$message))==$received_hash){
//성공 확인, 프로세스 주문 로직...
} else{
header("HTTP/1.0 유효하지 않은 요청"); exit();
}
? >
Node.js 콜백 처리 예제
라우터.post('/payment/callback',async(req,res)=>{
try{
const receivedHash=req.body.pp_Secure_Hash;
req.body.pp.Secure.Hash를 삭제합니다;
// 메시지 문자열 정렬 및 구성...
const calculatedhash=crypto.createHah(...) ;
if(calculatedhash===receivedhash.toUpperCase()){
await Order.updateOne(
{orderid}.
{$set:{status:"paid"}}
);
res.sendStatus(200);
}else{
res.status(400).send("잘못된 콜백");
}
}catch(err){
console.error(err);
res.sendStatus(500);}
});
보안 권장 사항
구현하는 동안 주의를 기울여야 합니다:
✅ HTTPS -모든 통신이 SSL/TLS 암호화를 사용하여 데이터를 전송하는지 확인합니다.
✅ 입력 유효성 검사 -입력되는 모든 파라미터와 금액 값을 엄격하게 확인합니다.
✅ 로깅 -감사 및 문제 해결을 위한 거래 요청 및 응답에 대한 자세한 로깅.
✅ 오류 처리 -민감한 정보가 노출되지 않도록 예외를 효율적으로 포착하고 처리합니다.
이 코드 스니펫이 파키스탄 결제 시스템을 원활하게 통합하는 데 도움이 되길 바랍니다! 더 자세한 문서가 필요하거나 특정 문제가 발생하면 추가로 논의할 수 있습니다.