%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/sale/handlers/paysystem/paymaster/ |
Current File : //home/bitrix/www/bitrix/modules/sale/handlers/paysystem/paymaster/handler.php |
<?php namespace Sale\Handlers\PaySystem; use Bitrix\Main\Error; use Bitrix\Main\Request; use Bitrix\Main\Type\DateTime; use Bitrix\Sale\Payment; use Bitrix\Sale\PaySystem; use Bitrix\Main\Loader; use Bitrix\Main\Localization\Loc; Loader::registerAutoLoadClasses('sale', array(PaySystem\Manager::getClassNameFromPath('WebMoney') => 'handlers/paysystem/webmoney/handler.php')); Loc::loadMessages(__FILE__); class PayMasterHandler extends WebMoneyHandler { /** * @param Payment $payment * @param Request|null $request * @return PaySystem\ServiceResult */ public function initiatePay(Payment $payment, Request $request = null) { $extraParams = array( 'PS_MODE' => $this->service->getField('PS_MODE'), 'URL' => $this->getUrl($payment, 'pay'), 'BX_PAYSYSTEM_CODE' => $payment->getPaymentSystemId() ); $this->setExtraParams($extraParams); return $this->showTemplate($payment, 'template'); } /** * @return array */ static public function getIndicativeFields() { return array('BX_HANDLER' => 'PAYMASTER'); } /** * @param Payment $payment * @param Request $request * @return PaySystem\ServiceResult */ public function processRequest(Payment $payment, Request $request) { /** @var PaySystem\ServiceResult $serviceResult */ $serviceResult = new PaySystem\ServiceResult(); if ((int)$request->get('LMI_PREREQUEST') == 1 || (int)$request->get('LMI_PREREQUEST') == 2) { if ( !$this->checkSum($payment, $request) || $request->get('LMI_CURRENCY') != $this->getBusinessValue($payment, 'PAYMENT_CURRENCY') || $request->get('LMI_MERCHANT_ID') != $this->getBusinessValue($payment, 'PAYMASTER_SHOP_ACCT') ) { $serviceResult->addError(new Error(Loc::getMessage('SALE_HPS_PAYMASTER_ERROR_PARAMS_VALUE'))); } else { $serviceResult->setData(array('CODE' => 'YES')); } } else { if ($this->checkHash($payment, $request)) { $psDescription = ''; if ($request->get("LMI_SIM_MODE") != 0) $psDescription .= Loc::getMessage('SALE_HPS_PAYMASTER_SIM_MODE_TEST'); $psDescription .= str_replace('#MERCHANT_ID#', $request->get("LMI_MERCHANT_ID"), Loc::getMessage('SALE_HPS_PAYMASTER_DESC_MERCHANT_ID')); $psDescription .= str_replace('#SYS_INVS_NO#', $request->get("LMI_SYS_INVS_NO"), Loc::getMessage('SALE_HPS_PAYMASTER_DESC_SYS_INVS_NO')); $psDescription .= str_replace('#SYS_TRANS_NO#', $request->get("LMI_SYS_TRANS_NO"), Loc::getMessage('SALE_HPS_PAYMASTER_DESC_SYS_TRANS_NO')); $psDescription .= str_replace('#SYS_TRANS_DATE#', $request->get("LMI_SYS_TRANS_DATE"), Loc::getMessage('SALE_HPS_PAYMASTER_DESC_SYS_TRANS_DATE')); $psDescription .= str_replace('#PAY_SYSTEM#', $request->get("LMI_PAY_SYSTEM"), Loc::getMessage('SALE_HPS_PAYMASTER_DESC_PAY_SYSTEM')); $psMessage = ''; if ($request->get("LMI_PAYER_PURSE") !== null) $psMessage .= str_replace('#PAYER_PURSE#', $request->get("LMI_PAYER_PURSE"), Loc::getMessage('SALE_HPS_PAYMASTER_DESC_PAYER_PURSE')); if ($request->get("LMI_PAYER_WM") !== null) $psMessage .= str_replace('#PAYER_WM#', $request->get("LMI_PAYER_WM"), Loc::getMessage('SALE_HPS_PAYMASTER_DESC_PAYER_WM')); if ($request->get("LMI_PAYMER_NUMBER") !== null) $psMessage .= str_replace('#PAYMER_NUMBER#', $request->get("LMI_PAYER_NUMBER"), Loc::getMessage('SALE_HPS_PAYMASTER_DESC_PAYER_NUMBER')); if ($request->get("LMI_PAYMER_EMAIL") !== null) $psMessage .= str_replace('#PAYMER_EMAIL#', $request->get("LMI_PAYER_EMAIL"), Loc::getMessage('SALE_HPS_PAYMASTER_DESC_PAYER_EMAIL')); if ($request->get("LMI_TELEPAT_PHONENUMBER") !== null) $psMessage .= str_replace('#TELEPAT_PHONENUMBER#', $request->get("LMI_TELEPAT_PHONENUMBER"), Loc::getMessage('SALE_HPS_PAYMASTER_DESC_TELEPAT_PHONENUMBER')); if ($request->get("LMI_TELEPAT_ORDERID") !== null) $psMessage .= str_replace('#TELEPAT_ORDERID#', $request->get("LMI_TELEPAT_ORDERID"), Loc::getMessage('SALE_HPS_PAYMASTER_DESC_TELEPAT_ORDERID')); $psFields = array( "PS_STATUS" => "Y", "PS_STATUS_CODE" => "-", "PS_STATUS_DESCRIPTION" => $psDescription, "PS_STATUS_MESSAGE" => $psMessage, "PS_SUM" => $request->get("LMI_PAYMENT_AMOUNT"), "PS_CURRENCY" => $this->getBusinessValue($payment, 'PAYMENT_CURRENCY'), "PS_RESPONSE_DATE" => new DateTime() ); if ($this->checkSum($payment, $request) && $this->getBusinessValue($payment, 'PAYMENT_CURRENCY') == $request->get("LMI_CURRENCY") && $this->getBusinessValue($payment, 'PAYMASTER_SHOP_ACCT') == $request->get("LMI_MERCHANT_ID") && !$payment->isPaid() ) { $serviceResult->setOperationType(PaySystem\ServiceResult::MONEY_COMING); $serviceResult->setPsData($psFields); } else { $serviceResult->addError(new Error('Incorrect payment sum or payment flag')); } } else { $serviceResult->addError(new Error('Incorrect payment hash')); } } if (!$serviceResult->isSuccess()) { $error = 'Paymaster: processRequest: '.join('\n', $serviceResult->getErrorMessages()); PaySystem\Logger::addError($error); } return $serviceResult; } /** * @return array */ protected function getUrlList() { return array( 'pay' => array( self::ACTIVE_URL => 'https://paymaster.ru/Payment/Init' ) ); } /** * @param Payment $payment * @param Request $request * @return bool */ protected function checkHash(Payment $payment, Request $request) { $algorithm = $this->getBusinessValue($payment, 'PAYMASTER_HASH_ALGO'); $string = $request->get("LMI_MERCHANT_ID").";".$request->get("LMI_PAYMENT_NO").";".$request->get("LMI_SYS_PAYMENT_ID").";".$request->get("LMI_SYS_PAYMENT_DATE").";".$request->get("LMI_PAYMENT_AMOUNT").";".$request->get("LMI_CURRENCY").";".$request->get("LMI_PAID_AMOUNT").";".$request->get("LMI_PAID_CURRENCY").";".$request->get("LMI_PAYMENT_SYSTEM").";".$request->get("LMI_SIM_MODE").";".$this->getBusinessValue($payment, 'PAYMASTER_CNST_SECRET_KEY'); $hash = base64_encode(hash($algorithm, $string, true)); return ToUpper($hash) == ToUpper($request->get('LMI_HASH')); } /** * @param PaySystem\ServiceResult $result * @param Request $request * @return mixed */ public function sendResponse(PaySystem\ServiceResult $result, Request $request) { global $APPLICATION; $APPLICATION->RestartBuffer(); $data = $result->getData(); if (array_key_exists('CODE', $data)) { echo $data['CODE']; die(); } } }