Перейти к содержимому


Фотография

Wordpress+API+Webmoney


  • Пожалуйста, авторизуйтесь для ответа.
20 ответов в данной теме

#1 Участник buildcommunity (WMID 122248610247 )

  • Группа: Пользователи
  • сообщений 10
  • Регистрация: 05-марта 15
  • Webmoney BL

Отправлено 01 апреля 2016 - 10:33

Всем доброго дня.

 

У меня вопрос.

Есть сайт на wordpress на котором установлена тема, что-то наподобие каталога. Тема буржуйская, соответственно прием денег только на буржуйские агрегаторы. Платежные шлюзы импортируются как плагины, плагины с сайта создателя темы. Хотелось бы прикрутить наш webmoney.
Для примера, вот как организована форма формирования платежа через moneybookers:

//1. HOOK INTO THE GATEWAY ARRAY
function wlt_gateway_moneybookers_admin($gateways){
    $nId = count($gateways)+1;
    $gateways[$nId]['name']         = "Moneybookers (Skrill)";
    $gateways[$nId]['logo']         = plugins_url()."/wlt_gateway_moneybookers/img/logo.png";
    $gateways[$nId]['function']     = "wlt_gateway_moneybookers_form";
    $gateways[$nId]['website']      = "https://www.skrill.com";
    $gateways[$nId]['callback']     = "yes";
    //$gateways[$nId]['ownform']        = "yes";
    $gateways[$nId]['fields']       = array(
    '1' => array('name' => 'Enable Gateway', 'type' => 'listbox','fieldname' => $gateways[$nId]['function'],'list' => array('yes'=>'Enable','no'=>'Disable',) ),    
    '2' => array('name' => 'moneybookers Email', 'type' => 'text', 'fieldname' => 'moneybookers_e'), 
    '3' => array('name' => 'Currency Code', 'type' => 'text', 'fieldname' => 'moneybookers_c' , 'default' => 'USD'), 
     
    '4' => array('name' => 'Display Name', 'type' => 'text', 'fieldname' => $gateways[$nId]['function'].'_name', 'default' => 'Pay Now with moneybookers'), 
    );
    $gateways[$nId]['notes']    = "";
    return $gateways;
}
add_action('hook_payments_gateways','wlt_gateway_moneybookers_admin');
 
//2. BUILD THE PAYMENT FORM DATA
function wlt_gateway_moneybookers_form($data=""){
 
    global $wpdb, $userdata;
    
    /* DATA AVAILABLE
   
    $GLOBALS['total']    
    $GLOBALS['subtotal']     
    $GLOBALS['shipping']     
    $GLOBALS['tax']          
    $GLOBALS['discount']     
    $GLOBALS['items']        
    $GLOBALS['orderid']      
    $GLOBALS['description'] 
    
    */
    
$gatewaycode = '<form action="https://www.moneybookers.com/app/payment.pl" method="post" name="gateway_moneybookers">
  <input type="hidden" name="pay_to_email" value="'.get_option('moneybookers_e').'"/>
  <input type="hidden" name="status_url" value="'.$GLOBALS['CORE_THEME']['links']['callback']."?order_id=".$GLOBALS['orderid'].'"/>
  <input type="hidden" name="cancel_url" value="'.$GLOBALS['CORE_THEME']['links']['callback'].'"/> 
  <input type="hidden" name="language" value="EN"/>
  <input type="hidden" name="amount" value="'.$GLOBALS['total'].'"/>
  <input type="hidden" name="currency" value="'.get_option('moneybookers_c').'"/>
  <input type="hidden" name="detail1_description" value="'.$GLOBALS['description'].'"/>
  <input type="hidden" name="transaction_id" value="'.$GLOBALS['orderid'].'"/>
 
  '.MakePayButton('javascript:document.gateway_moneybookers.submit();').' 
</form>';
 
return $gatewaycode;
 
}
 
// 3. HANDLE THE CALLBACK 
function wlt_gateway_moneybookers_callback($orderID){ global $CORE, $userdata;
 
    if(isset($_POST['pay_to_email']) && isset($_POST['transaction_id']) && $_POST['status'] == 2 ){      
         
        core_generic_gateway_callback($_POST['transaction_id'], array('description' =>  '', 'email' => $_POST['pay_from_email'], 'shipping' => 0, 'shipping_label' => "", 'tax' => 0, 'total' => $_POST['amount'] ) );
        
        return "success";   
        
    }else{
        return ""; // LEAVE FOR SYSTEM TO PICK  UP
    }   
}
 
add_action('hook_callback','wlt_gateway_moneybookers_callback');
 
?>

Я перебрал форму под webmoney, но не могу понять как сформировать 3-ю часть - 3. HANDLE THE CALLBACK - отчет об успешном или неудачном завершении операции. С сайта webmoney:

<html> 
<head>
 ... 
</head> 
<body> 
... 
<form method="<метод вызова Success URL>" action="<Success URL>">
  <input type="hidden" name="LMI_PAYMENT_NO" value="1">
  <input type="hidden" name="LMI_SYS_INVS_NO" value="281">
  <input type="hidden" name="LMI_SYS_TRANS_NO" value="558">
  <input type="hidden" name="LMI_SYS_TRANS_DATE" value="20020314 14:01:14">
  <input type="hidden" name="FIELD_1" value="VALUE_1">
  <input type="hidden" name="FIELD_2" value="VALUE_2">
  ... 
</form>
 .. 
</body> 
</html>

Все вроде просто, но как это впихнуть в мой код?
Программист я так себе - самоучка.

Вот еще концовки из других плагинов-агрегаторов:

// 3. HANDLE THE CALLBACK FROM GOOGLE WALLET
function wlt_gateway_adyen_callback($orderID){ global $CORE;
 
    if(isset($_POST['total'])){     
        $PPTPayment->UpdateOrderStatus(5, $orderID);
        return "thankyou";  
    }else{
        return ""; // LEAVE FOR SYSTEM TO PICK  UP
    }   
}
 
add_action('hook_callback','wlt_gateway_adyen_callback');
// 3. HANDLE THE CALLBACK 
function wlt_gateway_coinpayments_callback($orderID){ global $CORE, $userdata;
 
    if(isset($_POST['cartId']) && strlen($_POST['cartId']) > 4 ){        
         
        core_generic_gateway_callback($_POST['cartId'], array('description' =>  $_POST['desc'], 'email' => $userdata->user_email, 'shipping' => 0, 'shipping_label' => $_POST['displayAddress']." \n ".$_POST['countryString']." \n ".$_POST['postcode']." \n ".$_POST['email']." \n Tel:".$_POST['tel'], 'tax' => 0, 'total' => $_GET['authCost'] ) );
        
        return "success";   
        
    }else{
        return ""; // LEAVE FOR SYSTEM TO PICK  UP
    }   
}
 
add_action('hook_callback','wlt_gateway_coinpayments_callback');
// 3. HANDLE THE CALLBACK FROM PAYPAL PRO
function _process_blankform(){ global $CORE, $wpdb, $userdata;
    // PROCESS THE PAYMENT
    if(isset($_POST['payment_gateway_blankform']) && $_POST['pro']['amount'] > 0){  
        
        $email_content = "";
        foreach($_POST['bf'] as $k=>$v){
        $email_content .= $k.": ".$v." <br />"; 
        }
        
        $CORE->SENDEMAIL(get_option('blankform_email'),0,'[IMPORTANT] BLANK PAYMENT FORM',$email_content);
         
        // SUCCESS AND PASS IN DATA
        core_generic_gateway_callback($_POST['blank_order_id'], array('description' =>  $_POST['description'], 'email' => $userdata->user_email, 'shipping' => 0, 'shipping_label' => '', 'tax' => 0, 'total' => $_POST['pro']['amount'] ) );
    
        // REDIRECT USER ON SUCCESSFUL PAYMENT
        header("location:".$GLOBALS['CORE_THEME']['links']['callback']."?status=thankyou");
        exit();
         
    }
}
add_action('init','_process_blankform');

Буду рад помощи.


    • 0
  • Наверх

#2 Участник Valle (WMID 212592349835 )

  • Группа: Пользователи
  • сообщений 15
  • Регистрация: 19-апреля 12
  • Webmoney BL

Отправлено 01 апреля 2016 - 21:58

Вообще лучше всего с подобным вопросом в техническую поддержку обратиться через тикетную систему.

Перенаправят специалисту и тот даст ответ :)

Продублируйте тему в тикете технической поддержке, если не сделали ранее.


    • 0
  • Наверх

#3 Знаток ^-^ (WMID 273407224562 )

  • Группа: Пользователи
  • сообщений 6 059
  • Регистрация: 10-сентября 13
  • Webmoney BL

Отправлено 02 апреля 2016 - 09:58

Служба поддержки WebMoney отвечает исключительно на вопросы ошибок работы интерфейсов. Если пользователь не умеет программировать, тогда они попросят задавать эти вопросы своему программисту или попросят нанять такового.

 

Если бы Вы привели, где конкретно что-то не работает. Потому что разбираться в функциях что куда отправляется, что куда идёт никто не будет.

Какие конкретно у Вас возникают ошибки и на каком этапе? Вот просто пальцем тыкните.

А много кода... ну это сложно и времени отнимет много.


Бесплатный SSL на 3 мес. / Сертификат SSL от 299 руб.
    • 0
  • Наверх

#4 Знаток ! добрый торговец ! (WMID 217358758215 )

  • Группа: Пользователи
  • сообщений 9 850
  • Регистрация: 18-мая 09
  • МестоположениеЭфиопия
  • Webmoney BL

Отправлено 02 апреля 2016 - 23:19

А много кода... ну это сложно и времени отнимет много.

 И вообще, дорого стоит :)
 

Есть сайт на wordpress

Думаю, на wordpress есть куча готовых решений, возьмите одно из них и посмотрите, как там.
    • 1
  • Наверх

#5 Участник buildcommunity (WMID 122248610247 )

  • Группа: Пользователи
  • сообщений 10
  • Регистрация: 05-марта 15
  • Webmoney BL

Отправлено 03 апреля 2016 - 00:44

Если бы Вы привели, где конкретно что-то не работает. Потому что разбираться в функциях что куда отправляется, что куда идёт никто не будет.
Какие конкретно у Вас возникают ошибки и на каком этапе? Вот просто пальцем тыкните.
А много кода... ну это сложно и времени отнимет много.

 
Дело в том, что я не могу закончить 3 часть-уведомление о платеже. Я не знаю как работает функция, какие переменные туда добавлять и как вообще на сайте формируется отчет о завершении покупки. Там нет 2 страниц типа succes и fail url там есть одна /callback и все. Когда я пытался по образу и подобию подобрать 3 часть как в примере moneybookers то у меня постоянно выбивает страницу с неудачным завершением покупки.
    • 0
  • Наверх

#6 Знаток ^-^ (WMID 273407224562 )

  • Группа: Пользователи
  • сообщений 6 059
  • Регистрация: 10-сентября 13
  • Webmoney BL

Отправлено 03 апреля 2016 - 01:46

Когда я пытался по образу и подобию подобрать 3 часть

Подождите, то есть Вы решили сыграть в игру-угадайку и ищете участников, т.к. одному играть скучно?
Тут дело не в том, самоучка или нет. Тут важно определять ошибки работы и тыкать пальцем "где конкретно".
А игра-угдайка - это ходить вокруг да около. Это бессмысленно.

Постарайтесь включить отчёт ошибок, чтобы хотя бы видеть, что работает некорректно.
Сие в "wp-config.php"

ini_set("display_errors", 1);
ini_set("track_errors", 1);
error_reporting(E_ALL);

Так же может помочь

Ещё один способ увидеть ошибки - в файле wp-config.php заменить
define('WP_DEBUG', false);
на
define('WP_DEBUG', true);

Зачем включать вывод ошибок?
Ошибки уровня E_NOTICE могут не выводиться для пользователя и считаться не существенными (не Fatal Error). Поэтому некоторый код может просто не работать. В итоге, что-то грузится, но ничего не работает.
Бесплатный SSL на 3 мес. / Сертификат SSL от 299 руб.
    • 0
  • Наверх

#7 Участник buildcommunity (WMID 122248610247 )

  • Группа: Пользователи
  • сообщений 10
  • Регистрация: 05-марта 15
  • Webmoney BL

Отправлено 04 апреля 2016 - 20:46

 

 

Ещё один способ увидеть ошибки - в файле wp-config.php заменить
define('WP_DEBUG', false);
на
define('WP_DEBUG', true);

Проделал действие выше, получился такой результат:

Warning: call_user_func_array() expects parameter 1 to be a valid callback, function 'wlt_gateway_webmoney_callback' not found or invalid function name in my-site/public_html/wp-includes/plugin.php on line 235

Открыл plugin.php через Notepad++, на 235 строке прописано следующее:

	$value = call_user_func_array($the_['function'], array_slice($args, 1, (int) $the_['accepted_args']));

Весь блок вместе с этой строкой и комментами выглядит так:

/**
 * Call the functions added to a filter hook.
 *
 * The callback functions attached to filter hook $tag are invoked by calling
 * this function. This function can be used to create a new filter hook by
 * simply calling this function with the name of the new hook specified using
 * the $tag parameter.
 *
 * The function allows for additional arguments to be added and passed to hooks.
 *
 *     // Our filter callback function
 *     function example_callback( $string, $arg1, $arg2 ) {
 *         // (maybe) modify $string
 *         return $string;
 *     }
 *     add_filter( 'example_filter', 'example_callback', 10, 3 );
 *
 *     /*
 *      * Apply the filters by calling the 'example_callback' function we
 *      * "hooked" to 'example_filter' using the add_filter() function above.
 *      * - 'example_filter' is the filter hook $tag
 *      * - 'filter me' is the value being filtered
 *      * - $arg1 and $arg2 are the additional arguments passed to the callback.
 *     $value = apply_filters( 'example_filter', 'filter me', $arg1, $arg2 );
 *
 * @since 0.71
 *
 * @global array $wp_filter         Stores all of the filters.
 * @global array $merged_filters    Merges the filter hooks using this function.
 * @global array $wp_current_filter Stores the list of current filters with the current one last.
 *
 * @param string $tag   The name of the filter hook.
 * @param mixed  $value The value on which the filters hooked to `$tag` are applied on.
 * @param mixed  $var   Additional variables passed to the functions hooked to `$tag`.
 * @return mixed The filtered value after all hooked functions are applied to it.
 */
function apply_filters( $tag, $value ) {
	global $wp_filter, $merged_filters, $wp_current_filter;

	$args = array();

	// Do 'all' actions first.
	if ( isset($wp_filter['all']) ) {
		$wp_current_filter[] = $tag;
		$args = func_get_args();
		_wp_call_all_hook($args);
	}

	if ( !isset($wp_filter[$tag]) ) {
		if ( isset($wp_filter['all']) )
			array_pop($wp_current_filter);
		return $value;
	}

	if ( !isset($wp_filter['all']) )
		$wp_current_filter[] = $tag;

	// Sort.
	if ( !isset( $merged_filters[ $tag ] ) ) {
		ksort($wp_filter[$tag]);
		$merged_filters[ $tag ] = true;
	}

	reset( $wp_filter[ $tag ] );

	if ( empty($args) )
		$args = func_get_args();

	do {
		foreach ( (array) current($wp_filter[$tag]) as $the_ )
			if ( !is_null($the_['function']) ){
				$args[1] = $value;
				$value = call_user_func_array($the_['function'], array_slice($args, 1, (int) $the_['accepted_args']));
			}

	} while ( next($wp_filter[$tag]) !== false );

	array_pop( $wp_current_filter );

	return $value;
}

    • 0
  • Наверх

#8 Знаток ^-^ (WMID 273407224562 )

  • Группа: Пользователи
  • сообщений 6 059
  • Регистрация: 10-сентября 13
  • Webmoney BL

Отправлено 07 апреля 2016 - 23:37

А что это за функция "wlt_gateway_webmoney_callback"? Где она у Вас описана?


Бесплатный SSL на 3 мес. / Сертификат SSL от 299 руб.
    • 0
  • Наверх

#9 Участник buildcommunity (WMID 122248610247 )

  • Группа: Пользователи
  • сообщений 10
  • Регистрация: 05-марта 15
  • Webmoney BL

Отправлено 08 апреля 2016 - 20:18

Моя ошибка, пропустил когда перебивал форму с moneybookers в webmoney изменить название функции:

// 3. HANDLE THE CALLBACK 
function wlt_gateway_moneybookers_callback($orderID){ global $CORE, $userdata;

Уже исправил. Вся форма теперь выглядит так:

//1. HOOK INTO THE GATEWAY ARRAY
function wlt_gateway_webmoney_admin($gateways){
	$nId = count($gateways)+1;
	$gateways[$nId]['name'] 		= "Webmoney";
	$gateways[$nId]['logo'] 		= plugins_url()."/wlt_gateway_webmoney/img/logo.png";
	$gateways[$nId]['function'] 	= "wlt_gateway_webmoney_form";
	$gateways[$nId]['website'] 		= "https://www.Webmoney.ru";
	$gateways[$nId]['callback'] 	= "yes";
	//$gateways[$nId]['ownform'] 		= "yes";
	$gateways[$nId]['fields'] 		= array(
	'1' => array('name' => 'Enable Gateway', 'type' => 'listbox','fieldname' => $gateways[$nId]['function'],'list' => array('yes'=>'Enable','no'=>'Disable',) ),	
	'2' => array('name' => 'WMID продавца', 'type' => 'text', 'fieldname' => 'webmoney_e'), 
	'3' => array('name' => 'Флаг тестового режима', 'type' => 'listbox','fieldname' => 'webmoney_f','list' => array('1'=>'Enable','0'=>'Disable',) ), 
 	 
	'4' => array('name' => 'Display Name', 'type' => 'text', 'fieldname' => $gateways[$nId]['function'].'_name', 'default' => 'Оплата webmoney'),	
	);
	
	return $gateways;
}
add_action('hook_payments_gateways','wlt_gateway_webmoney_admin');

//2. BUILD THE PAYMENT FORM DATA
function wlt_gateway_webmoney_form($data=""){

	global $wpdb, $userdata;
	
    /* DATA AVAILABLE
   
	$GLOBALS['total'] 	 
	$GLOBALS['subtotal'] 	 
	$GLOBALS['shipping'] 	 
	$GLOBALS['tax'] 		 
	$GLOBALS['discount'] 	 
	$GLOBALS['items'] 		 
	$GLOBALS['orderid'] 	 
	$GLOBALS['description'] 
    
    */
	
	  
	
	
$gatewaycode = '<form action="https://merchant.webmoney.ru/lmi/payment.asp" accept-charset="windows-1251" method="POST" name="gateway_webmoney">
  <input type="hidden" name="LMI_PAYMENT_NO" value="'.$GLOBALS['orderid'].'"/>
  <input type="hidden" name="LMI_PAYMENT_AMOUNT" value="'.$TTL.'"/>
  <input type="hidden" name="LMI_PAYMENT_DESC" value="'.$GLOBALS['items']['description'].'"/>
  <input type="hidden" name="LMI_PAYEE_PURSE" value="'.get_option('webmoney_e').'"/>  
  <input type="hidden" name="LMI_SIM_MODE="'.get_option('webmoney_f').'"/> 
  '.MakePayButton('javascript:document.gateway_webmoney.submit();').' 
</form>';

return $gatewaycode;

}
// 3. HANDLE THE CALLBACK 
function wlt_gateway_webmoney_callback($orderID){ global $CORE, $userdata;


		
	if(isset($_POST['LMI_SYS_INVS_NO'])){		 
		 
		core_generic_gateway_callback($_POST['LMI_PAYMENT_NO'], array('description' =>  $_POST['LMI_SYS_INVS_NO'], 'email' => 0, 'shipping' => 0, 'shipping_label' => 0, 'tax' => 0, 'total' =>  ""));
		
		return "success";	
		
	}else{
		return ""; // LEAVE FOR SYSTEM TO PICK  UP
	}	
}

add_action('hook_callback','wlt_gateway_webmoney_callback');
?>

Теперь выбивает следующие ошибки:

Notice: Undefined variable: user_ID in my-site/public_html/wp-content/themes/DT/framework/class/class_gateways.php on line 471 Notice: Undefined offset: 1 in my-site/public_html/wp-content/themes/DT/framework/class/class_gateways.php on line 482 Notice: Undefined variable: user_ID in my-site/public_html/wp-content/themes/DT/framework/class/class_gateways.php on line 499 Notice: Undefined offset: 1 in my-site/public_html/wp-content/themes/DT/framework/class/class_gateways.php on line 504

Вот эти строки:

// HOOK FOR EXTRAS
	hook_callback_process_orderid($obits);
	
	// FINAL CHECK FOR USER ID
	if(isset($CHECKUSERID) && is_numeric($CHECKUSERID) && $CHECKUSERID > 0){
		$saveme_orderdata['userid'] 	= $CHECKUSERID;				
		$saveme_orderdata['username'] 	= get_the_author_meta('user_login', $CHECKUSERID);
	} 
	
	// ORDER DATA FOR NON-CART THEMES
	if(!defined('WLT_CART')){
	
	$order_data_description .= "\n\n\n********** Order Information **********\n\n";
	$order_data_description .= "Date : ".hook_date(date('Y-m-d H:i:s'))."\n";
	$order_data_description .= "Order ID : ".$orderid."\n";
471   $order_data_description .= "User ID : ".$user_ID."\n";	
	$order_data_description .= "Email : ".$orderdata['email']."\n";
	$order_data_description .= "Tax : ".hook_price($orderdata['tax'])."\n"; 
	$order_data_description .= "Order Total : ".hook_price($orderdata['total'])."\n";
	
	$order_data_description .= "\n\n\n********** Delivery Information **********\n\n";
	$order_data_description .= "Shipping : ".$orderdata['shipping_label']."\n";
	
	}	
				 
	// ORDER DATA			
482   $saveme_orderdata['items']			= $obits[1];
	$saveme_orderdata['shipping']		= $orderdata['shipping'];
	$saveme_orderdata['tax']			= $orderdata['tax'];
	$saveme_orderdata['total']			= $orderdata['total'];
	$saveme_orderdata['status']			= 1;	
	$saveme_orderdata['email']			= $orderdata['email'];
	$saveme_orderdata['shipping_label'] = $orderdata['shipping_label'];	
	
	// SAVE ALL ORDER DATA
	$pstring = "";
	foreach($_POST as $k=>$v){$pstring .= $k.":".$v."\n"; }		
	$saveme_orderdata['paydata']		= $pstring;
 
	// ADD NEW ORDER
	$CORE->ORDER('add',$saveme_orderdata);
	
	// MAKE GLOBAL VALUES FOR CALLBACK
499    $_POST['user_id'] 			= $user_ID;
	$_POST['username'] 			= $saveme_orderdata['username'];
	$_POST['order_data_raw'] 	= $saveme_orderdata;
	$_POST['order_data'] 		= $order_data_description;
	$_POST['orderid'] 			= $orderid;
504    $_POST['paid_item_id'] 		= $obits[1];

Судя по гайду webmoney форма выполненного платежа состоит из следующих параметров:

<form method="<метод вызова Success URL>" action="<Success URL>">
  <input type="hidden" name="LMI_PAYMENT_NO" value="1">
  <input type="hidden" name="LMI_SYS_INVS_NO" value="281">
  <input type="hidden" name="LMI_SYS_TRANS_NO" value="558">
  <input type="hidden" name="LMI_SYS_TRANS_DATE" value="20020314 14:01:14">
  <input type="hidden" name="FIELD_1" value="VALUE_1">
  <input type="hidden" name="FIELD_2" value="VALUE_2">

Я могу как-то в функцию проверки 

if(isset($_POST['LMI_SYS_INVS_NO'])){        
        
        core_generic_gateway_callback($_POST['LMI_PAYMENT_NO'], array('description' => $_POST['LMI_SYS_INVS_NO'], 'email' => 0, 'shipping' => 0, 'shipping_label' => 0, 'tax' => 0, 'total' => "")); 

вместо LMI_SYS_INVS_NO загнать что-то типа pay_success? потому что в форме о невыполнении платежа передается такой же параметр. И еще там в конце по идее принимается сумма платежа total, webmoney не передает этот параметр назад, может как-то его прописать из глобальной доступной переменной $GLOBALS['total']?

        
           


    • 0
  • Наверх

#10 Знаток ^-^ (WMID 273407224562 )

  • Группа: Пользователи
  • сообщений 6 059
  • Регистрация: 10-сентября 13
  • Webmoney BL

Отправлено 08 апреля 2016 - 21:16

 

Судя по гайду webmoney форма выполненного платежа состоит из следующих параметров:

<form method="<метод вызова Success URL>" action="<Success URL>">
  <input type="hidden" name="LMI_PAYMENT_NO" value="1">
  <input type="hidden" name="LMI_SYS_INVS_NO" value="281">
  <input type="hidden" name="LMI_SYS_TRANS_NO" value="558">
  <input type="hidden" name="LMI_SYS_TRANS_DATE" value="20020314 14:01:14">
  <input type="hidden" name="FIELD_1" value="VALUE_1">
  <input type="hidden" name="FIELD_2" value="VALUE_2">

Я могу как-то в функцию проверки 

if(isset($_POST['LMI_SYS_INVS_NO'])){
        ..........

вместо LMI_SYS_INVS_NO загнать что-то типа pay_success? потому что в форме о невыполнении платежа передается такой же параметр. И еще там в конце по идее принимается сумма платежа total, webmoney не передает этот параметр назад, может как-то его прописать из глобальной доступной переменной $GLOBALS['total']?

 

В форме, которую передаёте в мерчант, укажите свой параметр, или прямо "pay_success".

Описание (в таблице в самом низу):

Дополнительные параметры продавца  Определяется продавцом  Нет  Все поля формы, не имеющие в названии префикса "LMI_" или "__", обрабатываются сервисом Web Merchant Interface автоматически и передаются на веб-сайт продавца.

Так же может помочь пример.

Кратко:
 

В той же форме платежа (ред.) можно передавать и свои произвольные параметры, если это необходимо. При чем, названы эти параметры могут быть как угодно, главное, чтобы они не начинались с префикса "LMI_". В нашем примере мы добавили в форму:

    Поле id - содержит id выбранного покупателем товара. Берется из таблицы goods.
    Поле email - покупатель указывает здесь свой email, на который он получит товар после оплаты.

....

Ниже приводим PHP-код, реализующий эти проверки в нашем примере.

....

// Если это форма предварительного запроса, то идем дальше...
IF($_POST['LMI_PREREQUEST']==1) {
  // 1) Проверяем, есть ли товар с таким id в базе данных.
  // Если такой товар не обнаружен, то выводим ошибку и прерываем работу скрипта.
  $q="SELECT `id`, `cost` FROM `goods` WHERE id='$_POST['id']'";
  $res=mysql_fetch_row(mysql_query($q));
  if(!$res[0] or $res[0]=="") {
    echo "ERR: НЕТ ТАКОГО ТОВАРА";
    exit;
  }
  ...
  // 4) Проверяем, указал ли пользователь свой email.
  // Если параметр $email пустой, то выводим ошибку и прерываем работу скрипта.
  if(!trim($_POST['email']) or trim($_POST['email'])=="") {
    echo "ERR: НЕ УКАЗАН EMAIL";
    exit;
  }
  // Если ошибок не возникло и мы дошли до этого места, то выводим YES
  echo "YES";
}

 

 

Мерчант должен передать "total"?

Для $GLOBALS['total'] может так?

if(isset($_POST['LMI_PAYMENT_AMOUNT'])) $GLOBALS['total'] = $_POST['LMI_PAYMENT_AMOUNT'];

Бесплатный SSL на 3 мес. / Сертификат SSL от 299 руб.
    • 0
  • Наверх

#11 Участник buildcommunity (WMID 122248610247 )

  • Группа: Пользователи
  • сообщений 10
  • Регистрация: 05-марта 15
  • Webmoney BL

Отправлено 08 апреля 2016 - 22:07

Функция проверки прохождения платежа 

function wlt_gateway_webmoney_callback($orderID){ global $CORE, $userdata;


		
	if(isset($_POST['LMI_SYS_INVS_NO'])){		 
		 
		core_generic_gateway_callback($_POST['LMI_PAYMENT_NO'], array('description' =>  $_POST['LMI_SYS_INVS_NO'], 'email' => 0, 'shipping' => 0, 'shipping_label' => 0, 'tax' => 0, 'total' =>  ""));
		
		return "success";	
		
	}else{
		return ""; // LEAVE FOR SYSTEM TO PICK  UP
	}	
}

По идее если какой-то параметр передался, который как флаг показывает что платеж прошел функция возвращает success и заносит в базу через core_generic_gateway_callback данные платежа, если параметра нет, то возвращает false . 

По предложенному вами варианту я могу передать какой-то свой параметр в форме платежа, например <input type="hidden" name="status" value="pay_succes"/>

Но судя по описанию в примере, функция как бы проносит через себя этот параметр и возвращает обратно в любой форме будь то форма об успешной или неудачной оплате. Так что по сути он бесполезен в функции, ну кроме дополнительного параметра с ценой, которая требует 'total' => "". Но через фиддлер я заметил что в случае неудачной оплаты эти значения: LMI_SYS_INVS_NO=&LMI_SYS_TRANS_NO=&LMI_SYS_TRANS_DATE пусты. Может как-то прописать проверку на наличие просто данных, например:

if(isset($_POST['LMI_SYS_INVS_NO'] > 0)){

или 

if(isset($_POST['LMI_SYS_INVS_NO']!== null)){

    • 0
  • Наверх

#12 Знаток ^-^ (WMID 273407224562 )

  • Группа: Пользователи
  • сообщений 6 059
  • Регистрация: 10-сентября 13
  • Webmoney BL

Отправлено 08 апреля 2016 - 23:23

Не совсем пойму: Вы хотите проверять платёж по Success или Fail ссылке, когда плательщик переходит на Ваш сайт? Ей нельзя верить, если только Ваши товары будут передаваться после проверки оплаты.
Бесплатный SSL на 3 мес. / Сертификат SSL от 299 руб.
    • 0
  • Наверх

#13 Участник buildcommunity (WMID 122248610247 )

  • Группа: Пользователи
  • сообщений 10
  • Регистрация: 05-марта 15
  • Webmoney BL

Отправлено 08 апреля 2016 - 23:58

Вот именно. В зависимости от результата платежа система на сайте продавца показывает страницу с успешной или неудачной оплатой. Если с успешной, скрипт заносит в аккаунте покупателя сумму оплаты, предоставляет услугу и ведет статистику для продавца.

Я просил о помощи корректно составить 3 часть кода - // 3. HANDLE THE CALLBACK, что я описывал в 1 посте, где скрипт получает результат оплаты и на основании этого далее предоставляет услугу, статистику и пр.


    • 0
  • Наверх

#14 Знаток ^-^ (WMID 273407224562 )

  • Группа: Пользователи
  • сообщений 6 059
  • Регистрация: 10-сентября 13
  • Webmoney BL

Отправлено 09 апреля 2016 - 00:24

Вот именно. В зависимости от результата платежа система на сайте продавца показывает страницу с успешной или неудачной оплатой. Если с успешной, скрипт заносит в аккаунте покупателя сумму оплаты, предоставляет услугу и ведет статистику для продавца.

Вы являетесь администратором и Вам решать, как будут работать Ваши функции. У WebMoney есть чёткая документация, есть примеры работы. На их основе Вам нужно составить функции.

На сайте Никиты описаны и Success вместе с Fail:

Передача Мерчантом параметров на Success URL позволяет нам внести и сюда элемент интерактивности. Например, вывести на экран какое-нибудь персонифицированное сообщение об успешном окончании покупки. Ниже приведем один из вариантов Success URL (скрипт yes.php) для нашего примера:
echo "Покупка успешно произведена. Товар номер ".$_POST['id']." выслан на ваш email ".$_POST['email'];

Видим, что и id и email присутствует. Т.е. Вы можете принимать name="status" value="pay_succes".
 

Я просил о помощи корректно составить 3 часть кода

Вам могут помочь разобраться в том, как работает WebMoney, как работают интерфейсы, в конце концов с PHP и некоторыми функциями. Но писать за Вас функции никто не будет. Вы конечно можете тут такого подождать...


Бесплатный SSL на 3 мес. / Сертификат SSL от 299 руб.
    • 0
  • Наверх

#15 Участник buildcommunity (WMID 122248610247 )

  • Группа: Пользователи
  • сообщений 10
  • Регистрация: 05-марта 15
  • Webmoney BL

Отправлено 09 апреля 2016 - 10:01

Впринципе подобрал код. С помощью фиддлера обнаружил, что оказывается такие параметры как LMI_PAYMENT_NO, LMI_PAYMENT_AMOUNT, LMI_PAYMENT_DESC передаются на мерчант как положено со значениями, а после прохождения мерчанта в форме выполненного платежа LMI_PAYMENT_NO почему-то всегда становится равным "0", а LMI_PAYMENT_AMOUNT, LMI_PAYMENT_DESC вообще не возвращаются. Создал дополнительные дублирующие параметры в форме оплаты 

<input type="hidden" name="AMOUNT" value="'.$STL.'"/>
<input type="hidden" name="PAYMENT_NUMBER" value="'.$GLOBALS['orderid'].'"/>
<input type="hidden" name="DESCRIPTION" value="'.$GLOBALS['description'].'"/>

которые мерчант вернет всегда и скрипт заработал. Оплата проходит, услуга предоставляется. Оказывается скрипту нужны были эти данные как номер заказа внутри сайта, его описание и стоимость, без этого отказывался работать. Единственное почему-то услугу покупает 2 раза, не могу сообразить почему.

Ошибок осталось 2

Undefined variable: user_ID in my-site/public_html/wp-content/themes/DT/framework/class/class_gateways.php on line 499 Notice: Undefined offset: 1 in my-site/public_html/wp-content/themes/DT/framework/class/class_gateways.php on line 504

Попрошу Вас посмотреть ниже, правильно ли я составил функцию на проверку на наличие цифрового параметра в LMI_SYS_TRANS_NO в форме выполненного платежа.

if(!empty(trim($_POST['LMI_SYS_TRANS_NO'])) && is_numeric($_POST['LMI_SYS_TRANS_NO'])){

    • 0
  • Наверх

#16 Знаток ^-^ (WMID 273407224562 )

  • Группа: Пользователи
  • сообщений 6 059
  • Регистрация: 10-сентября 13
  • Webmoney BL

Отправлено 09 апреля 2016 - 10:50

оказывается такие параметры как LMI_PAYMENT_NO, LMI_PAYMENT_AMOUNT, LMI_PAYMENT_DESC передаются на мерчант ..., а после прохождения мерчанта в форме выполненного платежа LMI_PAYMENT_NO почему-то всегда становится равным "0", а LMI_PAYMENT_AMOUNT, LMI_PAYMENT_DESC вообще не возвращаются.

А что показывает исходный код мерчанта перед переходом на сайт продавца?

Или попробуйте перед возвращением от мерчанта посмотреть всё, что он передаёт, например так

var_dump($_POST);
 

Единственное почему-то услугу покупает 2 раза, не могу сообразить почему.

Undefined variable: user_ID in my-site/public_html/wp-content/themes/DT/framework/class/class_gateways.php on line 499 Notice: Undefined offset: 1 in my-site/public_html/wp-content/themes/DT/framework/class/class_gateways.php on line 504

Возможно в первый раз по ResultURL, а второй по SuccessURL?

user_ID - полагаю, что WP не знает, некоего ID пользователя? Возможно $GLOBALS поможет.
 

Попрошу Вас посмотреть ниже, правильно ли я составил функцию на проверку на наличие цифрового параметра в LMI_SYS_TRANS_NO в форме выполненного платежа.

if(!empty(trim($_POST['LMI_SYS_TRANS_NO'])) && is_numeric($_POST['LMI_SYS_TRANS_NO'])){

empty - Определяет, является ли пустой переменная,

В вашем случае, trim является вызовом функции, а не переменной. (источник)

 

LMI_SYS_TRANS_NO - это ТОЛЬКО цифры. Поэтому лучше использовать не is_numeric, а ctype_digit, потому что:

is_numeric(3.14) - вернёт true, а ctype_digit(3.14) - вернёт false.


Бесплатный SSL на 3 мес. / Сертификат SSL от 299 руб.
    • 1
  • Наверх

#17 Участник buildcommunity (WMID 122248610247 )

  • Группа: Пользователи
  • сообщений 10
  • Регистрация: 05-марта 15
  • Webmoney BL

Отправлено 09 апреля 2016 - 23:47

 

А что показывает исходный код мерчанта перед переходом на сайт продавца?

Или попробуйте перед возвращением от мерчанта посмотреть всё, что он передаёт, например так

var_dump($_POST);

Про вот это немного не понял, куда прописать var_dump($_POST);?

 

 

Возможно в первый раз по ResultURL, а второй по SuccessURL?

user_ID - полагаю, что WP не знает, некоего ID пользователя? Возможно $GLOBALS поможет.

Так и есть, оказалось что отправляет еще ResultURL, хотя в аккаунте глянул галочка на "Передавать параметры в предварительном запросе" не стояла. Убрал адрес на result и теперь покупает 1 раз.

Про user_ID непонятная фигня, заказ оформляется на нужного покупателя, это видно и в админке и в аккаунте.

 

 

LMI_SYS_TRANS_NO - это ТОЛЬКО цифры. Поэтому лучше использовать не is_numeric, а ctype_digit, потому что:

is_numeric(3.14) - вернёт true, а ctype_digit(3.14) - вернёт false.

 

Если так?

if(!empty($_POST['LMI_SYS_TRANS_NO']) && ctype_digit($_POST['LMI_SYS_TRANS_NO'])){

    • 0
  • Наверх

#18 Знаток ^-^ (WMID 273407224562 )

  • Группа: Пользователи
  • сообщений 6 059
  • Регистрация: 10-сентября 13
  • Webmoney BL

Отправлено 10 апреля 2016 - 00:46

Про вот это немного не понял, куда прописать var_dump($_POST);?

В Ваш Success URL или в Fail.
 

Если так?

if(!empty($_POST['LMI_SYS_TRANS_NO']) && ctype_digit($_POST['LMI_SYS_TRANS_NO'])){

Если ошибок нет, значит ок.

Сообщение отредактировал ^-^: 10 апреля 2016 - 00:47

Бесплатный SSL на 3 мес. / Сертификат SSL от 299 руб.
    • 0
  • Наверх

#19 Участник buildcommunity (WMID 122248610247 )

  • Группа: Пользователи
  • сообщений 10
  • Регистрация: 05-марта 15
  • Webmoney BL

Отправлено 10 апреля 2016 - 23:51

Через Fiddler видно что отправляет на мерчант:

LMI_PAYMENT_NO=BAN-header468-1-20160410195312&LMI_PAYMENT_AMOUNT=2250.00&LMI_PAYMENT_DESC=%CF%E0%EA%E5%F2+%D1%F2%E0%F0%F2&LMI_PAYEE_PURSE=R311761789757&LMI_SIM_MODE%3D=&AMOUNT=2250.00&PAYMENT_NUMBER=BAN-header468-1-20160410195312&DESCRIPTION=%CF%E0%EA%E5%F2+%D1%F2%E0%F0%F2

Т.е. все правильно.

На выходе после прохождения проверки и оплаты выдает:

LMI_PAYMENT_NO=0&LMI_SYS_INVS_NO=946&LMI_SYS_TRANS_NO=78&LMI_SYS_TRANS_DATE=20160410+23%3A17%3A06&LMI_LANG=ru-RU&AMOUNT=2250.00&DESCRIPTION=%CF%E0%EA%E5%F2+%D1%F2%E0%F0%F2&PAYMENT_NUMBER=BAN-header468-1-20160410195312

Вся форма через Fiddler перед переходом на мой сайт:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>Merchant WebMoney Transfer</title>
	<meta http-equiv="Content-Type" Content="text/html; charset=windows-1251">
	<META NAME="ROBOTS" CONTENT="NOINDEX" />
	<meta name="google" value="notranslate"> 

	
	<link rel="stylesheet" type="text/css" href="reset.css">
	<link rel="stylesheet" type="text/css" href="style_new.css?v=3">
	<link rel="shortcut icon" href="favicon.ico">
</head>
<body style="background-color:#ffffff;margin:0px 0px 0px 0px;">
<center>
<!-- top_new.inc END --><!-- toplogo_new.inc BEGIN -->
<table width="500" cellpadding="0" cellspacing="0" border="0">
	<tr>
		<td class="logo_new">
			<a href="http://www.webmoney.ru/" target="_blank"><img border="0" alt="WebMoney" src="img_new/logo_new.png" width="307" height="43" style="margin-bottom:8px"/></a>
		</td>
	</tr>
	<tr>
		<td colspan="2">
<!-- toplogo_new.inc END -->
<table width="550px" class="maintable_new" style="margin-top:0px"> 
  <tr>
	  <td colspan="2" class="header_new">

<div style="margin:0px;">Оплата в тестовом режиме () выполнена</div>
	  </td>
	</tr>
	<tr>
		<td class="pay_param_bb_new_h">Товар или услуга:</td>
		<td class="pay_param_bb_new">&#1055;&#1072;&#1082;&#1077;&#1090; &#1057;&#1090;&#1072;&#1088;&#1090;</td>
	</tr>
	<tr>
		<td class="pay_param_bb_new_h">Сумма:</td>
		<td class="pay_param_bb_new">2250.00 WMR</span></td>
	</tr>

	<tr>
		<td class="pay_param_bb_new_h">Продавец:</td>
		<td class="pay_param_bb_new">buildcommunity</td>
	</tr>

	<tr>
		<td class="pay_param_bb_new_h">На кошелек:</td>
		<td class="pay_param_bb_new">R3117--------</td>
	</tr>
	<tr>
		<td class="pay_param_bb_new_h">WMID:</td>
		<td class="pay_param_bb_new">122248610247 <a target=_blank href="https://passport.webmoney.ru/asp/certview.asp?wmid=122248610247">проверить аттестат</a></td>
	</tr>
	<tr>
		<td class="pay_param_bb_new_h">Оплачен с кошелька:</td>		
		<td class="pay_param_bb_new">R3117--------</td>
	</tr>
	<tr>
		<td class="pay_param_bb_new_h">№ счета WM:</td>
		<td class="pay_param_bb_new">130</td>
	</tr>
	<tr>
		<td class="pay_param_bb_new_h">№ платежа WM:</td>
		<td class="pay_param_bb_new">579</td>
	</tr>
	<tr>
		<td class="pay_param_bb_new_h">Дата платежа:</td>
		<td class="pay_param_bb_new">20160410 23:56:53</td>
	</tr>
	<tr>
		<td colspan="2" class="act_block">
<script language="javascript" type="text/javascript"> 	
var go_enable = true;
function go_()
{
	if (!go_enable) return;
//  loadpass();
	go_enable = false;

	return document.forms[0].submit();
	
}
</script>

	<form method="POST" id="pay_success" name="pay_success" action="http://my-site/callback/" >
	
		<input type="hidden" name="LMI_PAYMENT_NO" value="0">
		
		<input type="hidden" name="LMI_SYS_INVS_NO" value="130">
		<input type="hidden" name="LMI_SYS_TRANS_NO" value="579">
		<input type="hidden" name="LMI_SYS_TRANS_DATE" value="20160410 23:56:53">
		<input type="hidden" name="LMI_LANG" value="ru-RU">
	<input type="hidden" name="AMOUNT" value="2250.00">	<input type="hidden" name="DESCRIPTION" value="&#1055;&#1072;&#1082;&#1077;&#1090; &#1057;&#1090;&#1072;&#1088;&#1090;">	<input type="hidden" name="PAYMENT_NUMBER" value="BAN-header468-1-20160410205623">	
		<input type="button" value="Вернуться к продавцу" name="back_toshop" class="act_button" id="back_toshop" onclick="go_()">

		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a target="_blank" href="https://merchant.webmoney.ru/conf/receipt.asp?rid=5e5be8259e6609cf9c4267afcbe033e023041e61a8547587">Распечатать квитанцию</a>

<script type="text/javascript">document.getElementById("back_toshop").focus();</script>
	</form>
	
		</td>
	</tr>
</table>
	
<script type="text/javascript" language="javascript">
intervId = window.setTimeout("go_()", "10000");
</script>
<!-- bottom_new.inc BEGIN -->
<span style="color:white">Srv7</span></td></tr></table>
</center>
</body>
</html>

Про var_dump($_POST); тут история посложнее. На сайте нет просто 2 форм типа Success URL или Fail.

Здесь реализовано через скрипт построение страницы в зависимости от результата прохождения оплаты. Вот он:

<?php get_header($CORE->pageswitch()); ?>

<?php 
	
	switch($payment_status){ 
	
		case "success": { 
		
			get_template_part( 'payment', 'thankyou' );
		
		} break;
		
		default: {
		
		 get_template_part( 'payment', 'error' );
		 
		} 
	
	}
?>    
		
<?php get_footer($CORE->pageswitch()); ?>

Т.е. на основе переменной $payment_status.

Поискал ее в других файлах, нашел вот что:

// GET PAYMENT RESPONSDE
		$payment_status = hook_callback($_POST);
		if(isset($_POST['order_data_raw'])){
		$payment_data = $_POST['order_data_raw'];
		}else{
		$payment_data = "";
		}
		
		
		// AUTO FOR FORCING PAYMENT SUCCESS
		if(isset($_GET['auth'])){ $payment_status = "success"; } 
		 
		// EMAIL OPTIONS
		if(isset($payment_status) && $payment_status != ""){
			switch($payment_status){
				case "thankyou":
				case "success": { 

Я так понимаю hook_callback($_POST); принимает возвращаемое success или Fail из моего платежного скрипта, потом через $payment_status на страницу оповещения о платеже.

Куда здесь можно впихнуть var_dump($_POST);?


Сообщение отредактировал buildcommunity: 11 апреля 2016 - 00:05

    • 0
  • Наверх

#20 Знаток ^-^ (WMID 273407224562 )

  • Группа: Пользователи
  • сообщений 6 059
  • Регистрация: 10-сентября 13
  • Webmoney BL

Отправлено 11 апреля 2016 - 00:32

Через Fiddler видно что отправляет на мерчант:

LMI_PAYMENT_NO=BAN-header468-1-20160410195312&LMI_PAYMENT_AMOUNT=2250.00&LMI_PAYMENT_DESC=%CF%E0%EA%E5%F2+%D1%F2%E0%F0%F2&LMI_PAYEE_PURSE=R311761789757&LMI_SIM_MODE%3D=&AMOUNT=2250.00&PAYMENT_NUMBER=BAN-header468-1-20160410195312&DESCRIPTION=%CF%E0%EA%E5%F2+%D1%F2%E0%F0%F2
Т.е. все правильно.

Как вы определили, что тут всё правильно?
LMI_PAYMENT_NO=BAN-header468-1-20160410195312
что это такое? Я предполагаю, что PayPal, Skrill и QIWI примут такое, но каждая платёжная система предъявляет свои требования к формату платежей.
Форма запроса платежа:

LMI_PAYMENT_NO - Внутренний номер покупки продавца
В этом поле продавец задает номер покупки в соответствии со своей системой учета. Несмотря на то, что параметр не является обязательным, мы рекомендуем всегда задавать его. Желательно использовать уникальный номер для каждого платежа, что позволит быстро получить относящуюся к нему информацию через другие интерфейсы системы WebMoney Transfer.
Номер должен представлять собой целое число без знака не больше 2147483647.


А вот это
LMI_PAYMENT_DESC=%CF%E0%EA%E5%F2+%D1%F2%E0%F0%F2
Вы видите на странице оплаты нормально или так же "%CF%E0"?

Сообщение отредактировал ^-^: 11 апреля 2016 - 00:35

Бесплатный SSL на 3 мес. / Сертификат SSL от 299 руб.
    • 1
  • Наверх