username = CSalePaySystemAction::GetParamValue("USER"); $this->pwd = CSalePaySystemAction::GetParamValue("PWD"); $this->signature = CSalePaySystemAction::GetParamValue("SIGNATURE"); $this->currency = CSalePaySystemAction::GetParamValue("CURRENCY"); $this->testMode = (CSalePaySystemAction::GetParamValue("TEST") == "Y"); $this->notifyUrl = CSalePaySystemAction::GetParamValue("NOTIFY_URL"); if(strlen($this->currency) <= 0) $this->currency = CSaleLang::GetLangCurrency(SITE_ID); if($this->testMode) $this->domain = "sandbox."; if(strlen($_REQUEST["token"]) > 0) $this->token = $_REQUEST["token"]; if(strlen($_REQUEST["PayerID"]) > 0) $this->payerId = $_REQUEST["PayerID"]; $this->version = "98.0"; $dbSite = CSite::GetByID(SITE_ID); $arSite = $dbSite->Fetch(); $this->serverName = $arSite["SERVER_NAME"]; if (strLen($this->serverName) <=0) { if (defined("SITE_SERVER_NAME") && strlen(SITE_SERVER_NAME)>0) $this->serverName = SITE_SERVER_NAME; else $this->serverName = COption::GetOptionString("main", "server_name", "www.bitrixsoft.com"); } $this->serverName = (CMain::IsHTTPS() ? "https" : "http")."://".$this->serverName; if(strlen($this->username) <= 0 || strlen($this->username) <= 0 || strlen($this->username) <= 0) { $GLOBALS["APPLICATION"]->ThrowException("CSalePaySystempaypal: init error", "CSalePaySystempaypal_init_error"); return false; } return true; } function BasketButtonShow() { if(LANGUAGE_ID == "ru") $imgSrc = "//www.1c-bitrix.ru/download/sale/paypal.jpg"; elseif(LANGUAGE_ID == "de") $imgSrc = "//www.paypal.com/de_DE/i/btn/btn_xpressCheckout.gif"; else $imgSrc = "//www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif"; return ""; } function BasketButtonAction($orderData = array()) { global $APPLICATION; if(strlen($_POST["paypalbutton"]) > 0) { $url = "https://api-3t.".$this->domain."paypal.com/nvp"; $arFields = array( "METHOD" => "SetExpressCheckout", "VERSION" => "98.0", "USER" => $this->username, "PWD" => $this->pwd, "SIGNATURE" => $this->signature, "PAYMENTREQUEST_0_AMT" => number_format($orderData["AMOUNT"], 2, ".", ""), "PAYMENTREQUEST_0_CURRENCYCODE" => $this->currency, "RETURNURL" => $this->serverName.$orderData["PATH_TO_ORDER"], "CANCELURL" => $this->serverName.$APPLICATION->GetCurPageParam("paypal=Y&paypal_error=Y", array("paypal", "paypal_error")), "PAYMENTREQUEST_0_PAYMENTACTION" => "Authorization", "PAYMENTREQUEST_0_DESC" => "Order payment for ".$this->serverName, "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->parseResult($res); if(strlen($result["TOKEN"]) > 0) { $url = "https://www.".$this->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("PPL_ERROR"), "CSalePaySystemPrePayment_action_error"); return false; } } return true; } function getHiddenInputs() { $result = " token)."\"> payerId)."\"> "; if(strlen($this->token) > 0) $result .= "".GetMessage("PPL_PREAUTH_TEXT")."

"; return $result; } function isAction() { if($_REQUEST["paypal"] == "Y" && strlen($this->token) > 0) return true; return false; } function parseResult($data) { global $APPLICATION; $keyarray = array(); $res1= explode("&", $data); foreach($res1 as $res2) { list($key,$val) = explode("=", $res2); $keyarray[urldecode($key)] = urldecode($val); if(strlen($this->encoding) > 0) $keyarray[urldecode($key)] = $APPLICATION->ConvertCharset($keyarray[urldecode($key)], $this->encoding, SITE_CHARSET); } return $keyarray; } function getProps() { if(strlen($this->token) > 0) { $url = "https://api-3t.".$this->domain."paypal.com/nvp"; $arFields = array( "METHOD" => "GetExpressCheckoutDetails", "VERSION" => $this->version, "USER" => $this->username, "PWD" => $this->pwd, "SIGNATURE" => $this->signature, "TOKEN" => $this->token, "buttonsource" => "Bitrix_Cart", ); $ht = new \Bitrix\Main\Web\HttpClient(array("version" => "1.1")); if($res = $ht->post($url, $arFields)) { $result = $this->parseResult($res); if($result["ACK"] == "Success") { $arResult = 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 $arResult; } } } } function payOrder($orderData = array()) { if(strlen($this->token) > 0) { global $APPLICATION; $url = "https://api-3t.".$this->domain."paypal.com/nvp"; $arFields = array( "METHOD" => "GetExpressCheckoutDetails", "VERSION" => $this->version, "USER" => $this->username, "PWD" => $this->pwd, "SIGNATURE" => $this->signature, "TOKEN" => $this->token, "buttonsource" => "Bitrix_Cart", ); $ht = new \Bitrix\Main\Web\HttpClient(array("version" => "1.1")); if($res = $ht->post($url, $arFields)) { $result = $this->parseResult($res); if($result["ACK"] == "Success" && in_array($result["CHECKOUTSTATUS"], array("PaymentActionNotInitiated"))) { $arFields["METHOD"] = "DoExpressCheckoutPayment"; $arFields["PAYERID"] = $this->payerId; $arFields["PAYMENTACTION"] = "Sale"; $arFields["PAYMENTREQUEST_0_AMT"] = number_format($this->orderAmount, 2, ".", ""); $arFields["PAYMENTREQUEST_0_CURRENCYCODE"] = $this->currency; $arFields["PAYMENTREQUEST_0_DESC"] = "Order #".$this->orderId; $arFields["PAYMENTREQUEST_0_NOTETEX"] = "Order #".$this->orderId; $arFields["PAYMENTREQUEST_0_INVNUM"] = $this->orderId; $arFields["PAYMENTREQUEST_0_CUSTOM"] = $this->paymentId; if(DoubleVal($this->deliveryAmount) > 0) { $arFields["PAYMENTREQUEST_0_SHIPPINGAMT"] = number_format($this->deliveryAmount, 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->orderAmount-$this->deliveryAmount, 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["L_PAYMENTREQUEST_0_NUMBER".$k] = $val["PRODUCT_ID"]; } } if(strlen($this->notifyUrl) > 0) $arFields["PAYMENTREQUEST_0_NOTIFYURL"] = $this->notifyUrl; if($res2 = $ht->Post($url, $arFields)) { $result2 = $this->parseResult($res2); /** @var \Bitrix\Sale\Order $order */ $order = Order::load($this->orderId); $payment = $order->getPaymentCollection()->getItemById($this->paymentId); if($result2["ACK"] == "Success" && in_array($result2["PAYMENTINFO_0_PAYMENTSTATUS"], array("Completed"))) { $payment->setField('PAID', 'Y'); $strPS_STATUS_MESSAGE = ""; $strPS_STATUS_MESSAGE .= "Name: ".$result["FIRSTNAME"]." ".$result["LASTNAME"]."; "; $strPS_STATUS_MESSAGE .= "Email: ".$result["EMAIL"]."; "; $strPS_STATUS_DESCRIPTION = ""; $strPS_STATUS_DESCRIPTION .= "Payment status: ".$result2["PAYMENTINFO_0_PAYMENTSTATUS"]."; "; $strPS_STATUS_DESCRIPTION .= "Payment sate: ".$result2["PAYMENTINFO_0_ORDERTIME"]."; "; $arOrderFields = array( "PS_STATUS" => "Y", "PS_STATUS_CODE" => "-", "PS_STATUS_DESCRIPTION" => $strPS_STATUS_DESCRIPTION, "PS_STATUS_MESSAGE" => $strPS_STATUS_MESSAGE, "PS_SUM" => $result2["PAYMENTINFO_0_AMT"], "PS_CURRENCY" => $result2["PAYMENTINFO_0_CURRENCYCODE"], "PS_RESPONSE_DATE" => ConvertTimeStamp(false, "FULL"), "PAY_VOUCHER_NUM" => $result2["PAYMENTINFO_0_TRANSACTIONID"], "PAY_VOUCHER_DATE" => ConvertTimeStamp(false, "FULL"), ); } else { $strPS_STATUS_MESSAGE = ""; $strPS_STATUS_MESSAGE .= "Name: ".$result["FIRSTNAME"]." ".$result["LASTNAME"]."; "; $strPS_STATUS_MESSAGE .= "Email: ".$result["EMAIL"]."; "; $strPS_STATUS_DESCRIPTION = ""; $strPS_STATUS_DESCRIPTION .= "Payment status: ".$result2["PAYMENTINFO_0_PAYMENTSTATUS"]."; "; $strPS_STATUS_DESCRIPTION .= "Pending reason: ".$result2["PAYMENTINFO_0_PENDINGREASON"]."; "; $strPS_STATUS_DESCRIPTION .= "Payment sate: ".$result2["PAYMENTINFO_0_ORDERTIME"]."; "; $arOrderFields = array( "PS_STATUS" => "N", "PS_STATUS_CODE" => $result2["PAYMENTINFO_0_PAYMENTSTATUS"], "PS_STATUS_DESCRIPTION" => $strPS_STATUS_DESCRIPTION, "PS_STATUS_MESSAGE" => $strPS_STATUS_MESSAGE, "PS_SUM" => $result2["PAYMENTINFO_0_AMT"], "PS_CURRENCY" => $result2["PAYMENTINFO_0_CURRENCYCODE"], "PS_RESPONSE_DATE" => ConvertTimeStamp(false, "FULL"), "PAY_VOUCHER_NUM" => $result2["PAYMENTINFO_0_TRANSACTIONID"], "PAY_VOUCHER_DATE" => ConvertTimeStamp(false, "FULL"), ); } $result = $payment->setFields($arOrderFields); if ($result->isSuccess()) $order->save(); } } } } } } ?>