放慢了步伐,只为跑得更远~

0%

关于接入QQ微端游戏的教程

前言

作为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系统(罗盘)

说明

接口调用

思考

参考资料

-------------本文结束感谢您的阅读-------------