3namespace Bitrix\Sale\PaySystem;
5use Bitrix\Main\Application;
6use Bitrix\Main\ArgumentException;
7use Bitrix\Main\ArgumentNullException;
8use Bitrix\Main\ArgumentOutOfRangeException;
9use Bitrix\Main\Config\Option;
11use Bitrix\Main\EventResult;
12use Bitrix\Main\IO\Directory;
13use Bitrix\Main\IO\File;
14use Bitrix\Main\IO\Path;
15use Bitrix\Main\Localization\Loc;
16use Bitrix\Main\Request;
17use Bitrix\Sale\Basket;
18use Bitrix\Sale\BusinessValue;
19use Bitrix\Sale\Internals\PaySystemActionTable;
20use Bitrix\Sale\Internals\PaySystemRestHandlersTable;
21use Bitrix\Sale\Internals\ServiceRestrictionTable;
22use Bitrix\Sale\Internals\BusinessValueTable;
24use Bitrix\Sale\Payment;
25use Bitrix\Sale\Registry;
26use Bitrix\Sale\Services\Base\Restriction;
27use Bitrix\Sale\Services\PaySystem\Restrictions;
29Loc::loadMessages(__FILE__);
48 private static $handlerDirectories =
array(
50 'LOCAL' =>
'/local/php_interface/include/sale_payment/',
51 'SYSTEM' =>
'/bitrix/modules/sale/handlers/paysystem/',
58 'SYSTEM_OLD' =>
'/bitrix/modules/sale/payment/'
68 $handlerDirectories = self::$handlerDirectories;
69 $handlerDirectories[
'CUSTOM'] = Option::get(
"sale",
"path2user_ps_files", BX_PERSONAL_ROOT.
"/php_interface/include/sale_payment/");
73 unset($handlerDirectories[
'SYSTEM_OLD']);
76 return $handlerDirectories;
86 return PaySystemActionTable::getList(
$params);
99 'select' =>
array(
'*'),
100 'filter' =>
array(
'ID' => $id)
114 'select' =>
array(
'*'),
130 $oldFields = PaySystemActionTable::getByPrimary($primary)->fetch();
133 $newFields = array_merge($oldFields,
$data);
134 $data[
'PS_CLIENT_TYPE'] = (
new Service($newFields))->getClientTypeFromHandler();
137 $updateResult = PaySystemActionTable::update($primary,
$data);
138 if ($oldFields && $updateResult->isSuccess())
140 $oldFields = array_intersect_key($oldFields,
$data);
142 'PAY_SYSTEM_ID' => $primary,
143 'OLD_FIELDS' => $oldFields,
144 'NEW_FIELDS' =>
$data,
146 $event =
new Event(
'sale', self::EVENT_ON_PAYSYSTEM_UPDATE, $eventParams);
150 return $updateResult;
162 return PaySystemActionTable::add(
$data);
170 return uniqid(
'bx_');
193 while ($item =
$items->fetch())
195 $name = $item[
'ACTION_FILE'];
197 foreach (self::getHandlerDirectories() as
$type =>
$path)
200 if (File::isFileExists(
$documentRoot.$path.$name.
'/handler.php'))
202 [$className] = self::includeHandler($item[
'ACTION_FILE']);
205 if (class_exists($className) && is_callable(
array($className,
'isMyResponse')))
207 if ($className::isMyResponse(
$request, $item[
'ID']))
224 $pos = mb_strrpos($className,
'\\');
226 $className = mb_substr($className, $pos + 1);
228 $folder = str_replace(
'Handler',
'', $className);
229 $folder = self::sanitize($folder);
230 $folder = mb_strtolower($folder);
241 return preg_replace(
"/[^a-z0-9._]/i",
"",
$name);
251 if (empty($paymentId))
257 'select' => [
'ID',
'ORDER_ID'],
260 if (intval($paymentId).
'|' == $paymentId.
'|')
262 $params[
'filter'][
'=ID'] = $paymentId;
266 $params[
'filter'][
'=ACCOUNT_NUMBER'] = $paymentId;
272 $paymentClassName = $registry->getPaymentClassName();
276 return [(int)
$data[
'ORDER_ID'], (
int)
$data[
'ID']];
289 while ($item =
$items->fetch())
291 $data = self::getHandlerDescription($item[
'ACTION_FILE'], $item[
'PS_MODE']);
292 $data[
'NAME'] = $item[
'NAME'];
293 $data[
'GROUP'] =
'PAYSYSTEM';
294 $data[
'PROVIDERS'] = [
295 'VALUE',
'COMPANY',
'ORDER',
'USER',
'PROPERTY',
296 'PAYMENT',
'BANK_DETAIL',
'MC_BANK_DETAIL',
297 'REQUISITE',
'MC_REQUISITE',
'CRM_COMPANY',
298 'CRM_MYCOMPANY',
'CRM_CONTACT'
314 'select' =>
array(
'IS_CASH'),
315 'filter' =>
array(
'ID' => $paySystemId)
321 return $data[
'IS_CASH'];
335 public static function getListWithRestrictionsByOrder(Order
$order,
float $sum =
null,
int $mode =
Restrictions\Manager::MODE_CLIENT):
array
338 $orderClone =
$order->createClone();
340 $orderPrice = $orderClone->getPrice();
341 $paymentSum = $orderPrice;
350 'SUM' => $paymentSum,
369 '=ENTITY_REGISTRY_TYPE' => $payment::getRegistryType(),
372 $bindingPaySystemIds = [];
376 if ($bindingPaySystemIds)
378 $filter[
'=ID'] = $bindingPaySystemIds;
390 while ($paySystem =
$dbRes->fetch())
392 if ($bindingPaySystemIds)
394 $result[$paySystem[
'ID']] = $paySystem;
399 if ($checkServiceResult !=
Restrictions\Manager::SEVERITY_STRICT)
401 if ($checkServiceResult ==
Restrictions\Manager::SEVERITY_SOFT)
403 $paySystem[
'RESTRICTED'] = $checkServiceResult;
405 $result[$paySystem[
'ID']] = $paySystem;
412 $result[$paySystem[
'ID']] = $paySystem;
426 public static function getHandlerList()
434 foreach (self::getHandlerDirectories() as
$type =>
$dir)
442 foreach ($directory->getChildren() as $handler)
444 if (!$handler->isDirectory())
449 $isDescriptionExist =
false;
451 foreach ($handler->getChildren() as $item)
459 if (mb_strpos($item->getName(),
'.description') !==
false)
461 $handlerName = $handler->getName();
463 include $item->getPath();
465 if (array_key_exists(
'NAME',
$data))
468 if (isset(
$data[
'IS_AVAILABLE']))
484 $handlerName = str_replace(Path::normalize(
$documentRoot),
'', $handler->getPath());
486 $group = (mb_strpos(
$type,
'SYSTEM') !==
false) ?
'SYSTEM' :
'USER';
488 if (!isset(
$result[$group][$handlerName]))
499 $isDescriptionExist =
true;
505 if (!$isDescriptionExist)
507 $group = (mb_strpos(
$type,
'SYSTEM') !==
false) ?
'SYSTEM' :
'USER';
508 $handlerName = str_replace(
$documentRoot,
'', $handler->getPath());
509 $result[$group][$handlerName] = $handler->getName();
514 $result[
'USER'] = array_merge(static::getRestHandlers(),
$result[
'USER']);
525 $pos = mb_strrpos(
$path,
'/');
527 if ($pos == mb_strlen(
$path))
530 $pos = mb_strrpos(
$path,
'/');
536 return "Sale\\Handlers\\PaySystem\\".$path.
'Handler';
551 $eventParams =
array(
'handler' => $handler);
552 $event =
new Event(
'sale', self::EVENT_ON_GET_HANDLER_DESC, $eventParams);
554 foreach (
$event->getResults() as $eventResult)
556 if ($eventResult->getType() !== EventResult::ERROR)
558 $codes = $eventResult->getParameters();
559 if ($codes && is_array($codes))
561 if (!isset(
$data[
'CODES']) || !is_array(
$data[
'CODES']))
566 $data[
'CODES'] = array_merge(
$data[
'CODES'], $codes);
571 if (isset(
$data[
'CODES']) && is_array(
$data[
'CODES']))
577 $sortA =
$a[
'SORT'] ?? 0;
578 $sortB = $b[
'SORT'] ?? 0;
580 return ($sortA < $sortB) ? -1 : 1;
602 $dirs = self::getHandlerDirectories();
604 if (mb_strpos($folder, DIRECTORY_SEPARATOR) !==
false)
606 $folderWithoutHandlerName = array_slice(explode(DIRECTORY_SEPARATOR, $folder), 1, -1);
607 $folderWithoutHandlerName = implode(DIRECTORY_SEPARATOR, $folderWithoutHandlerName);
609 $handlersDirectory =
new Directory($folderWithoutHandlerName);
610 $handlersDirectoryPhysicalPath = DIRECTORY_SEPARATOR.$handlersDirectory->getPhysicalPath().DIRECTORY_SEPARATOR;
612 foreach ($dirs as
$dir)
619 return Directory::isDirectoryExists(
$documentRoot.$folder) ? $folder :
null;
624 foreach ($dirs as
$dir)
645 $cacheManager = Application::getInstance()->getManagedCache();
647 if ($cacheManager->read(self::TTL, self::CACHE_ID))
649 $id = $cacheManager->get(self::CACHE_ID);
654 $data = PaySystemActionTable::getRow(
657 'filter' => [
'=ACTION_FILE' =>
'inner']
662 $id = self::createInnerPaySystem();
669 $cacheManager->set(self::CACHE_ID, $id);
679 private static function createInnerPaySystem()
681 $paySystemSettings =
array(
682 'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_INNER_NAME'),
683 'PSA_NAME' => Loc::getMessage(
'SALE_PS_MANAGER_INNER_NAME'),
684 'ACTION_FILE' =>
'inner',
690 $imagePath = Application::getDocumentRoot().
'/bitrix/images/sale/sale_payments/inner.png';
691 if (File::isFileExists($imagePath))
693 $paySystemSettings[
'LOGOTIP'] = \CFile::MakeFileArray($imagePath);
694 $paySystemSettings[
'LOGOTIP'][
'MODULE_ID'] =
"sale";
695 \CFile::SaveForDB($paySystemSettings,
'LOGOTIP',
'sale/paysystem/logotip');
698 $result = PaySystemActionTable::add($paySystemSettings);
712 return (
bool)self::getById($id);
739 public static function getTariff($folder, $paySystemId = 0)
744 $path = self::getPathToHandlerFolder($folder);
749 $actionFile = self::getFolderFromClassName(self::getClassNameFromPath(
$path));
750 [$className] = self::includeHandler($actionFile);
751 if (class_exists($className) && is_subclass_of($className, IPayable::class))
753 $result = $className::getStructure($paySystemId);
771 'CONNECT_SETTINGS_ALFABANK' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_ALFABANK'),
'SORT' => 100],
772 'CONNECT_SETTINGS_AUTHORIZE' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_AUTHORIZE'),
'SORT' => 100],
773 'CONNECT_SETTINGS_YANDEX' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_YANDEX'),
'SORT' => 100],
774 'CONNECT_SETTINGS_YANDEX_INVOICE' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_YANDEX_INVOICE'),
'SORT' => 100],
775 'CONNECT_SETTINGS_WEBMONEY' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_WEBMONEY'),
'SORT' => 100],
776 'CONNECT_SETTINGS_ASSIST' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_ASSIST'),
'SORT' => 100],
777 'CONNECT_SETTINGS_ROBOXCHANGE' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_ROBOXCHANGE'),
'SORT' => 100],
778 'CONNECT_SETTINGS_QIWI' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_QIWI'),
'SORT' => 100],
779 'CONNECT_SETTINGS_PAYPAL' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_PAYPAL'),
'SORT' => 100],
780 'CONNECT_SETTINGS_PAYMASTER' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_PAYMASTER'),
'SORT' => 100],
781 'CONNECT_SETTINGS_LIQPAY' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_LIQPAY'),
'SORT' => 100],
782 'CONNECT_SETTINGS_BILL' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_BILL'),
'SORT' => 100],
783 'CONNECT_SETTINGS_BILLDE' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_BILLDE'),
'SORT' => 100],
784 'CONNECT_SETTINGS_BILLEN' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_BILLEN'),
'SORT' => 100],
785 'CONNECT_SETTINGS_BILLUA' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_BILLUA'),
'SORT' => 100],
786 'CONNECT_SETTINGS_BILLLA' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_BILLLA'),
'SORT' => 100],
787 'CONNECT_SETTINGS_SBERBANK' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_SBERBANK'),
'SORT' => 100],
788 'GENERAL_SETTINGS' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_GENERAL_SETTINGS'),
'SORT' => 100],
789 'COLUMN_SETTINGS' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_COLUMN'),
'SORT' => 100],
790 'VISUAL_SETTINGS' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_VISUAL'),
'SORT' => 100],
791 'PAYMENT' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_PAYMENT'),
'SORT' => 200],
792 'PAYSYSTEM' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_PAYSYSTEM'),
'SORT' => 500],
793 'PS_OTHER' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_PS_OTHER'),
'SORT' => 10000],
794 'CONNECT_SETTINGS_UAPAY' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_UAPAY'),
'SORT' => 100],
795 'CONNECT_SETTINGS_ADYEN' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_ADYEN'),
'SORT' => 100],
796 'CONNECT_SETTINGS_APPLE_PAY' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_APPLE_PAY'),
'SORT' => 200],
797 'CONNECT_SETTINGS_SKB' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_SINARA'),
'SORT' => 100],
798 'CONNECT_SETTINGS_BEPAID' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_BEPAID'),
'SORT' => 100],
799 'CONNECT_SETTINGS_WOOPPAY' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_WOOPPAY'),
'SORT' => 100],
800 'CONNECT_SETTINGS_PLATON' => [
'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_PLATON'),
'SORT' => 100],
801 'CONNECT_SETTINGS_TBB' => [
802 'NAME' => Loc::getMessage(
'SALE_PS_MANAGER_GROUP_CONNECT_SETTINGS_TBB'),
815 public static function delete($primary)
822 $paySystemInfo = PaySystemActionTable::getRowById($primary);
823 if ($paySystemInfo[
'LOGOTIP'])
825 \CFile::Delete($paySystemInfo[
'LOGOTIP']);
828 self::deleteRestrictions($primary);
833 self::deleteBusinessValues(
$service);
836 $deleteResult = PaySystemActionTable::delete($primary);
837 if ($deleteResult->isSuccess())
842 if (!$onDeletePaySystemResult->isSuccess())
844 $deleteResult->addErrors($onDeletePaySystemResult->getErrors());
849 return $deleteResult;
858 private static function deleteRestrictions(
int $paySystemId): void
861 if ($restrictionList)
865 foreach ($restrictionList as $restriction)
868 $className = $restriction[
'CLASS_NAME'];
869 if (is_subclass_of($className, Restriction::class))
871 $className::delete($restriction[
'ID'], $paySystemId);
884 private static function deleteBusinessValues(Service
$service): void
888 $paySystemCount = PaySystemActionTable::getList([
891 'ACTION_FILE' =>
$service->getField(
'ACTION_FILE'),
893 'count_total' =>
true,
895 if ($paySystemCount === 1)
897 $handlerDescription =
$service->getHandlerDescription();
898 $handlerDescriptionCodes = array_keys($handlerDescription[
'CODES'] ?? []);
899 foreach ($handlerDescriptionCodes as
$code)
901 BusinessValueTable::deleteByCodeKey(
$code);
915 $dbRestriction = ServiceRestrictionTable::getList(
array(
917 'SERVICE_ID' => $paySystemId,
918 'SERVICE_TYPE' =>
Restrictions\Manager::SERVICE_TYPE_PAYMENT,
923 while ($restriction = $dbRestriction->fetch())
924 $data = array_merge(
$data, $restriction[
'PARAMS'][
'PERSON_TYPE_ID']);
941 public static function getPaymentObjectByData(
array $data)
943 $context = Application::getInstance()->getContext();
948 $orderClass = $registry->getOrderClassName();
955 $basketClass = $registry->getBasketClassName();
957 $basket = $basketClass::create(
$context->getSite());
958 $order->setBasket($basket);
960 $collection =
$order->getPaymentCollection();
963 return $collection->createItem();
974 $paySystemList =
array();
975 $dbRes = static::getList();
980 $paySystemList[
$data[
'ACTION_FILE']][] =
$data;
984 foreach ($paySystemList as $handler =>
$data)
987 $classHandler = static::getClassNameFromPath($handler);
989 if (is_subclass_of($classHandler,
'\Bitrix\Sale\PaySystem\ServiceHandler'))
1003 private static function getRestHandlers()
1007 $dbRes = PaySystemRestHandlersTable::getList();
1008 while ($item =
$dbRes->fetch())
1010 $result[$item[
'CODE']] = $item[
'NAME'].
' ('.$item[
'CODE'].
')';
1029 $handlerData = PaySystemRestHandlersTable::getList([
1030 'filter' => [
'=CODE' => $handler],
1033 $result[$handler] = (bool)$handlerData;
1035 return $result[$handler] ??
false;
1050 if (
$name = self::getFolderFromClassName($actionFile))
1053 foreach (self::getHandlerDirectories() as
$type =>
$path)
1055 if (File::isFileExists(
$documentRoot.$path.$name.
'/handler.php'))
1057 $className = self::getClassNameFromPath($actionFile);
1058 if (!class_exists($className))
1061 if (class_exists($className))
1063 $handlerType =
$type;
1072 if ($className ===
'')
1074 if (self::isRestHandler($actionFile))
1076 $className =
'\Bitrix\Sale\PaySystem\RestHandler';
1077 if (!class_exists($actionFile))
1079 class_alias($className, $actionFile);
1084 $className =
'\Bitrix\Sale\PaySystem\CompatibilityHandler';
1098 if (!$handlerDescription)
1103 if (isset($handlerDescription[
'HANDLER_MODE_LIST'][$psMode]))
1105 return $handlerDescription[
'HANDLER_MODE_LIST'][$psMode];
1107 elseif (isset($handlerDescription[
'NAME']))
1109 return $handlerDescription[
'NAME'];
if(!Loader::includeModule('catalog')) if(!AccessController::getCurrent() ->check(ActionDictionary::ACTION_PRICE_EDIT)) if(!check_bitrix_sessid()) $request
static delete($consumerKey, $personTypeId=null)
static getListWithRestrictions(CollectableEntity $entity)
static getObjectById($id)
static getList(array $parameters=[])
static onDeletePaySystem(Sale\PaySystem\Service $service)
static getClassNameFromPath($path)
const EVENT_ON_GET_HANDLER_DESC
static getList(array $params=array())
static getTariff($folder, $paySystemId=0)
static getInnerPaySystemId()
static getPsType($paySystemId)
static getBusValueGroups()
static searchByRequest(Request $request)
static getDataRefundablePage()
const EVENT_ON_PAYSYSTEM_UPDATE
const HANDLER_AVAILABLE_FALSE
static getHandlerName(string $handler, string $psMode='')
static getPersonTypeIdList($paySystemId)
static getFolderFromClassName($className)
static isRestHandler($handler)
const HANDLER_AVAILABLE_TRUE
static getListWithRestrictions(Payment $payment, $mode=Restrictions\Manager::MODE_CLIENT)
static getConsumersList()
static getHandlerDirectories()
static includeHandler($actionFile)
static getObjectById($id)
static getHandlerDescription($handler, $psMode=null)
static getPathToHandlerFolder($folder)
static update($primary, array $data)
static getAvailablePaySystemIdsByPaymentId(int $paymentId)
static getInstance($type)
const REGISTRY_TYPE_ORDER
static checkService($serviceId, Entity $entity, $mode=self::MODE_CLIENT)
static getRestrictionsList($serviceId)
static getPaySystemTarif($actionFile, $psId, $persId=0)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
foreach(['Bitrix\\Main'=> '/lib', 'Psr\\Container'=> '/vendor/psr/container/src', 'Psr\\Log'=> '/vendor/psr/log/src', 'Psr\\Http\\Message'=> '/vendor/psr/http-message/src', 'Psr\\Http\\Client'=> '/vendor/psr/http-client/src', 'Http\\Promise'=> '/vendor/php-http/promise/src', 'PHPMailer\\PHPMailer'=> '/vendor/phpmailer/phpmailer/src', 'GeoIp2'=> '/vendor/geoip2/geoip2/src', 'MaxMind\\Db'=> '/vendor/maxmind-db/reader/src/MaxMind/Db', 'PhpParser'=> '/vendor/nikic/php-parser/lib/PhpParser', 'Recurr'=> '/vendor/simshaun/recurr/src/Recurr',] as $namespace=> $namespacePath) $documentRoot
IsModuleInstalled($module_id)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']