%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/sale/handlers/paysystem/paypal/ |
Current File : //home/bitrix/www/bitrix/modules/sale/handlers/paysystem/paypal/handler.php |
<?php namespace Sale\Handlers\PaySystem; use Bitrix\Main\Request; use Bitrix\Main\Type\DateTime; use Bitrix\Main\Type\Date; use Bitrix\Sale\Payment; use Bitrix\Sale\PaySystem; use Bitrix\Main\Application; use Bitrix\Main\Localization\Loc; use Bitrix\Main\Web\HttpClient; use Bitrix\Sale\PriceMaths; use Bitrix\Sale\Registry; Loc::loadMessages(__FILE__); /** * Class PayPalHandler * @package Sale\Handlers\PaySystem */ class PayPalHandler extends PaySystem\ServiceHandler implements PaySystem\IPrePayable { const DELIMITER_PAYMENT_ID = ':'; private $prePaymentSetting = array(); /** * @return array */ static public function getIndicativeFields() { return array('mc_gross', 'mc_currency'); } /** * @param Request $request * @param $paySystemId * @return bool */ protected static function isMyResponseExtended(Request $request, $paySystemId) { $data = PaySystem\Manager::getById($paySystemId); if ($data) { return self::getRegistryType($request) === $data['ENTITY_REGISTRY_TYPE']; } return false; } /** * @param Request $request * @return mixed */ private static function getRegistryType(Request $request) { $paymentId = null; if ($request->get('custom') !== null) { $paymentId = $request->get('custom'); } if ($paymentId === null) { $paymentId = $request->get('cm'); } $pos = strpos($paymentId, static::DELIMITER_PAYMENT_ID); if ($pos !== false) { return substr($paymentId, 0, $pos); } return Registry::REGISTRY_TYPE_ORDER; } /** * @param Payment $payment * @param Request $request * @return PaySystem\ServiceResult */ public function processRequest(Payment $payment, Request $request) { /** @var PaySystem\ServiceResult $serviceResult */ $serviceResult = new PaySystem\ServiceResult(); $instance = Application::getInstance(); $context = $instance->getContext(); $server = $context->getServer(); $req = ''; if ($request->get('tx')) { $req = $this->getPdtRequest($payment, $request); } elseif ($request->get('txn_id') && $server->getRequestMethod() == "POST") { $req = $this->getIpnRequest($request); } if ($req !== '') { $domain = ''; if ($this->isTestMode($payment)) { $domain = "sandbox."; } $host = "www.".$domain."paypal.com"; $header = "POST /cgi-bin/webscr HTTP/1.1\r\n"; $header .= "Host: ".$host."\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: ".strlen($req)."\r\n"; $header .= "User-Agent: 1C-Bitrix\r\n"; $header .= "Connection: Close\r\n\r\n"; if ($this->getBusinessValue($payment, "PAYPAL_SSL_ENABLE") == "Y") { $fp = fsockopen("ssl://".$host, 443, $errNo, $errStr, 30); } else { $fp = fsockopen($host, 80, $errNo, $errStr, 30); } if ($fp) { PaySystem\Logger::addDebugInfo('PayPal: request: '.$header.$req); fputs ($fp, $header.$req); $response = ''; $headerDone = false; while (!feof($fp)) { $line = fgets ($fp, 1024); if (strcmp($line, "\r\n") == 0) { $headerDone = true; } elseif ($headerDone) { $response .= $line; } } PaySystem\Logger::addDebugInfo('PayPal: response: '.$response); // parse the data $lines = explode("\n", $response); if (strcmp($lines[1], "SUCCESS") == 0) { return $this->processSuccessAction($payment, $request, $lines); } elseif (strpos($response, "VERIFIED") !== false) { return $this->processVerifiedAction($payment, $request); } else { $serviceResult->setData(array('MESSAGE' => Loc::getMessage("SALE_HPS_PAYPAL_I1"))); } } else { $serviceResult->setData( array('MESSAGE' => Loc::getMessage("SALE_HPS_PAYPAL_I3").'<br /><br />'.Loc::getMessage("SALE_HPS_PAYPAL_I4")) ); } } return $serviceResult; } /** * @param Payment $payment * @param Request $request * @param $lines * @return PaySystem\ServiceResult */ protected function processSuccessAction(Payment $payment, Request $request, $lines) { $serviceResult = new PaySystem\ServiceResult(); $keys = array(); for ($i=1, $cnt = count($lines); $i < $cnt; $i++) { list($key, $val) = explode('=', $lines[$i]); $keys[urldecode($key)] = urldecode($val); } $psStatusMessage = 'Name: '.$keys['first_name'].' '.$keys['last_name'].'; '; $psStatusMessage .= 'Email: '.$keys['payer_email'].'; '; $psStatusMessage .= 'Item: '.$keys['item_name'].'; '; $psStatusMessage .= 'Amount: '.$keys['mc_gross'].'; '; $psStatusDescription = 'Payment status - '.$keys['payment_status'].'; '; $psStatusDescription .= 'Payment sate - '.$keys['payment_date'].'; '; $fields = array( "PS_STATUS" => "Y", "PS_STATUS_CODE" => "-", "PS_STATUS_DESCRIPTION" => $psStatusDescription, "PS_STATUS_MESSAGE" => $psStatusMessage, "PS_SUM" => $keys["mc_gross"], "PS_CURRENCY" => $keys["mc_currency"], "PS_RESPONSE_DATE" => new DateTime(), "PAY_VOUCHER_NUM" => $request->get('tx'), "PAY_VOUCHER_DATE" => new Date() ); $serviceResult->setPsData($fields); $paymentSum = PriceMaths::roundPrecision($this->getBusinessValue($payment, 'PAYMENT_SHOULD_PAY')); $payPalSum = (float)$keys["mc_gross"]; if ($keys["tax"]) { $payPalSum -= (float)$keys["tax"]; } $payPalSum = PriceMaths::roundPrecision($payPalSum); PaySystem\Logger::addDebugInfo('PayPal: payPalSum='.$payPalSum."; paymentSum=".$paymentSum); if ($paymentSum == $payPalSum && ToLower($keys["receiver_email"]) == ToLower($this->getBusinessValue($payment, "PAYPAL_BUSINESS")) && $keys["payment_status"] == "Completed" ) { $serviceResult->setOperationType(PaySystem\ServiceResult::MONEY_COMING); } $response = '<p><h3>'.Loc::getMessage('SALE_HPS_PAYPAL_T1').'</h3></p>'; $response .= '<b>'.Loc::getMessage('SALE_HPS_PAYPAL_T2').'</b><br>'; $response .= '<li>'.Loc::getMessage('SALE_HPS_PAYPAL_T3').': '.$keys['first_name'].' '.$keys['last_name'].'</li>'; $response .= '<li>'.Loc::getMessage('SALE_HPS_PAYPAL_T4').': '.$keys['item_name'].'</li>'; $response .= '<li>'.Loc::getMessage('SALE_HPS_PAYPAL_T5').': '.$keys['mc_gross'].'</li>'; $serviceResult->setData(array('MESSAGE' => $response)); return $serviceResult; } /** * @param Request $request * @param Payment $payment * @return PaySystem\ServiceResult */ protected function processVerifiedAction(Payment $payment, Request $request) { $serviceResult = new PaySystem\ServiceResult(); $psStatusMessage = Loc::getMessage("SALE_HPS_PAYPAL_T3").": ".$request->get("first_name")." ".$request->get("last_name")."; "; $psStatusMessage .= "Email: ".$request->get("payer_email")."; "; $psStatusMessage .= Loc::getMessage("SALE_HPS_PAYPAL_T4").": ".$_POST["item_name"]."; "; $psStatusMessage .= Loc::getMessage("SALE_HPS_PAYPAL_T5").": ".$_POST["mc_gross"]."; "; $psStatusDescription = "Payment status - ".$request->get("payment_status")."; "; $psStatusDescription .= "Payment sate - ".$request->get("payment_date")."; "; $fields = array( "PS_STATUS" => "Y", "PS_STATUS_CODE" => "-", "PS_STATUS_DESCRIPTION" => $psStatusDescription, "PS_STATUS_MESSAGE" => $psStatusMessage, "PS_SUM" => $request->get("mc_gross"), "PS_CURRENCY" => $request->get("mc_currency"), "PS_RESPONSE_DATE" => new DateTime(), "PAY_VOUCHER_NUM" => $request->get('txn_id'), "PAY_VOUCHER_DATE" => new Date() ); $serviceResult->setPsData($fields); $paymentSum = PriceMaths::roundPrecision($this->getBusinessValue($payment, 'PAYMENT_SHOULD_PAY')); $payPalSum = (float)$request->get("mc_gross"); if ($request->get('tax')) { $payPalSum -= (float)$request->get('tax'); } $payPalSum = PriceMaths::roundPrecision($payPalSum); PaySystem\Logger::addDebugInfo('PayPal: payPalSum='.$payPalSum."; paymentSum=".$paymentSum); if ($paymentSum == $payPalSum && ToLower($request->get("receiver_email")) == ToLower($this->getBusinessValue($payment, "PAYPAL_BUSINESS")) && $request->get("payment_status") == "Completed" && $payment->getField("PAY_VOUCHER_NUM") != $request->get('txn_id') ) { $serviceResult->setOperationType(PaySystem\ServiceResult::MONEY_COMING); } return $serviceResult; } /** * @param Payment $payment * @param Request $request * @return string */ protected function getPdtRequest(Payment $payment, Request $request) { $req = ''; if ($request->get('tx')) { $req = 'cmd=_notify-synch'; $req .= "&tx=".$request->get('tx')."&at=".$this->getBusinessValue($payment, "PAYPAL_IDENTITY_TOKEN"); } return $req; } /** * @param Request $request * @return string */ protected function getIpnRequest(Request $request) { $req = 'cmd=_notify-validate'; foreach ($_POST as $key => $value) { $req .= '&'.$key.'='.urlencode(stripslashes($value)); } return $req; } /** * @return array */ protected function getUrlList() { return array( 'pay' => array( self::TEST_URL => 'https://www.sandbox.paypal.com/cgi-bin/webscr', self::ACTIVE_URL => 'https://www.paypal.com/cgi-bin/webscr' ) ); } /** * @param Payment $payment * @param Request|null $request * @return PaySystem\ServiceResult */ public function initiatePay(Payment $payment, Request $request = null) { $this->setExtraParams(array('URL' => $this->getUrl($payment, 'pay'))); return $this->showTemplate($payment, 'template'); } /** * @param Payment $payment * @return array */ public function getParamsBusValue(Payment $payment = null) { $params = parent::getParamsBusValue($payment); if ($payment) { $registryType = $payment::getRegistryType(); $params['PAYMENT_ID'] = $registryType.static::DELIMITER_PAYMENT_ID.$params['PAYMENT_ID']; } return $params; } /** * @return array */ public function getCurrencyList() { return array('RUB', 'EUR', 'USD'); } /** * @param Request $request * @return mixed */ public function getPaymentIdFromRequest(Request $request) { $paymentId = null; if ($request->get('custom') !== null) { $paymentId = $request->get('custom'); } if ($paymentId === null) { $paymentId = $request->get('cm'); } $pos = strpos($paymentId, static::DELIMITER_PAYMENT_ID); if ($pos !== false) { return substr($paymentId, $pos+1); } return $paymentId; } /** * @param Payment $payment * @return bool */ protected function isTestMode(Payment $payment = null) { return $this->getBusinessValue($payment, 'PS_IS_TEST') == 'Y'; } /** * @param PaySystem\ServiceResult $result * @param Request $request * @return mixed */ public function sendResponse(PaySystem\ServiceResult $result, Request $request) { $data = $result->getData(); if (isset($data['MESSAGE'])) { echo $data['MESSAGE']; } return ''; } /** * @param Payment $payment * @param Request $request * @return bool */ public function initPrePayment(Payment $payment = null, Request $request) { $this->prePaymentSetting = array( 'USER' => $this->getBusinessValue($payment, 'PAYPAL_USER'), 'PWD' => $this->getBusinessValue($payment, 'PAYPAL_PWD'), 'SIGNATURE' => $this->getBusinessValue($payment, 'PAYPAL_SIGNATURE'), 'CURRENCY' => $this->getBusinessValue($payment, 'PAYMENT_CURRENCY'), 'TEST' => $this->isTestMode($payment), 'NOTIFY_URL' => $this->getBusinessValue($payment, 'PAYPAL_NOTIFY_URL'), 'ENCODING' => $this->service->getField('ENCODING') ); if (!$this->prePaymentSetting['CURRENCY']) { $this->prePaymentSetting['CURRENCY'] = \CSaleLang::GetLangCurrency(SITE_ID); } if ($this->prePaymentSetting['TEST']) { $this->prePaymentSetting['DOMAIN'] = "sandbox."; } if ($request->get("token")) { $this->prePaymentSetting['TOKEN'] = $request->get("token"); } if ($request->get("PayerID")) { $this->prePaymentSetting['PayerID'] = $request->get("PayerID"); } $this->prePaymentSetting['VERSION'] = "98.0"; $dbSite = \CSite::GetByID(SITE_ID); $arSite = $dbSite->Fetch(); $this->prePaymentSetting['SERVER_NAME'] = $arSite["SERVER_NAME"]; if ($this->prePaymentSetting['SERVER_NAME']) { if (defined("SITE_SERVER_NAME") && strlen(SITE_SERVER_NAME) > 0) { $this->prePaymentSetting['SERVER_NAME'] = SITE_SERVER_NAME; } else { $this->prePaymentSetting['SERVER_NAME'] = \COption::GetOptionString("main", "server_name", "www.bitrixsoft.com"); } } $this->prePaymentSetting['SERVER_NAME'] = (\CMain::IsHTTPS() ? "https" : "http")."://".$this->prePaymentSetting['SERVER_NAME']; if(!$this->prePaymentSetting['USER']) { $GLOBALS["APPLICATION"]->ThrowException("CSalePaySystempaypal: init error", "CSalePaySystempaypal_init_error"); return false; } return true; } /** * @param $data * @return array */ protected function parsePrePaymentResult($data) { global $APPLICATION; $keyArray = array(); $res1 = explode("&", $data); foreach ($res1 as $res2) { list($key, $val) = explode("=", $res2); $keyArray[urldecode($key)] = urldecode($val); if ($this->prePaymentSetting['ENCODING']) { $keyArray[urldecode($key)] = $APPLICATION->ConvertCharset($keyArray[urldecode($key)], $this->prePaymentSetting['ENCODING'], SITE_CHARSET); } } return $keyArray; } /** * @return array */ public function getProps() { $data = array(); if ($this->prePaymentSetting['TOKEN']) { $url = "https://api-3t.".$this->prePaymentSetting['DOMAIN']."paypal.com/nvp"; $arFields = array( "METHOD" => "GetExpressCheckoutDetails", "VERSION" => $this->prePaymentSetting['VERSION'], "USER" => $this->prePaymentSetting['USER'], "PWD" => $this->prePaymentSetting['PWD'], "SIGNATURE" => $this->prePaymentSetting['SIGNATURE'], "TOKEN" => $this->prePaymentSetting['TOKEN'], "buttonsource" => "Bitrix_Cart" ); $ht = new HttpClient(array("version" => "1.1")); if ($res = $ht->post($url, $arFields)) { $result = $this->parsePrePaymentResult($res); if ($result["ACK"] == "Success") { $data = array( "FIO" => $result["FIRSTNAME"]." ".$result["LASTNAME"], "EMAIL" => $result["EMAIL"], "ZIP" => $result["SHIPTOZIP"], "ADDRESS" => $result["SHIPTOSTREET"]." ".$result["SHIPTOSTREET2"], "COUNTRY" => $result["SHIPTOCOUNTRYNAME"], "STATE" => $result["SHIPTOSTATE"], "CITY" => $result["SHIPTOCITY"], "LOCATION" => $result["SHIPTOCITY"], "PP_SOURCE" => $result, ); return $data; } } } return $data; } /** * @param array $orderData */ public function payOrder($orderData = array()) { $serviceResult = new PaySystem\ServiceResult(); if($this->prePaymentSetting['TOKEN']) { global $APPLICATION; $url = "https://api-3t.".$this->prePaymentSetting['DOMAIN']."paypal.com/nvp"; $arFields = array( "METHOD" => "GetExpressCheckoutDetails", "VERSION" => $this->prePaymentSetting['VERSION'], "USER" => $this->prePaymentSetting['USER'], "PWD" => $this->prePaymentSetting['PWD'], "SIGNATURE" => $this->prePaymentSetting['SIGNATURE'], "TOKEN" => $this->prePaymentSetting['TOKEN'], "buttonsource" => "Bitrix_Cart", ); $ht = new \Bitrix\Main\Web\HttpClient(array("version" => "1.1")); if($res = $ht->post($url, $arFields)) { $result = $this->parsePrePaymentResult($res); if($result["ACK"] == "Success" && in_array($result["CHECKOUTSTATUS"], array("PaymentActionNotInitiated"))) { $arFields["METHOD"] = "DoExpressCheckoutPayment"; $arFields["PAYERID"] = $this->prePaymentSetting['payerId']; $arFields["PAYMENTACTION"] = "Sale"; $arFields["PAYMENTREQUEST_0_AMT"] = number_format($this->prePaymentSetting['ORDER_PRICE'], 2, ".", ""); $arFields["PAYMENTREQUEST_0_CURRENCYCODE"] = $this->prePaymentSetting['CURRENCY']; $arFields["PAYMENTREQUEST_0_DESC"] = "Order #".$this->prePaymentSetting['ORDER_ID']; $arFields["PAYMENTREQUEST_0_NOTETEX"] = "Order #".$this->prePaymentSetting['ORDER_ID']; $arFields["PAYMENTREQUEST_0_INVNUM"] = $this->prePaymentSetting['ORDER_ID']; if(DoubleVal($this->prePaymentSetting['DELIVERY_PRICE']) > 0) { $arFields["PAYMENTREQUEST_0_SHIPPINGAMT"] = number_format($this->prePaymentSetting['DELIVERY_PRICE'], 2, ".", ""); } $orderProps = $this->getProps(); if(!empty($orderProps)) { $arFields["PAYMENTREQUEST_0_SHIPTONAME"] = $APPLICATION->ConvertCharset($orderProps["PP_SOURCE"]["PAYMENTREQUEST_0_SHIPTONAME"], SITE_CHARSET, "utf-8"); $arFields["PAYMENTREQUEST_0_SHIPTOSTREET"] = $APPLICATION->ConvertCharset($orderProps["PP_SOURCE"]["PAYMENTREQUEST_0_SHIPTOSTREET"], SITE_CHARSET, "utf-8"); $arFields["PAYMENTREQUEST_0_SHIPTOSTREET2"] = $APPLICATION->ConvertCharset($orderProps["PP_SOURCE"]["PAYMENTREQUEST_0_SHIPTOSTREET2"], SITE_CHARSET, "utf-8"); $arFields["PAYMENTREQUEST_0_SHIPTOCITY"] = $APPLICATION->ConvertCharset($orderProps["PP_SOURCE"]["PAYMENTREQUEST_0_SHIPTOCITY"], SITE_CHARSET, "utf-8"); $arFields["PAYMENTREQUEST_0_SHIPTOSTATE"] = $APPLICATION->ConvertCharset($orderProps["PP_SOURCE"]["PAYMENTREQUEST_0_SHIPTOSTATE"], SITE_CHARSET, "utf-8"); $arFields["PAYMENTREQUEST_0_SHIPTOZIP"] = $orderProps["PP_SOURCE"]["PAYMENTREQUEST_0_SHIPTOZIP"]; $arFields["PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE"] = $APPLICATION->ConvertCharset($orderProps["PP_SOURCE"]["PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE"], SITE_CHARSET, "utf-8"); } if(!empty($orderData["BASKET_ITEMS"])) { $arFields["PAYMENTREQUEST_0_ITEMAMT"] = number_format($this->prePaymentSetting['ORDER_PRICE']-$this->prePaymentSetting['DELIVERY_PRICE'], 2, ".", ""); foreach($orderData["BASKET_ITEMS"] as $i => $val) { $arFields["L_PAYMENTREQUEST_0_NAME".$i] = $APPLICATION->ConvertCharset($val["NAME"], SITE_CHARSET, "utf-8"); $arFields["L_PAYMENTREQUEST_0_AMT".$i] = number_format($val["PRICE"], 2, ".", ""); $arFields["L_PAYMENTREQUEST_0_QTY".$i] = $val["QUANTITY"]; $arFields["L_PAYMENTREQUEST_0_NUMBER".$i] = $val["PRODUCT_ID"]; } } if(strlen($this->prePaymentSetting['DELIVERY_PRICE']) > 0) { $arFields["PAYMENTREQUEST_0_NOTIFYURL"] = $this->prePaymentSetting['NOTIFY_URL']; } if($postResult = $ht->Post($url, $arFields)) { $parseResult = $this->parsePrePaymentResult($postResult); if($parseResult["ACK"] == "Success" && in_array($parseResult["PAYMENTINFO_0_PAYMENTSTATUS"], array("Completed"))) { $psStatusMessage = "Name: ".$result["FIRSTNAME"]." ".$result["LASTNAME"]."; "; $psStatusMessage .= "Email: ".$result["EMAIL"]."; "; $psStatusDescription = "Payment status: ".$parseResult["PAYMENTINFO_0_PAYMENTSTATUS"]."; "; $psStatusDescription .= "Payment sate: ".$parseResult["PAYMENTINFO_0_ORDERTIME"]."; "; $fields = array( "PS_STATUS" => "Y", "PS_STATUS_CODE" => "-", "PS_STATUS_DESCRIPTION" => $psStatusDescription, "PS_STATUS_MESSAGE" => $psStatusMessage, "PS_SUM" => $parseResult["PAYMENTINFO_0_AMT"], "PS_CURRENCY" => $parseResult["PAYMENTINFO_0_CURRENCYCODE"], "PS_RESPONSE_DATE" => ConvertTimeStamp(false, "FULL"), "PAY_VOUCHER_NUM" => $parseResult["PAYMENTINFO_0_TRANSACTIONID"], "PAY_VOUCHER_DATE" => ConvertTimeStamp(false, "FULL"), ); } else { $psStatusMessage = "Name: ".$result["FIRSTNAME"]." ".$result["LASTNAME"]."; "; $psStatusMessage .= "Email: ".$result["EMAIL"]."; "; $psStatusDescription = "Payment status: ".$parseResult["PAYMENTINFO_0_PAYMENTSTATUS"]."; "; $psStatusDescription .= "Pending reason: ".$parseResult["PAYMENTINFO_0_PENDINGREASON"]."; "; $psStatusDescription .= "Payment sate: ".$parseResult["PAYMENTINFO_0_ORDERTIME"]."; "; $fields = array( "PS_STATUS" => "N", "PS_STATUS_CODE" => $parseResult["PAYMENTINFO_0_PAYMENTSTATUS"], "PS_STATUS_DESCRIPTION" => $psStatusDescription, "PS_STATUS_MESSAGE" => $psStatusMessage, "PS_SUM" => $parseResult["PAYMENTINFO_0_AMT"], "PS_CURRENCY" => $parseResult["PAYMENTINFO_0_CURRENCYCODE"], "PS_RESPONSE_DATE" => ConvertTimeStamp(false, "FULL"), "PAY_VOUCHER_NUM" => $parseResult["PAYMENTINFO_0_TRANSACTIONID"], "PAY_VOUCHER_DATE" => ConvertTimeStamp(false, "FULL"), ); } $serviceResult->setPsData($fields); } } } } } /** * @param array $orderData * @return bool|string */ public function BasketButtonAction($orderData = array()) { global $APPLICATION; if (array_key_exists('paypalbutton_x', $_POST) && array_key_exists('paypalbutton_y', $_POST)) { $url = "https://api-3t.".$this->prePaymentSetting['DOMAIN']."paypal.com/nvp"; $arFields = array( "METHOD" => "SetExpressCheckout", "VERSION" => "98.0", "USER" => $this->prePaymentSetting['USER'], "PWD" => $this->prePaymentSetting['PWD'], "SIGNATURE" => $this->prePaymentSetting['SIGNATURE'], "PAYMENTREQUEST_0_AMT" => number_format($orderData["AMOUNT"], 2, ".", ""), "PAYMENTREQUEST_0_CURRENCYCODE" => $this->prePaymentSetting['CURRENCY'], "RETURNURL" => $this->prePaymentSetting['SERVER_NAME'].$orderData["PATH_TO_ORDER"], "CANCELURL" => $this->prePaymentSetting['SERVER_NAME'].$APPLICATION->GetCurPageParam("paypal=Y&paypal_error=Y", array("paypal", "paypal_error")), "PAYMENTREQUEST_0_PAYMENTACTION" => "Authorization", "PAYMENTREQUEST_0_DESC" => "Order payment for ".$this->prePaymentSetting['SERVER_NAME'], "LOCALECODE" => ToUpper(LANGUAGE_ID), "buttonsource" => "Bitrix_Cart", ); if(!empty($orderData["BASKET_ITEMS"])) { $arFields["PAYMENTREQUEST_0_ITEMAMT"] = number_format($orderData["AMOUNT"], 2, ".", ""); foreach($orderData["BASKET_ITEMS"] as $k => $val) { $arFields["L_PAYMENTREQUEST_0_NAME".$k] = $APPLICATION->ConvertCharset($val["NAME"], SITE_CHARSET, "utf-8"); $arFields["L_PAYMENTREQUEST_0_AMT".$k] = number_format($val["PRICE"], 2, ".", ""); $arFields["L_PAYMENTREQUEST_0_QTY".$k] = $val["QUANTITY"]; } } $arFields["RETURNURL"] .= ((strpos($arFields["RETURNURL"], "?") === false) ? "?" : "&")."paypal=Y"; $ht = new \Bitrix\Main\Web\HttpClient(array("version" => "1.1")); if($res = $ht->post($url, $arFields)) { $result = $this->parsePrePaymentResult($res); if($result["TOKEN"] != '') { $url = "https://www.".$this->prePaymentSetting['DOMAIN']."paypal.com/webscr?cmd=_express-checkout&token=".$result["TOKEN"]; if($orderData["ORDER_REQUEST"] == "Y") { return $url; } LocalRedirect($url); } else { $GLOBALS["APPLICATION"]->ThrowException($result['L_SHORTMESSAGE0'].' : '.$result['L_LONGMESSAGE0'], "CSalePaySystemPrePayment_action_error"); return false; } } else { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SALE_HPS_PAYPAL_ERROR"), "CSalePaySystemPrePayment_action_error"); return false; } } return true; } /** * @param array $orderData */ public function setOrderConfig($orderData = array()) { if ($orderData) { $this->prePaymentSetting = array_merge($this->prePaymentSetting, $orderData); } } }