前言
作为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..的形式.
具体的代码实现方式如下所示,
|
|
发起支付
玩家点击道具购买按钮之后,客户端需要将指定的参数传送到服务端.由服务端负责将相关的数据提交到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导致每次请求时提示服务器内部错误.按照正常理解,服务器内部错误应该是服务器本身报错,从而误导开发者.