猫耳FM游戏 SDK 开发包(简称:SDK)主要用来向第三方应用程序提供便捷、安全以及可靠的登录、支付服务。本文主要描述 SDK 用户登录、支付接口的使用方法,供合作伙伴的开发者接入使用。
接入前期准备工作包括商户签约和密钥配置,已完成商户可略过。 需要获取的参数包括:
参数名称 | 参数说明 |
---|---|
server_id | 分配给研发的区服 id |
merchant_id | 分配给研发的商户 id |
app_id | 分配给研发的游戏 id |
app_key | SDK 客户端与 SDK 服务器通信秘钥 |
这些参数请通过开放平台或与我方人员联系获取
- app_key 是客户端签名所使用的的 key,是 SDK 初始化时必填的参数
重要提示:研发接入需根据不同 app_id 分配单独的服务器部署,基于平台游戏 app_id + 用户 uid 对应游戏内用户唯一 ID,以便区分用户。
本教程适用于 AndroidStudio 开发工具。(请尽可能使用新版本的 AndroidStudio,Demo 使用的是 Android Studio Giraffe)
(1) 如果之前接入过猫耳FM游戏 SDK,需要先移除主 module 下 libs 文件夹中的 alipaysdk-noutdid-15.8.10.220419171600.aar
以及
missevansdk_Game_SDK_release_vxxx.aar
文件。
(2) 将本 demo 工程中 app/libs
下的 Missevansdk-Game-SDK-Release-v2.0.7.aar
文件放置到主 module 的 libs
文件夹下。如果主 module 下没有 libs
文件夹,则需要新建一个。
(3) 在主 module 的 build.gradle 配置文件中添加入下代码:
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
// 1. 导入 aar
implementation fileTree(dir: 'libs', include: ['*.aar'])
implementation 'androidx.core:core:1.6.0'
implementation 'com.alipay.sdk:alipaysdk-android:15.8.09@aar'
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.8.0'
// this dependency is not required if you are already using your own slf4j implementation
implementation 'org.slf4j:slf4j-nop:1.7.25'
}
请将以下内容全部复制到 AndroidManifest.xml 的 manifest 标签下
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
重要提示:Android 6.0 以后请对相应权限进行动态权限申请
添加 Activity 前请注意以下内容
- 由于加入微信支付功能,接入时,需要在自己的包名下新建 wxapi 文件夹,然后在此文件夹下新建 WXPayEntryActivity,并且 WXPayEntryActivity 继承 SDK 中的 BaseWXEntryActivity,WXPayEntryActivity 不需要实现任何方法。最后在 AndroidManifest.xml 中声明此 Activity。(此部分可参照 Demo 项目)
请将以下内容全部复制到 AndroidManifest.xml 的 application 标签下
<activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singleTop" />
如果与 Demo 项目中存在差异,请以 Demo 项目中为准。
合作游戏打包前,需接入猫耳FM渠道闪屏,并在游戏 icon 右下角添加猫耳FM渠道角标(素材路径为 assets/猫耳角标闪屏.zip
),接入时,请规范使用素材,不得进行影响渠道 logo 展示的加工修改,如裁切 logo 主体、单向拉伸等。
初始化接口调用方式如下
MissEvanSdk gameSdk = MissEvanSdk.initialize(
boolean debug,
Context c,
String merchant_id,
String app_id,
String server_id,
String app_key,
InitCallbackListener initCallbackListener,
ExitCallbackListener exitListener
);
参数说明如下
参数名称 | 参数说明 |
---|---|
debug | 是否打开 debug 模式,正式包必须关闭,值为 false |
c | Activity 实例 |
merchant_id | 商户 id,由平台提供 |
app_id | 每款应用在平台的唯一标识,由平台提供 |
server_id | 我方分配的商户应用的区服 id,一般用来区分区服,如果游戏有多个区服,对应一个我方分配的区服 id,并在选择角色、区服后调用 notifyZone 接口传入我方的区服 id |
app_key | 商户应用的客户端密钥,请勿使用服务器端密钥 |
initCallbackListener | initCallbackListener 为 InitCallbackListener 的实例。InitCallbackListener 的回调方法有 onSuccess、onFailed。回调 onSuccess 方法表明初始化成功,回调 onFailed 方法表明初始化失败 |
exitListener | 当触发防沉迷功能时,会回调该接口,接入方需在该接口的 onExit 方法中释放资源,实现退出游戏的代码 |
initCallbackListener 的回调方法 onFailed(int code, @Nullable String msg, @Nullable Throwable throwable) 包含失败码,失败信息,以及失败异常对象
code 默认值 0 时不具有具体业务含义, msg 与 throwable 可以反映具体的错误信息
- 注意:请保证收到初始化成功的回调后再调用登录接口以及其他接口
- 注意:务必要在 exitListener 中实现游戏直接退出的代码
获取 MissEvanSdk 对象后,可以调用其中接口。每个接口方法的参数中都包含 CallbackListener 类型的监听器,用户需实现其中的3个方法:onSuccess、onFailed 和 onError。当调用执行完毕返回结果时,会根据返回状态的不同执行其中相应的方法。
代码示例
MissEvanSdk.getInstance().login(new CallbackListener(){
@Override
public void onSuccess(Bundle success){
// 此处为操作成功时执行,返回值通过 Bundle 传回
LogUtils.d("onSuccess");
String uid=success.getString("uid");
}
@Override
public void onFailed(MissEvanSdkError failed){
// 此处为操作失败时执行,返回值为 MissEvanSdkError 类型变量,其中包含 ErrorCode 和 ErrorMessage
LogUtils.d("MainActivity onFailed\nErrorCode : " + failed.getErrorCode() + "\nErrorMessage : " + failed.getErrorMessage());
}
@Override
public void onError(MissEvanSdkError error){
// 此处为操作异常时执行,返回值为 MissEvanSdkError 类型变量,其中包含 ErrorCode 和 ErrorMessage
LogUtils.d("onError\nErrorCode : " + error.getErrorCode() + "\nErrorMessage : " + error.getErrorMessage());
}
});
接入前,建议运行 Demo apk,从而全面了解我方 SDK,接入的具体详情可以参考 Demo Project
login(CallbackListener listener);
调用该方法,会打开猫耳游戏用户登录界面,引导用户输入用户名、密码完成登录过程,登录成功后弹出欢迎弹窗,可以切换用户,需确保每次进入游戏前都调用。
注意:停服相关公告接口会在登录之前调用,停服维护期间不要调用 SDK 登录接口(若游戏有多个区服,停服维护的区服不可调用SDK接口,其他正常区服可调用)
参数:
参数名称 | 参数说明 |
---|---|
listener | CallbackListener 回调监听 |
返回结果: (1) 成功时执行 onSuccess() 方法,返回 Bundle 类型变量,其中包含键和值为:
key | 含义 | 类型 | 样例 |
---|---|---|---|
uid | 用户 id | String | 10001 |
username | 用户名 | String | gameUserName |
nickname | 用户名昵称 | String | gameNickName |
access_token | 访问令牌 | String | fdae8922a3b3d06a4e40882ac9f37a7e |
expire_times | 会话过期时间 | long | 1389262844 |
refresh_token | 刷新令牌 | String | 0d5ddfa364d51359e6243892bf0a965c |
(2) 失败时执行 onFailed() 方法,返回 MissEvanSdkError 类型变量,MissEvanSdkError 类中包含 errorCode 和 errorMessage 字段
(3) 错误时执行 onError() 方法,返回 MissEvanSdkError 类型变量,MissEvanSdkError 类中包含 errorCode 和 errorMessage 字段
notifyZone(String server_id,String server_name,String role_id,String role_name,CallbackListener listener)
调用该方法来设置用户当前信息,用于支付校验
参数:
参数名称 | 参数说明 |
---|---|
server_id | 分配给研发的区服 id |
server_name | 分配给研发的区服名称 |
role_id | 用户在游戏内角色 id(游戏自己的) |
role_name | 用户在游戏内角色名称(游戏自己的) |
listener | CallbackListener 回调监听 |
返回结果: (1) 通知区服成功时执行 onSuccess() 方法,返回 Bundle 类型变量,其中包含键和值为:
key | 含义 | 类型 | 样例 |
---|---|---|---|
tips | 通知区服提示内容 | String | 通知区服成功 |
(2) 失败时执行 onFailed() 方法,返回 MissEvanSdkError 类型变量,MissEvanSdkError 类中包含 errorCode 和 errorMessage 字段
(3) 错误时执行 onError() 方法,返回 MissEvanSdkError 类型变量,MissEvanSdkError 类中包含 errorCode 和 errorMessage 字段
注意: 请在用户登录并选择角色以及服务器后调用,否则无法通过审核
createRole(String server_id,String server_name,String role_id,String role_name)
这个方法需要在用户创建角色成功时调用
参数:
参数名称 | 参数说明 |
---|---|
server_id | 分配给研发的区服 id |
server_name | 分配给研发的区服名称 |
role_id | 用户在游戏内角色 id(游戏自己的) |
role_name | 用户在游戏内角色名称(游戏自己的) |
pay(
String uid,
int game_money,
String subject,
String body,
String out_trade_no,
int total_fee,
String role_id,
String role_name,
String extension_info,
String notify_url,
String order_sign,
OrderCallbackListener listener
)
调用该方法,会打开平台支付页面,引导用户完成支付交易过程
支付之前请确认调用过 notifyZone 接口来设置当前区服信息,无需每次支付前都调用。PS:该支付结果仅作为参考,真实结果请以服务器结果为准
参数:
参数名称 | 参数说明 |
---|---|
uid | 猫耳平台用户的唯一标识 |
game_money | 游戏内货币,即本次交易购买的游戏内货币 |
subject | 商品名称,如:金币(由于支付宝不支持特殊字符 % &,所以参数中不能包含 % &) |
body | 商品简单描述(参数中不能包含 % &) |
out_trade_no | 商户订单号,2~32 位字符,用于对账用 |
total_fee | 本次交易金额,单位:分(注意,total_fee的值必须为整数,并且在1~100000之间) |
role_id | 用户在游戏内角色 id(游戏自己的) |
role_name | 用户在游戏内角色名称(游戏自己的) |
extension_info | 支付接口的额外参数(请不要传入 emoji 等特殊字符),会在服务器异步回调中原样传回 |
notify_url | 异步通知地址,为空时,使用正式支付回调地址进行支付回调,否则使用该地址进行支付回调,本字段用于游戏线下测试时支付异步通知地址,游戏包上线前请将此字段设置为空("") |
order_sign | 订单参数签名,请在服务端完成订单参数签名(参考服务端文档) |
listener | CallbackListener 回调监听 |
注意:为了保护游戏充值的安全性,此部分的签名操作一定要放在游戏服务端完成,否则暴露出游戏服务端secertkey会有很大风险。
返回结果: (1) 成功时执行 onSuccess() 方法,返回 String 类型变量 out_trade_no,bs_trade_no(我方的订单号)
(2) 失败时执行 onFailed() 方法,返回 String 类型变量 out_trade_no 以及 MissEvanSdkError 类型变量,MissEvanSdkError 类中包含 errorCode 和 errorMessage 字段
- 错误码:7005。返回此异常的场景为,当 CP 进行支付时传入的 uid 与 SDK 本地存储的 uid 不同时 SDK 会返回 7005 的 errorCode
- 错误码:7004。返回此异常的场景为,新版微信支付过程中 SDK 通知发货失败,此时会返回 7004 的 error missevan sever 查单接口,也可以等待 missevan server 异步通知
- 错误码:-5。订单签名异常
(3) 错误时执行 onError() 方法,返回 MissEvanSdkError 类型变量,MissEvanSdkError 类中包含 errorCode 和 errorMessage 字段
gameSdk.setAccountListener(new AccountCallBackListener() {
@Override
public void onAccountInvalid(){
// TODO 其他登出操作
makeToast("账号已登出");
}
});
此接口会在用户登录失效时调用,请在收到监听时进行相关登出操作,回到游戏登录界面
getUserInfo(CallbackListener listener)
调用该方法,如果用户已经登录且没有超时,则返回用户相关信息
参数:
参数名称 | 参数说明 |
---|---|
listener | CallbackListener 回调监听 |
返回结果: (1) 成功时执行 onSuccess() 方法,返回 Bundle 类型变量,其中包含键和值为:
key | 含义 | 类型 | 样例 |
---|---|---|---|
uid | 用户 id | String | 10001 |
username | 用户名 | String | gameUserName |
nickname | 用户名昵称 | String | gameNickName |
access_token | 访问令牌 | String | fdae8922a3b3d06a4e40882ac9f37a7e |
expire_times | 会话过期时间 | long | 1389262844 |
refresh_token | 刷新令牌 | String | 0d5ddfa364d51359e6243892bf0a965c |
(2) 失败时执行 onFailed() 方法,返回 MissEvanSdkError 类型变量,MissEvanSdkError 类中包含 errorCode 和 errorMessage 字段
(3) 错误时执行 onError() 方法,返回 MissEvanSdkError 类型变量,MissEvanSdkError 类中包含 errorCode 和 errorMessage 字段
isLogin(CallbackListener listener)
调用该方法,会返回用户是否登录
参数:
参数名称 | 参数说明 |
---|---|
listener | CallbackListener 回调监听 |
返回结果: (1) 成功时执行 onSuccess() 方法,返回 Bundle 类型变量,其中包含键和值为:
key | 含义 | 类型 | 样例 |
---|---|---|---|
is_login | 是否登录 | boolean | false |
(2) 失败时执行 onFailed() 方法,返回 MissEvanSdkError 类型变量,MissEvanSdkError 类中包含 errorCode 和 errorMessage 字段
(3) 错误时执行 onError() 方法,返回 MissEvanSdkError 类型变量,MissEvanSdkError 类中包含 errorCode 和 errorMessage 字段
logout(CallbackListener listener)
调用该方法,会返回用户是否登出成功。让玩家退出当前的账号信息
参数:
参数名称 | 参数说明 |
---|---|
listener | CallbackListener 回调监听 |
返回结果: (1) 成功时执行 onSuccess() 方法,返回 Bundle 类型变量,其中包含键和值为:
key | 含义 | 类型 | 样例 |
---|---|---|---|
tips | 提示 | String | 注销成功 |
(2) 失败时执行 onFailed() 方法,返回 MissEvanSdkError 类型变量,MissEvanSdkError 类中包含 errorCode 和 errorMessage 字段
(3) 错误时执行 onError() 方法,返回 MissEvanSdkError 类型变量,MissEvanSdkError 类中包含 errorCode 和 errorMessage 字段
exit(ExitCallbackListener exitListener)
调用该方法,会回调研发退出接口方法
参数:
参数名称 | 参数说明 |
---|---|
exitListener | ExitCallbackListener 回调监听 |
exitListener:需在该接口的 onExit 方法中释放资源,关闭游戏
返回结果:
调用该接口,弹出 SDK 退出框
isRealNameAuth(CallbackListener listener)
调用该方法,会返回用户是否实名认证
参数:
参数名称 | 参数说明 |
---|---|
listener | CallbackListener 回调监听 |
返回结果: (1) 成功时执行 onSuccess() 方法,返回 Bundle 类型变量,其中包含键和值为:
key | 含义 | 类型 | 样例 |
---|---|---|---|
is_realname_auth | 是否实名认证 | boolean | false |
(2) 失败时执行 onFailed() 方法,返回 MissEvanSdkError 类型变量,MissEvanSdkError 类中包含 errorCode 和 errorMessage 字段
(3) 错误时执行 onError() 方法,返回 MissEvanSdkError 类型变量,MissEvanSdkError 类中包含 errorCode 和 errorMessage 字段
参数名称 | 参数说明 | 类型 | 样例 |
---|---|---|---|
result | 结果状态 | int | -1 |
uid | 用户 id | String | 10001 |
username | 用户名 | String | gameUserName |
nickname | 用户名昵称 | String | gameNickName |
access_token | 访问令牌 | String | fdae8922a3b3d06a4e40882ac9f37a7e |
expire_times | 会话过期时间 | long | 1389262844 |
refresh_token | 刷新令牌 | String | 0d5ddfa364d51359e6243892bf0a965c |
bs_trade_no | 我方订单号 | String | 20140101012348888 |
out_trade_no | CP 商户订单号 | String | 20140101012345678 |
is_login | 登录状态 | boolean | false |
状态代码(result) | 参数说明 |
---|---|
1 | 操作成功 |
-1 | 操作失败 |
错误代码(errorCode) | 错误描述(errorMessage) |
---|---|
1000 | 支付失败 |
1001 | 用户取消交易 |
2001 | 服务器返回数据异常 |
2002 | 网络未连接 |
3001 | 注销失败 |
3002 | 未登录或者登录已过期 |
5701 | 支付宝交易失败 |
5702 | 微信支付失败 |
6001 | 用户取消注册 |
6002 | 用户取消登录 |
7003 | 请检查是否安装新版微信客户端 |
7004 | 查单失败 |
7005 | uid 不统一,支付失败 |
8001 | 支付前请先调用 nofiyZone 方法通知区服,并确保与支付参数相符 |
91001 | 关闭登录 |
200003 | 需要进行实名认证 |
200004 | 非法交易金额 |
500027 | 支付额度限制 |
- 目前 demo 切换 API 环境需要先初始化 SDK 后再进行修改 BaseUrl,会出现多调用一次生产环境的接口的情况,可忽略,后续版本修复。