%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/sale/handlers/paysystem/webmoney/ |
| Current File : //home/bitrix/www/bitrix/modules/sale/handlers/paysystem/webmoney/handler.php |
<?php
namespace Sale\Handlers\PaySystem;
use Bitrix\Main\Error;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Request;
use Bitrix\Main\Type\DateTime;
use Bitrix\Sale\Payment;
use Bitrix\Sale\PaySystem;
use Bitrix\Sale\PaySystem\ServiceResult;
use Bitrix\Sale\PriceMaths;
Loc::loadMessages(__FILE__);
class WebMoneyHandler extends PaySystem\ServiceHandler
{
/**
* @return array
*/
static public function getIndicativeFields()
{
return array('BX_HANDLER' => 'WEBMONEY');
}
/**
* @param Request $request
* @param $paySystemId
* @return bool
*/
static protected function isMyResponseExtended(Request $request, $paySystemId)
{
$id = $request->get('BX_PAYSYSTEM_CODE');
return $id == $paySystemId;
}
/**
* @param Payment $payment
* @param Request|null $request
* @return PaySystem\ServiceResult
*/
public function initiatePay(Payment $payment, Request $request = null)
{
$extraParams = array(
'URL' => $this->getUrl($payment, 'pay'),
'ENCODING' => $this->service->getField('ENCODING'),
'BX_PAYSYSTEM_CODE' => $payment->getPaymentSystemId()
);
$this->setExtraParams($extraParams);
return $this->showTemplate($payment, 'template');
}
/**
* @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)
{
if (
!$this->checkSum($payment, $request) ||
$request->get('LMI_PAYEE_PURSE') != $this->getBusinessValue($payment, 'WEBMONEY_SHOP_ACCT')
)
{
$serviceResult->addError(new Error('Incorrect sum or WEBMONEY_SHOP_ACCT'));
}
}
else
{
if ($this->checkHash($payment, $request))
{
$psDescription = '';
if ($request->get("LMI_MODE") != 0)
$psDescription .= Loc::getMessage('SALE_HPS_WEBMONEY_TEST');
$psDescription .= Loc::getMessage('SALE_HPS_WEBMONEY_PAYEE_PURSE', array('#PAYEE_PURSE#' => $request->get("LMI_PAYEE_PURSE")))."; ";
$psDescription .= Loc::getMessage('SALE_HPS_WEBMONEY_INVS_NO', array('#INVS_NO#' => $request->get("LMI_SYS_INVS_NO")))."; ";
$psDescription .= Loc::getMessage('SALE_HPS_WEBMONEY_TRANS_NO', array('#TRANS_NO#' => $request->get("LMI_SYS_TRANS_NO")))."; ";
$psDescription .= Loc::getMessage('SALE_HPS_WEBMONEY_TRANS_DATE', array('#TRANS_DATE#' => $request->get("LMI_SYS_TRANS_DATE")))."; ";
$psMessage = "";
if ($request->get("LMI_PAYER_PURSE") !== null)
$psMessage .= Loc::getMessage('SALE_HPS_WEBMONEY_PAYER_PURSE', array('#PAYER_PURSE#' => $request->get("LMI_PAYER_PURSE")))."; ";
if ($request->get("LMI_PAYER_WM") !== null)
$psMessage .= Loc::getMessage('SALE_HPS_WEBMONEY_PAYER_WM', array('#PAYER_WM#' => $request->get("LMI_PAYER_WM")))."; ";
if ($request->get("LMI_PAYMER_NUMBER") !== null)
$psMessage .= Loc::getMessage('SALE_HPS_WEBMONEY_PAYMER_NUMBER', array('#PAYMER_NUMBER#' => $request->get("LMI_PAYMER_NUMBER")))."; ";
if ($request->get("LMI_PAYMER_EMAIL") !== null)
$psMessage .= Loc::getMessage('SALE_HPS_WEBMONEY_PAYMER_EMAIL', array('#PAYMER_EMAIL#' => $request->get("LMI_PAYMER_EMAIL")))."; ";
if ($request->get("LMI_TELEPAT_PHONENUMBER") !== null)
$psMessage .= Loc::getMessage('SALE_HPS_WEBMONEY_TELEPAT_PHONENUMBER', array('#TELEPAT_PHONENUMBER#' => $request->get("LMI_TELEPAT_PHONENUMBER")))."; ";
if ($request->get("LMI_TELEPAT_ORDERID") !== null)
$psMessage .= Loc::getMessage('SALE_HPS_WEBMONEY_TELEPAT_ORDERID', array('#TELEPAT_ORDERID#' => $request->get("LMI_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" => $payment->getField('CURRENCY'),
"PS_RESPONSE_DATE" => new DateTime()
);
if ($this->checkSum($payment, $request)
&& $this->getBusinessValue($payment, 'WEBMONEY_SHOP_ACCT') == $request->get("LMI_PAYEE_PURSE")
&& !$payment->isPaid()
&& $this->getBusinessValue($payment, 'PS_CHANGE_STATUS_PAY') == "Y"
)
{
$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'));
}
}
return $serviceResult;
}
/**
* @param Request $request
* @return array
*/
public function getPaymentIdFromRequest(Request $request)
{
return $request->get('LMI_PAYMENT_NO');
}
/**
* @param Payment $payment
* @return mixed
*/
protected function isTestMode(Payment $payment = null)
{
return $this->getBusinessValue($payment, 'PS_IS_TEST');
}
/**
* @return array
*/
protected function getUrlList()
{
return array(
'pay' => array(
self::ACTIVE_URL => 'https://merchant.webmoney.ru/lmi/payment.asp'
)
);
}
/**
* @param Payment $payment
* @param Request $request
* @return bool
*/
protected function checkSum(Payment $payment, Request $request)
{
$paymentShouldPay = roundEx($this->getBusinessValue($payment, 'PAYMENT_SHOULD_PAY'), 2);
$lmiPaymentAmount = roundEx($request->get('LMI_PAYMENT_AMOUNT'), 2);
return $paymentShouldPay == $lmiPaymentAmount;
}
/**
* @param Payment $payment
* @param Request $request
* @return bool
*/
protected function checkHash(Payment $payment, Request $request)
{
$algorithm = $this->getBusinessValue($payment, 'WEBMONEY_HASH_ALGO');
$string = $request->get("LMI_PAYEE_PURSE").$request->get("LMI_PAYMENT_AMOUNT").$request->get("LMI_PAYMENT_NO").$request->get("LMI_MODE").$request->get("LMI_SYS_INVS_NO").$request->get("LMI_SYS_TRANS_NO").$request->get("LMI_SYS_TRANS_DATE").$this->getBusinessValue($payment, 'WEBMONEY_CNST_SECRET_KEY').$request->get("LMI_PAYER_PURSE").$request->get("LMI_PAYER_WM");
$hash = hash($algorithm, $string);
return ToUpper($hash) == ToUpper($request->get('LMI_HASH'));
}
/**
* @return array
*/
public function getCurrencyList()
{
return array('RUB', 'USD', 'EUR', 'UAH');
}
/**
* @param ServiceResult $result
* @param Request $request
* @return mixed
*/
public function sendResponse(ServiceResult $result, Request $request)
{
global $APPLICATION;
if ($result->isSuccess() && (int)$request->get('LMI_PREREQUEST') == 1)
{
$APPLICATION->RestartBuffer();
echo 'YES';
die();
}
}
}