Здравствуйте! Помогите разобраться. пишу дополнение подключение платёжной системы, вот по этому примеру
в настройках магазина всё отображается и подключается.
При пополнений счёта или оплаты товара счёт не пополняется автоматом, но при этом платёж успешно проходит и перебрасывает как положено на страницу успешной оплаты. Подскажите что не так.
Вот код
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 в строке, сгенерированной выше.Здесь уже пробовал по разному ничего не выходит.
Вот здесь небольшое видео по настройке