Модуль оплаты WordPress - Bluemedia - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь получить работу с модулем оплаты от шлюза bluemedia, и у меня есть проблема.я создаю файлы, например, как с PayPal,

    <?php

class SLN_Payment_Bluemedia
{
    const TEST_URL = 'https://pay-accept.bm.pl/payment';
    const PROD_URL = 'https://pay.bm.pl/payment';
    protected $plugin;

    public function __construct(SLN_Plugin $plugin)
    {
        $this->plugin = $plugin;
    }

    function reverseCheckIpn()
    {
        $raw_post_data  = file_get_contents('php://input');
        $raw_post_array = explode('&', $raw_post_data);
        $myPost         = array();
        foreach ($raw_post_array as $keyval) {
            $keyval = explode('=', $keyval);
            if (count($keyval) == 2) {
                $myPost[$keyval[0]] = urldecode($keyval[1]);
            }
        }

        $req = 'cmd=_notify-validate';
        if (function_exists('get_magic_quotes_gpc')) {
            $get_magic_quotes_exists = true;
        }
        foreach ($myPost as $key => $value) {
            if ($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
                $value = urlencode(stripslashes($value));
            } else {
                $value = urlencode($value);
            }
            $req .= "&$key=$value";
        }
        $fields = (is_array($getFields)) ? http_build_query($getFields) : $getFields;

        $isTest = $this->plugin->getSettings()->isBluemediaTest();

        $ch = curl_init($this->getBaseUrl());
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $isTest ? 0 : 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('BmHeader: pay-bm'));

        if (!($res = curl_exec($ch))) {
            error_log("Got " . curl_error($ch) . " when processing IPN data");
            curl_close($ch);
            exit;
        }
        curl_close($ch);


        return (strcmp($res, "VERIFIED") == 0);
    }


    public function getUrl($id, $amount, $title)
    {
        $settings = $this->plugin->getSettings();
        $url      = SLN_Func::currPageUrl();
    $url      = apply_filters('sln.booking.payment.bluemedia.get-url', $url);

        return $this->getBaseUrl() . "?"
        . http_build_query(
            array(
                'ServiceID'      => $settings->getBluemediaID(),
                'OrderID'       => $id,
                'Amount'        => $amount,
                'Hash'      => $settings->getBluemediaHash(),
                'Currency' => $settings->getCurrency(),

            )
        );
    }

    private function getBaseUrl()
    {
        $isTest = $this->plugin->getSettings()->isBluemediaTest();
        return $isTest ?
            self::TEST_URL : self::PROD_URL;
    }

    function isCompleted($amount)
    {
        return floatval($_POST['mc_gross']) == floatval($amount) && $_POST['payment_status'] == 'Completed';
    }
    function getTransactionId(){
        return sanitize_text_field(wp_unslash( $_POST['txn_id'] ));
    }
}

Другой файл выглядит следующим образом:

<?php

class SLN_PaymentMethod_Bluemedia extends SLN_PaymentMethod_Abstract
{

    public function getFields(){
        return array(
            'pay_bluemedia_domain',
            'pay_bluemedia_id',
            'pay_bluemedia_hash',
            'pay_bluemedia_test'
        );
    }

    public function dispatchThankYou(SLN_Shortcode_Salon_ThankyouStep $shortcode, SLN_Wrapper_Booking $booking = null){
        if (isset($_GET['op'])) {
            $op = explode('-', sanitize_text_field($_GET['op']));
            $action = $op[0];
            if ($action == 'success') {
                if ($this->isTest()) {
                    $booking->markPaid('test');
                }
                $shortcode->goToThankyou();
            } elseif ($action == 'notify') {
                $this->processIpn($op[1]);
            } elseif ($action == 'cancel') {
                return __('Your payment has not been completed', 'salon-booking-system');
            } else {
                throw new Exception('payment method operation not managed');
            }
        } elseif ($_GET['mode'] == 'bluemedia') {
            if ($shortcode->isAjax()) {
                    $bookUrl = str_replace(site_url(), '',get_permalink($this->plugin->getSettings()->get('pay')));
                    $_SERVER['REQUEST_URI'] = $bookUrl.'?sln_step_page=thankyou&submit_thankyou=1&mode=bluemedia';
            }
            $ppl = new SLN_Payment_Bluemedia($this->plugin);
            $url = $ppl->getUrl($booking->getId(), $booking->getToPayAmount(false), $booking->getTitle());
            $shortcode->redirect($url);
        } else {
            throw new Exception('payment method mode not managed');
        }
    }

    private function isTest(){
        return $this->plugin->getSettings()->isBluemediaTest();
    }
}

внутри инструкции theres информация, на которую должна смотреть ссылка, например: https://domena_bramki/sciezka?ServiceID=2&OrderID=100&Amount=1.50&Hash=2ab5 2e6918c6ad3b69a8228a2ab815f11ad58533eeed963dd990df81

и мой сценарий правильно генерирует эту ссылку таким же образом, но шлюз bluemedia сообщает: мы не можем реализовать вашу транзакцию ..... я думаю, может быть, есть проблема с генерацией хэша ...

Кто-нибудь может мне помочь ?

...