Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 30.03.2015, 03:12
Golovorot вне форума Посмотреть профиль Отправить личное сообщение для Golovorot Найти все сообщения от Golovorot
  № 1  
Ответить с цитированием
Golovorot

Регистрация: Sep 2012
Сообщений: 101
По умолчанию payments

1)Я делаю запрос к вк серверу через vk.call
2)через php мне приходит статус платежа(использовал пример вконтактовской php проверки, без изменений)
3)если все успешно, то посылаю запрос на свой сервер и меняю количество монеток.
При использовании такого метода через раз 3 пункт не выполняется, а голоса снимаются. Как это исправить?

Старый 30.03.2015, 06:50
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
)если все успешно, то посылаю запрос на свой сервер и меняю количество монеток.
Написать свой сервер правильно

Старый 30.03.2015, 12:46
Golovorot вне форума Посмотреть профиль Отправить личное сообщение для Golovorot Найти все сообщения от Golovorot
  № 3  
Ответить с цитированием
Golovorot

Регистрация: Sep 2012
Сообщений: 101
Цитата:
Сообщение от caseyryan Посмотреть сообщение
Написать свой сервер правильно
Он написан правильно, вк не возвращает ответ иногда в приложение

Старый 30.03.2015, 13:46
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 4  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Значит ответ просто кэшируется на сервере вк. Надо передавать параметр, который отключает кэш. По памяти не помню как он называется, но в доках вк есть описание. Я тоже как-то раз с этим сталкивался

п.с. тогда я не понимаю вот этого
Цитата:
)если все успешно
Если все успешно, значит сервер вк ответил. Иначе это не успешно.

Старый 30.03.2015, 13:56
faraday вне форума Посмотреть профиль Отправить личное сообщение для faraday Найти все сообщения от faraday
  № 5  
Ответить с цитированием
faraday
 
Аватар для faraday

Регистрация: Apr 2009
Сообщений: 409
не совсем понятно из поста от кого что приходит. Если ты ждешь вызова колбека внутри прилы, и потом отправляешь запрос на сервер на начисление монеток - это не правильно.
Инициализировать начисление монет должен order_status_chnged на сервере, а не клиент.

Старый 30.03.2015, 21:54
Golovorot вне форума Посмотреть профиль Отправить личное сообщение для Golovorot Найти все сообщения от Golovorot
  № 6  
Ответить с цитированием
Golovorot

Регистрация: Sep 2012
Сообщений: 101
Код AS3:
	private function paymentsGo(e:MouseEvent):void {
			VK.callMethod('showOrderBox', {type:'votes', item:'Алмаз', votes:golosa});
		}
		private function onSuccess(data:Object):void {
			var uv:URLVariables = new URLVariables();
			uv["votes"] 	= golosa;
			uv["id"] 	=    Main.id;
			uv["hash"] 		= Main.auth_key;
			uv["action"]	= 12;
			uv["hash1"] = MD5.encrypt(Main.id + "_" + golosa);
			var req:REQ = new REQ(uv);
			req.addEventListener(REQ.COMPLETE, completeReqHandler);
		}
		private function completeReqHandler(e:Event):void {
			e.currentTarget.removeEventListener(REQ.COMPLETE, completeReqHandler);
			var ur:URLVariables = new URLVariables(e.currentTarget.data);
			if (ur.req == "true") {
				Main.diamond = Main.diamond + (golosa * 15);
			}else {
				Main.setMessage(Main.write("errors", "unknown_error"));
			}
		}
		private function onError(data: Object):void {
			paySet.resultTxt.text = data.error_msg;
			Main.setMessage(Main.write("errors", "unknown_error"));
		}
		private function onCanc(data:Object):void {
			Main.setMessage(Main.write("errors", "unknown_error"));
		}
Вот as3 код. Однако, через раз не присылает ответ

PHP код:
$sig $input['sig'];
unset(
$input['sig']);
ksort($input);
$str '';
foreach (
$input as $k => $v) {
  
$str .= $k.'='.$v;
}
 
if (
$sig != md5($str.$secret_key)) {
  
$response['error'] = array(
    
'error_code' => 10,
    
'error_msg' => 'Несовпадение вычисленной и переданной подписи запроса.',
    
'critical' => true
  
);
} else {
  
// Подпись правильная
  
switch ($input['notification_type']) {
    case 
'get_item':
      
// Получение информации о товаре
      
$item $input['item']; // наименование товара
 
if ($item == 'item1') {
        
$response['response'] = array(
          
'item_id' => 1//id товара
          
'title' => 'Алмаз'//наименование
          
'photo_url' => ''//фотография товара,если оставить поле пустым,то будет выведена иконка приложения
          
'price' => //цена товара в голосах
        
);
      }
      break;
 
case 
'get_item':
      
// Получение информации о товаре в тестовом режиме
      
$item $input['item'];
      if (
$item == 'item1') {
        
$response['response'] = array(
          
'item_id' => 1//id товара
          
'title' => 'Алмаз'//наименование
          
'photo_url' => ''//фотография товара,если оставить поле пустым,то будет выведена иконка приложения
          
'price' => //цена товара в голосах
        
);
      }
      break;
 
case 
'order_status_change':
      
// Изменение статуса заказа
      
if ($input['status'] == 'chargeable') {
        
$order_id intval($input['order_id']);
        
$user_id  intval($input['user_id']);
// Код проверки товара, включая его стоимость
 
//Вконтакте может несколько раз отправлять уведомления типа Изменения статуса заказа
//(с тем же order_id) и ответ должен в точности повторять ответ для исходного уведомления.
 
$handle fopen("file.txt","a+"); // ОТкрываем фаил,чтобы записать туда ид плтельщика и ид покупки
fwrite($handle,"\n".user_id."\n".$order_id); // Записываем
fclose($handle); // Закрываем фаил
 
 
$response['response'] = array(
          
'order_id' => $order_id,
        );
      } else {
        
$response['error'] = array(
          
'error_code' => 100,
          
'error_msg' => 'Передано непонятно что вместо chargeable.',
          
'critical' => true
        
);
      }
      break;
 
case 
'order_status_change_test':
      
// Изменение статуса заказа в тестовом режиме
      
if ($input['status'] == 'chargeable') {
        
$order_id intval($input['order_id']);
        
$user_id  intval($input['user_id']);
 
$handle fopen("file.txt","a+"); // ОТкрываем фаил,чтобы записать туда ид плтельщика и ид покупки
fwrite($handle,"\n".$user_id."\n".$order_id); // Записываем
fclose($handle); // Закрываем фаил
 
$response['response'] = array(
          
'order_id' => $order_id,
        );
      } else {
        
$response['error'] = array(
          
'error_code' => 100,
          
'error_msg' => 'Передано непонятно что вместо chargeable.',
          
'critical' => true
        
);
      }
      break;
  }
}
 
echo 
json_encode($response);
?> 
вот php

Старый 31.03.2015, 07:09
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 7  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
На клиенте этот код не нужен. Лучше пользоваться библиотекой APIConnection и не изобретать самому себе лишние трудности.
У меня вот такой код на сервере:
(добавил там комменты)
PHP код:
<?php 
    
require_once 'functions.php';
    require_once 
'constants.php';
    
header("Content-Type: application/json; encoding=utf-8");  
    
    
$input             $_POST;
    
$sig             $input['sig']; 
    unset(
$input['sig']); 
    
ksort($input); 
    
$str             ''
    
    foreach (
$input as $k => $v) { 
      
$str .= $k.'='.$v
    } 
    
// проверяем подпись
    
if ($sig != md5($str.SECRET_KEY)) { 
      
$response['error'] = array( 
        
'error_code' => 10
        
'error_msg' => 'Несовпадение вычисленной и переданной подписи запроса.'
        
'critical' => true 
      
); 
    } else {
        
        
$notification_type     $input['notification_type'];
        
        if (
$notification_type == 'get_item' || $notification_type == 'get_item_test') {
            
// указано в itemCode на клиенте
            
$item_code         intval($input['item']);
            
$order_id        intval($input['order_id']);
            
$user_id         $input['user_id'];
            
openConnection();
            
// тут находим товар, соответствующий коду, пришедшему с клиента
              
$needed_item    getItemByCode($item_code);
              
closeConnection();
              if (
$needed_item) {
                  
$rubies_to_buy            $needed_item->level;
                  
$golds_to_buy            $needed_item->friends;
                  
$price_in_votes            $needed_item->price;
                  
                  
                  
$order                    = array(
                                              
'golds' => $golds_to_buy,
                                              
'rubies' => $rubies_to_buy,
                                              
'user_id' => $user_id,
                                              
'code' => $item_code,
                                              
'price' => $price_in_votes
                                          
);
                  
// добавляем заказ в базу данных, чтобы после ответа сервера знать о чем речь 
                  
$order_set     setOrder($order_id$order);
                  if (
$order_set == true) {                        
                      
$response['response'] = array(
                          
'item_id' => $needed_item->code
                          
'title' => $needed_item->title
                        
// тут передается картинка товара. Слово new здесь дописано только для того, чтобы закэшировать новую картинку, при изменении картинки его тоже нужно поменять
                          
'photo_url' => "http://" $_SERVER['SERVER_ADDR'] . "/store/rubies/" $needed_item->img "?new",
                        
'price' => $needed_item->price 
                      
);
                  } else {
                      
$response['error'] = array(
                      
'error_code' => 20
                      
'error_msg' => 'Ошибка. Повтор запроса.'
                      
'critical' => true 
                      
);
                  }
              } else {
                  
$response['error'] = array(
                  
'error_code' => 20
                  
'error_msg' => 'Товара не существует.'
                  
'critical' => true 
                  
);
              }
        } elseif (
$notification_type == 'order_status_change' || $notification_type == 'order_status_change_test') {
            
$status         $input['status'];
            
$order_id         intval($input['order_id']);
            
            
              
$app_order_id     1;
            
// здесь берутся данные о заказе, которые при запросе записались базу. Можно сделать и по-другому, просто у меня так
              
$order            getOrder($order_id);
              
            if (
$status == 'chargeable' || !$order) {
                
// Код проверки товара, включая его стоимость
                
$user_id         $order['user_id'];
                
$golds             intval($order['golds']);
                
$rubies         intval($order['rubies']);
                
                
openConnection();
                
// проверяем что уже есть у игрока
                
$cur_values        getValues($user_idfalsetrue);
                
$cur_golds         intval($cur_values['golds']);
                
$cur_rubies     intval($cur_values['rubies']);
                
                
// вычисляем новые значения после после покупки
                
$golds            += $cur_golds;
                
$rubies            += $cur_rubies;
                
                
// обновляем значения в базе
                
$to_values        = array(
                                    
'golds' => $golds,
                                    
'rubies' => $rubies
                                
);
                
updateValuesTable($to_values$user_id);
                
closeConnection();
                
                
$response['response'] = array(
                  
'order_id' => $order_id
                  
'app_order_id' => $app_order_id
                  );
                
            } else {
                
$response['error'] = array(
                  
'error_code' => 100
                  
'error_msg' => 'Передано непонятно что вместо chargeable.'
                  
'critical' => true 
                  
);    
            }
        }        
    
}
// отдаем готовый ответ
echo json_encode($response); 


?>
А на клиенте всего лишь:
Код AS3:
_vk.addEventListener('onOrderSuccess', onOrderSuccess);
// дальше в методе showPaymentBox() ->
_vk.callMethod("showOrderBox", { type: "item", votes: votes, item: itemCode } );
 
// и обработчик ->
var orderID:String = String(e.params[0]);
if (orderID && orderID.length > 1) {
        // ну а тут уже спрашиваю у своего сервера, сколько денег у игрока сейчас
	var packet:Packet = new Packet("getMoneyState", onMoneyState);
}
Все это работает безотказно. Запросы всегда приходят и обрабатываются

Старый 31.03.2015, 22:22
Golovorot вне форума Посмотреть профиль Отправить личное сообщение для Golovorot Найти все сообщения от Golovorot
  № 8  
Ответить с цитированием
Golovorot

Регистрация: Sep 2012
Сообщений: 101
caseyryan, спасибо большое

Создать новую тему Ответ Часовой пояс GMT +4, время: 20:02.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 20:02.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.