Страница 1 из 2
Полноценные пример работы Payments API
Добавлено: 04 янв 2013, 02:59
Fedya
Здравствуйте, скиньте, пожалуйста, код, чтобы при нажатии на "Купить"
появлялось окно с переводом 1 голоса. + в базу перешло значение поля comment, при удачной операции.
Это iFrame приложение
Я делаю так
index.php
Код: Выделить всё
<html><head> <script src="http://vk.com/js/api/xd_connection.js" type="text/javascript"></script> <link rel='stylesheet' type='text/css' href='css/main.css' /> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <script type='text/javascript' src='js/jquery.min.js'></script> <script type="text/javascript" charset="utf8" > window.onload = (function() { VK.init(function() { // узнаём flashVars, переданные приложению GET запросом. Сохраняем их в переменную flashVars var parts=document.location.search.substr(1).split("&"); var flashVars={}, curr; for (i=0; i<parts.length; i++) { curr = parts[i].split('='); flashVars[curr[0]] = curr[1]; } var viewer_id = flashVars['viewer_id']; $('#uid').attr('value',viewer_id); // получаем профиль VK.api("users.get", {uids:viewer_id}, function(data) { document.getElementById('info').innerHTML = '<b>' + data.response[0].first_name + ' ' + data.response[0].last_name + '</b>'; }); }); }); $('#link_btn').click(function() { VK.callMethod("showOrderBox",{type: 'item', item: 'add_link'}); }); </script></head><body> <div id='info'></div><form id='link' name='link' action=''> <input value='ваш комментарий' type='text' name='comment'> <a href='#' id='link_btn'>Купить</a></form> </body></html>
out.php (кусок из документации)
Код: Выделить всё
<?phpheader("Content-Type: application/json; encoding=utf-8"); $secret_key = '1111111111111'; // Защищенный ключ приложения $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_test': // Получение информации о товаре в тестовом режиме $item = $input['item']; if ($item == 'item1') { $response['response'] = array( 'item_id' => 125, 'title' => '300 золотых монет (тестовый режим)', 'photo_url' => 'http://somesite/images/coin.jpg', 'price' => 5 ); } elseif ($item == 'item2') { $response['response'] = array( 'item_id' => 127, 'title' => '500 золотых монет (тестовый режим)', 'photo_url' => 'http://somesite/images/coin.jpg', 'price' => 10 ); } else { $response['error'] = array( 'error_code' => 20, 'error_msg' => 'Товара не существует.', 'critical' => true ); } break; case 'order_status_change_test': // Изменение статуса заказа в тестовом режиме if ($input['status'] == 'chargeable') { $order_id = intval($input['order_id']); $app_order_id = 1; // Тут фактического заказа может не быть - тестовый режим. $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 ); } break; } } echo json_encode($response); ?>
Re: Полноценные пример работы Payments API
Добавлено: 04 янв 2013, 16:50
Casperovskii
Не до конца понял, зачем отправлять в базу комент, но вот код с оф.документации:
Код: Выделить всё
<script type="text/javascript"> function order() { var params = { type: 'item', item: 'item_25new' }; VK.callMethod('showOrderBox', params); } var callbacksResults = document.getElementById('callbacks'); VK.addCallback('onOrderSuccess', function(order_id) { callbacksResults.innerHTML += '<br />onOrderSuccess '+order_id; }); VK.addCallback('onOrderFail', function() { callbacksResults.innerHTML += '<br />onOrderFail'; }); VK.addCallback('onOrderCancel', function() { callbacksResults.innerHTML += '<br />onOrderCancel'; });</script>
Re: Полноценные пример работы Payments API
Добавлено: 04 янв 2013, 17:08
Fedya
У меня приложении есть поле комментарий, пользователь должен заполнить его, потом оплатить, а потом , при удачной оплате, комментарий должен добавиться в бд,
да я видел этот код, я не понимаю куда его всунуть.
С простыми CallMethod у меня все получается, а с showOrderBox не врубаюсь, вот и прошу полный код (две странички) чтобы разобраться.
Re: Полноценные пример работы Payments API
Добавлено: 04 янв 2013, 19:00
Fedya
Дам 3 голоса тому, кто готов объяснить и дать пример.
Re: Полноценные пример работы Payments API
Добавлено: 08 янв 2013, 13:56
kahoxa
вот моя страничка
https://vk.com/stepa_shashkov
кто поможет подключить приложение к платежки голосов за 10?
Re: Полноценные пример работы Payments API
Добавлено: 08 янв 2013, 14:56
Fedya
3 голоса мне не надо)) Вот, надеюсь поймете что зачем:
JavaScript
Код: Выделить всё
/*** Сначала добавляем коллбек, который буден вызван, когда пользователь купит что-то за голоса**/VK.addCallback('onOrderSuccess', function(order_id){ alert("Платеж "+order_id+" успешно проведен");});/*** Вызываем метод showOrderBox чтобы открыл юзеру окно покупки товара* Ему передаем два параметра* type со значением item - из документации: "item - окно покупки товара в приложении";* item со значением "gold" - это значение Вконтакт передаст нашему серверному скрипту на проверку.**/VK.callMethod('showOrderBox', { type:'item',item:'gold'});
Итак с JS все. Теперь в двух словах о том что делается.
После того, как из JS сделали запрос showOrderBox Вконтакт пошлет запрос на наш сервер к скрипту, который указан в настройках приложения. При этому вконтакт передаст ему значение, которое мы указали в свойстве item.
Твой скрипт должен проверить данные и передать вконтакту информацию о товаре, которую он покажет пользователю. А когда пользователь оплатит товар голосами, вконтакт сделает еще один запрос к скрипту, которым скажет
мол "все ок, пользователь платит" и скрипт твой должен ответить, что товар пользователю выдан, забирай у него голоса.
Ну ладно ближе к делу. Серверный скрипт:
Код: Выделить всё
<?php/** * Соединяем скрипт с БД */$dbserver = "localhost";$dbuser = "MyName";$dbpassword = "MyPassword";$dbname = "DataBaseName";mysql_connect($dbserver, $dbuser, $dbpassword) or die();mysql_select_db($dbname) or die();mysql_set_charset('utf8');/* -- *///Устанавливаем кодировкуheader("Content-Type: application/json; encoding=utf-8"); /** * Проверяем подпись, что все ок, данные от вконтакта */$secret_key = 'reekj454l5kljkljlkkkkk'; //Секретный ключ приложения$input = $_POST; //Суем данные из $_POST в переменную $input$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': //Он прислал get_item значит просит информацию о товаре $item = $input['item']; //Значение item которое прислал вконтакт, то которое посылали ему из JavaScript там было gold if($item == "gold") { /** * Значит если он прислал gold то все норм посылаем вконтакту в ответ * item_id - ID должен быть свой для каждого продаваемого товара. Потом вконтакт его пришлет на проверку * title - название * price - цена в голосах */ $response['response'] = array( 'item_id' => 1, 'title' => "100500 золотых", 'price' => 5 ); } else //Иначе, если item не равен gold то возвращаем сообщение об ошибке { $response['error'] = array( 'error_code' => 20, 'error_msg' => 'Нет у меня такого товара', 'critical' => true ); } break; case 'get_item_test': //Вконтакт прислал get_item_test значит просит инфу о товаре в тестовом режиме. По коду все тоже самое что и в рабочем режиме $item = $input['item']; if($item == "gold") { $response['response'] = array( 'item_id' => 1, 'title' => "100500 золотых", 'price' => 5 ); } else { $response['error'] = array( 'error_code' => 20, 'error_msg' => 'Нет у меня такого товара', 'critical' => true ); } break; case 'order_status_change': //Вконтакт прислал order_status_change то есть говорит, что статус заказа сменился if ($input['status'] == 'chargeable') { //Проверяем статус, chargeable говорит, что все гуд, пользователь оплачивает $order_id = intval($input['order_id']); //ID заказа вконтакте. /* * Тут если ведется учет покупок, а он должен вестись, можно сделать запрос была ли такая покупка или еще нет чтобы не продублировать * потому что вконтакт может прислать запрос с одним товаром несколько, если например из-за сбоя ему не придет ответ от сервера. * Делаем запрос в таблицу orders */ $result = mysql_query("SELECT orderid FROM orders WHERE orderid = ".$order_id); if(!mysql_num_rows($query)) // Такого заказа еще не было, надо добавить пользователю золотых или там еще чего { /** * Добавляем в базу заказ * У меня здесь таблица orders имеет предположительно следущий вид: * orderid INT(11), userid INT(11) * в реальных условиях конечно стоит добавить еще время заказа, его стоимость и т.п. */ mysql_query("INSERT INTO orders VALUES('".(int)$order_id."', '".(int)$input['user_id']."')") or die(); $dataid = mysql_insert_id(); //ID заказа в приложении, здесь получается, что он совпадает с ID заказа Вконтакте, но вы можете сделать и по другому if($input['item_id'] == 1) //Смотрим itemid это ID товара который посылали выше, когда вконтакт инфу о товаре просил, а посылали мы 1 что было ID товара 100500 золота { //Даем пользователю 100500 золота mysql_query("UPDATE users SET gold = gold + 100500 WHERE userid = ".$input['user_id']) or die(); //Ну и формируем ответ вконтакту id заказа вконтакте и id заказа в приложении //Этот ответ говорит Вконтакту что все норм $response['response'] = array( 'order_id' => $order_id, 'app_order_id' => $dataid ); } else //ID какой-то не тот пришел отвечаем вконтакту ошибкой { $response['error'] = array( 'error_code' => 20, 'error_msg' => 'Не тот пришел ID', 'critical' => true ); } } else { //Такой товар уже обрабатывался, отправляем ответ такой же повторно $response['response'] = array( 'order_id' => $order_id, 'app_order_id' => mysql_result($query, 0) ); } } else { //Пришел статус не chargeable отвечаем ошибкой $response['error'] = array( 'error_code' => 100, 'error_msg' => 'В статусе джигурда какая-то пришла', 'critical' => true ); } break; case 'order_status_change_test': //Вконтакт прислал order_status_change_test то есть говорит, что статус заказа в тестовом режиме сменился, здесь тоже самое что и в рабочем ранее if ($input['status'] == 'chargeable') { $order_id = intval($input['order_id']); $result = mysql_query("SELECT orderid FROM orders WHERE orderid = ".$order_id); if(!mysql_num_rows($query)) { mysql_query("INSERT INTO orders VALUES('".(int)$order_id."', '".(int)$input['user_id']."')") or die(); $dataid = mysql_insert_id(); if($input['item_id'] == 1) { mysql_query("UPDATE users SET gold = gold + 100500 WHERE userid = ".$input['user_id']) or die(); $response['response'] = array( 'order_id' => $order_id, 'app_order_id' => $dataid ); } else { $response['error'] = array( 'error_code' => 20, 'error_msg' => 'Не тот пришел ID', 'critical' => true ); } } else { $response['response'] = array( 'order_id' => $order_id, 'app_order_id' => mysql_result($query, 0) ); } } else { $response['error'] = array( 'error_code' => 100, 'error_msg' => 'В статусе джигурда какая-то пришла', 'critical' => true ); } break; }}echo json_encode($response); //Ну и выводим на экран ответ вконтакту?>
Стоит учесть что ID заказов в тестовом и в рабочем режиме могут пересекаться, поэтому, если оставлять как в этом скрипте (ID заказа вконтакте == ID заказа в приложении) то после тестов нужно будет удалить все записи из таблицы orders.
Ну вот вроде как-то так...
Там в коде серверного скрипта в двух местах замените
на
По привычке имена переменных написал)))
Re: Полноценные пример работы Payments API
Добавлено: 08 янв 2013, 14:57
Fedya
Теперь я могу
Re: Полноценные пример работы Payments API
Добавлено: 09 янв 2013, 11:24
kahoxa
Fedya писал(а):
Теперь я могу
напиши мне в вк на всякий)
Смотрите что не так делаю?
JS вызова окна покупки:
Код: Выделить всё
<div id='callbacks' onClick=order() style='width:50;height:10; border: solid 1px black;'>кнопка</div><script type="text/javascript"> function order() { VK.callMethod('showOrderBox', {type:'item',item:'get_item',title:'ssss'}); } var callbacksResults = document.getElementById('callbacks'); VK.addCallback('onOrderSuccess', function(order_id) { callbacksResults.innerHTML += '<br />onOrderSuccess '+order_id; }); VK.addCallback('onOrderFail', function() { callbacksResults.innerHTML += '<br />onOrderFail'; }); VK.addCallback('onOrderCancel', function() { callbacksResults.innerHTML += '<br />onOrderCancel'; }); </script>
и php тот что callback взят с примера, только с моим ключом:
Код: Выделить всё
<?phpheader("Content-Type: application/json; encoding=windows-1251"); $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' => 25, 'title' => '300 золотых монет', 'photo_url' => 'http://somesite/images/coin.jpg', 'price' => 5 ); } elseif ($item == 'item2') { $response['response'] = array( 'item_id' => 27, 'title' => '500 золотых монет', 'photo_url' => 'http://somesite/images/coin.jpg', 'price' => 10 ); } else { $response['error'] = array( 'error_code' => 20, 'error_msg' => 'Товара не существует.', 'critical' => true ); } break; case 'get_item_test': // Получение информации о товаре в тестовом режиме $item = $input['item']; if ($item == 'item1') { $response['response'] = array( 'item_id' => 125, 'title' => '300 золотых монет (тестовый режим)', 'photo_url' => 'http://somesite/images/coin.jpg', 'price' => 5 ); } elseif ($item == 'item2') { $response['response'] = array( 'item_id' => 127, 'title' => '500 золотых монет (тестовый режим)', 'photo_url' => 'http://somesite/images/coin.jpg', 'price' => 10 ); } else { $response['error'] = array( 'error_code' => 20, 'error_msg' => 'Товара не существует.', 'critical' => true ); } break; case 'order_status_change': // Изменение статуса заказа if ($input['status'] == 'chargeable') { $order_id = intval($input['order_id']); // Код проверки товара, включая его стоимость $app_order_id = 1; // Получающийся у вас идентификатор заказа. $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 ); } break; case 'order_status_change_test': // Изменение статуса заказа в тестовом режиме if ($input['status'] == 'chargeable') { $order_id = intval($input['order_id']); $app_order_id = 1; // Тут фактического заказа может не быть - тестовый режим. $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 ); } break; } } echo json_encode($response); ?>
приложение одобрено, в логах респонс не чего не возвращает.
я не знаю, может еще что-то нужно кроме этого?
Re: Полноценные пример работы Payments API
Добавлено: 09 янв 2013, 11:49
Casperovskii
А не смущает, что подпись к предмету передаешь get_item, а на сервере такой нет? Надо item1:
VK.callMethod("showOrderBox", { type: 'item', item: 'item1' } );
Re: Полноценные пример работы Payments API
Добавлено: 09 янв 2013, 15:11
kahoxa
Исправил, теперь в окне пишет, ошибка доступа(