Payments Lite

Payments Lite — это новый способ настройки покупок в приложении и управления ими. С ним вы сможете разработать решение для обработки платежей без сервера.

Если же у вас есть собственный сервер, вы можете определить и разместить собственные решения для обработки платежей в разделе Получение платежей.

Обзор

Payments Lite — это новый способ настройки покупок в приложении как products непосредственно в панели приложений. Здесь необходимо задать ID, название, описание, цену, валюту и добавить изображение. Затем, чтобы запустить процесс платежа, в вызов JavaScript передается не URL OG Object, как в обычном процессе платежа, а product ID. Это позволяет оптимизировать процесс, поскольку вы сможете создавать и изменять продукты, не отправляя push-уведомления на сервер.

Создание продуктов

Чтобы создать продукт, необходимо перейти в Платежи на Холсте в панели приложений и открыть подраздел Продукты.

Чтобы создать продукт, нажмите кнопку Создать новый продукт в правом верхнем углу. В диалоге "Сведения о продукте" введите Product ID, Title, Description и Price, выберите в меню валюту и загрузите изображение размером 50 х 50 пикселей, которое будет представлять продукт.

Payments Lite позволяет вызвать диалог "Платеж" только для одного продукта, поэтому, если вы планируете продавать внутриигровую валюту, ваши продукты должны представлять пакеты валюты.

Product List API

После настройки продуктов, которые будут продаваться в игре, необходимо создать внутриигровой магазин. В нем игроки смогут выбрать продукты, которые хотят купить. Чтобы проверить, используете ли вы правильную информацию о продуктах, которые хотите продавать, вы можете получить эту информацию с помощью Product List API. Чтобы получить список продуктов, отправьте вызов к следующей конечной точке:

GET https://graph.facebook.com/APP_ID/products

Со следующими параметрами:

Имя параметра Тип Значение Обязательное?

product_ids

Строка

Список ID продуктов в приложении, через запятую

Нет

Пример вызова и ответа:

FB.api(
  '/app/products', 
  'get', 
  function(response) {
    console.log(response);
  }
);
FB.API(
  "app/products",
  HttpMethod.GET,
  this.productCallback // callback that receives a IGraphResult
);
{
  "data": [
    {
      "title": "100 coins lite package",
      "product_id": "payments_lite_test_01",
      "product_type": "managed",
      "description": "Package of 100 coins to test Payments Lite",
      "price": "$1.00",
      "price_amount_cents": 100,
      "price_currency_code": "USD"
    },
    {
      "title": "Friend Smash!",
      "product_id": "480369938658210_premium",
      "product_type": "managed",
      "description": "One time purchase to play game",
      "price": "$0.01",
      "price_amount_cents": 1,
      "price_currency_code": "USD"
    }
  ],
  "paging": {
    "cursors": {
      "before": "QVFIUlg1cXRqcnVad05taFRVRlZAZAU2tQdWNSd0FKRDh1TTJMdGd3azVTZA3ZAZAOFgzcXZAaZAlQ1N1VMMmRmZAXpUNG9KX2tsSWhYVlB6Yko2cEotUXZAiRGgzQkFKc0lJLUQzVlJxbHVPampZAS19SWEQ4",
      "after": "QVFIUmRiSGltU1BKQnRqWTRxNkd1WktUTHFKMmxvaEwtV2dSYUtpeDJxQnN0Ri1mZAnF0TG1Ub3oyWnphSExqZAU5qQzNNZAmFrejVnSTlaRVVGMXdSSlNsNE13"
    }
  }
}

Если вы настроили более 25 продуктов, будут возвращены только первые 25. Информацию о том, как получить все остальные, см. по ссылке https://developers.facebook.com/docs/graph-api/using-graph-api#paging.

Активация пользовательского интерфейса

Когда пользователь выберет продукт, вы должны вызвать диалог "Платеж", чтобы он мог завершить покупку. Для этого можно использовать функцию ui в объекте Facebook SDK для JavaScript FB.

Чтобы вызвать диалог "Платеж", укажите в качестве первого параметра объект JSON со следующими ключами:

Имя параметра Тип Значение Обязательное?

method

Строка

pay

Да

action

Строка

purchaseiap

Да

product_id

Строка

ID продукта

Да

developer_payload

Строка

Строка, определяющая полезные данные, которые следует применять для подтверждения того, что транзакцию инициировал разработчик.

Нет

quantity

Целое число

Если этот параметр задан, он всегда должен иметь значение 1.

Нет

Пример кода для активации диалога:

FB.ui(
  {
    method: 'pay',
    action: 'purchaseiap',
    product_id: 'com.fb.friendsmash.coins.10',
    developer_payload: 'this_is_a_test_payload'
  },
  response => (console.log(response)) // Callback function
);
FB.PayWithProductId(
  "com.fb.friendsmash.coins.10",
  "purchaseiap",
  1,
  null, null, null, null, null,
  this.payCallback  // Callback function that receives an IPayResult
);

По завершении процесса можно проверить результат транзакции, указав функцию обратного вызова в качестве второго параметра вызова активации. Эта функция будет вызвана с объектом, содержащим информацию о транзакциях или код ошибки и сообщение:

Пример ответа в случае успеха:

{
  app_id: 241431489326925,
  developer_payload: "this_is_a_test_payload",
  payment_id: 860496004080598,
  product_id: "com.fb.friendsmash.coins.10",
  purchase_time: 1473719771,
  purchase_token: "10157567446205226",
  signed_request: "M3fQFj6MlK7WJi597QgCvMlMLh7fl_...",
}

Пример транзакции с ошибкой:

{
  error_code: 1383010, 
  error_message: "User canceled the order."
}

Добавление покупок игрока в список

Payments Lite позволяет добавлять продукты в список, чтобы проверять их и управлять ими. В этом случае игроки не смогут покупать в игре нерасходуемые продукты. Мы рекомендуем проверять после загрузки игры, есть ли у игрока покупки, которые он ещё не израсходовал.

Чтобы составить список покупок текущего игрока, воспользуйтесь конечной точкой /APP_ID/purchases приложения и маркером доступа пользователя. Этот вызов вернет список неизрасходованных покупок текущего игрока с информацией о них.

Например, можете выполнить следующий вызов:

FB.api(
  '/app/purchases',
  'get',
  {access_token: 'ACCESS_TOKEN'},      // user access token
   payload => {        // callback function
     console.log('purchases payload:');
     console.log(payload);
   }
);
FB.API(
  "/app/purchases?access_token=YOUR_ACCESS_TOKEN",
  HttpMethod.GET,
  this.purchasesCallback // callback that receives a IGraphResult
);

Пример ответа:

{
  data: [
    {
      app_id: 241431489326925,
      developer_payload: "this_is_a_test_payload",
      payment_id: 860496004080598,
      product_id: "com.fb.friendsmash.coin",
      purchase_time: 1473719771,
      purchase_token: "10157567446205226",
      signed_request: "M3fQFj6MlK7WJi597QgCvMlMLh7fl_...",
    },
    {
      ...
    }
  ],
  paging: {
    cursors: {
      after: "M3fQFj6MlK7WJi597QgCvMlMLh7fl...",
      before: "M3fQFj6MlK7WJi597QgCvMlMLh7...",
    }
  }
}

Дополнительную информацию о signed_request, возвращаемом в этом вызове, см. в этом разделе.

Если количество покупок превышает 25, будут возвращены только первые 25. Информацию о том, как получить все остальные, см. по ссылке https://developers.facebook.com/docs/graph-api/using-graph-api#paging.

Начиная с Graph API версии 11.0 поле consumed называется is_consumed.

Расходование покупки

Если игрок сделал покупку и вы выполнили подписанный запрос с полезными данными разработчика, чтобы убедиться, что он имел на это право, вы должны предоставить игроку купленный продукт или валюту. Если купленный продукт (например, валюту) можно израсходовать за один раз, его необходимо пометить как израсходованный, чтобы игрок смог приобрести его ещё раз. Многоразовые продукты (например, разблокировку специальных функций, особые программы для VIP-игроков и т. д.) не должны расходоваться, чтобы игроки не покупали один и тот же товар несколько раз.

Чтобы израсходовать покупку, необходимо указать purchase_token из обратного вызова JavaScript или списка покупок, о котором говорилось в предыдущем разделе. Чтобы израсходовать покупку, отправьте вызов к следующей конечной точке Graph API:

POST	https://graph.facebook.com/PURCHASE_TOKEN/consume

Например, с помощью Facebook SDK для JavaScript:

FB.api(
  '/' + PURCHASE_TOKEN + '/consume',    // Replace the PURCHASE_TOKEN
  'post',
  {access_token: access_token},         // Replace with a user access token
  result => {
    console.log('consuming product', productId, 'with purchase token', purchaseToken);
    console.log('Result:');
    console.log(result);
  }
);
FB.API(
  "/YOUR_PURCHASE_TOKEN/consume?access_token=YOUR_ACCESS_TOKEN",
  HttpMethod.POST,
  this.consumeCallback // callback that receives a IGraphResult
);

Пример ответа в случае успеха:

{
  success: true,
}

Споры

Споры могут возникать спустя долгое время после платежа, поэтому для их обработки необходим серверный компонент, который будет уведомлять разработчика о том, что игрок запустил процесс спора. Поскольку Payments Lite работает без сервера, все споры в этой системе автоматически разрешаются возвратом средств и закрываются. Подробную информацию о платежах и разрешении споров см. в статьях Получение платежей и Споры.