Здравствуйте! Помогите разобраться. пишу дополнение подключение платёжной системы, вот по этому примеру
в настройках магазина всё отображается и подключается.
При пополнений счёта или оплаты товара счёт не пополняется автоматом, но при этом платёж успешно проходит и перебрасывает как положено на страницу успешной оплаты. Подскажите что не так.
Вот код
add_action('init','rcl_add_Advcash_payment'); function rcl_add_Advcash_payment(){ $pm = new Rcl_Advcash_Payment(); $pm->register_payment('Advcash'); } class Rcl_Advcash_Payment extends Rcl_Payment{ public $form_pay_id; function register_payment($form_pay_id){ $this->form_pay_id = $form_pay_id; parent::add_payment($this->form_pay_id, array( 'class'=>get_class($this), 'request'=>'get_param', 'name'=>'Advcash', 'image'=>rcl_addon_url('assets/advcash.jpg',__FILE__) )); if(is_admin()) $this->add_options(); } function add_options(){ add_filter('rcl_pay_option',(array($this,'options'))); add_filter('rcl_pay_child_option',(array($this,'child_options'))); } function options($options){ $options[$this->form_pay_id] = __('Advcash','rcl'); return $options; } function child_options($child){ $opt = new Rcl_Options(); $child .= $opt->child( array( 'name'=>'connect_sale', 'value'=>$this->form_pay_id ), array( $opt->title(__('Настройки подключения "Advcash"','rcl')), $opt->label(__('Название магазина или компании)','rcl')), $opt->option('text',array('name'=>'ac_name')), $opt->notice(__('Название компании указанное в настройках на сайте Advcash','rcl')), $opt->label(__('Логин аккаунта (E-mail)','rcl')), $opt->option('text',array('name'=>'ac_login')), $opt->label(__('Ключ','rcl')), $opt->option('text',array('name'=>'ac_sekret')) ) ); return $child; } function pay_form($data){ global $rmag_options; $desc = ($data->description)? $data->description: 'Платеж от '.get_the_author_meta('user_email',$data->user_id); $baggage_data = ($data->baggage_data)? $data->baggage_data: false; //получаем данные из настроек подключения $login = $rmag_options['ac_login']; //формируем описание платежа по его типу $desc = ($data->pay_type==1)? 'Пополнение личного счета': 'Оплата заказа'; $currency = $rmag_options['primary_cur']; $ac_name = $rmag_options['ac_name']; $sekret = $rmag_options['ac_sekret']; $coment =($data->pay_type==1)? 'Пополнение личного счета': 'Оплата заказа'; //формируем массив данных полей формы платежа, //где ключами массива являются имена параметров отправляемых //в платежную систему, а значениями - отправляемые данные $fields = array( 'ac_account_email'=>$login, 'ac_sci_name'=>$ac_name, 'ac_amount'=>$data->pay_summ, 'ac_order_id'=>$data->pay_id, 'ac_currency'=>$currency, 'ac_sign'=>$sekret, 'description'=>$desc, ''=>$data->user_id, ''=>$data->pay_type, ''=>$baggage_data, 'ac_comments'=>$coment ); //Третьим параметром указываем куда именно будут отправляться данные платежа $form = parent::form($fields,$data,"https://wallet.advcash.com/sci/"); return $form; } function result($data){ global $rmag_options; $ac_sekret = $rmag_options['ac_sekret']; define(strtoupper(md5($ac_sekret))); //получаем необходимые данные от платежной системы $data->pay_summ = $_REQUEST['ac_amount']; $data->pay_id = $_REQUEST['ac_order_id']; $data->user_id = $_REQUEST['']; $data->pay_type = $_REQUEST['']; $data->baggage_data = $_REQUEST['']; $data->ac_sign =$_REQUEST['ac_sekret']; //формируем хеш, согласно алгоритма платежной системы $sign = strtoupper(hash( 'sha256', $_REQUEST['ac_sci_name'] . $_REQUEST['ac_account_email'] . $_REQUEST['ac_amount'] . $_REQUEST['ac_order_id'] . $_REQUEST['ac_sign'] )); //сверяем полученный хеш и присланный if($sign!=$_REQUEST['hash']){ //если хеш не совпадает, то отправляем письмо об ошибке //и прекращаем работу скрипта rcl_mail_payment_error($sign); exit; } //Проверяем наличие платежа //и если его нет, то произвоидим платеж if(!parent::get_pay($data)){ parent::insert_pay($data); exit ($_POST['ac_order_id'] . '|success'); } } function success(){ global $rmag_options; //получаем ИД платежа и ИД пользователя в массив $data = array( 'pay_id' => $_REQUEST['ac_order_id'], 'user_id' => $_REQUEST[''] ); //Передаем полученный массив в родительский класс на проверку if(parent::get_pay((object)$data)){ //Если платеж присутствует, то перенаправляем пользователя //на страницу с текстом об удачной оплате wp_redirect(get_permalink($rmag_options['page_successfully_pay'])); exit; } else { wp_die('Платеж не найден в базе данных!'); } } } }
'request'=>'get_param',
вместо get_param надо вставить наименование присылаемого платежной системой параметра во время оповещения вашего сервера, т.е. любого одного, который присылается на RESULT. В вашем случае, можно использовать ac_order_id, если этот параметр действительно шлется.
''=>$data->user_id, ''=>$data->pay_type, ''=>$baggage_data,
тут не понял что происходит, параметры должны иметь имена, смотрите в описании АПИ этой платежной системы, как передавать пользовательские параметры, должны обязательно передаваться ИД пользователя и тип платежа.
$data->user_id = $_REQUEST['']; $data->pay_type = $_REQUEST['']; $data->baggage_data = $_REQUEST[''];
тут таже история
$data = array( 'pay_id' => $_REQUEST['ac_order_id'], 'user_id' => $_REQUEST[''] );
и здесь $_REQUEST[''] не должен быть пустым
Добрый день!
В прошлый раз не было времени закончить, решил сегодня продолжить. Помогите разобраться, так и не получается добиться результата автоматического начисления.
Сейчас добился что уже приходит письмо об неудачной оплате, сам платеж через платёжную систему поступил нормально.
вот содержимое письма:
ac_src_wallet - U737340335739 ac_dest_wallet - U818561063395 ac_amount - 1.00 ac_merchant_amount - 1.00 ac_merchant_currency - USD ac_fee - 0.00 ac_buyer_amount_without_commission - 1.00 ac_buyer_amount_with_commission - 1.00 ac_buyer_currency - USD ac_transfer - 7611525a-9ad6-4cff-b45a-0ee602567a6e ac_sci_name - ProxyBrain_test ac_start_date - 2017-09-27 09:25:09 ac_order_id - 1506515075 ac_ps - ADVANCED_CASH ac_transaction_status - COMPLETED ac_buyer_email - alexx15830@yandex.ru ac_buyer_verified - false ac_hash - 2bbfefce89fbd699cde54f73b896c3f1c59a40eb1a8e4b3da82b16193f33084d USER_ID - 2 Cформированный хеш - B56F52342FB1CF1C80B5DBAEF6B57D6F Текущий пост - 136 RESULT - 136 SUCCESS - 138
Я так понимаю что у меня HASH не совпадает. вот часть кода:
function pay_form($data){ global $rmag_options; $pm_account = $rmag_options['pm_account']; $pm_name = $rmag_options['pm_name']; $currency = $rmag_options['primary_cur']; $fields = array( 'ac_sci_name'=>$pm_account, 'ac_account_email'=>$pm_name, 'ac_order_id'=>$data->pay_id, 'ac_amount'=>$data->pay_summ, 'ac_currency'=>$currency, 'ac_hash'=>$data->pay_type, 'USER_ID'=>$data->user_id, ); $form = parent::form($fields,$data,"https://wallet.advcash.com/sci/"); return $form; } function result($data){ global $rmag_options; $pm_phrase = $rmag_options['pm_phrase']; define('ALTERNATE_PHRASE_HASH', strtoupper(md5($pm_phrase))); $array = array( $_REQUEST['ac_order_id'], $_REQUEST['ac_account_email'], $_REQUEST['ac_amount'], $_REQUEST['ac_currency'], ALTERNATE_PHRASE_HASH, $_REQUEST['TIMESTAMPGMT'] ); $hash = strtoupper(md5(implode(':',$array))); if($hash!=$_REQUEST['ac_HASH']){ rcl_mail_payment_error($hash); die('HASH failed.'); } $data->pay_summ = $_REQUEST['ac_amount']; $data->pay_id = $_REQUEST['ac_order_id']; $data->user_id = $_REQUEST['USER_ID']; $data->pay_type = $_REQUEST['ac_hash']; if(!parent::get_pay($data)){ parent::insert_pay($data); die('PAYMENT OK.'); } }
Что не так делаю?
Вот здесь инструкция по настройкам если нужна:
начинать надо с формирования формы платежа, там есть несколько вопросов, например, тут
'ac_account_email'=>$pm_name,
почему ac_account_email? ведь $pm_name никакой не email
и тут
'ac_hash'=>$data->pay_type,
что за хеш? там передается тип платежа. Зачем вы запутываете сами себя давая неверные наименования передаваемым параметрам?
Секретный хеш из данных полей не формируете при передаче в платежную систему, это минус, но может у вас данная проверка в настройках отключена.
При получении данных на страницу RESULT хеш уже проверяется, но что то мне подсказывает, что неверно. Как я понял, для проверки хеша надо склеивать значения всех параметров формы платежа вместе с секретным ключом, а у вас в проверке не участвуют как минимум два параметра: 'ac_hash' и 'USER_ID', но они же передаются с платежной формы и видимо возвращаются на RESULT, значит и в формировании хеша тоже участвуют, надо дополнить ими массив данных при проверке подписи:
$array = array( $_REQUEST['ac_order_id'], $_REQUEST['ac_account_email'], $_REQUEST['ac_amount'], $_REQUEST['ac_currency'], $_REQUEST['USER_ID'], $_REQUEST['ac_hash'], ALTERNATE_PHRASE_HASH, $_REQUEST['TIMESTAMPGMT'] ); $hash = strtoupper(md5(implode(':',$array)));
видимо как то так, проверяйте
Андрей CS сказал(а)
начинать надо с формирования формы платежа, там есть несколько вопросов, например, тут
'ac_account_email'=>$pm_name,
почему ac_account_email? ведь $pm_name никакой не email
ac_account_email -это логин входа в платежную систему
'ac_hash'=>$data->pay_type,
Здесь я сам не могу понять какие параметры нужны для pay_type
проверку подписи отключил в настройках платёжной системы.
Вот так выглядит форма которая сгенерирована в системе чтоб было понятно откуда ac_account_email
<form method="post" action="https://wallet.advcash.com/sci/"> <input type="hidden" name="ac_account_email" value="test@mail.ru" /> <input type="hidden" name="ac_sci_name" value="ProxyBrain_test" /> <input type="text" name="ac_amount" value="1.00" /> <input type="text" name="ac_currency" value="USD" /> <input type="text" name="ac_order_id" value="123456789" /> <input type="text" name="ac_sign" value="c5aec96d51fa363e5f07d80483e7f06f04dbcf0a982fe5de3dc7255f3c2ba2a8" /> <!-- Optional Fields --> <input type="hidden" name="ac_success_url" value="http://test.ru/uspesh" /> <input type="hidden" name="ac_success_url_method" value="GET" /> <input type="hidden" name="ac_fail_url" value="http://test.ru/fail" /> <input type="hidden" name="ac_fail_url_method" value="GET" /> <input type="hidden" name="ac_status_url" value="http://test.ru/success" /> <input type="hidden" name="ac_status_url_method" value="GET" /> <input type="text" name="ac_comments" value="Comment" /> <input type="submit" /> </form>
Формирование цифровой подписи
Для генерирования цифровой подписи (ac_sign) Вам необходимо объединить
следующие параметры Формы «Запрос платежа» с паролем SCI (secret),
указанным при создании SCI.
ac_account_email:ac_sci_name:ac_amount:ac_currency:secret:ac_order_id
Разделитель ":".
ac_sign является SHA-256 hash в строке, сгенерированной выше.
Здесь уже пробовал по разному ничего не выходит.
Aleks сказал(а)
Андрей CS сказал(а)
начинать надо с формирования формы платежа, там есть несколько вопросов, например, тут
'ac_account_email'=>$pm_name,
почему ac_account_email? ведь $pm_name никакой не emailac_account_email -это логин входа в платежную систему
'ac_hash'=>$data->pay_type,Здесь я сам не могу понять какие параметры нужны для pay_type
проверку подписи отключил в настройках платёжной системы.
Вот так выглядит форма которая сгенерирована в системе чтоб было понятно откуда ac_account_email
<form method="post" action="https://wallet.advcash.com/sci/"> <input type="hidden" name="ac_account_email" value="test@mail.ru" /> <input type="hidden" name="ac_sci_name" value="ProxyBrain_test" /> <input type="text" name="ac_amount" value="1.00" /> <input type="text" name="ac_currency" value="USD" /> <input type="text" name="ac_order_id" value="123456789" /> <input type="text" name="ac_sign" value="c5aec96d51fa363e5f07d80483e7f06f04dbcf0a982fe5de3dc7255f3c2ba2a8" /> <!-- Optional Fields --> <input type="hidden" name="ac_success_url" value="http://test.ru/uspesh" /> <input type="hidden" name="ac_success_url_method" value="GET" /> <input type="hidden" name="ac_fail_url" value="http://test.ru/fail" /> <input type="hidden" name="ac_fail_url_method" value="GET" /> <input type="hidden" name="ac_status_url" value="http://test.ru/success" /> <input type="hidden" name="ac_status_url_method" value="GET" /> <input type="text" name="ac_comments" value="Comment" /> <input type="submit" /> </form>Формирование цифровой подписи
Для генерирования цифровой подписи (ac_sign) Вам необходимо объединить
следующие параметры Формы «Запрос платежа» с паролем SCI (secret),
указанным при создании SCI.
ac_account_email:ac_sci_name:ac_amount:ac_currency:secret:ac_order_id
Разделитель ":".
ac_sign является SHA-256 hash в строке, сгенерированной выше.Здесь уже пробовал по разному ничего не выходит.
Вот здесь небольшое видео по настройке