1 游戏接入种类说明
游戏接入分两种方式,1、需要接入大厅;2、单分发版本。
游戏接入的类型有:1、Cocos2dx(C++, Lua, JS三种),2、Unity3D。
目前Cocos2dx都支持接入大厅和单分发,而Unity3D目前只支持单分发。
2 接入规范和要求(接入必看)
由于iOS平台的特殊性,对接入的游戏有一定的要求。
2.1 因为平台计划接入多家合作方的游戏,而iOS使用XCODE打包app发布时,是不允许工程里面有重名的文件,所以,为了方便管理和项目工程能正常运行,需要对代码文件及资源文件的命名进行规范开发。
2.2 命名规范
2.2.1 工程文件命名规范
代码文件、类名、枚举、图片、文件等,命名的时候,需要统一的格式。
文件的命名规范:公司前缀_项目前缀_具体文件名
例如:QGHallHomeViewController.m,qg_hall_icon.png
相邻单词之间是使用下划线,还是首字母大写,由游戏合作方自己决定。
枚举示例:
typedef enum : NSUInteger
{
QGShareTypeCancel = 0,
QGShareTypeWX,
QGShareTypeWXCircle,
QGShareTypeQQ,
QGShareTypeQzone,
}QGShareType
2.2.2 加入到沙箱文件路径的命名规范(保证唯一性)
游戏的一些资源文件,如,图片、文件等,可以通过下载的方式放到沙箱文件夹下(如Documents目录下),这个需要保持路径及文件夹的命名规范,保证路径的唯一性,否则有可能会出现被覆盖的后果。(一般保证根目录的文件夹命名唯一性即可)
文件夹的命名规范:公司前缀_项目前缀_具体文件夹名
如:qg_hall_icons
2.3 为了减少包大小,能复用的资源只含一份;
2.4 为了防止大厅编译时出现文件冲突,游戏方引入的第三方库,在游戏打包成静态库(或动态库)时,不要包含第三方库,而是由大厅统一添加;
2.5 Cocos2d的库统一由大厅管理,游戏方只需要打包自己的代码成静态库(动态库)。Cocos2dx的库,目前大厅统一使用3.10版本
因为iOS只有多线程,没有多进程,所以,每个游戏在启动后退出时,需要自己释放内存及相关资源,确保大厅的稳定性(这点与ANDROID不同,需要特别注意)。
2.6 Unity3D 使用5.4版本。
3 接入第三方依赖的SDK(如果直接使用大厅提供的demo,可以忽略此步骤)
3.1 TSDK版
3.1.1 SDK添加方式
3.1.1.1 Wtlogin
3.1.1.2 微信SDK
把Demo里面的文件直接把文件夹添加到工程
3.1.1.3 QQ互联SDK
把Demo里面的文件直接把文件夹添加到工程
3.1.1.4 米大师SDK
把Demo里面的文件直接把文件夹添加到工程
3.1.1.5 接入大厅的SDK
大厅的sdk由静态库.a和头文件组成,只需要添加到工程即可,在使用该sdk时,可以参考demo的调用方式
3.1.2 SDK环境配置
3.1.2.1 配置URL Schemes
主要是配置大厅、微信、QQ互联的URL Schemes
3.1.2.2、配置info.plist文件
添加LSApplicationQueriesSchemes和NSAppTransportSecurity
<key>LSApplicationQueriesSchemes</key>
<array>
<string>qqgamehall</string>
<string>weixin</string>
<string>wtloginmqq</string>
<string>mqq</string>
<string>mqqOpensdkSSoLogin</string>
<string>mqqapi</string>
<string>mqqopensdkapiV2</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
3.2 非TSDK(单分发版本:使用的是MSDK+米大师SDK,请参考demo)
3.2.1 添加MSDK
3.2.1.1 直接添加到工程里面
3.2.1.2 配置info.plist
注意:QQAppID、WXAppID、MSDK_OfferId、MSDKKey、hall_weixinSecret、hall_midasEnv、hall_gameId、hall_IAP、hall_qqSecret、hall_msdkSecret、hall_sdkEnv、hall_gamePackageName是一定要配置的,相关参数找产品要。
3.2.1.3 配置URL Schemes
3.2.1.4 配置c++
“Build Setting->C++ Language Dialect”配置分别为“GNU++11”和“libc++(LLVM C++ standard library with C++11 support)”的工程。
3.2.2 添加米大师SDK
直接添加到工程里面
3.2.3 添加大厅的SDK
大厅的sdk由静态库.a和头文件组成,只需要添加到工程即可,在使用该sdk时,可以参考demo的调用方式
4 接入接口说明
4.1 大厅与游戏互调接口说明
双方的数据交互都是通过JSON格式进行传递。
发起请求示例:
{
"protocolVersion" : "1.0" // 协议版本
"protocolName" : "GameLoginRequest" //协议名字
"protocolParam" : "{"loginType" : 0}" //协议参数
}
请求结果示例:
{
"protocolVersion" : "1.0" // 协议版本
"protocolName" : "GameLoginResponse" //协议名字
"protocolParam" : "{"xST" : "st", "xKey" : "key"}" //协议参数
}
注意:
1,协议名字或协议版本号不支持时,大厅都将不会处理。
2,byte[] 以Base64编码后的String传递
3,游戏和iOS QQ游戏大厅的交互,需要C++和Object-C共同实现
4.2 接口的调用和回调
4.2.1 获取登录票据协议v1.0(TSDK版)
请求协议: GameLoginRequest
请求参数:
参数名 参数类型 参数说明 callerPkgName
string 接口调用方包名
loginType
int 0 : 获取大厅当前账户
1:获取QQ账户
2:获取微信账户
3:获取游客账户
若游戏不关心登录方式,拉取数据和重试时候,请求参数loginType=0
若游戏仅仅支持单一登录方式,拉取数据和重试时候,请求参数loginType为对应类型
forceLoginRequest
int 0:获取已有票据
1:要求大厅重新登录, 发现获取到的票据异常时,可设置此标志重新获取票据, 要注意只能调用一次
回调协议:GameLoginResponse
回调参数:
参数名
参数类型 参数说明 resultCode
int 登录结果, 0:成功, 其他:不正确。
resultMsg
string 登录结果说明
loginType
int 1:QQ票据,2:微信票据,3:游客票据
launchType
int 透传 管理端配置的 启动游戏时 要触发的活动类型
protocolParam
透传 管理端配置的 启动游戏时 要触发的活动需要的参数 JSON串
nick
string
headUrl
string
account
string
st string
stKey
string
exKey
string
e.g.:
{
launchType = 0;
loginType = 1;
protocolName = GameLoginResponse;
protocolParam = {
account = "enrUFHN2P7GLPnpjTBonVhVY30yk78UwxPJGZ+/QvGEIFqDOKeAFgvoamPbNdLwNObhV5rlGE6egGj/HCsOyqfF8SP9a2VPO+TIFj5wBQ+5Krp838csAoNI62dWVAPOH5CPYtmDqb9t25449nzzUD4V2lTmnYIWFkhvAvXAo1EcGPBz5EqIUcJCykNZkM8U+JarOz/sLFdROR1JWu0tTtuwhz60j8XNmEjPHnCbyKC5KklVzc3WndQW8dPkscBoc7HBoPDsJw7lWsxFtusx4mVLSCJVxOZdSCCQ8tvSAU/ixT8Gj3L037iZLqJiAli2lQjt0GyWlgOZb/MOTSiJS/g==";
exKey = "headUrlKey_XVvc1N49yAMVhKq7ruEgskYd1Y1FXp7fMKSPt9SjiK91FhmoB727uCoRQFLes8aSqvxAz+rIXBjGE7YNTONJLNG3+GSMQqMD3z6HXgm52/kg2n5r0xxAAec6sO03YvSNo84rifF7XQ9/05ANwg5MlGhA8cRfeL/NEw+hWKBph93Q+pA0Q5lrxAMaLvQ+DTSaFs5MkBU+VN2ECa8VeiufzBAjKOWPXnHB/j0+0605mMR4krWpLwvr1HpB1SgfHB2zPDbtDHxau5EV38MHhZJcIb0CwX+SDHQcuK/xROoxPHCmI/JkhljzaPw+G12LZoSrxK8JDyWcVTphNwmVsiO3+g==";
headUrl = "https://thirdqq.qlogo.cn/g?b=sdk&k=iareF8xXp5N6UMPFMFOnXXw&s=100&t=0";
nick = "\U554a\U554a\U554a";
st = "CKHDVnNeHD8oYjaWMxb1DANRpy/o2NUlnCITxC302HVd8M2+KsS3p16pPtuwMDur7FKfqYdPKW8K2q2+Cr309wVpLI1SjB/U7/ZFVhjJIXSX9njpQi3XQHVuKTIWKRziVuYFtPJ97zbXkUh5yOu/tUmxYFJFtOC4KhLWu9GO3we6hPZY3CCjtTn0ICmsaXhBXK21cYPaQX+zjDWjMCEVq219WnrWxfia5i6I+hPoZ5Tb/WF0Pz80XGo07vb85DLg8LULHgdskadU3z6Kdw6v5VPLsF84davl45H6EVc/A77lRByQOgXTVpL+qbrkK2sqF4zsWiB1s6F7QeE79kvL1w==";
stKey = "saJKqQ7Hb3BGyw2OG7NoopBe0MhUAJijA0x0bx0g07hwIAesLH5o68tbGAQTm76s1TJ5t4EgELsMFWOqcj8tSmgDAOyVGz/e4cUsz+9C9jSy5RvreVPU6BpOmpDXR9yCxEe/WPLmjJA8/uBLMTrQPlgLReXchv5NtRTHofM52IRCyFg9NpIg49egUPUj9FsVlKRvG3L458DFPXE0EpjsCP6efCbUduGnTdTWG51n34eH9XmlhexL1qfp63arqAUIqRs8Uc/h98zT9qWlAp+cOWrxgtBpzdVarPMKVSlaDv2rUi9yPy9KHdXsobdlYhKYrrxRUXVbOoezblvs0jhdsw==";
};
protocolVersion = "1.0";
resultCode = 0;
resultMsg = "login success";
}
4.2.2 获取登录票据协议v1.0(非TSDK版)
请求协议:LoginTicketRequest
请求参数
注:红色字段iOS不需要提供
参数名 参数类型 参数说明 appId string 游戏在开放平台申请的id
callerPkgName
string
接口调用方包名
gameType string
1:QQ票据,2:微信票据,3:游客票据,这里返回大厅当前的登录类型
ticketType
string
需要的票据类型: "OPEN_ID"
loginType int 0 : 获取大厅当前账户
1:获取QQ账户
2:获取微信账户
3:获取游客账户
若游戏不关心登录方式,拉取数据和重试时候,请求参数loginType=0
若游戏仅仅支持单一登录方式,拉取数据和重试时候,请求参数loginType为对应类型
forceLoginRequest
int 0:获取已有票据
1:要求大厅重新登录, 发现获取到的票据异常时,可设置此标志重新获取票据, 要注意只能调用一次。
回调协议:LoginTicketResponse
回调参数:
注:红色字段iOS不提供(这里说明一下,iOS版本没有多玩法,所以大厅不会返回gameId给游戏,大厅也不知道游戏的gameId是什么,需要游戏自己缓存gameId。比如数据上报的时候需要携带gameId传给大厅。这点和安卓不一样啊)
参数名 参数类型 参数说明 resultCode
int 登录结果, 0:成功, 其他:不正确。
resultMsg
string
登录结果说明
loginType
int 1:QQ票据,2:微信票据,3:游客票据,这里返回大厅当前的登录类型
launchType
int 透传 管理端配置的 启动游戏时 要触发的活动类型
protocolParam
json 透传 管理端配置的 启动游戏时 要触发的活动需要的参数 JSON串
protocolParam参数:
unionId
string 用来区分用户的唯一性(微信账号下使用,QQ和游客没有)
openId
string
用户的标识,当前应用级别唯一性
openKey
string
调用接口凭证,对应QQ的openkey、微信的access_token
pf
string
平台标识信息:平台-注册渠道-版本-安装渠道-业务自定义(自定义),最大150字节
pfKey
string
由平台来源和openkey根据规则生成的一个密钥串,跳转到应用首页后,URL后会带该参数
headerUrl string 头像URL地址 gender string 返回“男”或“女” loginResult
string
Json串,透传后台返回的票据字段
现阶段为:
openid 游戏的openid
openkey 游戏的openkey
pf 游戏支付用到
pfkey 游戏支付用到
(老版本协议用到, 请忽略这个值)
channel
string
支付渠道标识,支付时透传给后台,后台根据channel从配置文件获取
支付要用到的 offerid和appkey
gameId
string
游戏在开放平台申请的id,这个参数分享回调回来才有
e.g.:
{
launchType = 0;
loginType = 1;
gameid = "";
launchParam = "从分享回调传回来的参数"; //gameid launchParam只有分享回调
protocolName = "LoginTicketResponse ";
protocolParam = {
gender = "男";
headUrl = "https://q2.qlogo.cn/g?b=qq&k=KtnMYcunkC3QJXnGMw2vqA&s=140&t=1488627349";
nick = mike;
openId = 7486467F3F4F591497310B08DEE100023;
openKey = a6c03c9dbcc2e1bbefebc877ab77f7b53;
};
protocolVersion = "1.0";
resultCode = 0;
resultMsg = "login success";
}
4.2.3 分享协议
请求协议:ShareRequest
请求参数:
回调协议:ShareResponse
回调参数:
参数名 参数类型 参数说明 resultCode int 错误码:0:正确,其他:不正确,-100:QQ没有安装 -101:微信没有安装 resulltMsg string 分享提示内容 注意:单分发游戏的分享页面(选择微信好友、朋友圈、QQ好友、QQ空间)由游戏来实现。单分发游戏分享时,sharePlatform不能为0。
4.2.4 事件上报协议(预留协议,非数据统计上报,暂时没有用到)
请求协议:ReportRequest
请求参数:
4.2.5 游戏退出协议
请求协议:GameQuitRequest
请求参数:
参数名 参数类型 参数说明 quitStatus int cocos游戏传1,Unity3D游戏传2 eg:
{
protocolName = GameQuitRequest;
protocolParam = {
quitStatus = 1; // cocos游戏传1,Unity3D游戏传2
};
protocolVersion = "1.0";
}
大厅回调参数:(无,直接退出)
4.2.6 查询大厅钻石协议(单发版本不需要调;而是由游戏方自己实现)
请求协议:DiamondNumRequest
请求参数:
参数名 参数类型 参数说明 callerPkgName string 接口调用包名 loginType int 游戏当前帐号类型,1:QQ,2:微信,3:游客 eg:
{
protocolName = DiamondNumRequest;
protocolParam = {
loginType = 1;
};
protocolVersion = "1.0";
}
回调协议:DiamondNumResponse
回调参数:
eg:
参数名 参数类型 参数说明 resultCode int 事件结果代码,成功结果为0 resultMsg string 事件描述 diamondNum int 大厅钻石余额 {
diamondNum = 1740;
protocolName = DiamondNumResponse;
protocolVersion = "1.0";
resultCode = 0;
resultMsg = "";
}
4.2.7 iOS支付协议
请求协议:PayRequest
请求参数:
参数名 参数类型 参数说明 callerPkgName
string 接口调用方包名
payValue
int 用户充值数量,即游戏币的个数.(必须是整数)
payType
int 支付类型, 0 : 米大师 , 1:商品
reqTime
string
请求发生的时间
goodsItemId
int 商品对应的id号
customMeta
string
customMeta
当payType=0时,表示是拉起米大师购买钻石,payValue为要购买的钻石数量;
当payType=1时,表示是用大厅的钻石购买游戏内的商品,这时游戏方通过goodsItemId传送商品id给大厅(单发版本游戏方自己实现,不经过大厅客户端)
eg:
{
protocolName = PayRequest;
protocolParam = {
customMeta = "gameid=89&nickname=mike";
goodsItemId = 0;
payType = 0;
payValue = 60;
reqTime = 1499999547;
};
protocolVersion = "1.0";
}
回调协议:PayResponse
回调参数:
参数名 参数类型 参数说明 resultCode int 0:成功;
1004:余额不足
1018:登录校验失败
其他:失败
diamondNum int 当前用户剩余钻石数量(单发版本中则为本次成功购买的钻石数量)
resultMsg string 返回信息 orderNo string 订单号(注:购买钻石是没有订单号的)
eg:失败返回:
{
protocolName = PayResponse;
protocolVersion = "1.0";
resultCode = "-1";
resultMsg = "\U652f\U4ed8\U5931\U8d25";
}
成功返回:
{
diamondNum = 140;
protocolName = PayResponse;
protocolVersion = "1.0";
resultCode = 0;
resultMsg = "";
}
4.2.8 iOS获取游戏资源绝对路径地址(单发版本不需要)
请求协议:PayRequest
请求参数:
参数名 参数类型 参数说明 callerPkgName
String
接口调用方包名
loginType
int
游戏当前账户类型 , 1:QQ, 2:微信 3:游客
eg:
{
protocolName = GameResourcesPathRequest;
protocolParam = {
loginType = 1;
};
protocolVersion = "1.0";
}
回调协议:GameResourcesPathResponse
回调参数:
参数名
参数类型
参数说明
resultCode
int 0:成功; 其他:失败
resultMsg
String
返回信息
commonResourcesPath
String
返回通用资源地址路径
gameResourcesPath
String
返回游戏资源地址路径
eg:
{
commonResourcesPath = "/var/mobile/Containers/Data/Application/3673A3AC-F42D-4F9C-AC4E-03676968D0DB/Documents/qqgame_embedded/com.qqgame.ghgame.common";
gameResourcesPath = "/var/mobile/Containers/Data/Application/3673A3AC-F42D-4F9C-AC4E-03676968D0DB/Documents/qqgame_embedded/com.qqgame.ghgame.qqshuangkou";
protocolName = GameResourcesPathResponse;
protocolVersion = "1.0";
resultCode = 0;
resultMsg = "request success";
}
4.2.9 移动大厅传登录类型给第三方游戏
请求协议:HallLoginTypeRequest
请求参数:无
eg:
{
protocolName = HallLoginTypeRequest;
protocolVersion = "1.0";
}
回调协议:HallLoginTypeResponse
回调参数:
参数名 参数类型 参数说明 loginType int 0:未知,1:QQ,3:游客 eg:
{
protocolName = HallLoginTypeResponse;
loginType = 1; // 0:未知;1:qq;2:微信;3:游客
}
4.2.10 获取好友关系链
请求协议:RelationRequest
请求参数:无
eg:
{
protocolName = RelationRequest;
protocolVersion = "1.0";
}
回调协议:RelationResponse
回调参数:
参数说明 参数类型 参数说明 resultCode int 结果,0:成功, -1:请求出错,-10000:不存在(比如游客) resultMsg string 结果说明 persons array 好友列表 好友详细信息:
参数名 参数类型 参数说明 nickName
string
好友昵称
openId
string
好友openId
gender
string
性别
pictureSmall
string
小头像
pictureMiddle
string
中头像
pictureLarge
string
大头像
provice
string
省份
city
string
城市
isFriend
bool 是否好友
distance
int 离此次定位地点的距离
lang
string
语言
country
string
国家
gpsCity
string
根据GPS信息获取到的城市
eg:
{
persons = (
{
city = Shenzhen;
country = "";
gender = "\U7537";
gpsCity = "";
pictureSamll = "https://wx.qlogo.cn/mmhead/Q3auHgzwzM5o0csLYjOicHvgm8xELI402SxZVISRBcsQ4TI2G6QVnCw/96";
pictureMiddle = "https://wx.qlogo.cn/mmhead/Q3auHgzwzM5o0csLYjOicHvgm8xELI402SxZVISRBcsQ4TI2G6QVnCw/96";
pictureLarge = "https://wx.qlogo.cn/mmhead/Q3auHgzwzM5o0csLYjOicHvgm8xELI402SxZVISRBcsQ4TI2G6QVnCw/96";
isFriend = 1;
lang = "";
nickName = "\U4ebb\U590b\U4ebb\U6840";
openId = "oa_7Rwer7b-kHY8_9MHxI6qZiKEY";
provice = "";
},
{
city = Shenzhen;
country = "";
gender = "\U7537";
gpsCity = "";
pictureSamll = "https://wx.qlogo.cn/mmhead/Q3auHgzwzM6SQaHp8UOiaezQdPdOxyDT9HVCOBGMYEb6VbJia9dQW5Bw/96";
pictureMiddle = "https://wx.qlogo.cn/mmhead/Q3auHgzwzM5o0csLYjOicHvgm8xELI402SxZVISRBcsQ4TI2G6QVnCw/96";
pictureLarge = "https://wx.qlogo.cn/mmhead/Q3auHgzwzM5o0csLYjOicHvgm8xELI402SxZVISRBcsQ4TI2G6QVnCw/96";
isFriend = 1;
lang = "";
nickName = "\U5f20\U817e\U98de";
openId = "oa_7RwaIu-lw_yPXvZEKJ37Q3HkI";
provice = "";
},
);
protocolName = RelationResponse;
protocolVersion = "1.0";
resultCode = 0;
resultMsg = success;
}
4.2.11 后台分享(不拉起qq或微信)
请求协议:BackgroundShareRequest
请求参数:
参数名 参数类型 参数说明 openId
string
分享给目标好友的QQ(或微信)opened
title
string
分享的标题
summary
string
分享的简介
imgUrl
string
分享缩略图URL(QQ独有)
targetUrl
string
跳转目标页面, 通常为游戏的详情页(QQ独有)
previewText
string
可选, 预览文字(QQ独有)
gameTag
string
(QQ独有,默认MSG_INVITE)可选, 此参数必须填入如下值的其中一个
MSG_INVITE //邀请
MSG_FRIEND_EXCEED //超越炫耀
MSG_HEART_SEND //送心
MSG_SHARE_FRIEND_PVP //PVP对战
messageExt
string
可选,游戏分享是传入字符串,(微信独有)
mediaTagName
string
(微信独有,默认MSG_INVITE)请根据实际情况填入下列值的一个, 此值会传到微信供统计用, 在分享返回时也会带回此值, 可以用于区分分享来源
"MSG_INVITE"; // 邀请
"MSG_SHARE_MOMENT_HIGH_SCORE"; //分享本周最高到朋友圈
"MSG_SHARE_MOMENT_BEST_SCORE"; //分享历史最高到朋友圈
"MSG_SHARE_MOMENT_CROWN"; //分享金冠到朋友圈
"MSG_SHARE_FRIEND_HIGH_SCORE"; //分享本周最高给好友
"MSG_SHARE_FRIEND_BEST_SCORE"; //分享历史最高给好友
"MSG_SHARE_FRIEND_CROWN"; //分享金冠给好友
"MSG_friend_exceed" // 超越炫耀
"MSG_heart_send" // 送心
eg:
{
protocolName = BackgroundShareRequest;
protocolVersion = "1.0";
}
回调协议:BackgroundShareResponse
回调参数:
参数名 参数类型 参数说明 resultCode int 结果,0:成功,其他:出错 eg:
{
protocolName = BackgroundShareResponse;
protocolVersion = "1.0";
resultCode = 0;
}
4.2.12 数据上报协议名及参数
请求协议:UploadLogRequest
请求参数:
回调协议:UploadLogResponse
回调参数:
参数名 参数类型 参数说明 resultCode int 0:成功; -1:参数错误。-2: 其他:失败
4.2.13 QQ会员信息协议名及参数
请求协议:QQVipRequest
请求参数:
参数名
参数类型 参数说明 callerPkgName
string //接口调用方包名
gameType
string
//游戏类型: "UNITY", "COCOS", "APK"
openids
array //希望获取的玩家的openid信息,若只查自己的信息,只填写自己的openid即可
回调协议:QQVipResponse
回调参数:
参数名
参数类型
参数说明
resultCode
int 结果, 0:成功, 其他:不正确。
resultMsg
string 结果说明
vipinfos
array qqvip信息
QQVipInfo详细信息:
is_qq_vip
int
是不是qq会员,0不是1是
is_qq_year_vip
int
是不是年费qq会员,0不是1是
qq_vip_level
int
qq会员等级
openids
string 玩家openid
is_qq_svip
int
是否是qq超级会员,0不是1是
4.2.14 唤醒通知协议名及参数(在应用被第三方应用打开时候,如qq、微信等,会通过此接口通知游戏,是哪个第三方应用唤醒了游戏)
该接口属于游戏平台侧主动通知游戏,不需要游戏调用request,但需要游戏处理接收response内容。具体识别方式,对应不同的第三方应用的参数设定。
例如:来自手Q游戏中心的启动,会在extInfo中新增launchfrom字段,该字段值为sq_gamecenter即表示启动来自手Q游戏中心
示例场景:游戏app上架手q游戏中心,在手q游戏中心游戏详情页面可以直接拉起游戏,此时手q游戏中心会通过此接口给游戏传递一些数据,游戏检测到sq_gamecenter标识,即认为此次拉起行为是通过手q游戏中心拉起的,需要后续做一些启动特权的内容
@interface QGWakeUpDataModel : NSObject
@property (nonatomic,assign) int flag; //错误码
@property (nonatomic,assign) int platform; //被什么平台唤起
@property (nonatomic,strong) NSString * mediaTagName; //wx回传得meidaTagName
@property (nonatomic,strong) NSString * openId; //qq传递的openid
@property (nonatomic,strong) NSString * desc; //描述
@property (nonatomic,strong) NSString * lang; //语言 目前只有微信5.1以上用,手Q不用
@property (nonatomic,strong) NSString * country; //国家 目前只有微信5.1以上用,手Q不用
@property (nonatomic,strong) NSString * messageExt; //游戏分享传入自定义字符串,平台拉起游戏不做任何处理返回 目前只有微信5.1以上用,手Q不用
@property (nonatomic,strong) NSDictionary *extInfoDic; //游戏-平台携带的自定义参数手Q专用
@end
从QQ游戏中心拉起游戏时,extInfoDic里面是手Q传给游戏的数据,数据会根据flag的不同而不同。比如flag=3004时,刷新票据,atoken就是openKey;flag=3003,需要弹出异帐号提示。
{
atoken = CAF6E076B460A1EF9DA7A2DAFBE72566;
launchfrom = "sq_gamecenter";
openid = E2E110F324C7E565EC5971A30BBFE51E;
platform = "qq_m";
"user_openid" = E2E110F324C7E565EC5971A30BBFE51E;
}
备注:交互方式具体参考5
4.2.15 微信群功能协议
请求协议:WXGroupRequest
请求参数:
参数名 参数类型 参数说明 requestType int requestType: 0 查询, 1 创建, 2 加入 (必须)
groupId
string 公会Id (必须) openIdList
string 待检查是否在群里的用户openid列表,以","逗号分割 (查询)
chatRoomName
string 聊天群名称 (创建)
chatRoomNickName
string 用户在聊天群的自定义昵称 (创建、加入)
statusType
int 0(是否建群),1(是否加群)
回调协议:WXGroupResponse
回调参数:
参数名 参数类型 参数说明 resultCode
int //0成功
resultMsg
string //错误信息
platform
int //平台
memberNum
int //群成员数
chatRoomURL
string //创建(加入)群聊URL
openIdList
string //群成员openId,以","分隔
1)查询微信群信息
游戏内查询公会微信群信息,用于检查是否创建微信公会群以及对应用户是否加入群。
{
protocolName = WXGroupRequest;
protocolParam = {
groupId = 100001;
openIdList = "oa_7RwXce2Fl3sZX600OWa3nQbIs";
requestType = 0;
};
protocolVersion = "1.0";
}
成功:
{
chatRoomURL = "";
memberNum = 1;
openIdList = "oa_7RwXce2Fl3sZX600OWa3nQbIs";
platform = 1;
resultCode = 0;
resultMsg = success;
}
失败:
{
platform = 1;
resultCode = 2013;
resultMsg = "Group ID not exist!";
}
2)创建公会微信群
{
protocolName = WXGroupRequest;
protocolParam = {
chatRoomName = roomName1;
chatRoomNickName = nickname1;
groupId = 100002;
requestType = 1;
};
protocolVersion = "1.0";
}
成功:
{
platform = 1;
resultCode = 0;
resultMsg = "";
}
失败:
{
platform = 1;
resultCode = 2014;
resultMsg = "had created a group today and limit one chance a day";
}
3)加入公会微信群
{
protocolName = WXGroupRequest;
protocolParam = {
chatRoomNickName = nickname2;
groupId = 100001;
requestType = 2;
};
protocolVersion = "1.0";
}
成功
{
platform = 1;
resultCode = 0;
resultMsg = "";
}
4)查询微信群状态
{
protocolName = WXGroupRequest;
protocolParam = {
groupId = 100003;
requestType = 3;
statusType = 0;
};
protocolVersion = "1.0";
}
成功:
{
"resultMsg" : "success,[]",
"resultCode" : 0,
"requestType" : 3,
"platform" : 1
}
5)解绑微信群
{
protocolName = WXGroupRequest;
protocolParam = {
groupId = 100002;
requestType = 4;
};
protocolVersion = "1.0";
}
成功:
失败:
{
platform = 1;
requestType = 4;
resultCode = 2013;
resultMsg = "Group ID not exist!";
}
4.2.16 粘贴板功能
请求协议:PasteboardRequest
请求参数:
参数名 参数类型 参数说明 pasteboardText string 需要粘贴到粘贴板的字符串
回调协议:PasteboardResponse
回调参数:
参数名 参数类型 参数说明 resultCode int 0 正确,其他,错误
4.2.17 游戏调用大厅的WebView控件打开web页面
这个接口提供打开web页面的功能,游戏传送URL等参数到大厅SDK,大厅会在游戏最上层打开一个webview。目前默认全屏。
请求协议:OpenUrlRequest
请求参数:
参数名 参数类型 参数说明 url string 要打开的web页面URL 回调协议:OpenUrlResponse
回调参数:
参数名 参数类型 参数说明 resultCode int 0:正确,-1:错误 resultMsg string 出错的时候会返回错误信息 5 大厅主动发送消息给游戏方案
交互方式:游戏监听“GameHallToGameNotification”的通知,根据消息类型,获取到大厅发给游戏的信息,然后游戏做相应的操作。通知里面有两个参数:infoType(消息类型)和dataModel(数据载体)
消息类型:
typedef enum : NSUInteger
{
QGHallToGameInfoTypeUnkown = 0, //未知
QGHallToGameInfoTypeWakeUp = 1 //游戏被第三方应用唤醒唤醒
}QGHallToGameInfoType;
1、cocos游戏接入方式:
游戏方需要添加的代码:
[[NSNotificationCenter defaultCenter] addObserverForName:kGameHallToGameNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
NSDictionary *dic = [note object];
if (dic && [dic isKindOfClass:[NSDictionary class]]) {
QGHallToGameInfoType infoType = (QGHallToGameInfoType)[[dic objectForKey:@"infoType"] integerValue];
QGWakeUpDataModel *dataModel = (QGWakeUpDataModel*)[dic objectForKey:@"dataModel"];
//接下来是游戏获取到通知的数据做相应的操作
}
}];
2、Unity3D游戏接入方式
参考demo,在c#里面注册回调
//注册回调
void Awake()
{
Debug.Log("QGHallSDKAdapter Awake");
#if UNITY_IOS && !UNITY_EDITOR
InitCallBackFunc (DispatchQGSDKMessageWrapper,DispatchQGSDKHallCallGameWrapper);
#endif
}
6 支付方案(单发版本(非TSDK版本))(iOS)
单发版本的支付流程如下,除了购买钻石,是游戏方向大厅sdk发起请求,由大厅sdk完成支付;其他请求,都是由游戏方客户端,向游戏方的服务器发起请求来完成相应的功能。所以,游戏方服务器需要完成下面的1、3、4、5功能。
注意:
1、商品在腾讯rdm上配置,并同步到米大师官网,同时写死在客户端。每次有变动,都要发版本;
2、钻石是存在米大师服务器的,每次有用到钻石的地方,都需要游戏服务器向米大师服务器发起查询请求;
3、最后提交上线审核的时候需要提供一个QQ号码,该号码必须在七天内全部执行过上面提到的四个接口(1、3、4、5),由游戏方提供给大厅。
6.1 查询钻石接口
测试环境url
//msdktest.qq.com/mpay/get_balance_m
正式环境url
//msdk.qq.com/mpay/get_balance_m
接口文档
//wiki.midas.qq.com/post/index/1/45/75
6.2 购买钻石接口
参考4.2.7接口,注意:payType=0
6.3 扣除游戏币接口(消费钻石接口)
测试环境url
//msdktest.qq.com/mpay/pay_m
正式环境url
//msdk.qq.com/mpay/pay_m
接口文档
//wiki.midas.qq.com/post/index/1/45/76
6.4 直接赠送游戏币(钻石)接口
测试环境url
//msdktest.qq.com/mpay/present_m
正式环境url
//msdk.qq.com/mpay/present_m
接口文档
//wiki.midas.qq.com/post/index/1/45/78
6.5 取消支付接口
测试环境url
//msdktest.qq.com/mpay/cancel_pay_m
正式环境url
//msdk.qq.com/mpay/cancel_pay_m
接口文档
//wiki.midas.qq.com/post/index/1/45/77
7 Unity3D游戏接入方案
7.1 接入方式
Unity3D 游戏接入与Cocos游戏接入方式有差别,但接口是基本一致的。
Unity3D游戏接入工程结构参考Demo。游戏与大厅壳之间的交互部分,由QGHallSDKAdapter.cs与大厅SDK来完成。游戏方只需要参考demo里面的QGHallSDKAdapter.cs来完成游戏测的接入,其他都有SDK来完成。游戏方从Unity导出Xcode工程,只需要把导出的工程中的Data和Native文件夹下的内容替换掉demo里面相应的文件夹下的内容即可(注意:在demo里面,删除Native文件夹下的内容,需要在工程里面删除,不是在文件夹下删除;然后把导出的native文件夹下的文件夹add到工程里面)。
在QGHallSDKAdapter.cs里面,有两个回调方法:DispatchQGSDKMessageWrapper和DispatchQGSDKHallCallGameWrapper。
DispatchQGSDKMessageWrapper的作用是:游戏主动调用大厅的接口(如第4部分的一系列接口)。
DispatchQGSDKHallCallGameWrapper的作用是:大厅主动调用游戏,通过参数cmd来区分不同接口。
注意:这两个回调的参数pDataBuf是JSON数据转成字符串之后的数据。
7.2 注意问题
7.2.1 不要在游戏里面接Bugly,不要有任何Bugly相关的代码。统一在大厅里面接了。