%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/sale/handlers/paysystem/roboxchange/ |
| Current File : /home/bitrix/www/bitrix/modules/sale/handlers/paysystem/roboxchange/handler.php |
<?php
namespace Sale\Handlers\PaySystem;
use Bitrix\Main\Error;
use Bitrix\Main\Request;
use Bitrix\Main\Type\DateTime;
use Bitrix\Main\Localization\Loc;
use Bitrix\Sale\PaySystem;
use Bitrix\Sale\Payment;
use Bitrix\Sale\PriceMaths;
Loc::loadMessages(__FILE__);
class RoboxchangeHandler extends PaySystem\ServiceHandler
{
/**
* @param Payment $payment
* @param Request|null $request
* @return PaySystem\ServiceResult
*/
public function initiatePay(Payment $payment, Request $request = null)
{
$test = '';
if ($this->isTestMode($payment))
$test = '_TEST';
$paymentShouldPay = (float)$this->getBusinessValue($payment, 'PAYMENT_SHOULD_PAY');
$signatureValue = md5(
$this->getBusinessValue($payment, 'ROBOXCHANGE_SHOPLOGIN').":".
$paymentShouldPay.":".
$this->getBusinessValue($payment, 'PAYMENT_ID').":".
$this->getBusinessValue($payment, 'ROBOXCHANGE_SHOPPASSWORD'.$test).':'.
'SHP_BX_PAYSYSTEM_CODE='.$payment->getPaymentSystemId().':'.
'SHP_HANDLER=ROBOXCHANGE'
);
$params = array(
'URL' => $this->getUrl($payment, 'pay'),
'PS_MODE' => $this->service->getField('PS_MODE'),
'SIGNATURE_VALUE' => $signatureValue,
'BX_PAYSYSTEM_CODE' => $payment->getPaymentSystemId(),
'PAYMENT_SHOULD_PAY' => $paymentShouldPay,
);
$this->setExtraParams($params);
return $this->showTemplate($payment, "template");
}
/**
* @return array
*/
public static function getIndicativeFields()
{
return array('SHP_HANDLER' => 'ROBOXCHANGE');
}
/**
* @param Request $request
* @param $paySystemId
* @return bool
*/
static protected function isMyResponseExtended(Request $request, $paySystemId)
{
$id = $request->get('SHP_BX_PAYSYSTEM_CODE');
return $id == $paySystemId;
}
/**
* @param Payment $payment
* @param $request
* @return bool
*/
private function isCorrectHash(Payment $payment, Request $request)
{
$test = '';
if ($this->isTestMode($payment))
$test = '_TEST';
$hash = md5($request->get('OutSum').":".$request->get('InvId').":".$this->getBusinessValue($payment, 'ROBOXCHANGE_SHOPPASSWORD2'.$test).':SHP_BX_PAYSYSTEM_CODE='.$payment->getPaymentSystemId().':SHP_HANDLER=ROBOXCHANGE');
return ToUpper($hash) == ToUpper($request->get('SignatureValue'));
}
/**
* @param Payment $payment
* @param Request $request
* @return bool
*/
private function isCorrectSum(Payment $payment, Request $request)
{
$sum = PriceMaths::roundPrecision($request->get('OutSum'));
$paymentSum = PriceMaths::roundPrecision($this->getBusinessValue($payment, 'PAYMENT_SHOULD_PAY'));
return $paymentSum == $sum;
}
/**
* @param Request $request
* @return mixed
*/
public function getPaymentIdFromRequest(Request $request)
{
return $request->get('InvId');
}
/**
* @return mixed
*/
protected function getUrlList()
{
return array(
'pay' => array(
self::ACTIVE_URL => 'https://auth.robokassa.ru/Merchant/Index.aspx'
)
);
}
/**
* @param Payment $payment
* @param Request $request
* @return PaySystem\ServiceResult
*/
public function processRequest(Payment $payment, Request $request)
{
$result = new PaySystem\ServiceResult();
if ($this->isCorrectHash($payment, $request))
{
return $this->processNoticeAction($payment, $request);
}
else
{
PaySystem\Logger::addError('Roboxchange: processRequest: Incorrect hash');
$result->addError(new Error('Incorrect hash'));
}
return $result;
}
/**
* @param Payment $payment
* @param Request $request
* @return PaySystem\ServiceResult
*/
private function processNoticeAction(Payment $payment, Request $request)
{
$result = new PaySystem\ServiceResult();
$psStatusDescription = Loc::getMessage('SALE_HPS_ROBOXCHANGE_RES_NUMBER').": ".$request->get('InvId');
$psStatusDescription .= "; ".Loc::getMessage('SALE_HPS_ROBOXCHANGE_RES_DATEPAY').": ".date("d.m.Y H:i:s");
if ($request->get("IncCurrLabel") !== null)
$psStatusDescription .= "; ".Loc::getMessage('SALE_HPS_ROBOXCHANGE_RES_PAY_TYPE').": ".$request->get("IncCurrLabel");
$fields = array(
"PS_STATUS" => "Y",
"PS_STATUS_CODE" => "-",
"PS_STATUS_DESCRIPTION" => $psStatusDescription,
"PS_STATUS_MESSAGE" => Loc::getMessage('SALE_HPS_ROBOXCHANGE_RES_PAYED'),
"PS_SUM" => $request->get('OutSum'),
"PS_CURRENCY" => $this->getBusinessValue($payment, "PAYMENT_CURRENCY"),
"PS_RESPONSE_DATE" => new DateTime(),
);
$result->setPsData($fields);
if ($this->isCorrectSum($payment, $request))
{
$result->setOperationType(PaySystem\ServiceResult::MONEY_COMING);
}
else
{
PaySystem\Logger::addError('Roboxchange: processNoticeAction: Incorrect sum');
$result->addError(new Error('Incorrect sum'));
}
return $result;
}
/**
* @param Payment $payment
* @return bool
*/
protected function isTestMode(Payment $payment = null)
{
return ($this->getBusinessValue($payment, 'PS_IS_TEST') == 'Y');
}
/**
* @return array
*/
public function getCurrencyList()
{
return array('RUB');
}
/**
* @param PaySystem\ServiceResult $result
* @param Request $request
* @return mixed
*/
public function sendResponse(PaySystem\ServiceResult $result, Request $request)
{
global $APPLICATION;
if ($result->isResultApplied())
{
$APPLICATION->RestartBuffer();
echo 'OK'.$request->get('InvId');
}
}
/**
* @return array
*/
public static function getHandlerModeList()
{
return array(
'' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_NO_CHOOSE'),
'WMR' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_WMRM_EMONEY'),
'AlfaBank' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_ALFABANKOCEANR_BANK'),
'BankCard' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_OCEANBANKOCEANR_BANK'),
'PhoneMegafon' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_MEGAFONR_MOBILE'),
'PhoneMTS' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_MTSR_MOBILE'),
'StoreEuroset' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_RAPIDAOCEANEUROSETR_OTHER'),
'PhoneTele2' => 'Tele2',
'PhoneBeeline' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_MMixplatBeelineRIBR'),
'BankRSB' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_RussianStandardBankRIBR'),
'BankTrust' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_BSSNationalBankTRUSTR'),
'BankTatfondbank' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_BSSTatfondbankR'),
'BankPSB' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_PSKBR'),
'HandyBank' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_HandyBankMerchantOceanR'),
'HandyBankBO' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_HandyBankBO'),
'StoreSvyaznoy' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_RapidaRIBSvyaznoyR'),
'HandyBankFB' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_HandyBankFB'),
'HandyBankFU' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_HandyBankFU'),
'HandyBankKB' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_HandyBankKB'),
'HandyBankKSB' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_HandyBankKSB'),
'HandyBankLOB' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_HandyBankLOB'),
'HandyBankNSB' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_HandyBankNSB'),
'HandyBankTB' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_HandyBankTB'),
'HandyBankVIB' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_HandyBankVIB'),
'BankMTEB' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_BSSMezhtopenergobankR'),
'BankMIN' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_MINBankR'),
'BankFBID' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_BSSFederalBankForInnovationAndDevelopmentR'),
'BankInteza' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_BSSIntezaR'),
'BankGorod' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_BSSBankGorodR'),
'BankAVB' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_BSSAvtovazbankR'),
'KUBank' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_KUBankR'),
'MobileRobokassa' => Loc::getMessage('SALE_HPS_ROBOXCHANGE_BANKOCEAN3CHECKR'),
);
}
}