前言
作为Unity3D引擎开发的一款3D枪战类型的游戏,其本身就具备了多端兼容的优势.当游戏在国内外各大手游市场上不断发力的同时,我们也开始尝试在进军微端游戏市场.QQ游戏平台作为一个集成手游、页游、端游三位于一体的游戏平台,最适合游戏公司甚至独立游戏开发者发布自己游戏.
常用接口
接入QQ游戏平台端游有几个必须接入的游戏接口,分别为获取用户信息,蓝钻信息,Q点直购.这些接口接入最麻烦的就是签名验证功能.其中获取用户信息、蓝钻信息接口和Q点直购在签名验证上存在一些区别.以下对签名验证功能做一些简要的讲解.
第三方应用开放平台参数验证,将请求源串以及密钥根据一定签名方法生成的签名值,用来提高传输过程参数的防篡改性.签名的生成分为3个步骤:构造源串,构造密钥,生成签名.
构造源串
- 将请求的URI路径进行URL编码.
- 将除’sign’以外的其他参数按照键值key进行字典升序排列
- 将排序的参数(key=value)按照”&”拼接起来,并进行URL编码
- 将请求方式(GET或者POST)以及第一、三步骤生成URL编码字符串用”&”拼接起来.
构造密钥
在开放平台申请应用之后获取一串字符串(appkey),在appkey末尾加上”&”,就是密钥源串
生成签名
- 使用HMAC-SHA1利用第二步生成的秘钥对第一步生成源串加密.(php5.1.2之后直接使用hash_hmac函数)
- 将加密后的字符串进行Base64编码.
通过以上几个步骤变可得到签名.在常用的这个接口接入验证的时候会使用到.当然,为了帮助我们检查签名的有效性,开放者后台有专用的开放者平台联调工具.
代码演示
以下是PHP版本的sign源串加密算法
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
| function getSDKSignature($arrData,$uri,$arrTemp=""){ $strUri = $this->getUriList($uri); list($ms,$sc) = explode(" ",microtime()); $time = @date('[d/M/Y:H:i:s]')."[$ms]"; if(!empty($strUri)){ $idApp = $this->idApp; $keyApp = $this->keyApp; $arrDataGetTemp = array( "appid" => $idApp, "pf" => "qqgame", "format" => "json", "zoneid" => "0", ); $arrDataGetTemp = is_array($arrTemp) ? array() : $arrDataGetTemp; $arrData = array_merge($arrData,$arrDataGetTemp); $method = "GET"; ksort($arrData); $strData = $this->UrlEncode($uri,$arrData); $strOriginal = $method."&".urlencode($strUri)."&".urlencode($strData); $appKey = $keyApp."&"; $encrypt = hash_hmac("sha1",$strOriginal,$appKey,true); $signature = base64_encode($encrypt); } $signature = empty($signature) ? "" : $signature; $arrRst = array( "data" => $arrData, "signature" => $signature, ); return $arrRst; }
|
因为支付部分对sign验证部分要求比较严格,在代码上做了一些调整.单独抽出重写.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| static function PayUrlEncode($string) { $encodeStr = urlencode($string); $encodeStr = str_replace("%2A", "*", $encodeStr); $encodeStr = str_replace("%21", "!", $encodeStr); $encodeStr = str_replace("%28", "(", $encodeStr); $encodeStr = str_replace("%29", ")", $encodeStr); $encodeStr = str_replace('+','%20',$encodeStr); $encodeStr = str_replace('_','%5F',$encodeStr); $encodeStr = str_replace('.','%2E',$encodeStr); $encodeStr = str_replace('-','%2D',$encodeStr); return $encodeStr; } static function getPayUrlEncode(&$string){ $string = QQGamePay::PayUrlEncode($string); } function UrlEncode($uri,$arrData){ strcmp($uri,"delivery_goods") ? null : array_walk($arrData,"QQGamePay::getPayUrlEncode"); return urldecode(http_build_query($arrData,NULL,"&")); }
|
前端接口调用
说明
开通蓝钻
QQ点直购
BI系统(罗盘)
说明
接口调用
思考
参考资料