Giant Dad

Giant Dad

С нами с 11 августа 2021; Место в рейтинге пользователей: #399
Giant Dad
21 июня 2023, 11:38
0
Ну, вот я Ваш метод беру, вот этот:
<?php

if (!class_exists('msPaymentInterface')) {
    require_once dirname(__FILE__, 3) . '/handlers/mspaymenthandler.class.php';
}

class EpayHalykBank extends msPaymentHandler implements msPaymentInterface
{

    /**
    * EpayHalykBank constructor.
    *
    * @param xPDOObject $object
    * @param array $config
    */
    function __construct(xPDOObject $object, $config = array())
    {
        parent::__construct($object, $config);

        $siteUrl = $this->modx->getOption('site_url');
        $assetsUrl = $this->modx->getOption('assets_url') . 'components/minishop2/';
        $paymentUrl = $siteUrl . substr($assetsUrl, 1) . 'payment/mspepayhalykbank.php';

        $this->config = array_merge(array(
            'grant_type' => 'client_credentials',
            'debug' => $modx->getOption('epay_debug'),
            'epayTokenAuthUrl' => $this->config['debug'] == 1 ? $modx->getOption('epay_test_auth_url') : $modx->getOption('epay_prod_auth_url'),
            'payPageUrl' => $this->config['debug'] == 1 ? $modx->getOption('epay_test_pay_page_url') : $modx->getOption('epay_pay_page_url'),
            'scope' => 'webapi usermanagement email_send verification statement statistics payment',
            'client_id' => $modx->getOption('epay_client_id'),
            'client_secret' => $modx->getOption('epay_client_secret'),
            'currency' => $modx->getOption('epay_payment_currency'),
            'terminal_id' => $modx->getOption('epay_terminal_id'),
            'postLink' => $modx->makeUrl($modx->getOption('epay_post_success_page_id')),
            'failurePostLink' => $modx->makeUrl($modx->getOption('epay_post_error_page_id'))
        ), $config);
    }



    /**
    * Create Auth Token
    *
    * @param 
    *
    * @return string
    */
    public function paymentAuth(msOrder $order)
    {
        $authUrl = $this->config['epayTokenAuthUrl'];

        $params = array(
            'grant_type' => $this->config['grant_type'],
            'scope' => $this->config['scope'],
            'client_id' => $this->config['client_id'],
            'client_secret' => $this->config['client_secret'],
            'invoiceID' => $this->getOrderHash($order),
            'amount' => $order->get('cost'),
            'currency' => $this->config['currency'],
            'terminal' => $this->config['terminal_id'],
            'postLink' => $this->config['postLink'],
            'failurePostLink' => $this->config['failurePostLink']
        );

        $myCurl = curl_init();
        curl_setopt_array($myCurl, array(
            CURLOPT_URL => $authUrl,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => http_build_query($params)
        ));

        $response = curl_exec($myCurl);
        curl_close($myCurl);

        return json_decode($response, true);

    }


    /**
    * Returns a direct link for continue payment process of existing order
    *
    * @param msOrder $order
    *
    * @return string
    */
    public function getPaymentLink(msOrder $order)
    {

        $authResponse = $this->paymentAuth($order);

        $msAddress = $order->getOne('Address');
        $orderPhone = $msAddress->get('phone');
        $orderEmail = $msAddress->get('email');
        $orderReceiver = $msAddress->get('receiver');
        $orderComment = $msAddress->get('comment');

        if(substr($orderPhone, 0, 1) == '7'){
            $orderPhone = '+' . $orderPhone;
        }
        // if($authResponse['access_token'])
        // 'data' => "{\"statement\":{\"name\":\"Arman      Ali\",\"invoiceID\":\"80000016\"}}",

        return $this->config['payPageUrl'] . '?' .
        http_build_query(array(
            'action' => 'continue',
            'msorder' => $order->get('id'),
            'mscode' => $this->getOrderHash($order),
            'invoiceId' => $this->getOrderHash($order),
            'backLink' => $this->config['postLink'].'?action=success',
            'failureBackLink' => $this->config['failurePostLink'].'?action=error',
            'postLink' => $this->$siteUrl,
            'failurePostLink' => $this->config['failurePostLink'].'?action=error',
            'language' => 'rus',
            'description' => 'Оплата в интернет магазине',
            'accountId' => $this->config['client_id'],
            'terminal' => $this->config['terminal_id'],
            'amount' => $order->get('cost'),
            'data' => array(
                'name' => $orderReceiver,
                'orderId' => $order->get('id'),
                'invoiceId' => $this->getOrderHash($order),
                'phone' => $orderPhone,
                'email' => $orderEmail,                
                'comment' => $orderComment
            ),
            'currency' => $this->config['currency'],
            'phone' => $orderPhone,
            'email' => $orderEmail,
            'cardSave' => true,
            'auth' => $authResponse

        ));
    }
}
Заменяю в
require_once dirname(__FILE__, 3) . '/handlers/mspaymenthandler.class.php';
путь на свой:
require_once dirname(__FILE__, 3) . '/model/minishop2/mspaymenthandler.class.php';
название класса оставляю прежним,
регистрирую через
if ($miniShop2 = $this->modx->getService('miniShop2')) {
    $miniShop2->addService('payment', 'EpayHalykBank',
        '{core_path}components/minishop2/custom/payment/epayhalykbank.class.php'
    );
}
Может быть я что-то ещё упускаю?
И ещё, а вот как это должно вообще работать (хотя бы в общих чертах)? После нажатия кнопки «Оплатить заказ» что должно происходить? в каких файлах какие функции должны отрабатывать? Для меня просто оплата в minishop2 пока новый опыт и я не совсем представляю как это вообще работает
Giant Dad
21 июня 2023, 11:23
0
а видели я пишу выше «регистрирую через $this->modx»? это я как раз про регистрацию в системе через консоль. делаю как раз по документации, на которую вы ссылаетесь.
Создаю класс, подключаю его через консоль, в ms2_services сервис прописывается,
{«cart»:[],«order»:[],«payment»:{«epayhalykbank»:"{core_path}components\/minishop2\/custom\/payment\/epayhalykbank.class.php"},«delivery»:[]}
но класс-обработчик не появляется в выпадашке при создании нового способа оплаты
Giant Dad
21 июня 2023, 11:18
0
я так и делаю, как раз по вашему топику, регистрирую в консоли, указываю свой название класса и файла, в сервисах путь появляется, но в выборе способа оплаты — пусто, только стандартный PayPal (я, кстати, тоже для ХалыкБанка пытаюсь сделать)
Giant Dad
20 июня 2023, 16:22
0
копирую Ваш код, регистрирую через $this->modx, но при создании оплаты, класс-обработчик всё равно не появляется disk.yandex.ru/d/xq_rjkOVRfquHQ только стандартный PayPal. Подскажите, пожалуйста, в чём может быть проблема
Giant Dad
31 мая 2023, 13:25
0
Да, так сработало! Спасибо огромное! получается, в where можно и просто готовое условие вписать… учтём
Giant Dad
31 мая 2023, 13:12
0
Тот же резальтат. SQL-запрос генерится с условием
WHERE  ( `msProduct`.`class_key` = 'msProduct' AND `Data`.`old_price` > 'Data.price' AND `Data`.`internet_magazin` = '1' AND `msProduct`.`parent` IN (21904, ...) AND `msProduct`.`published` = 1 AND `msProduct`.`deleted` = 0 )
вот тут неправильно получается
`Data`.`old_price` > 'Data.price'
а должно быть
`Data`.`old_price` > `Data`.`price`
Если поменять руками запрос в PHPMySql, то всё работает, но как сделать так, чтобы сниппет msProducts эту часть правильно генерил? Кстати, есть вообще документация как правильно прописывать в сниппете условие where? Только не с типичными примерами, а что-то посложнее типа того что у меня
Giant Dad
31 мая 2023, 12:33
0
Копирую ваш вариант, естественно со своими родителями, выдаёт всё равно все товары подряд и со скидкой и без. Если убрать условие по свойству internet_magazin, то выдаёт то же самое, все товары.
Вот запрос: Added where condition: class_key=msProduct, Data.old_price:>=Data.price,…
Giant Dad
30 мая 2023, 18:11
0
internet_magazin — это свойство товара, расширенное вручную, не через msAddField
Giant Dad
01 февраля 2023, 15:11
0
Спасибо за объяснение
Giant Dad
20 октября 2022, 17:44
0
да я эти варианты в первую очередь проверил, не выводит ничего
Giant Dad
12 сентября 2022, 13:45
0
Я в классе уже дописал, но как говорится, есть нюанс. Получается, что у нас в начале выгрузки все товары с сайта пропадут, и будут появляться по мере работы выгрузки? Как-то это не очень хорошее решение. Может как-то можно сверять массивы ID товаров на сайте и в выгрузке и потом, положим, по тем ID, что нет в выгрузке пробегаться, и отключать эти товары?
Giant Dad
12 сентября 2022, 11:36
0
У меня есть только событие mskladOnProductImport На него можно повесить? Или оно срабатывает на каждом ресурсе, а не до выгрузки?
joxi.ru/5mdEGK0IJ49952
Giant Dad
08 сентября 2022, 16:09
0
Здравствуйте.
Не могу обратиться с вопросом в техподдержу, поэтому попробую спросить здесь, может кто-то подскажет.
У нас на сайте требуется произвести получение документов из 1С на сайт (Счета, Платежи и Отчеты за период), возможна ли реализация данного функционала через mSklad/mSync? Может быть, есть какие-то готовые решения или же сторонние модули, которые бы могли решить данную задачу?

Передача данных из 1С (скорее всего, в xml формате). Необходимо получать данные и записывать их БД сайта.
Giant Dad
30 июня 2022, 18:01
0
Я их уже пробовал. Так же, как и у автора, у меня не работает
Giant Dad
19 июня 2022, 15:57
0
Так контекстов предполагается много, плюс самих шаблонов там дофига. Нужно какое-то более универсальное решение
Giant Dad
19 июня 2022, 15:56
0
Ну как в контенте, там может быть и дизайн будет другой. Там вообще предполагалось, что можно будет сделать на основе вот этой статьи. cat-art.ru/blog/multiyazyichnost-modx-revo Только без Babel.