Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   payments (http://www.flasher.ru/forum/showthread.php?t=210559)

Golovorot 30.03.2015 03:12

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

caseyryan 30.03.2015 06:50

Цитата:

)если все успешно, то посылаю запрос на свой сервер и меняю количество монеток.
Написать свой сервер правильно

Golovorot 30.03.2015 12:46

Цитата:

Сообщение от caseyryan (Сообщение 1180719)
Написать свой сервер правильно

Он написан правильно, вк не возвращает ответ иногда в приложение

caseyryan 30.03.2015 13:46

Значит ответ просто кэшируется на сервере вк. Надо передавать параметр, который отключает кэш. По памяти не помню как он называется, но в доках вк есть описание. Я тоже как-то раз с этим сталкивался

п.с. тогда я не понимаю вот этого
Цитата:

)если все успешно
Если все успешно, значит сервер вк ответил. Иначе это не успешно.

faraday 30.03.2015 13:56

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

Golovorot 30.03.2015 21:54

Код 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

caseyryan 31.03.2015 07:09

На клиенте этот код не нужен. Лучше пользоваться библиотекой 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);
}

Все это работает безотказно. Запросы всегда приходят и обрабатываются

Golovorot 31.03.2015 22:22

caseyryan, спасибо большое


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

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