关于接入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系统(罗盘)

说明

接口调用

思考

参考资料

文章目录
  1. 1. 前言
  2. 2. 常用接口
    1. 2.1. 构造源串
    2. 2.2. 构造密钥
    3. 2.3. 生成签名
    4. 2.4. 代码演示
  3. 3. 前端接口调用
    1. 3.1. 说明
    2. 3.2. 开通蓝钻
    3. 3.3. QQ点直购
  4. 4. BI系统(罗盘)
    1. 4.1. 说明
    2. 4.2. 接口调用
  5. 5. 思考
  6. 6. 参考资料