一. 接入前准备
1、注册开发者账号,并联系商务。
2、获得系统分配的参数appId、appkey和appSecret.
appId:小游戏对应用的唯一Id,每一款游戏有一个Id。
appKey:支付创建订单的时候用来签名。
appSecret:验证用户登录用来签名和支付回调的时候用来验证签名。
请您公司的服务器开发人员将如下IP加到IP白名单中,以免因为IP限制造成回调不成功。
42.62.48.246
223.202.68.237
42.62.103.0/26(42.62.103.1~42.62.103.62)
120.134.34.0/26(120.134.34.1~120.134.34.62)
183.84.4.0/26,118.26.209.0/24
61.155.4.99、61.155.4.100、61.155.4.101
二. 登录支付API
1、游戏登录
登录交互图:
qg.login(OBJECT)
参数:
参数名称 | 类型 | 描述 |
success | Function | 登录成功 |
fail | Function | 失败回调 |
complete | Function | 完成回调 |
success返回值:
参数名称 | 类型 | 描述 |
appAccountId | Int | 游戏中心计费系统 用户Id,作为用户的唯一标识 |
session | String | 本次登录游戏的会话ID(当前登录有效、会过期) |
示例:
qg.login({
success: function(res) {
},
fail: function(res){}
});
2、 验证用户session(服务端)[必接]
- 接口地址:https://mis.migc.xiaomi.com/api/biz/service/loginvalidate
- 请求方式:POST
- Headers:Content-Type: application/x-www-form-urlencoded
请求参数说明:
参数名称 | 重要性 | 说明 |
appId | 必须 | 游戏ID |
session | 必须 | 用户sessionID |
uid | 必须 | 用户ID、和登录接口返回的appAccountId一致 |
signature | 必须 | 签名,签名方法见后面说明 使用appSecret签名 |
例如:
POST https://mis.migc.xiaomi.com/api/biz/service/loginvalidate
appId=2882303761517239138&session=1nlfxuAGmZk9IR2L&uid=100010&signature=b560b14efb18ee2eb8f85e51c5f7c11f697abcfc
返回参数说明:
参数名称 | 重要性 | 说明 |
errcode | 必须 | 状态码: 200 验证正确 1515 appId 错误 1516 uid 错误 1520 session 错误 1525 signature 错误 4002 appid, uid, session 不匹配(常见为session过期) |
errMsg | 可选 | 错误信息 |
adult | 可选 | 用户实名标识。 407 实名认证通过,年龄大于18岁 408 实名认证通过,年龄小于18岁 409 未进行实名认证 |
例如: { "errcode": 200,"adult":409 }
3、获取用户信息
NOTICE: 开发者调用时,平台会弹出用户授权弹窗,需要用户授权才能获取到用户信息,用户取消授权时会走失败回调,这时开发者需要处理用户取消授权的情况。
qg.getUserInfo(OBJECT)
参数:
参数名称 | 类型 | 必填 | 描述 |
success | Function | 否 | 成功 |
fail | Function | 否 | 失败回调 |
complete | Function | 否 | 完成回调 |
success返回值res:
参数名称 | 类型 | 描述 |
res.userInfo | Object | 用户信息对象 |
userInfo参数说明:
参数名称 | 类型 | 描述 |
nickName | String | 用户昵称 |
avatarUrl | String | 用户头像url |
gender | Int | 用户性别,0:未知,1:男,2:女 |
示例:
qg.getUserInfo({
success: function(res) {
console.log('nickName:${res.userInfo.nickName}')
},
fail: function(){
console.log('user reject!')
},
complete: function(res){
console.log('get userInfo complete')
}
});
4、用户信息变化监听事件,用户同意授权后,用户信息更新才会回调
qg.onUserInfoChange(function callback)
参数
function callback 用户信息变化回调事件
callback参数res:
参数名称 | 描述 |
res.userInfo | 用户信息 |
userInfo参数说明:
参数名称 | 类型 | 描述 |
nickName | String | 用户昵称 |
avatarUrl | String | 用户头像url |
gender | Int | 用户性别,0:未知,1:男,2:女 |
示例:
qg.onUserInfoChange(function (res) {
console.log(res.userInfo.nickName)
console.log(res.userInfo.avatarUrl)
console.log(res.userInfo.gender)
})
5、取消用户信息变化监听事件
qg.offUserInfoChange(function callback)
参数
function callback 用户信息变化回调事件。
三. 游戏支付说明(游戏内包含支付能力必接)
1、创建支付订单
qg.pay(OBJECT)
参数:
参数名称 | 类型 | 描述 |
orderInfo | OBJECT | 需要由游戏服务端生成的订单明细字符串,由下表中的基本参数,加上签名参数构成。参数使用URL编码成字符串 |
success | Function | 支付成功回调 |
fail | Function | 失败回调 |
complete | Function | 完成回调 |
orderInfo参数说明:
参数名称 | 参数类型 | 描述 |
appId | String | 游戏唯一ID |
appAccountId | int | 与登录接口返回的appAccountId一致 |
session | String | 与登录接口返回的session一致 |
cpOrderId | String | 游戏订单号 |
cpUserInfo | String | cp透传信息 (非空) |
displayName | String | 支付的时候显示的商品名称 |
feeValue | Int | 价格 单位分 |
sign | String | 签名 注:签名的key为(AppKey 全是数字) (必传) 签名方式见下文 必须先验证 用户session验证接口 |
示例:
qg.pay({
orderInfo: {
appId:"2882303761117490626",
appAccountId:"74317",
session:"TRQJzccscL9u6VvC",
cpOrderId:'1556088963',
cpUserInfo: '74317',
displayName: '游戏元宝',
feeValue: 100,
sign: '22fea7804df43420dc9886a04c028b6f335d87b6',
},
success: function(data){
//{memo: "支付成功", resultStatus: "9000"}
//9000: 支付成功
},
fail: function(data){
//{memo: "已取消支付", resultStatus: "6001"}
//6001: 已取消支付
//5000: 未安装微信
//5001: 微信订单未支付
}
})
2、发货通知(服务端)[必接]
接口描述:该接口为通知游戏发货接口,SDK服务端会在客户端支付成功后将订单信息发送至开发者提供的支付回调地址,为防止被篡改,游戏需要对所收到的参数进行校验,确认收到的参数和下单的参数一致。
请求参数:
参数名称 | 是否必须 | 参数类型 | 描述 |
appId | 是 | string | 游戏ID |
cpOrderId | 是 | string | 开发商订单ID |
cpUserInfo | 否 | string | 开发商透传信息 |
uid | 是 | string | 用户ID |
orderId | 是 | string | 游戏平台订单ID |
orderStatus | 是 | string | 订单状态,TRADE_SUCCESS 代表成功 |
payFee | 是 | string | 支付金额,单位为“分”。 |
productCode | 是 | string | 商品代码 |
productName | 是 | string | 商品名称 |
productCount | 是 | string | 商品数量 |
payTime | 是 | string | 支付时间,格式 yyyy-MM-dd HH:mm:ss |
partnerGiftConsume | 否 | string | 优惠券金额(分) 非必填 |
signature | 是 | string | 签名,签名方法见后面说明 使用appSecret验证签名 |
回调示例:
http://ccc.com/notify.do?appId=2882303761517239138&cpOrderId=9786bffc-996d-4553-aa33-f7e92c0b29d5&orderConsumeType=10&orderId=21140990160359583390&orderStatus=TRADE_SUCCESS&payFee=1&payTime=2014-09-05%2015:20:27&productCode=com.demo_1&productCount=1&productName=%E9%93%B6%E5%AD%901%E4%B8%A4&uid=100010&signature=1388720d978021c20aa885d9b3e1b70cec751496 |
发货接口说明:
- 服务端在订单支付完成之后将立即通知到CP发货接口。
- 服务器通知CP发货时,若未接收到CP接口成功返回,该笔订单将重复通知3次。
- 服务器在重复3次通知CP发货的过程中,若都未收到CP的成功回复,订单将进入后台轮询通知发货。每次轮询将有3次的通知;第一次轮询为订单新建之后的15分钟;24小时之内每半小时轮询通知一次;24小时之后每小时轮询通知一次;7天之后不再通知,CP可通过订单查询接口进行主动对账补偿。
- 服务器收到CP接口返回: {"errcode":200,"errMsg":"success"} json串时将不再对该笔订单做重复通知。
- 服务器若对某笔订单重复通知,则CP需自行判断是否已经发货,若已发货则接口直接返回: {"errcode":200,"errMsg":"success"} json串,当作成功处理。 该接口优先GET方式,返回信息全部为json结构。 该接口中所有签名编码都为UTF-8,且加密结果均转换为小写字符。
3、订单信息查询(服务端)[选接]
接口描述:服务端开发者调用该接口,可以查询具体订单信息。
- 接口地址:https://mis.migc.xiaomi.com/api/biz/service/queryOrder.do
- 请求方式:POST
- Headers:Content-Type: application/x-www-form-urlencoded
请求参数:
参数名 | 参数类型 | 描述 |
appId | string | 游戏ID |
cpOrderId | string | 开发商订单ID |
uid | string | 用户ID |
signature | string | 签名,签名方法见后面说明 |
返回参数:
参数名称 | 是否必须 | 参数类型 | 描述 |
appId | 是 | string | 游戏ID |
cpOrderId | 是 | string | 开发商订单ID |
cpUserInfo | 否 | string | 开发商透传信息 |
uid | 是 | string | 用户ID |
orderId | 是 | string | 游戏平台订单ID |
orderStatus | 是 | string | 订单状态,TRADE_SUCCESS代表成功WAIT_BUYER_PAY代表未支付REPEAT_PURCHASE订购关系已经存在 |
payFee | 是 | string | 支付金额,单位为分,即0.01米币 |
productCode | 是 | string | 商品代码 |
productName | 是 | string | 商品名称 |
productCount | 是 | string | 商品数量 |
payTime | 是 | string | 支付时间,格式 yyyy-MM-dd HH:mm:ss |
signature | 是 | string | 签名,签名方法见后面说明 |
返回参数例如:
{ "signature": "eb30240cff8c66f856ec0e48354aa670b8cf037f", "uid": "100010", "appId": 2882303761517239300, "cpOrderId": "9786bffc-996d-4553-aa33-f7e92c0b29d5", "productCode": "com.demo_1", "orderStatus": "TRADE_SUCCESS", "productName": "%E9%93%B6%E5%AD%901%E4%B8%A4", "productCount": 1, "orderConsumeType": "10", "orderId": "21140990160359583390", "payFee": 1, "payTime": "2014-09-05 15:20:27" } |
四.广告API
五、保存桌面API
小游戏中为开发者提供了可按需提示用户将小游戏icon保存到桌面的能力,可使用积分激励、复活等方法刺激用户保存;
请开发者一定实现该逻辑,保存icon后用户才会更方便找回并可push,从而提升留存。
请开发者不要随意使用,最终上线时会审核,如发现滥用将驳回。
参考效果如下:
提示保存桌面文档
该接口暂适用小米,联盟在统一进度中,使用前需要通过qg.getProvider判断当前是否为小米平台,非小米平台请处理不要调用避免发生错误;
Shortcut shortcut = qg.getShortcut();
获取全局唯一的Shortcut对象
具体实现建议如下:
shortcut.hasInstalled(OBJECT)
询问桌面是否有icon
可在进入游戏时获取桌面icon是否创建,如已创建可继续提示“看视频复活”,未创建提示“保存桌面复活“
参数:
示例:
shortcut.hasInstalled({ success: function() { console.log('handling success') } })
shortcut.install(OBJECT)
用户点击时提示保存
弹窗文案可修改,每行18个字最多请设置3行,请填充文案后看下效果。
假如用户选择“7天不再提醒”且点击“取消”时,框架会返回创建失败code“201”,请合作方保存该提示避免下次调用无反应,后续会将code分开。
参数名 | 类型 | 必填 | 说明 |
success | Function | 否 | 成功回调。参数:true 已创建,false 未创建 |
fail | Function | 否 | 失败回调 |
complete | Function | 否 | 执行结束后的回调 |
参数:
参数名 | 类型 | 必填 | 说明 |
message 1030+ | String | 否 | 权限弹窗上的说明文字,用于向用户解释为什么要创建桌面图标 |
success | Function | 否 | 创建成功 |
fail | Function | 否 | 创建失败 |
complete | Function | 否 | 执行结束后的回调 |
fail 返回错误代码
错误码 | 说明 |
201 | 用户拒绝创建 |
示例:
shortcut.install({ success: function() { console.log('handling success') } })
属性
名称 | 参数类型 | 是否可读 | 是否可写 | 描述 |
systemPromptEnabled 1020+ | Boolean | 是 | 是 | 是否开启系统快捷方式创建弹窗,默认 true。不会持久化,只对当前运行有效 |
示例:
shortcut.systemPromptEnabled = false let enabled = shortcut.systemPromptEnabled console.log('system prompt enabled: ' + enabled)
六、退出游戏API
qg.exitApplication(Object object)
参数 Object object
属性 | 类型 | 默认值 | 必填 | 说明 |
success | Function | 否 | 接口调用成功的回调函数 | |
fail | Function | 否 | 接口调用失败的回调函数 | |
complete | Function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
七、签名相关
1、生成算法
生成带签名字符串表中各参数按字母顺序排序(不包含signature),如果第一个字母相同,按第二个字母排序,依次类推。排序后拼接成par1=val1&par2=val2&par3=val3的格式,所生成的字符串即为待签名的字符串。没有值的参数请不要参与签名。 由于有些数据根据HTTP协议需求,需要进行URLencoding,这样接收方才可以接收到正确的参数,但如果这个参数参与签名,那么待签名字符串必须 是字符串原值而非URLencoding的值。
例如:
在订单通知接口收到的回调信息如下:
appId=2882303761517239138&cpOrderId=9786bffc-996d-4553-aa33-f7e92c0b29d5&orderConsumeType=10&orderId=21140990160359583390&orderStatus=TRADE_SUCCESS&payFee=1&payTime=2014-09-05%2015:20:27&productCode=com.demo_1&productCount=1&productName=%E9%93%B6%E5%AD%901%E4%B8%A4&uid=100010&signature=1388720d978021c20aa885d9b3e1b70cec751496 |
这时候需要对每个参数的值进行URLdecode,decode后的字符如下:
appId=2882303761517239138&cpOrderId=9786bffc-996d-4553-aa33-f7e92c0b29d5&orderConsumeType=10&orderId=21140990160359583390&orderStatus=TRADE_SUCCESS&payFee=1&payTime=2014-09-05 15:20:27&productCode=com.demo_1&productCount=1&productName=银子1两&uid=100010&signature=1388720d978021c20aa885d9b3e1b70cec751496 |
而需要进行签名的字符串为:
appId=2882303761517239138&cpOrderId=9786bffc-996d-4553-aa33-f7e92c0b29d5&orderConsumeType=10&orderId=21140990160359583390&orderStatus=TRADE_SUCCESS&payFee=1&payTime=2014-09-05 15:20:27&productCode=com.demo_1&productCount=1&productName=银子1两&uid=100010 |
签名算法以AppSecret作为key,使用hmac-sha1带密钥(secret)的哈希算法对代签字符串进行签名计算。签名的结果由16进制表示。hmac-sha1 带密钥(secret)哈希算法的实现请参考
2、编码约定
任何涉及到需要使用非ASCII码字符的地方,统一使用UTF-8编码。
3、签名示例
HmacSHA1验证 在线加密解密