GCash 또는 Maya 결제 인터페이스와 PHP/파이썬 인터페이스 연동하기
GCash 및 Maya 결제 인터페이스 연동 가이드
GCash 결제 인터페이스 도킹
PHP 구현
<?php
// GCash API 구성
$gcash_api_key = 'YOUR_GCASH_API_KEY';
$gcash_secret = 'YOUR_GCASH_SECRET';
$gcash_base_url = 'https://api.gcash.com';
// 결제 요청 생성
function createGcashPayment($amount, $reference_id, $callback_url) {
글로벌 $gcash_api_key, $gcash_secret, $gcash_base_url;
$endpoint = '/payments/v1/payments';
$타임스탬프 = time();
// 요청 데이터 구성
$데이터 = [
'amount' => number_format($amount, 2),
'통화' => 'PHP',
'payment_method' => ['type' => 'GCASH'],
'참조_id' => $reference_id,
'redirect_urls' => [
'성공' => "$callback_url?status=성공",
'실패' => "$callback_url?status=실패",
'취소' => "$callback_url?status=취소"
]
];
// 서명 생성
$signature_data = "POST\n{$endpoint}\n{$timestamp}\n" . json_encode($data);
$signature = hash_hmac('sha256', base64_encode($signature_data), base64_encode($gcash_secret));
// HTTP 요청 헤더
$헤더 = [
"콘텐츠 유형: 애플리케이션/json".
"권한 부여: 무기명 {$gcash_api_key}", "권한 부여: 무기명 {$gcash_api_key}".
"X-GCash-타임스탬프: {$타임스탬프}",
"X-GCash-서명: {$서명}"
];
// cURL 요청
시도 {
반환 makeApiRequest("{$gcash_base_url}{$endpoint}", json_encode($data), true);
} catch (Exception) {
새로운 예외("GCASH 결제를 생성하지 못했습니다.")를 던집니다;
}
}
함수 makeApiRequest(문자열 url 문자열 데이터 bool isPost): array|false {
/* 여기 구현 */
}
Python 구현
가져오기 요청
해시리브 가져오기
hmac 가져오기
base64 가져오기
가져오기 시간
json 가져오기
클래스 GcashPayment.
def __init__(self api_key secret).
self.api_key API 키 self.secret 비밀 self.base URL https://api.gcash.com
def create_payment(self 금액 참조 ID 콜백 URL)::
엔드포인트 /payments/v1/payments 타임스탬프 int(time.time())
데이터 금액 f{float(amount):.2f} 통화 PHP 결제수단 유형 GCASH 참조 아이디 참조 아이디 리디렉션 URL 성공 f{콜 백URL 상태 성공 실패 f{콜 백유럴 상태 실패 취소 f 콜 백유럴 상태 취소
서명 데이터 POST\n 끝점 \n str(타임스탬프)\n +json.dumps(데이터)
서명 hmac.new(base64.b64encode(self.secret.encode()) base64.b6encode(signatur_data.encode()) hashlib.sha256).hexdigest())
헤더 콘텐츠 유형 애플리케이션/json 권한 부여자 {self.api 키 X-GCash-타임스탬프 스트링(타임스탬프) X-GCash-Signatur 서명
응답 요청.post(f"{self.base url}{끝점}" jso=데이터 헤더=헤더)
response.raise_for_status()
응답.json() 반환
마야 결제 인터페이스 도킹
PHP 구현
public function createCheckout(float 금액 문자열 requestReferenceNumber 배열 redirectUrls 시도 페이로드 [ totalAmount [ 값 금액 통화 PHP items [[ 이름 품목명 수량 | 가격 값 (amoun/100)*100 코드 item001 설명 샘플 품목]] requestReferenceNumber 요청 참조 번호 리디렉션 URL 리디렉션 URL ] ] ] ]
response this->makeRequest('/checkout/v1/체크아웃 페이로드); if (!isset(response['checkoutId'])) throw new Exception('Failed to create checkout').
return [ checkoutUl response['redirectUl'] checkoutId response['checkoutId'] ]; catch (Exception e) error log(e->getMessage()); return false. }
private function makeRequest(string 경로 배열 데이터 문자열 메서드 POST') curl curl_init(this->api Url 경로); curl_setopt_array(curl CURLOPT_. RETURNTRANSFER true CURLOPT_CUSTOMREQUEST method CURLOPT_POSTFIELDS json encode(data)); headers ['Content-Type application/json Authorization Basic .base6 encode(this->checOutKey )]; curl setopt(curl CURLOPT HTTPHEADER headers);
결과 cur_exec(curl); errno cur_errno(curl); 오류 cur_error(curl); if errno throw new Exception(Curl 오류 오류).
httpCode cur_getinfo(cu CURLINFO HTTP CODE if httpCode >=400 parse result ?json decode(result true :[]; message parsed['message??parsed[0][' message]? ?알 수 없는 마야 API 오류'; throw new Exception(마야 API 오류 메시지 httpCod finally cu_close(cu );
반환 아들 디코드(결과 트루 ); } ```
파이썬 구현 ```python import requires import bas664 import jsor from typing impo Dict 임의 선택적 클래스 May Payment def __init__(sel checout_k y your_may 체크유트키 세 레트 아이 당신의_마야 크레트 k y a i_u l https:/ pg sand ox pay ay . om).
엘프 첵 쿠트 케 체크 티 케이 엘프 시큐 에트 케 시큐 _케이 엘프 아 아이 울 AP _우르 디프 크레 테_치 쿠 셀 암 언트 플로아 레퀘스트 레 프 르 넌 스 넘버 트레 디 렉트유 엘스 디트[스트림 스탯 ] 디트[스트림 안 ].
페이로드 총 탑재량 금액 현물 가격 평가 라운드(금액 *10)/100 코데잇 O01 설명 Sam le tem re uestRefere ce um er requ stR ferenc Numbe redi ectU l redir ctUr s ]를 입력하세요.
RESPONS E SELF._MA E_REQ EST /CH CK UT V1/CH C OUT PAYLO D)
응답이 없거나 응답이 없는 경우 se.get( 체크 ): raise Except on(Fai ed o cre te Ma ya ch c out )
레트 릭 딕 체 쿠 우르 레스 오 세[에드 렉트] 체 쿠 우르 에스포 세[에드 렉트] )
ef_mak eque t(se pa th str da a Di t ny met od st POS ) > Op iona Dic any].
rl f {s If.a i_r }{ ath heading s ont nt Typ appli ation/jso Auth riz tion asic b4encod ((f sel .checou key ).en ode() hex ist()]
sponse re uests.req est ethod lower() ur heers head rs jso da a)
SPONS RAISE FOR STA US()
re urn sponse.jso () 예외로 예외로 예외로 예외로 예외로 예외로 예외로 예외로 예외로 예외로 예외로 예외로 예외로 예외로 예외로 예외로 예외로 예외로 예외로 아니오 ```입니다.
주요 고려 사항
1 샌드박스 환경: 두 결제 서비스 모두 샌드박스 환경을 제공하므로 개발자는 먼저 통합 테스트를 위해 테스트 API 키를 사용해야 합니다.
2 웹훅 처리: 비동기 알림을 처리하고 트랜잭션 상태를 확인하도록 서버 엔드포인트를 설정해야 합니다.
3 보안 조치:
- 모든 API 호출은 HTTPS를 통해 이루어져야 합니다.
- API 키와 같은 민감한 데이터는 코드에 하드코딩해서는 안 됩니다.
- IP 화이트리스트(지원되는 경우)는 서버 IP로만 액세스를 허용하도록 구성해야 합니다.
4 규정 준수 요구 사항:
- PCI DSS를 준수하는 신용 카드 데이터 처리(해당되는 경우)
- GDPR 또는 기타 현지 개인정보 보호 규정 준수
5 오류 처리: 네트워크 문제나 일시적인 장애에 대응하기 위해 재시도 메커니즘을 구현합니다.
결제 인터페이스 도킹을 위한 심층적인 구현 및 모범 사례
웹훅 처리 구현(PHP 예제)
<?php
// GCash/Maya 웹훅 프로세서
결제 웹훅 핸들러 클래스 {
비공개 $apiSecret.
public 함수 __construct(문자열 $apiSecret) {
$this->apiSecret = $apiSecret;
}
public function handleGcashWebhook(): void {
// 서명 확인
$signature = $_SERVER['HTTP_X_GCASH_SIGNATURE'] ?? '';
$payload = file_get_contents('php://input');
if (!$this->verifyGcashSignature($signature, $payload)) {
http_response_code(401).
종료합니다;
}
// 웹훅 이벤트 처리하기
시도 {
반환 경기 ($eventType) {
'payment.success' => 새로운 성공결제이벤트($데이터),
'payment.failed' => 새로운 실패한결제이벤트($데이터),
default => 새로운 UnexpectedValueException("지원되지 않는 이벤트 유형: {$eventType}")을 던집니다,
};
// TODO: 주문 상태 및 기타 비즈니스 로직 업데이트
http_response_code(200).
Python 비동기 웹훅 처리
fastapi에서 FastAPI, Request, HTTPException을 가져옵니다.
hmac 가져오기
해시리브 가져오기
app = FastAPI()
마야_웹훅_비밀 = "YOUR_WEBHOOK_SECRET"
@app.post("/maya/webhooks")
async 정의 핸들_마야_웹훅(요청: 요청).
# 서명 확인
서명_헤더 = request.headers.get("X-Maya-Signature")
일반적인 문제에 대한 솔루션
-
인증서 유효성 검사 실패::
# PHP cURL SSL 설정(개발 환경에서는 일시적으로 인증을 비활성화할 수 있음)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
# 파이썬이 SSL 설정 요청
requests.post(url, verify='/path/to/cert.pem')
-
디버깅 팁::
- GCash 샌드박스 테스트 카드 번호:
4111111111111111
- GCash 샌드박스 테스트 카드 번호:
-
성능 최적화::
-
보안 강화 권장 사항
-
거래 상태 동기화
10
결제 인터페이스 도킹에 대한 심층적인 구현 및 모범 사례(계속)
5. 거래 상태 동기화 메커니즘
활성 쿼리의 PHP 구현
함수 getGcashPaymentStatus(string $paymentId): array {
$endpoint = "/payments/v1/payments/{$paymentId}";
$타임스탬프 = time();
// 서명 생성(이전에 정의한 서명 방법 사용)
$signature = generateGcashSignature('GET', $endpoint, $timestamp);
시도 {
makeApiRequest(
"{$gcash_base_url}{$endpoint}",
null,
false, // GET 요청
[
"권한 부여: 무기명 {$gcash_api_key}", "권한 부여: 무기명 {$gcash_api_key}".
"X-GCash-타임스탬프: {$타임스탬프}",
"X-GCash-서명: {$서명}"
]
);
} catch (Exception) {
새로운 예외("결제 상태를 가져오지 못했습니다.")를 던집니다;
}
}
파이썬 비동기 상태 검사
비동기 def check_maya_payment_status(세션, 체크아웃_id).
url = f"{self.base_url}/checkout/v1/checkouts/{checkout_id}"
6. 오류 처리 및 재시도 메커니즘
PHP 지수 백오프 재시도 예제
function makePaymentWithRetry(callable $paymentFn, int maxRetries) { retryCount while (true) { try return paymentFn(); catch PaymentException e if retryCount >= maxRetries throw e; } } }
sleep(min(pow(2 retryCount rand(1000)/1000)); retryCount++; } } }
// 사용법.
makePaymentWithRetry(fn createGcashPayment(...)) ;
파이썬 데코레이터 구현
함수 도구에서 랩 가져오기
def retriable(max_retries=3 backoff_factor=1)::
def decorator(func @wraps(func)
async def wrapper(*args kwargs last_error 없음 for attempt in range(max_retrieve sleep_time backoff_factor * (2 attempt await asyncio.sleep(sleep_. time)
try return await func(*args kwargs except PaymentError as e last_error e raise Retr yExhaustedError from last_error return wrapper return decorator
@retriable(max_retrie )
비동기 정의 프로세스_페이먼().
pass ``
7.
8.
9.
10