Steam-SDK 接入教程

前言

作为Unity3D引擎开发的一款3D枪战类型的游戏,其本身就具备了多端兼容的优势.当游戏在国内外各大手游市场上不断发力的同时,我们也开始尝试在进军微端游戏市场.腾讯游戏平台作为一个集成手游、页游、端游三位于一体的游戏平台,最适合游戏公司甚至独立游戏开发者发布自己游戏.在海外,作为最重要的端游平台,Steam的名气几乎在游戏玩家之间传播着.

支付流程

基本流程

玩家在游戏内购买道具并支付的流程如下,

  • ①玩家购买指定的道具时,客户端需要向服务端相关参数.
  • ②服务端按照Steam提供的api发起支付请求.请求成功之后,界面上会自动弹出Stea支付结算界面.
  • ③如果请求时调用的是沙盒测试环境,可以直接购买该道具.如果是正式环境,玩家余额不足事会引导玩家去充值.
  • ④玩家玩家支付之后,客户端通过监听Steam响应,并将结果通知服务端.
  • ⑤服务端将按照Steam提供的api发起结束交易请求.如果支付成功,需要根据订单给玩家发送指定的道具.

服务端接口

服务端在整个支付流程中主要负责两部分,发起支付与结束交易.当然,其前提必须要有指定的APP的支付权限.

获取开发者支付秘钥

获取开发者支付秘钥的前提是当前Steamworks的账号要有管理员权限.

  • ①选择或者创建一个包含待创建秘钥的与应用的群组.
  • ②点击该群组查看群组右侧,如果尚未创建秘钥,只要点击「Create Web API Key」选项;否则可直接在右侧查看该群组的秘钥.

通用接口规范

支付接口分为两部分,分别为发起支付,介绍交易.
小额交易实现指南这章中,对支付API的规范有做了说明.

The Content-Type should be “application/x-www-form-urlencoded” and the POST parameters should be in the body of the request in standard form urlencoding format. Text should be transmitted as UTF-8.

因此,在代码请求的时候需要明确数据格式,

  • ①请求头里设置好 “application/x-www-form-urlencoded”
  • ②请求以POST的方式,数据拼接以key1=value1&key2=value2..的形式.
    具体的代码实现方式如下所示,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function curlByPay($arrData, $method,$sandbox=0){
$jsonData = urldecode(http_build_query($arrData,NULL,"&"));
switch($method){
case "InitTxn":
$urlPay = $sandbox ? $this->urlInitTxnSandBox : $this->urlInitTxnLive;
break;
case "FinalizeTxn":
$urlPay =$sandbox ? $this->urlFinalizeTxnSandBox : $this->urlFinalizeTxnLive;
break;
default:
$urlPay = "";
break;
}
$header = array(
'Content-Type:application/x-www-form-urlencoded',
'Accept: application/json',
'Accept-Language: en_US'
);
if(!empty($urlPay)){
//简单的curl
$ch = curl_init($urlPay);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch,CURLOPT_HTTPHEADER,$header);
$result = curl_exec($ch);
curl_close($ch);
}
$result = empty($result) ? "" : json_encode(json_decode($result,true));
return $result;
}
}

发起支付

玩家点击道具购买按钮之后,客户端需要将指定的参数传送到服务端.由服务端负责将相关的数据提交到Steam服务器.一旦数据请求成功,客户端将会弹出指定道具的支付界面.游戏服务端和Steam交互过程中,需要调用发起支付API.

需要注意的是,该请求涉及到支付,需要使用开发者秘钥,并且该请求最好放在相对安全的服务单,而不是客户端.以下只列举出调用该API必须的参数,

Name Type Description
key string Steamworks Web API publisher authentication key.
orderid uint64 Unique 64-bit ID for order
steamid uint64 Steam ID of user making purchase.
appid uint32 App ID of game this transaction is for.
itemcount uint32 Number of items in cart.
language string ISO 639-1 language code of the item descriptions.
currency string ISO 4217 currency code.
itemid[0] uint32 3rd party ID for item.
qty[0] uint32 Quantity of this item.
amount[0] int32 Total cost (in cents) of item(s).
description[0] string Description of item.

通过该发起支付的API请求之后,会收到相应的响应.具体的数据形式如下,

Name Type Description
result string Result of the operation. (OK or Failure)
params[‘orderid’] uint64 ID for order.
params[‘transid’] uint64 Steam transaction ID.
params[‘steamurl’] string Optional URL returned when the usersession input is set to web.
error[‘errorcode’] int32 Error or event code.
error[‘errordesc’] string Message for error or event.

结束交易

一旦弹出支付结算界面之后,客户端需要开始通过Steam SDK监听玩家支付行为.当玩家完成支付之后,客户端通过SDK收到支付结果.从而判断是否向服务端发起结束交易的行为.

思考

优点

普通秘钥和开发者秘钥的使用的域名是分开的,根据用户使用的频繁度和安全性不同也有不同.

  • ①普通用户的API是走Akamai的cdn缓存,一方面是保证用户请求的速度,另一方面也减轻服务器的资源负载.
  • ②开发者秘钥涉及到支付等涉及玩家与商家的隐私信息.一方面使用SSL证书保证数据传输加密,另一方面使用独立的服务器实时数据交互保证数据的准确性.

缺点

数据响应不够明确,或者可能是设计的疏忽.

在请求发起支付的时候,因为客户端的失误传入服务端的Steam ID导致每次请求时提示服务器内部错误.按照正常理解,服务器内部错误应该是服务器本身报错,从而误导开发者.

参考资料

文章目录
  1. 1. 前言
  2. 2. 支付流程
    1. 2.1. 基本流程
    2. 2.2. 服务端接口
      1. 2.2.1. 获取开发者支付秘钥
      2. 2.2.2. 通用接口规范
      3. 2.2.3. 发起支付
      4. 2.2.4. 结束交易
  3. 3. 思考
    1. 3.1. 优点
    2. 3.2. 缺点
  4. 4. 参考资料