Сделайте урок по новым платежам

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

Сделайте урок по новым платежам

Сообщение mirstore.ru » 24 сен 2012, 17:22

Здравствуйте! Сделайте кому не сложно, урок по новой системе платежей. Я пробовал внедрить новую систему, но что-то не получается. Где-то что-то недопонимаю. Получается только списать голоса на счёт пользователя, а не приложения.
mirstore.ru

 
Автор темы
Сообщения: 46
Зарегистрирован: 29 авг 2012, 14:09
Благодарил (а): 2 раз.
Поблагодарили: 1 раз.

Чтобы убрать блок с рекламой, зарегистрируйтесь на форуме или войдите.

Google
 



Re: Сделайте урок по новым платежам

Сообщение Emeltil » 24 сен 2012, 17:28

+1
Emeltil

 
Сообщения: 298
Зарегистрирован: 26 мар 2011, 15:29
Благодарил (а): 11 раз.
Поблагодарили: 7 раз.

Re: Сделайте урок по новым платежам

Сообщение hahaha » 24 сен 2012, 18:06

+1
hahaha

 
Сообщения: 86
Зарегистрирован: 04 янв 2012, 14:52
Благодарил (а): 25 раз.
Поблагодарили: 0 раз.

Re: Сделайте урок по новым платежам

Сообщение Serge » 24 сен 2012, 19:57

  1. <script language="JavaScript" type="text/javascript">
  2. function order()
  3. {
  4.     var params = {
  5.         type: 'votes', //Списание голосов в пользу приложения
  6.         votes: 10  //сумма голосов
  7.     };
  8.     VK.callMethod('showOrderBox', params);
  9. }
  10.  
  11. $(document).ready(function(){
  12.     VK.init(function()
  13.     {
  14.         var parts=document.location.search.substr(1).split("&");
  15.         var flashVars={}, curr;
  16.         for (i=0; i<parts.length; i++)
  17.         {
  18.             curr = parts[i].split('=');
  19.             flashVars[curr[0]] = curr[1];
  20.         }
  21.         viewer_id = flashVars['viewer_id'];
  22.         auth_key = flashVars['auth_key'];
  23.     });
  24.  
  25.     var callbacksResults = document.getElementById('callbacks');
  26.  
  27.     VK.addCallback('onOrderSuccess', function(order_id)
  28.     {
  29.         callbacksResults.innerHTML += '<br />onOrderSuccess '+order_id;
  30.     });
  31.     VK.addCallback('onOrderFail', function()
  32.     {
  33.         callbacksResults.innerHTML += '<br />onOrderFail';
  34.     });
  35.     VK.addCallback('onOrderCancel', function()
  36.     {
  37.         callbacksResults.innerHTML += '<br />onOrderCancel';
  38.     });
  39. });
  40. </script>

Код взял чисто из ВК, не заморачивался на его счет.
Код для сервера также взял из ВК, добавил нужные функции (к примеру добавление предмета в базе при его покупке).
Тип votes можно менять на item, принцип не меняется, в ВК все описано.
Работает 100%, выводит запрос, при нажатии кнопки "Подтвердить" идет запрос на сервер, в случае положительного ответа от сервера - голоса уходят, как сделать уведомления об удачной покупке - думаю не нужно объяснять...
http://sevenlines.com.ua - разработка и продвижение сайтов

За это сообщение автора Serge поблагодарил:
deffos
Serge
WEB Team
WEB Team
 
Сообщения: 520
Зарегистрирован: 04 мар 2011, 21:55
Благодарил (а): 2 раз.
Поблагодарили: 65 раз.

Re: Сделайте урок по новым платежам

Сообщение mirstore.ru » 24 сен 2012, 21:19

а для флэша?
mirstore.ru

 
Автор темы
Сообщения: 46
Зарегистрирован: 29 авг 2012, 14:09
Благодарил (а): 2 раз.
Поблагодарили: 1 раз.

Re: Сделайте урок по новым платежам

Сообщение sanych_dv » 25 сен 2012, 03:37

Для флэша практически все тоже самое, только вместо колбэков - слушатели:

Для API 2.0:

  1.  
  2.             var VK:APIConnection = new APIConnection(flashVars);
  3.             VK.forceDirectApiAccess(true);
  4.  
  5. // ...
  6.  
  7.       var params:Object = {
  8.       type: 'item',
  9.       item: "MyPaymentName",
  10.     };
  11.            
  12.                       try
  13.                 {
  14.                    VK.callMethod("showOrderBox", params);
  15.                 }
  16.                 catch (errObject:Error)
  17.                 {
  18.                     trace(errObject.message);
  19.                 }
  20.  
  21. // добавляем слушатели
  22.  
  23.   VK.addEventListener('onOrderSuccess', onOrderSuccess);
  24.   VK.addEventListener('onOrderCancel', onOrderCancel);
  25.   VK.addEventListener('onOrderFail', onOrderFail);
  26.  
  27. private function onOrderSuccess(e:CustomEvent): void {
  28.  
  29. // смотрим колбэки в тестовом текстовом поле
  30.  
  31.                     myDebugTextField.htmlText = "<p>onOrderSuccess: Order ID: " + e.params[0] + "</p>";
  32.                 }
  33.        
  34.                 private function onOrderCancel(e:CustomEvent): void {
  35.                     myDebugTextField.htmlText = "<p>onOrderCancel</p>";
  36.                 }
  37.                
  38.             private function onOrderFail(e:CustomEvent): void {
  39.                     myDebugTextField.htmlText = "<p>onOrderFail: Error ID: " + e.params[0] + "</p>";
  40.                 }
  41.  
  42.  


В vk/APIConnection.as добавляем колбэки:

  1.  
  2.         private function onOrderSuccess(...params): void {
  3.       var paramsArr: Array = params as Array;
  4.       paramsArr.unshift('onOrderSuccess')
  5.       customEvent.apply(this, paramsArr);
  6.     }
  7.    
  8.             private function onOrderFail(...params): void {
  9.       var paramsArr: Array = params as Array;
  10.       paramsArr.unshift('onOrderFail')
  11.       customEvent.apply(this, paramsArr);
  12.     }
  13.    
  14.       private function onOrderCancel(...params): void {
  15.       var paramsArr: Array = params as Array;
  16.       paramsArr.unshift('onOrderCancel')
  17.       customEvent.apply(this, paramsArr);
  18.     }
  19.  




Очень большой минус и упущение в новых платежах вижу в том, что метод onOrderSuccess возвращает только Order ID, а должен возвращать объект с возможностью записи своих переменных. Теперь после обработки onOrderSuccess я вынужден дополнительно запрашивать из приложения необходимые мне измененные данные из БД.

За это сообщение автора sanych_dv поблагодарили - 3:
catamount5, deffos, mirstore.ru
sanych_dv
Разработчик
Разработчик
 
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52
Благодарил (а): 1 раз.
Поблагодарили: 77 раз.

Re: Сделайте урок по новым платежам

Сообщение sanych_dv » 25 сен 2012, 09:31

Далее, что выбрать в типе платежа: "item" (окно покупки товара в приложении) или "votes" (окно для ввода голосов на счёт приложения).

Если в приложении подразумевается единственный платеж, то вполне можно обойтись простым переводом голосов "votes".

Если в приложении несколько видов платежей с разным поведением приложения / изменением данных пользователя после совершения платежа, то в этом случае лучше использовать "item" (окно покупки товара в приложении).

В PHP в обработчике уведомлений удобно развести эти платежи через $item_id (как и показано в примере php-скрипта)

  1.  
  2. if ($item == 'Payment_1') {
  3.         $response['response'] = array(
  4.           'item_id' => 1,
  5.           'title' => 'Платеж 1',
  6.           'photo_url' => '', // необязательный параметр
  7.           'price' => 3 // цена товара / услуги в голосах
  8.         );
  9.       } elseif ($item == 'Payment_2') {
  10.         $response['response'] = array(
  11.           'item_id' => 2,
  12.           'title' => 'Платеж 2',
  13.           'photo_url' => '', // необязательный параметр
  14.           'price' => 3  цена товара / услуги в голосах
  15.         );
  16.  


Важный момент - сначала callback.php получает информацию о товаре ( $input['notification_type'] = "get_item" ) и только потом поступает POST-запрос на изменение статуса заказа: ( $input['notification_type'] = "order_status_change" )

Соответственно, именно в блоке /* case 'order_status_change': */ после проверки списания голосов мы и производим необходимые нам действия (к примеру, с БД):

  1.  
  2.  // Изменение статуса заказа
  3.       if ($input['status'] == 'chargeable') {
  4.         $order_id = intval($input['order_id']);
  5.  
  6. // А вот здесь нам и пригодится ранее объявленная переменная item_id для разных платежей:
  7.  
  8.         $item_id = $input['item_id'];
  9.  
  10. // разводим по значениям:
  11.        
  12.         switch($item_id) {
  13.         case "1":
  14.         // здесь что-то происходит
  15.         break;
  16.         case "2":
  17.         // здесь что-то происходит
  18.         break;
  19.         }
  20. // ...  далее стандартно формируется ответ в формате JSON , как в примере обработчика
  21.  
  22. // $response['response'] = array( ... и так далее
  23. }
  24.  
  25. echo json_encode($response);
  26.  
  27. // Как правильно написал Александр, отследить ответы сервера можно в логе:
  28.  
  29. $f = fopen('log.txt', 'a');
  30. fwrite($f, date('d.m.y H:i:s', time()).' '.json_encode($response). " POST: " . print_r($_POST, true) . PHP_EOL );
  31. fclose($f);
  32.  


Не забывайте сохранять скрипт обработчика в кодировке UTF-8 без BOM.
sanych_dv
Разработчик
Разработчик
 
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52
Благодарил (а): 1 раз.
Поблагодарили: 77 раз.

Re: Сделайте урок по новым платежам

Сообщение sanych_dv » 25 сен 2012, 10:56

Далее: дополнительная проверка статуса заказа: http://vk.com/developers.php?oid=-1&p=% ... yments_API

Эти методы можно вызвать через URLLoader в слушателе onOrderSuccess() для дополнительной проверки заказа или отдельно (методы работают только с сервера).
sanych_dv
Разработчик
Разработчик
 
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52
Благодарил (а): 1 раз.
Поблагодарили: 77 раз.

Re: Сделайте урок по новым платежам

Сообщение site-eks » 25 сен 2012, 19:47

sanych_dv, пробую так проверить статус покупки после события onOrderSuccess. ответ не приходит,в лог ничего не пишет. as3 все правильно вроде, полагаю проблема в orders.getById

  1.  
  2. <?php
  3.  
  4. require('VkApi.class.php');
  5.  
  6.  
  7. //$UserID = $_POST['UserID'];
  8. //$auth_key = $_POST['auth_key'];
  9. //$toPay=$_POST['toPay'];
  10. $app_id = '3045678';
  11. $api_secret = 'fruedhertergteqertnwh';
  12. $order_id = $_POST['order_id'];
  13.  
  14.  
  15. $real_key = md5($app_id."_".$UserID."_".$api_secret);
  16.  
  17.  
  18. function get_url($query) {
  19. $ch = curl_init();
  20. curl_setopt($ch, CURLOPT_URL, $query);
  21. curl_setopt($ch, CURLOPT_HEADER, 0);
  22. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  23. curl_setopt($ch, CURLOPT_TIMEOUT, 10);
  24. return curl_exec($ch);
  25. curl_close($ch);
  26. }
  27.  
  28. $api = new VkApiNode($app_id, $api_secret);
  29. $query = $api->orders.getById($order_id);
  30. $status = new SimpleXMLElement(get_url($query));
  31.  
  32. $f = fopen('log.txt', 'a');
  33. fwrite($f, date('d.m.y H:i:s', time()).' '.json_encode($status). " POST: " . print_r($_POST, true) . PHP_EOL );
  34. fclose($f);
  35.  
  36. echo (&status);
  37.  
  38. ?>
  39.  
  40.  
  41.  
site-eks

 
Сообщения: 20
Зарегистрирован: 23 мар 2012, 20:32
Благодарил (а): 8 раз.
Поблагодарили: 0 раз.

Re: Сделайте урок по новым платежам

Сообщение sanych_dv » 26 сен 2012, 01:10

site-eks

А так?

  1.  
  2. require_once('vkapi.class.php');
  3.  
  4. $VK = new vkapi($api_id, $secret_key);
  5.  
  6. $response = $VK->api('orders.getById', array('order_id' => $_POST['order_id'], 'test_mode' => 1 ) );
  7.  

За это сообщение автора sanych_dv поблагодарил:
catamount5
sanych_dv
Разработчик
Разработчик
 
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52
Благодарил (а): 1 раз.
Поблагодарили: 77 раз.

След.

Вернуться в Просим готовое и бесплатно



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1