steam小额支付对接心得

2,909 阅读4分钟

编写背景原因

由于最近在steam渠道的客户端要推出商品购买功能,而steam官方要求使用steam小额支付,所以研究了一下steam官方文档,感觉坑还是蛮多的,所以总结了一下。

这篇文章主要包含整体对接流程说明和服务端开发的实现细节。

工具

一些有用的链接:

  • steam个人主页:https://partner.steamgames.com/dashboard,需要登录。
  • steam官方文档:https://partner.steamgames.com/doc/features/microtransactions/implementation
  • steam官方论坛:https://steamcommunity.com/discussions/虽然论坛里大多是关于游戏的讨论,但也有许多技术相关的内容,有些问题可以尝试在论坛上搜索,也可以留言求救(虽然大概率没人回你)

前提准备

获取steam上我的应用的appid

首先你要有自己的应用,然后打开steam个人主页,找到应用名称后边的那串数字,记录下来后边要用。

在steam上创建一个WebAPI发行商密钥

1.打开管理组 图片.png

2.选择包含该应用的管理组 图片.png

3.选择创建webapi发行商密钥,我的直接已经创建过了,所以直接复制第二个红框的密钥,记录下来后边要用。 图片.png

获取用户的steam id

  • 非开发手段:登录steam客户端,打开账户明细,找到左上角账户名的Steam ID,记录下来后边要用。
  • 客户端获取:参考官方文档https://partner.steamgames.com/doc/api/ISteamUser#GetSteamID
  • 前端获取:参考官方文档https://partner.steamgames.com/doc/features/auth#website

注意:

  • 网上有些文章说去steam安装目录找目录名作为steam id的说法,我验证过是错误的,切记不要用这种方法。
  • 有时候账户明细打不开,是网络原因,可能需要科学上网。
  • 建议使用客户端获取,因为前端获取需要用户走登录steam的流程,体验较差。

至此,我们已经获取到了appid、webApiKey、steamid。

两种实现方式

  • 游戏内购买
  • 基于网页的购买 steam小额支付有两种实现方式,分别是游戏内购买基于网页的购买,游戏内购买主要开发工作在客户端,基于网页的购买主要开发工作在前端,服务端实现差别不大。

steam服务提供的能力

服务端调用steam接口

  • ISteamMicroTxn/GetUserInfo 使用steam id获取steam用户信息
    • 比较简单
    • 用于检查用户状态是否可以购买
  • ISteamMicroTxn/InitTxn 初始化steam支付订单
    • 坑比较多,很多错误steam给的接口返回是500内部错误
    • 保证你使用的steam id对应的账号在steam客户端打开了应用
    • 保证你的steam id获取是正确的,我找到的大概是18位长度的数字
    • 保证你的orderid是在合法范围内的,如果总是出现订单号已存在请检查orderid是否超出长度
    • 如果使用基于网页的购买需要传递参数usersession=web和ipaddress=客户端IP
    • 基于网页的购买接口返回会附带steamurl参数
  • ISteamMicroTxn/QueryTxn 查询支付结果
    • 比较简单
    • 游戏内购买的话客户端会直接得到购买结果,可以不调用这个接口
  • ISteamMicroTxn/FinalizeTxn 确认支付结果
    • 比较简单
    • 该接口请求成功后,才会真实付款

基本流程

  1. 客户端获取steam id,传递给服务端。
  2. 服务端发起ISteamMicroTxn/GetUserInfo检查用户是否可以购买。
  3. 服务端发起ISteamMicroTxn/InitTxn 创建订单。
    • 如果是游戏内购买,在请求成功后,用户将会通过 Steam 的游戏内界面收到需要对交易进行授权的通知,在用户操作支付确认后,由应用设置的ISteamUser::MicroTxnAuthorizationResponse_t 回调处理程序`来通知服务端用户确认支付状态。
    • 如果基于网页的购买,在请求成功的返回中会带有steamurl,在用户浏览器上打开steamurl?return_url=支付完成回调的地址,用户实际支付操作就是在steamurl这个地址上完成支付确认的,在用户支付确认完成后,steamurl网页会有回调跳转到附带参数return_url的地址,在这个地址前端需要通知服务端用户已确认支付。
  4. 服务端收到通知后,调用ISteamMicroTxn/QueryTxn 查询支付结果,如果支付成功,调用ISteamMicroTxn/FinalizeTxn通知steam完成订单并扣款,同时告知客户端处理成功。