设置游戏密钥销售

Buy Button可让您在游戏网站上以真实货币或虚拟货币的形式来销售游戏密钥,从而实现游戏的变现。

您可以向未授权授权用户销售游戏密钥。

对于未授权用户

用户进行购买时受以下条件限制:

  • 不能使用权利系统
  • 支付方式和艾克索拉余额不会在艾克索拉支付中心保存。

商品销售方式
一份游戏(游戏密钥)。使用直接链接小组件
多份游戏(游戏密钥)或购物车中的多个游戏。传入唯一用户ID和邮箱地址。邮箱地址和其他数据(用户名和ISO 3166-1 alpha-2标准下的国家/地区代码)使用Base64编码,并在调用获取支付令牌方法时作为x-user参数传入标题。
一个商品。使用一个商品的快速购买调用
购物车中的多个商品。传入唯一用户ID。唯一用户ID在调用游戏密钥方法组下“目录”子部分的API方法时以数字或字符串形式在标题中使用(x-unauthorized-id参数)。标识符在前端侧生成,例如通过标识符生成库生成。

对于授权用户

要管理用户对您的应用程序以及艾克索拉产品功能的访问权限,请设置用户认证系统。对此,您可以使用艾克索拉登录管理器实现自有认证系统

如果您已实现了自有认证系统而仅需要支付UI,可以生成支付中心访问令牌并在您的服务器上设置Webhook。

如果没有自己的服务器或希望使用现成解决方案,可为您的游戏内商店使用艾克索拉登录管理器。以下功能在艾克索拉侧执行:

  • 存储及管理目录
  • 管理结果
  • 存储区域价格的数据
  • 认证用户
  • 处理交易

通过艾克索拉登录管理器进行认证

艾克索拉登录管理器支持用于用户注册和认证的OAuth 2.0标准协议。标准OAuth 2.0协议有助于简化客户端侧应用程序的开发。OAuth 2.0可让您在无需用户参与的情况下更新访问令牌。

已授权用户的数据可存储在以下地方:

注:
用户数据包括真实货币余额(变化)、保存的银行卡、交易历史记录及订阅。

通过支付中心访问令牌认证

注:
如希望集成In-Game Store & Buy Button API方法,则推荐使用。

您的客户端与艾克索拉服务器间的交互过程如下:

  1. 您的客户端向您的服务器发送认证请求。
  2. 您的服务器向艾克索拉服务器请求认证令牌并向其发送包含project_id/merchant_idapi_key参数的
  3. 艾克索拉服务器返回支付中心访问令牌。
  4. 您的服务器将支付中心访问令牌传入您的客户端。
  5. 返回的支付中心访问令牌在游戏内商店和Buy Button API及生成商店界面中用作进行认证的授权令牌。

获取支付中心访问令牌

在应用程序后端,请实现通过HTTP POST请求来获取支付中心访问令牌的方法。

艾克索拉API使用基本HTTP 认证。请求必须包含Authorization: Basic <your_authorization_basic_key>头,其中<your_authorization_basic_key>是按照Base64标准加密的商户ID: API密钥对。请前往发布商帐户找到这些参数:

  • 商户ID在以下位置显示:
    • 项目设置 > Webhooks部分。
    • 公司设置 > 公司部分。
    • 在发布商帐户任意页面的浏览器地址栏的URL中。URL的格式如下:https://publisher.xsolla.com/​商户ID/发布商帐户部分

  • API密钥仅在创建它时在发布商帐户中显示一次,必须存储在己侧。您可以在以下部分中创建新的密钥:
    • 公司设置 > API密钥
    • 项目设置 > API密钥

注意

关于使用API密钥的详细信息,请参阅API参考

关于密钥的建议:

  • 请在己侧保存生成的API密钥。您仅会在创建API密钥时在发布商帐户中看见它一次。
  • 请妥善保管API不被泄露。它提供对您的个人帐户及您在发布商帐户中项目的访问权限。
  • API密钥必须存储在您的服务器上,切勿保存在代码或前端中。

HTTP请求:

POST https://api.xsolla.com/merchant/v2/merchants/{merchant_id}/token

要获取令牌,请将以下参数传入请求正文:

参数类型描述
settings
object带有自定义项目设置的对象。
settings.project_id
integer游戏的艾克索拉ID。可在发布商帐户中项目名称的旁边找到。 必需
user
object带用户相关数据的对象。
user.id
object授权系统中的用户ID(对象)。
user.id.value
string用户ID。 必需
user.email
object用户邮箱(对象)。
user.email.value
string用户电子邮箱。必须符合RFC 822协议标准。 必需
user.name
object带有用户昵称相关数据的对象。 必需
user.name.value
string用户昵称。
user.steam_id
object用户Steam ID(对象)。
user.steam_id.value
string用户Steam ID。如应用程序在Steam上发布,则为必需
user.playfab_id
object用户PlayFab ID(对象)。
user.playfab_id.value
string用户PlayFab ID。如果应用程序使用PlayFab服务来发放商品,则为必需

请求和响应示例见API参考

注意
请求中只能使用上面列表中的参数。请勿传入其他API调用参数(例如custom_parameterspurchase等),它们不能用来接收授权令牌。

与游戏内商店和物品库交互时支付中心访问令牌的有效期是距上次调用艾克索拉API之后1小时。如要更改支付中心访问令牌的有效期,请联系您的帐户经理。

实现令牌过期后重新获取支付中心访问令牌的逻辑。建议在后台获取新令牌,这样用户就无须重新登录应用程序。

您可以通过直接链接商店UI小组件销售游戏密钥。

以下链接将打开支付UI:

Copy
Full screen
Small screen

https://purchase.xsolla.com/pages/buy?type={YOUR-ITEM-TYPE}&project_id={YOUR_PROJECT_ID}&sku={YOUR-ITEM-SKU}

注:

只有与艾克索拉签署许可证协议后才能通过直接链接使用真实货币购买游戏密钥。方法是在发布商帐户中前往协议与税务信息 > 协议部分,完成协议表单,然后等待确认。审核协议最多可能需要3个工作日。

要测试支付,可在链接中添加mode=sandbox参数来使用测试环境。

将以下数据添加到链接:

  • YOUR-ITEM-TYPE — 商品类型:
    • game — 游戏;game_key — 指定平台上的游戏。
    • bundle — 捆绑包。
  • YOUR-PROJECT-ID — 您在发布商帐户项目设置 > 常规设置 > 项目ID部分的项目ID。
  • YOUR-ITEM-SKU — 游戏密钥套餐SKU。要在指定平台上销售游戏,请用获取游戏列表(该SKU一般类似于unit_name_drm_sku)来获取SKU。

  • 支付UI样式:主题(深色或默认的浅色主题)、大小及其他参数。在URL中指定ui_settings参数并传入Base64编码的settings.ui JSON对象作为值。以下为包含UI设置的URL示例:

Copy
Full screen
Small screen

https://purchase.xsolla.com/pages/buy?type={YOUR-ITEM-TYPE}&project_id={YOUR_PROJECT_ID}&sku={YOUR-ITEM-SKU}&ui_settings=ewoJCQkic2l6ZSI6ICJzbWFsbCIsCgkJCSJ0aGVtZSI6ICJkYXJrIgoJCX0=

  • 用于传递用户数据的令牌。仅当向通过认证的用户销售游戏密钥时使用。此令牌取决于认证方式。包含令牌的URL示例:

Copy
Full screen
Small screen

https://purchase.xsolla.com/pages/buy?type={YOUR-ITEM-TYPE}&project_id={YOUR_PROJECT_ID}&sku={YOUR_ITEM_SKU}&xsolla_login_token={ACCESS_TOKEN}

  • 用于支付测试的mode=sandbox参数。可使用测试银行卡完成支付。

注:
进行支付时,艾克索拉服务器会向Webhook URL发送一个验证游戏中是否存在该用户的请求。为避免测试支付时发生错误,请前往发布商帐户 > 项目设置 > Webhook,然后将开关设置为。如要使用Webhook,请实现对用户验证Webhook的成功处理。

  1. 测试URL的示例:

Copy
Full screen
Small screen

https://purchase.xsolla.com/pages/buy?type={YOUR-ITEM-TYPE}&project_id={YOUR_PROJECT_ID}&sku={YOUR-ITEM-SKU}&mode=sandbox

通过商店UI销售

您可以通过商店界面销售游戏密钥。要创建商店,可以:

如要创建自己版本的商店,可使用商店演示版本作为基础,添加发布在GitHub上的代码段。

要销售游戏密钥套餐,请集成In-Game Store & Buy Button API

  1. 要显示目录,请使用获取游戏列表方法。
  2. 实现游戏密钥的购买:

选择合适的认证方式以便方法正常工作。

注:
通过In-Game Store & Buy Button API销售游戏时,应实现让玩家在客户端上选择一个指定平台的功能。要获取该SKU,请传入请求中items.unit_items.sku参数的值以获取游戏列表

通过小组件销售

有以下几种开发按钮并与艾克索拉API集成的方法:

按钮自定义

  1. 在发布商帐户中打开您的项目。
  2. 在侧边栏中单击商店
  3. 游戏密钥窗格中,单击配置
  4. 选择游戏密钥,然后前往小组件自定义选项卡。

注:
如没有游戏密钥,请新建一个。

  1. 自定义区块中,选择浅色作为背景颜色。

注:
您也可以在代码中修改theme对象,让background参数以空字符串作为值。

  1. 将小组件代码添加到页面时,它包含了继承的样式。请添加下方的样式来覆盖这些样式。

注意
出于CSS继承/优先级原因,将这些代码添加在从小组件自定义选项卡获得的script标记下方的style标记中。
Copy
Full screen
Small screen

/* This should be used for button positioning but note this technically repositions the entire widget */
#xsolla-buy-button-widget {
  /* place code for button positioning here */
}

/* Styles the button itself */
.x-buy-button-widget.x-buy-button-widget__tiny
  .x-buy-button-widget-payment-button {
  background-color: #ff005b;
  color: black;
}

/* Button on hover */
.x-buy-button-widget.x-buy-button-widget__tiny
  .x-buy-button-widget-payment-button:hover {
  background-color: #ff005b;
}

/* The following are style overrides to leave you with just the button */

/* space immediately surrounding button */
.x-buy-button-widget-button-block.x-buy-button-widget-button-block__light {
  background-color: white;
}

/* space above button (including game title area) */
.x-buy-button-widget.x-buy-button-widget__tiny
  .x-buy-button-widget-game-logo {
  height: 200px;
  background-image: none !important;
  background-color: white;
}

 /* Game title (located right above button) */
.x-buy-button-widget-game-name.x-buy-button-widget-game-name__light {
  display: none !important;
}

注意
  • 上方的id/类名称和代码片段与复制的小组件代码(见步骤5的图片)一起使用。因此,请务必实现复制的小组件代码。
  • 您可以直接使用上方代码,也可以根据实际情况进行修改。代码注释(第1、3、5、11、16、18、22、29行)用于帮助您了解每条CSS规则的作用及做样式上的修改。例如,如果只需要按钮(不需要整个组件),则需在下方颜色是white的地方(第20和27行)替换页面的背景色。

如何创建多个按钮或SKU

关于如何使用Pay2Play小组件来实现的代码示例,请参阅Xsolla Pay2Play Widget Simple Integration 4 buttons

该结构类似于Buy Button小组件代码。迁移示例:

Copy
Full screen
Small screen

<div id="xsolla-buy-button-widget"></div>
<div id="xsolla-buy-button-widget-2"></div>
    <script>
      var options = {
        project_id: "191204",
        sku: "789",
        item_type: "unit",
        api_settings: {
          sandbox: false,
        },
        widget_ui: {
          target_element: "#xsolla-buy-button-widget",
          theme: {
            foreground: "gold",
            background: "",
          },
        },
        payment_widget_ui: {
          lightbox: {
            height: "700px",
            spinner: "round",
          },
        },
      };
      // options for second buy button - note the different SKU and target_element
      var options2 = {
        project_id: "191204",
        sku: "123",
        item_type: "unit",
        api_settings: {
          sandbox: false,
        },
        widget_ui: {
          target_element: "#xsolla-buy-button-widget-2",
          theme: {
            foreground: "gold",
            background: "",
          },
        },
        payment_widget_ui: {
          lightbox: {
            height: "700px",
            spinner: "round",
          },
        },
      };
      var s = document.createElement("script");
      s.type = "text/javascript";
      s.async = true;
      s.src = "https://cdn.xsolla.net/embed/buy-button/3.1.4/widget.min.js";

// one event listener per widget instance. repeat for more buttons, passing in different SKUs
      s.addEventListener(
        "load",
        function (e) {
          var widgetInstance = XBuyButtonWidget.create(options);
        },
        false
      );
      s.addEventListener(
        "load",
        function (e) {
          var widgetInstance2 = XBuyButtonWidget.create(options2);
        },
        false
      );
      var head = document.getElementsByTagName("head")[0];
      head.appendChild(s);
    </script>

注意
  • 第1、2行 — 每个按钮一个div,且每个都有唯一ID。
  • 第26行起是第二个按钮的选项(在options2中展开)。对于每个Buy按钮,都需要类似上面的一组options。请注意sku(第28行)和target_element(第34行,指向第2行的div)的不同。
本文对您的有帮助吗?
谢谢!
我们还有其他可改进之处吗? 留言
非常抱歉
请说明为何本文没有帮助到您。 留言
感谢您的反馈!
我们会查看您的留言并运用它改进用户体验。
为此页面评分
为此页面评分
我们还有其他可改进之处吗?

不想回答

感谢您的反馈!

继续阅读

下一步

设置Webhook
上次更新时间: 2023年5月30日

发现了错别字或其他内容错误? 请选择文本,然后按Ctrl+Enter。

报告问题
我们非常重视内容质量。您的反馈将帮助我们做得更好。
请留下邮箱以便我们后续跟进
感谢您的反馈!