最近做MSDK手Q的邀请功能,遇到一个坑,手Q结构化消息分享功能接口如下:
/**
* @param scene 标识发送手Q会话或者Qzone
* eQQScene.QQScene_QZone: 分享到空间(4.5以上版本支持)
* eQQScene.QQScene_Session: 分享到手Q会话
* @param title 结构化消息的标题
* @param desc 结构化消息的概要信息
* @param url 内容的跳转url,填游戏对应游戏中心详情页。在手Q中点击该条分享的消息会拉起游戏, 此时MSDK会给游戏OnWakeup(WakeupRet& wr)回调, 游戏在此url中的自定义参数(如 platformdata, gamedata等,详见此页面“游戏中心详情页”部分)会在WakeupRet.extInfo中以key-value的方式透传回来。
* @param imgUrl 分享消息缩略图URL
* @param imgUrlLen 分享消息缩略图URL长度
* @return void
* 通过游戏设置的全局回调的OnShareNotify(ShareRet& shareRet)回调返回数据给游戏, shareRet.flag值表示返回状态, 可能值及说明如下:
* eFlag_Succ: 分享成功
* eFlag_Error: 分享失败
*
* @return void
* 通过游戏设置的全局回调的OnShareNotify(ShareRet& shareRet)回调返回数据给游戏, shareRet.flag值表示返回状态, 可能值及说明如下:
* eFlag_Succ: 分享成功
* eFlag_Error: 分享失败
* 注意:
* 如果分享的是本地图片,则需要放置到sdcard分区, 或其他外部程序有权限访问之处
* 由于手Q客户端部分的版本返回的回调是有问题的, 故建议不要依赖此回调做其他逻辑。
*
*/
void WGSendToQQ(
const eQQScene& scene,
unsigned char* title,
unsigned char* desc,
unsigned char* url,
unsigned char* imgUrl,
const int& imgUrlLen
);
其中url是可以带参数的,规范格式如下:
http://gamecenter.qq.com/gcjump?appid={YOUR_APPID}&pf=invite&from=iphoneqq&plat=qq&originuin=111&ADTAG=gameobj.msg_invite&gamedata={YOUR_GAMEDATA}
字段规范
字段 | 是否必须 | 类型 | 说明 |
---|---|---|---|
appid | 必须 | Integer | 应用唯一标识ID |
pf | 必须 | String | 历史原因固定为“invite”,游戏中心检测到pf值为invite将直接呼起游戏 |
plat | 必须 | String | 来源平台,值为qq |
from | 必须 | String |
消息来源平台,可能值有:
androidqq:安卓QQ
iphoneqq:iPhone QQ
|
ADTAG | 必须 | String |
标识不同的结构化消息来源,可能值有:
gameobj.msg_invite(代表邀请)
gameobj.msg_exceed(代表超越)
gameobj.msg_heart(代表送心)
gameobj.msg_pvp(代表挑战)
gameobj.msg_show(代表炫耀)
|
originuin | 必须 | String | 发起方openID |
platformdata | 可选 | String | 透传给游戏的数据 |
gamedata | 可选 | String | 透传给游戏的数据 |
一般我们做邀请功能,都可能需要自己带一些参数,此时就用到了gamedata这个字段,但是,作为一个链接参数,我们必须对参数进行加密,一般的做法就是进行base64编码
base64在线编解码的网站:http://www1.tc711.com/tool/BASE64.htm
对应的c#的base64编解码的代码如下:
base64编码:
byte[] bytes = Encoding.Default.GetBytes("要转换的字符");
string str = Convert.ToBase64String(bytes);
base64解码:
byte[] outputb = Convert.FromBase64String(str);
string orgStr = Encoding.Default.GetString(outputb);
好,我们构造好了参数之后,通过手Q分享结构化消息给好友B君,B君在手Q端收到了分享消息,点击分享消息,此时会跳转到链接的网站,也就是手Q游戏中心,如果你的游戏已经在手Q游戏中心上架,并且你已经安装了游戏,则此时游戏中心会自动拉起游戏APP,并在APP唤醒时回调MSDK的onWakeupNotify接口,将gamedata回传给游戏。
好,重点来了,它回传的这个数据是被进行url编码过的,所以你在进行base64解码前,必须对数据进行url解码,
如果是用unity,直接用WWW.UnEscapeUrl接口即可进行url解码
在线的url编解码网站:http://tool.chinaz.com/Tools/URLEncode.aspx