快游戏统一 SDK 封装了登录、支付与广告的兼容逻辑,助力开发者在 vivo / OPPO / 小米 / 荣耀 四大平台上快速实现核心功能接入。
SDK 分为两部分:
提供测试用 DEMO:下载地址
若直接使用sdk打包文件
可以忽略2.1源码安装与打包
clientsdk
目录,安装依赖:npm install
npm run build
# 生成路径:clientsdk/dist/unionSdk.js
将代码拷贝到快游戏项目中,在游戏启动阶段引入 unionSdk.js
并初始化:
import unionSdk from "./unionSdk.js";
window.unionSdkInit({ config, adInfo });
将 config.json
(登录、支付配置)与 ad-info.json
(广告配置)文件放入游戏资源目录,并在初始化中加载。
⚠️ 示例中以 Cocos 引擎为例,文件需放在
assets
目录下
// 登录
qg.unionLogin({ success(res) { console.log(res); } });
// 支付
qg.unionPay({ orderInfo: { ... } });
// 原生广告
qg.createCustomAd({ adUnitId: qg.adInfo.customAd.id1 });
version | String | 否 | SDK 配置版本 |
---|---|---|---|
oppoConfig | Object | 否 | OPPO 配置 |
└─ appid | String | 是 | 应用 ID |
└─ version | String | 是 | 客户端版本,默认 1.0.0 |
└─ sdkPayUrl | String | 是 | SDK 服务端支付接口 URL |
字段名 | 类型 | 必填 | 描述 |
vivoConfig | Object | 否 | vivo 配置 |
└─ version | String | 是 | 客户端版本,默认 1.0.0 |
└─ appKey | String | 是 | 账号 appKey |
└─ appSecret | String | 是 | 账号 appSecret |
└─ sdkPayUrl | String | 是 | SDK 服务端支付接口 URL |
miConfig | Object | 否 | 小米配置 |
└─ version | String | 是 | 客户端版本,默认 1.0.0 |
└─ appId | String | 是 | 应用 ID |
└─ sdkPayUrl | String | 是 | SDK 服务端支付接口 URL |
honorConfig | Object | 否 | 荣耀配置 |
└─ version | String | 是 | 客户端版本,默认 1.0.0 |
└─ appId | String | 是 | 应用 ID |
└─ appSecret | String | 是 | 应用密钥 |
└─ sdkLoginUrl | String | 是 | 云端登录验证地址,详见 官方文档 |
{
"version": "1.0.0",
"oppoConfig": {
"appid": "30849125",
"version": "1.0.0",
"sdkPayUrl": "http://localhost:8080/pay_oppo"
},
"vivoConfig": {
"appKey": "xxx",
"appSecret": "xxx",
"version": "1.0.0",
"sdkPayUrl": "http://localhost:8080/pay_vivo"
},
"miConfig": {
"appid": "xxx",
"version": "1.0.0",
"sdkPayUrl": "http://localhost:8080/pay_mi"
},
"honorConfig": {
"appid": "xxx",
"appSecret": "xxx",
"version": "1.0.0",
"sdkLoginUrl": "https://hnoauth-login.cloud.honor.com/oauth2/v3/token"
}
}
在配置好 ad-info.json 文件后 ,广告 id 处的值填写 qg.adInfo.customAd.id 即可兼容各厂商的广告位获取
{
"oppo": {
"customAd": {
"id1": "oppo原生广告id"
},
"bannerAd": {
"id1": "oppo激励视频广告id"
}
},
"vivo": {
"customAd": {
"id1": "vivo原生广告id"
}
},
"mi": {
"customAd": {
"id1": "小米原生广告id"
}
},
"rong": {
"customAd": {
"id1": "荣耀原生广告id"
}
}
}
参数 object:
属性 | 类型 | 必填 | 说明 |
---|---|---|---|
needAuthCode | Boolean | 否 | 荣耀若要获取 token 这里需为 true,其它厂商无需传此参数也会返回 token |
success | Function | 否 | 接口调用成功的回调函数 |
fail | Function | 否 | 接口调用失败的回调函数 |
complete | Function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
success(res) 回调函数返回值
属性 | 类型 | 说明 |
---|---|---|
uid | String | 大厅 uid |
avatar | String | 大厅头像 |
nickName | String | 大厅昵称 |
token | String | 平台 token |
fail(res) 回调函数返回值
属性 | 类型 | 说明 |
---|---|---|
message | String | 消息内容(登录失败) |
code | Number | 返回状态码 |
支付流程:
参数 object:
属性 | 类型 | 必填 | 说明 |
---|---|---|---|
orderInfo | Object | 是 | 订单信息对象 |
success | Function | 否 | 接口调用成功的回调函数 |
fail | Function | 否 | 接口调用失败的回调函数 |
complete | Function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
orderInfo(签名涉及密钥信息,建议在服务器后台生成)
属性 | 类型 | 必填 | 说明 |
---|---|---|---|
orderAmount | String | 是 | 商品价格,单位为分,如商品价格为 6 元则要传“600",传“6“或者“600.0“则会报错 |
productName | String | 否 | 商品名称 (OPPO vivo 必填) |
externalInfo | String | 是 | cp 透传信息,非空 (小米必填) |
productId | String | 否 | 商品 ID (荣耀必填)荣耀支付参考文档 |
appId | String | 否 | 由开发者平台申请得到(荣耀必填) |
cpId | String | 否 | 由开发者平台申请得到(荣耀必填) |
publicKey | String | 否 | 荣耀开发者联盟添加应用内支付服务时生成的支付公钥(荣耀必填) |
success(res) 回调函数返回值
属性 | 类型 | 说明 |
---|---|---|
code | Number | 返回状态码 |
message | String | 消息内容 |
result | String | 支付结果(OPPO 这里的值是订单号) |
fail(res) 回调函数返回值
属性 | 类型 | 说明 |
---|---|---|
code | Number | 返回状态码 |
message | String | 消息内容 |
code 字段值
属性 | 描述 |
---|---|
0 | 支付成功 |
101 | 支付取消 |
102 | 支付失败 |
server/js/serversdk/routes/config.json
server/java/.../resources/config.json
server/php/.../config.json
属性 | 类型 | 必填 | 说明 |
---|---|---|---|
version | String | 否 | 版本 id |
oppoConfig | Object | 否 | oppo 侧配置 |
—pkgName | String | 是 | 应用包名 |
—appid | String | 是 | 应用 id |
—appKey | String | 是 | 游戏上架时分配的 key |
—appSecret | String | 是 | 游戏上架时分配的秘钥 |
—callBackUrl | String | 是 | 回调地址,用于通知支付结果,本服务端的通知回调支付接口 |
—privateKey | String | 是 | 开发者私钥,(私钥不加前缀:-----BEGIN RSA PRIVATE KEY-----,也不加后缀:-----END RSA PRIVATE) |
vivoConfig | Object | 否 | vivo 侧配置 |
—pkgName | String | 是 | 应用包名 |
—appid | String | 是 | 应用 id |
—appKey | String | 是 | 游戏上架时分配的 key |
—appSecret | String | 是 | 游戏上架时分配的账号秘钥 |
—payAppSecret | String | 是 | 游戏上架时分配的支付秘钥 |
—callBackUrl | String | 是 | 支回调地址,用于通知支付结果,本服务端的通知回调支付接口 |
miConfig | Object | 否 | 小米侧配置 |
—pkgName | String | 是 | 应用包名 |
—appId | String | 是 | 应用 appId |
—loginValidateUrl | String | 是 | 验证用户 session(服务端接口) 参考 |
—queryOrderStateUrl | String | 是 | 主动查询订单状态 参考 |
honorConfig | Object | 否 | 荣耀侧配置 |
—appId | String | 是 | 开发者服务平台上申请的 app id |
—publicKey | String | 是 | 快游戏在荣耀开平获取到的支付回调验签的公钥 参考 |
示例
{
"version": "1.0.0",
"oppoConfig": {
"pkgName": "String",
"appId": "String",
"appKey": "String",
"appSecret": "String",
"callBackUrl": "http://41234",
"privateKey": "MIICXQIBAAKBgQCjAFh6nQyVFX8U/Cv7GDT1xOARO5IPH+nW7CblMCPozrKY1hVb3FwMkcNLavpgH75EUE+OPyCxr0BoU3mMDybiXGppOSqBvaOnYWT+88nMKNGwwfsYT54lCVB20OYYaTBr7Uq9wrjatf+9yjSHAHKXlHJlOarg7zCS+3VCyT4sVQIDAQABAoGBAInFhAN29KiZ98Tj88SSzEii9AR8xlJUVhCbn7B9xQxEkL4PzRPMqFzTYy8+p4tRqT8SZnvDrb2hdB352DVipSi7K3idnpIrQOByz9+Hhrabb1u3ChbFIOk42vLfmufRf7dA18lVQ9NqMipSdsMc3Ko/TnVHDyVKhYX1FgrPZdQtAkEA0S8IUSioG895Zkr/oQs+QFax7BGLFdp1Bqd7/zRM3eR95HtVW0taIdXwiZPCZDHPzEPMDqCbiG87FI2/IKuo6wJBAMd7V2Y+RdwZ9OzL5F0xR0R41iVX5DJzM70dV3pj7gJzatFL2JwW2aY2V5l1OKrzVRlYuIXT9kOTuzmUKmV4L78CQBxK4DUZ6qLYTPMo8ao2exT4pNfpB4bNJUbhIERELqFUZjKg+8p9RpOM/BufgItMsW5PPSo9TswFP1hoU5F3pkECQQCc/xLjMiGTP46HC1U4jz8SwbNwgoLjvc07iqs9dQZuQV4RSQs6lbVIXj6FVT97M7WHFE9tbEvGFa/lehn/8B5LAkBgwCuXLhb+n4RA+K0tI/gmFesln+SVLl1SM8YxKGfu2rHVY0yNHKu3ZKFDAABpWbcXGt2uAq4Vvh7OTcLssEfz"
},
"vivoConfig": {
"pkgName": "com.jovi.wuziqi.vivominigame",
"appId": "100002162",
"appKey": "635fd8fd145fcec02749cb4ee7b4a744",
"account_appSecret": "0e169ad37148d220cb4411f1ca2afed3",
"appSecret": "17756692d9c419a21e76050f9a44d5f0",
"notifyUrl": "http://172.27.49.77:8080/pay_callback_vivo"
},
"miConfig": {
"pkgName": "com.xxx.cocos.mini",
"appSecret": "xxx",
"appId": "xxx",
"loginValidateUrl": "https://mis.migc.xiaomi.com/api/biz/service/loginvalidate",
"queryOrderStateUrl": "https://mis.migc.xiaomi.com/api/biz/service/queryOrder.do"
},
"honorConfig": {
"appId": "String",
"publicKey": "String"
}
}
接口参数 object:
属性 | 类型 | 必填 | 说明 |
---|---|---|---|
provider | String | 是 | 厂商标识,客户端 qg.getProvider 获取 |
token | String | 否 | 客户端 qg.login 返回的 token |
接口返回值 object:
属性 | 类型 | 说明 |
---|---|---|
uid | String | 大厅 uid |
avatar | String | 大厅头像 |
nickName | String | 大厅昵称 |
oppo | vivo | mi | honor | |
---|---|---|---|---|
支付接口名 | /pay_oppo | /pay_vivo | /pay_mi | 无支付接口 |
支付回调通知接口名 | /pay_callback_oppo | /pay_callback_vivo | /pay_callback_mi | /pay_callback_honor |
备注
QG.Login(
res => Debug.Log("登录成功:" + JsonUtility.ToJson(res)),
err => Debug.Log("登录失败:" + err.errMsg)
);
PayParam param = new PayParam() {
productName = "xxx",
orderAmount = 100
};
QG.Pay(param,
res => Debug.Log("支付成功: " + JsonUtility.ToJson(res)),
err => Debug.Log("支付失败: " + err.errMsg),
done => Debug.Log("支付完成: " + JsonUtility.ToJson(done))
);
//需要使用QG.GetAdInfo()获取当前运行平台的广告位列表
(string)QG.GetAdInfo()["bannerAd"]["id1"]
//创建bannerAd广告
var bannerAd = QG.CreateBannerAd(new QGCreateBannerAdParam() {
adUnitId = (string)QG.GetAdInfo()["bannerAd"]["id1"]
});
bannerAd.OnLoad(() => bannerAd.Show());
Q: 是否支持自定义 SDK 内容? A: 是的,SDK 为开源形式,开发者可根据需求进行裁剪与修改。
Q: 广告 id 如何统一管理? A: 在 ad-info.json
中配置多个广告类型与平台 ID,通过 qg.adInfo.xxx.id
动态读取,qg.adInfo 会根据当前运行的平台直接获取到对应的广告位列表
Q: SDK 是否可用于 Web 端? A: 当前仅适用于快游戏平台,不支持浏览器 Web 运行。