%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);
}
}
}