Работа с Payments API.(as3,php)

Только готовые уроки по использованию ВКонтакте API. Flash + PHP + API. НЕ IFrame!
Аватара пользователя
112
Модератор
Модератор
Сообщения: 2215
Зарегистрирован: 02 фев 2010, 21:53

Работа с Payments API.(as3,php)

Сообщение 112 »

Пример использования Payments API
ActionScript 3.0 (Adobe Flash CS5)

Понадобится свой сервер с поддержкой php и cURL.


Некоторым сложно разобраться с пошаговым руководством по Payments Api. В этом уроке, вы узнаете как можно принимать платежи в флэш приложении.

1. Создаём Новый документ Flash File (ActionScript 3.0)
Добавляем на сцену текстовое поле и называем его result_tf.
И кнопку votes_er.

2. Скачиваем APIConnection.zip
http://vkontakte.ru/source/APIConnection.zip
Папку vk из архива vk_api_connection\src\ кладем в папку с сохраненным fla.

3. Пишем код в приложении
Заходим в первый кадр
 Как найти кадр
Изображение
И пишем код

Код: Выделить всё

 import flash.display.Sprite;import flash.events.*;import vk.APIConnection;import vk.events.*; //Переменные              var api_id:Number;             var viewer_id:Number;             var sid:String;             var secret:String;//Заполняем переменные данными var flashVars:Object = stage.loaderInfo.parameters as Object;api_id = flashVars['api_id'];viewer_id = flashVars['viewer_id'];sid = flashVars['sid'];secret = flashVars['secret']; var VK:APIConnection = new APIConnection(flashVars);VK.api('getProfiles', { uids: flashVars['viewer_id']}, onProfileLoaded, onError);//Узнаем имя и фамилию пользователя       function onProfileLoaded(data: Object):void{result_tf.text ='Привет ' + data[0]['first_name'] + ' ' + data[0]['last_name'] + ' ,это тестовое приложение в котором показан пример работы с payments Api';}//добавляем три слушателя событииVK.addEventListener('onOrderSuccess', onSuccess); //если все прошло удачноVK.addEventListener('onOrderCancel', onCanc); //если пользователь отменил передачуVK.addEventListener('onOrderFail', onError); //если произошла ошибка            votes_er.addEventListener(MouseEvent.CLICK, function(event:MouseEvent) { //надатие на кнопкуVK.callMethod('showOrderBox', { type:'item',item:'item1'});//вызов окна перевода голосов ;type:'item' - окно покупки товара(возможно также окно вызова офферов или окно пополнения голосов),item:'item1'- номер товара})//три функции ,которые срабатывают при ://удачнои покупки        function onSuccess(data: Object):void        {            result_tf.text = "Голоса переведены";        }//при отмене               function onCanc(data: Object):void        {            result_tf.text = "Вы отменили перевод";        }//при ошибке         function onError(data: Object):void        {            result_tf.text = data.error_msg;        }  
4. Загружаем приложение в контакт
Приложение должно быть включено.
Без использования контейнера.

5. Подготовка серверной части к обработке платежных уведомлений
Надо реализовать обработку уведомлений от платежной системы ВКонтакте.А именно:
-Получение информации о товаре. ВКонтакте запрашивает информацию о товаре для его отображения в диалоге покупки.
-Изменение статуса заказа. В параметрах уведомления передается новый статус заказа. При статусе заказа chargeable необходимо оформить товар пользователю внутри приложения.

Вконтакте также дает пример обработчика уведомлений на языке PHP.
Им мы и воспользуемся.Я его немного изменил.

Так же нам понадобится создать пустой файл,который будет лежать в папке вместе с этим скриптом, назовем его file.txt
В него будут записываться id плательщика и id покупки.

Создадим скрипт ,который и будет указываться как адрес обратного вызова,ниже написано содержание этого скрипта

Код: Выделить всё

<?php header("Content-Type: application/json; encoding=utf-8");  $secret_key = ''; // Защищенный ключ приложения  $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 {   // Подпись правильная   switch ($input['notification_type']) {     case 'get_item':       // Получение информации о товаре       $item = $input['item']; // наименование товара  if ($item == 'item1') {         $response['response'] = array(           'item_id' => 1, //id товара          'title' => '10 монеток', //наименование          'photo_url' => '', //фотография товара,если оставить поле пустым,то будет выведена иконка приложения          'price' => 1 //цена товара в голосах        );       }       break;  case 'get_item_test':       // Получение информации о товаре в тестовом режиме       $item = $input['item'];       if ($item == 'item1') {         $response['response'] = array(           'item_id' => 1, //id товара          'title' => '10 монеток(test mode)', //наименование          'photo_url' => '', //фотография товара,если оставить поле пустым,то будет выведена иконка приложения          'price' => 1 //цена товара в голосах        );       }      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); ?> 
Теперь необходимо указать в пункте Адрес обратного вызова(Вкладка платежи)
Ссылку на скрипт который у вас получился.

6. Тестирование приложения
Если у ваше приложение не проверено ,то платежи могут проходить только в тестовом режиме .
Для этого в Пункте Тестеры платежей выберите себя.
Как таковые голоса переводится не будут.Вы сможете только посмотреть то, что у вас получилось.

Если же ваше приложение прошло проверку,то пользователи смогут пополнять баланс приложения.

Исходник

Наверно это и все.
Задавайте вопросы ,буду пробовать на них отвечать
Аватара пользователя
Abarmotina
Сообщения: 469
Зарегистрирован: 21 апр 2012, 19:34

Re: Работа с Payments API.(as3,php)

Сообщение Abarmotina »

:) Спасибо
agni
Сообщения: 100
Зарегистрирован: 07 июн 2010, 11:04

Re: Работа с Payments API.(as3,php)

Сообщение agni »

скорее всего - очевидно, :D но всё таки спрошу:
этот урок с учетом "Обновлённого платежного API для приложений"? который полностью заменил с 31 октября работу с голосами в приложении?
http://vk.com/topic-1_27042222
Аватара пользователя
112
Модератор
Модератор
Сообщения: 2215
Зарегистрирован: 02 фев 2010, 21:53

Re: Работа с Payments API.(as3,php)

Сообщение 112 »

agni
Да,это и есть тот самый урок по новому платежному API
catamount5
Сообщения: 63
Зарегистрирован: 10 авг 2010, 13:37

Re: Работа с Payments API.(as3,php)

Сообщение catamount5 »

Добрый день!
У меня есть несколько вопросов.
Здорово, что вы создаете file.txt и записываете в него id плательщика и id покупки. А если покупки будут следовать одни за другими одновременно от разных пользователей, и все они будут перезаписываться в файл file.txt? И смысл этого файла, если вы туда только записываете, а от туда ничего не считываете? Если я что-то недопонимаю, то буду признательна за объяснение.

Скачала исходник, в файле payment указала защищенный ключ приложения, выложила 2 файла на сервер, в контакте поменяла ссылку, загрузила приложение вконтакт - и не работает :(

И почему Вы не дописали код в APIConnection.as ?

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

В своем коде, который сделала на основе прочитанного вконтакте, не понятно одно. В тестовом режиме: вот у меня 3 голоса, пытаюсь списать 5. Пишет - списалось успешно! Бред какой-то.
Аватара пользователя
112
Модератор
Модератор
Сообщения: 2215
Зарегистрирован: 02 фев 2010, 21:53

Re: Работа с Payments API.(as3,php)

Сообщение 112 »

catamount5 писал(а): Здорово, что вы создаете file.txt и записываете в него id плательщика и id покупки. А если покупки будут следовать одни за другими одновременно от разных пользователей, и все они будут перезаписываться в файл file.txt? И смысл этого файла, если вы туда только записываете, а от туда ничего не считываете? Если я что-то недопонимаю, то буду признательна за объяснение.
Это всего лишь урок в котором показан Пример использования Payments API.Цель была показать как данный метод работает вообщем.Чтобы данные метод работал ,не надо больше ничего считывать.
Если вы хотите оттуда что-то считывать ,то лучше вообще записывать id юзера и заказа в бд ,а не в текстовый файл :)
catamount5 писал(а):А дополнительные методы проверки статуса заказа? http://vk.com/developers.php?oid=-1&p=% ... yments_API Они нужны как таковые?
Это скорее как дополнительные методы.Как таковые они не обязательны.
catamount5 писал(а): В своем коде, который сделала на основе прочитанного вконтакте, не понятно одно. В тестовом режиме: вот у меня 3 голоса, пытаюсь списать 5. Пишет - списалось успешно! Бред какой-то.
У вас на счету в реале 3 голоса ,а в тестовом режиме пытаетесь списать 5 и все списывается(т.е пишет об успешном списывание голосов),а на самом деле вообще ничего не списалось в т.ч и те 3 голоса которые у вас были,так я понял?Если да ,то у меня также ,это ж тестовый режим :)
javist
Сообщения: 8
Зарегистрирован: 21 сен 2012, 10:00

Re: Работа с Payments API.(as3,php)

Сообщение javist »

Добрый день,112!
Почему то в окне диалога оплаты в тестовом режиме, если делать подтверждение оплаты/отмену с первого раза отрабатывает не корректно, только со второго.
Например, при первом подтверждении отрабатывает onOrderCancel(в логе платежных уведомлений ответ приходит корректный), при повторном, корректно отрабатывает onOrderSuccess. Скрипт и вызов уведомлений не менялись и раньше корректно отрабатывало с первого раза.
У Вас были подобные проблемы? Писал админам VK, но они пока молчат.:(
Аватара пользователя
112
Модератор
Модератор
Сообщения: 2215
Зарегистрирован: 02 фев 2010, 21:53

Re: Работа с Payments API.(as3,php)

Сообщение 112 »

javist
Здравствуйте.Когда приложение еще было в тестовом режиме у себя таких проблем не замечал.
javist
Сообщения: 8
Зарегистрирован: 21 сен 2012, 10:00

Re: Работа с Payments API.(as3,php)

Сообщение javist »

Ясно. Спасибо. Буду пытать админов дальше.
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

Re: Работа с Payments API.(as3,php)

Сообщение XELAD »

Представим ситуацию, что это всё связано с БД, в №1 будут вноситься заказы, в №2 (там, где сохранение игроков) будут изменено кол-во монет на счету.
Как я понимаю:
1) Новую запись в БД №1 нужно создавать при case 'get_item'
- Внести user_id, item, order_id, а также app_order_id в виде счетчика. ПЛЮС одна графа, где мы укажем, сколько уведомлений пришло от ВК (подробности ниже), сейчас укажем ноль.
2) При case 'order_status_change' найти в БД №1 строку с теми же user_id, item, order_id....
Вспоминаем, что ВК может несколько раз отправлять уведомления типа Изменения статуса заказа с тем же order_id, смотрим на счетчик в той самой графе. И только если он равен нулю, прибавляем монеток в БД №2! И увеличиваем счетчик в той графе.
Всё это сделано, чтобы при каждом таком уведомлении от ВК, монеты не прибавлялись.
А если мы не находим такую запись в БД №1, то выдаем критическую ошибку.
3) В самом flash получаем событие onOrderSuccess, и загружаем данные пользователя из БД №2 для получения актуальной информации.

Поправьте меня, если я не прав, и если всё намного проще :)
Ответить