Social Engine에 사용자 지정 결제 게이트웨이를 추가하는 방법
Social Engine을 기반으로하는 회사 웹 사이트에 새로운 결제 게이트웨이를 통합해야합니다. CMS
새로운 게이트웨이를 통합 할 수있는 고급 결제 게이트웨이라는 확장이 있습니다. 실제로 게이트웨이 이름을 가져 와서 파일로 압축 된 스켈레톤 구조를 생성하므로 압축을 풀고 서버에 업로드하여 애플리케이션 디렉토리와 병합 할 수 있습니다.
저는 Social Engine없이 게이트웨이를 구현하는 방법을 설명 할 것이며, 누군가가이를 Social Engine에 통합 할 수있는 방법을 알려줄 수 있기를 바랍니다.
먼저 내
PSP
서비스에 연결합니다 .$client = new nusoap_client('https://example.com/pgwchannel/services/pgw?wsdl');
보낼 배열에 다음 매개 변수를 준비합니다
bpPayRequest
.$parameters = array( 'terminalId' => $terminalId, 'userName' => $userName, 'userPassword' => $userPassword, 'orderId' => $orderId, 'amount' => $amount, 'localDate' => $localDate, 'localTime' => $localTime, 'additionalData' => $additionalData, 'callBackUrl' => $callBackUrl, 'payerId' => $payerId); // Call the SOAP method $result = $client->call('bpPayRequest', $parameters, $namespace);
결제 요청이 수락되면 결과는 쉼표로 구분 된 문자열이며 첫 번째 요소는 0 입니다.
그런 다음 두 번째 요소 (참조 ID)를 다음과 같이POST
방법을 통해 지불 게이트웨이로 보낼 수 있습니다 .echo "<script language='javascript' type='text/javascript'>postRefId('" . $res[1] . "');</script>"; <script language="javascript" type="text/javascript"> function postRefId (refIdValue) { var form = document.createElement("form"); form.setAttribute("method", "POST"); form.setAttribute("action", "https://example.com/pgwchannel/startpay"); form.setAttribute("target", "_self"); var hiddenField = document.createElement("input"); hiddenField.setAttribute("name", "RefId"); hiddenField.setAttribute("value", refIdValue); form.appendChild(hiddenField); document.body.appendChild(form); form.submit(); document.body.removeChild(form); } </script>
게이트웨이는 결제 요청에서 제공
POST
한 콜백에 메서드를 통해 다음 매개 변수를 반환합니다URL
.
RefId
(이전 단계에서 생성 된 참조 ID)
ResCode
(결제 결과 : 0은 성공을 나타냄)
saleOrderId
(결제 요청 중 전달 된 주문 ID)
SaleReferenceId
(판매 참조 코드는 PSP가 판매자에게 제공합니다)경우
ResCode
이전 단계에 있었다 0 , 우리는 호출 전달해야 할 것bpVerifyRequest
그렇지 않으면 지급이 취소됩니다 지불을 확인하려면 다음 매개 변수를.$parameters = array( 'terminalId' => $terminalId, 'userName' => $userName, 'userPassword' => $userPassword, 'orderId' => $orderId, 'saleOrderId' => $verifySaleOrderId, 'saleReferenceId' => $verifySaleReferenceId); // Call the SOAP method $result = $client->call('bpVerifyRequest', $parameters, $namespace);
결과
bpVerifyRequest
가 0 인 경우 결제는 확실하며 가맹점은 구매 한 상품이나 서비스를 제공해야합니다. 그러나bpSettleRequest
정산을 요청하는 데 사용되는 선택적 방법 이 있습니다. 다음과 같이 호출됩니다.
$parameters = array(
'terminalId' => $terminalId,
'userName' => $userName,
'userPassword' => $userPassword,
'orderId' => $orderId,
'saleOrderId' => $settleSaleOrderId,
'saleReferenceId' => $settleSaleReferenceId);
// Call the SOAP method
$result = $client->call('bpSettleRequest', $parameters, $namespace);
PayPal, Stripe, 2Checkout 등과 같은 Payment Gateways 플러그인의 기본 게이트웨이를 보면 혼란스러워집니다.이 코드 로직을 새로 생성 된 게이트웨이 스켈레톤에 어떻게 통합합니까? (구조는 아래와 같습니다) :
여기에서 전체 소스 코드를 확인할 수 있습니다.
default.php
callback.php
Engine_Payment_Gateway_MyGateway
클래스 내부에 결제 코드를 추가하여이 문제를 해결했습니다 .
사용자가 SocialEngine 페이지에서 지불을 원하는 것을 확인 processTransaction()
하면 언급 된 클래스 내의 메소드 가 호출되고 사용자는 PSP의 지불 보안 페이지로 리디렉션됩니다. 결제가 완료되면 (예 : 결제 성공 또는 실패 또는 거래 취소) PSP의 페이지는 이전에 callBackUrl이라는 매개 변수로 전송 한 페이지로 리디렉션합니다. 거기에서 지불이 성공했는지 여부를 결정하고 다른 SOAP 호출로 PSP에 지불을 확인하도록 요청한 다음 선택적으로 결제를 요청하는 데 도움이되는 PSP 관련 매개 변수를 받게됩니다 (판매자의 계정에 최대한 빨리 돈을 입금).
processTransaction ()에 추가하십시오 .
$data = array();
$rawData = $transaction->getRawData();
//Save order ID for later
$this->_orderId = $rawData['vendor_order_id'];
$this->_grandTotal = $rawData['AMT'];
$client = new nusoap_client('https://example.com/pgwchannel/services/pgw?wsdl');
$namespace = 'http://interfaces.core.sw.example.com/';
// Check for an error
$err = $client->getError();
if ($err) {
echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
die();
}
/* Set variables */
//Get price from SEAO
//$order_ids = Engine_Api::_()->getDbTable('orders','sitestoreproduct')->getOrderIds($this->parent_id);
//$price = Engine_Api::_()->getDbTable('orders','sitestoreproduct')->getGrandTotal($this->parent_id);
$terminalId = '1111111';
$userName = 'username';
$userPassword = '1111111';
$orderId = $rawData['vendor_order_id'];
$amount = $rawData['AMT'];
$localDate = date("Y") . date("m") . date("d");
$localTime = date("h") . date("i") . date("s");
$additionalData = $rawData['return_url'];
$callBackUrl = 'https://example.com/pgateway/pay/callback';
$payerId = '0';
/* Define parameters array */
$parameters = array(
'terminalId' => $terminalId,
'userName' => $userName,
'userPassword' => $userPassword,
'orderId' => $orderId,
'amount' => $amount,
'localDate' => $localDate,
'localTime' => $localTime,
'additionalData' => $additionalData,
'callBackUrl' => $callBackUrl,
'payerId' => $payerId
);
$result = $client->call('bpPayRequest', $parameters, $namespace);
if ($client->fault) {
echo '<h2>Fault</h2><pre>';
print_r($result);
echo '</pre>';
die();
} else { //Check for errors
$error = $client->getError();
if ($error) {
echo "An error occurred: ";
print_r($error);
die();
} else {
//break the code
$resultSegmts = explode(',', $result);
$ResCode = $resultSegmts [0];
if ($ResCode == "0") {
//Notify admin of the order
echo '<h3>Redirecting you to the payment page. Please wait...</h3><br/>';
echo '<script language="javascript" type="text/javascript">
postRefId("' . $resultSegmts[1] . '");
</script>';
} elseif ($ResCode == "25") {
echo "<h3>Purchase successful</h3>";
} else {
echo "<h3>PSP response is: $ResCode</h3>";
}
}
}
콜백 액션에 추가 :
$this->view->message = 'This is callback action for PayController';
$RefId = $_POST['RefId'];
$ResCode = $_POST['ResCode'];
$saleOrderId = $_POST['SaleOrderId'];
$saleReferenceId = $_POST['SaleReferenceId'];
$this->_orderId = $saleOrderId;
$this->view->RefId = $RefId;
$this->view->saleOlderId = $saleOrderId;
$this->view->saleReferenceId = $saleReferenceId;
}
if ($ResCode == "0") {
try {
$client = new nusoap_client('https://example.com/pgwchannel/services/pgw?wsdl');
} catch (Exception $e) {
die($e->getMessage());
}
$namespace = 'http://interfaces.core.sw.example.com/';
$terminalId = "111111";
$userName = "username";
$userPassword = "11111111";
$parameters = array(
'terminalId' => $terminalId,
'userName' => $userName,
'userPassword' => $userPassword,
'orderId' => $saleOrderId,
'saleOrderId' => $saleOrderId,
'saleReferenceId' => $saleReferenceId
);
$resVerify = $client->call('bpVerifyRequest', $parameters, $namespace);
if ($resVerify->fault) { //Check for fault
echo "<h1>Fault: </h1>";
print_r($result);
die();
} else { //No fault: check for errors now
$err = $client->getError();
if ($err) {
echo "<h1>Error: " . $err . " </h1>";
} else {
if ($resVerify == "0") {//Check verification response: if 0, then purchase was successful.
echo "<div class='center content green'>Payment successful. Thank you for your order.</div>";
$this->view->message = $this->_translate('Thanks for your purchase.');
$this->dbSave(); //update database table
} else
echo "<script language='javascript' type='text/javascript'>alert( 'Verification Response: " . $resVerify . "');</script>";
}
}
//Note that we need to send bpSettleRequest to PSP service to request settlement once we have verified the payment
if ($resVerify == "0") {
// Update table, Save RefId
//Create parameters array for settle
$this->sendEmail();
$this->sendSms();
$resSettle = $client->call('bpSettleRequest', $parameters, $namespace);
//Check for fault
if ($resSettle->fault) {
echo "<h1>Fault: </h1><br/><pre>";
print_r($resSettle);
echo "</pre>";
die();
} else { //No fault in bpSettleRequest result
$err = $client->getError();
if ($err) {
echo "<h1>Error: </h1><pre>" . $err . "</pre>";
die();
} else {
if ($resSettle == "0" || $resSettle == "45") {//Settle request successful
// echo "<script language='javascript' type='text/javascript'>alert('Payment successful');</script>";
}
}
}
}
} else {
echo "<div class='center content error'>Payment failed. Please try again later.</div> ";
// log error in app
// Update table, log the error
// Show proper message to user
}
$returnUrl = 'https://example.com/stores/products'; //Go to store home for now. Later I'll set this to the last page
echo "<div class='center'>";
echo "<form action=$returnUrl method='POST'>";
echo "<input class='center' id='returnstore' type='submit' value='Return to store'/>";
echo "</form>";
echo "</div>";
참고URL : https://stackoverflow.com/questions/46011754/how-to-add-a-custom-payment-gateway-to-social-engine
'IT Share you' 카테고리의 다른 글
Mondrian : 사용할 집계 테이블을 가져올 수없는 것 같습니다. (0) | 2020.12.05 |
---|---|
Outlook 일정 게시. (0) | 2020.12.05 |
Lazy-Loaded 경로가있는 Angular CLI HMR은 모든 것을 핫 리로드합니다. (0) | 2020.12.05 |
AVPlayer HLS 라이브 스트림 레벨 미터 (FFT 데이터 표시) (0) | 2020.12.05 |
내부 매핑 셰이더 셀프 섀도 잉 (0) | 2020.12.05 |