最近国内做买量的游戏有点点多,顺便分享这几个渠道接入流程,还有要注意的一些坑,提供给同学们学习下!
一.联想SDK
官网:联想开放平台
接入SDK的版本号:V3.0.0
接口代码:
public class LenovoProxy {
private static final String TAG = LenovoProxy.class.getSimpleName();
private static LenovoProxy lenovoProxy = null;
private static final String SDK_VERSION = "3.0.0";
private static final String appId = "xxxxxx";
public static LenovoProxy getInstance() {
if (null == lenovoProxy) {
lenovoProxy = new LenovoProxy();
}
return lenovoProxy;
}
/**
* 初始化
*
* @param activity
*/
public void init(Activity activity) {
LenovoGameApi.doInit(activity, appId);
/**
* 防沉迷,默认不开启
* true 开启未成年时长限制,时长到期后,弹出限制弹窗,强制引导退出游戏。
* false 不开启未成年时长限制,时长到期后,不做任何处理
*/
LenovoGameApi.isLimitLoginTime(true);
}
/**
* 登录
*
* @param activity
*/
public void login(Activity activity) {
LenovoGameApi.doAutoLogin(activity, new IAuthResult() {
@Override
// 登录回调,处理登录结果
public void onFinished(boolean ret, String data) {
/**
* 返回值 ret:true 成功,false 失 败
* 返回值 data:登录 ST(token)
*/
if (ret) {
// 登录成功
String token = data;
/**
* 获取到渠道token
* 请求自己的服务端进行验证
*/
} else {
// 登录失败(失败原因开启飞行模式、 网络不通等)
}
}
});
}
/**
* 储值
*
* @param activity
* @param map 可改用其它数据模型进行传入
*/
public void pay(Activity activity, Map map) {
GamePayRequest payRequest = new GamePayRequest();
// 请填写商品自己的参数
payRequest.addParam("notifyurl", "");// 当前版本暂时不用,传空String
payRequest.addParam("appid", appId);
payRequest.addParam("waresid", "waresid");//商品id
payRequest.addParam("quantity", "quantity");//商品数量
/**
* 游戏方生成的订单号
* 请求自己服务端生成订单号,返回给客户端
* 由客户端传到渠道方法,拉起储值
*
* 如果没有服务端,那就客户端随机生成,如下
*/
payRequest.addParam("exorderno", "sample" + System.currentTimeMillis());
payRequest.addParam("price", "price");//商品价格
payRequest.addParam("cpprivateinfo", "123456");//附加信息,最大长度128
LenovoGameApi.doPay(activity, "", payRequest, new IPayResult() {
@Override
public void onPayResult(int resultCode, String signValue, String resultInfo) {// resultInfo =
// 应用编号&商品编号&外部订单号
if (LenovoGameApi.PAY_SUCCESS == resultCode) {
// 支付成功
Log.i(TAG, "sample:支付成功 ");
} else if (LenovoGameApi.PAY_CANCEL == resultCode) {
Log.i(TAG, "sample:取消支付 ");
// 取消支付处理,默认采用finish(),请根据需要修改
} else {
// 计费失败处理,默认采用finish(),请根据需要修改
Log.i(TAG, "sample:支付失败 ");
}
}
});
}
/**
* 查询实名认证
* CP 可以调用该接口获取当前登录用户实名认证的年龄;如用户未进行实名认证,
* 会先弹出实名认证的界面;如用户已认证,会返回年龄(age)可以通过年龄来判断用
* 户是否成年.
*
* @param activity
* @param token 渠道登录成功返回的ST
*/
public void registerRealName(Activity activity, String token) {
LenovoGameApi.doCheckRealAuth(activity, token, new OnAuthVerifyListener() {
@Override
public void onBackSuccess(boolean isAuthened, int age, String pi) {
if (isAuthened) {
//实名
if (age >= 18) {
//成年
}
} else {
//未实名
}
}
@Override
public void onBackFailed(int code, String message) {
}
});
}
/**
* 返回键
*
* @param activity
*/
public void onBackPressed(Activity activity) {
LenovoGameApi.doQuit(activity, new IAuthResult() {
@Override
public void onFinished(boolean result, String data) {
Log.i(TAG, "onFinished:" + data);
if (result) {
activity.finish();
System.exit(0);
} else {
// "用户点击底部返回键或点击弹窗close键"
}
}
});
}
}
联想的接入比较简单,到这结束。
二.雷电SDK
此处不包含闪屏代码,请同学自行处理。
接入SDK版本号:V2.4.4_5
接口代码:
public class ThunderProxy {
private static final String TAG = ThunderProxy.class.getSimpleName();
private static ThunderProxy thunderProxy = null;
private String mUid;
private static final String SDK_VERSION = "2.4.4_5";
//接入参数由雷电提供的
private static final String GAME_ID = "xxx"; //游戏ID
private static final String CHANNEL_ID = "xxx"; //渠道ID
private static final String SUN_CHANNEL_ID = "xxx"; //子渠道,分渠道
private static final String APP_SECRET_ID = "xxx"; //app密钥
public static ThunderProxy getInstance() {
if (null == thunderProxy) {
thunderProxy = new ThunderProxy();
}
return thunderProxy;
}
/**
* 初始化
*
* @param activity
*/
public void init(Activity activity) {
LdInfo info = new LdInfo();
info.gameId = GAME_ID;
info.channel = CHANNEL_ID;
info.sunChannel = SUN_CHANNEL_ID;
info.appSecret = APP_SECRET_ID;
/**
* 注意:gameId 、channel、sunChannel还需在AndroidManifests中配置,详见上方 配置信息
* appSecret 是我方提供的AppKey,需要和ServerKey区分开
*/
LdSdkManger.getInstance().init(activity, info, new InitCallBack() {
@Override
public void callback(int code, String desc) {
String result = "初始化返回--code: " + code + " ,desc: " + desc;
Toast.makeText(activity, result, Toast.LENGTH_SHORT).show();
switch (code) {
case 0:
//初始化成功
break;
case 1://初始化失败
default:
break;
}
}
});
}
public void login(Activity activity) {
/**
* 注意:
* 1、悬浮窗内部退出登录与游玩超时下线都是在此接口返回,code = 2 (需要厂商处理退出账号的逻辑)
* 2、注销账号功能,在此接口返回,code = 3 (需要厂商处理注销账号的逻辑)
* code:0.登录成功;1.登录失败;2.退出登录界面;3.注销游戏账号
*/
LdSdkManger.getInstance().showLoginView(activity, new LoginCallBack() {
@Override
public void callback(int code, String uid, String timestamp, String sign, String decs) {
/**
* code:0.登录成功;1.登录失败;2.退出登录界面;3.注销游戏账号
* uid:平台的用户 ID
* timestamp:时间戳
* sign:签名串(user_token)
* desc:描述
*/
mUid = uid;
switch (code) {
case 0:
/**
* 登录成功
* 获取uid,user_token等上传到服务器验证登录
*/
Log.i(TAG, "登录成功:" + code + " ;decs: " + decs);
break;
case 2:
//退出登录界面
Log.i(TAG, "登出成功:" + code + " ;decs: " + decs);
break;
case 3:
//注销游戏账号
Log.i(TAG, "注销游戏账号:" + code + " ;decs: " + decs);
break;
case 1:
default:
//登录失败
Log.i(TAG, "登录失败:" + code + " ;decs: " + decs);
break;
}
}
});
}
/**
* 退出游戏
*
* @param activity
*/
public void exitGame(final Activity activity) {
LdSdkManger.getInstance().showExitView(activity, new ExitCallBack() {
@Override
public void onFinish(int i, String s) {
//code 0.退出游戏;1.继续游戏;
if (i == 0) {
//销毁资源的方法
LdSdkManger.getInstance().DoRelease(activity);
Log.i(TAG, "确认退出应用");
} else if (i == 1) {
Log.i(TAG, "取消退出应用");
}
}
});
}
/**
* 储值
*
* @param activity
*/
public void pay(Activity activity) {
/**
* 注意:以下所有参数都不能为空,否则会支付失败,没有的参数用任意值代替
*/
LdPayInfo ldPayInfo = new LdPayInfo();
ldPayInfo.orderId = "12345"; //游戏的支付订单号
//支付金额(单位:分)
//注意:如果返回的Price包含小数点,必须要截取,否则支付失败
//例如:返回的是100.0,此时直接传入是支付失败;处理变成100,正常
ldPayInfo.amount = "1";//支付金额(单位:分)
ldPayInfo.productId = "12"; //定额的产品支付,暂时没用到,默认值
ldPayInfo.productDesc = "充值金币";//商品描述
ldPayInfo.productName = "金币";//商品名称
ldPayInfo.roleId = "10086";// 角色id
ldPayInfo.roleName = "张三";// 角色名字
ldPayInfo.serverId = "23";// 服务器id
ldPayInfo.serverName = "内测服";//服务器名字;
LdSdkManger.getInstance().showChargeView(activity, ldPayInfo, new PayCallback() {
@Override
public void callback(int code, String uid, String billno, String timestamp, String decs) {
/**
* code 0.支付成功;1.支付失败;2.取消支付,退出支付界面
* uid 平台的用户 ID
* billno 充值订单id
*/
switch (code) {
case 0:
//支付成功
Log.i(TAG, "支付成功");
break;
case 2://取消支付,退出支付界面
Log.i(TAG, "取消支付");
break;
case 1://支付失败
default:
Log.i(TAG, "支付失败");
break;
}
}
});
}
/**
* isForce 是否强制实名,true该弹窗在实名认证成功前不可关闭
*/
public void registerRealName() {
LdSdkManger.getInstance().verifyIdCard(true, new VerifyIdCardListener() {
@Override
public void callback(int code, String birthday, boolean isAdult) {
/**
* code; 0.不可用; 1.成功; 2.验证中; 3.验证不通过;
* birthday; 用户出生日期(19990909)
* isAdult; 是否成年
*/
switch (code) {
case 1:
if (isAdult) {
//成年
} else {
//未成年
}
break;
case 0:
case 2:
case 3:
default:
break;
}
}
});
}
/**
* 上传角色信息
*
* @param activity
*/
public void updateRoleInfo(Activity activity) {
LdGameInfo ldGameInfo = new LdGameInfo();
ldGameInfo.uid = mUid;
ldGameInfo.serverId = "23";// 服务器id
ldGameInfo.serverName = "内测服";//服务器名字
ldGameInfo.roleId = "10086";// 角色id
ldGameInfo.roleName = "张三";// 角色名字
ldGameInfo.roleType = ""; //角色类型,例如:战士,魔法师,弓箭手
ldGameInfo.level = "99"; //等级
ldGameInfo.money = "10000000000000"; //游戏的金币数
ldGameInfo.partyName = "工会";//公会
ldGameInfo.powerNum = 10000;//角色战斗力
ldGameInfo.vipLevel = 12;//VIP等级
LdSdkManger.getInstance().enterGame(activity, ldGameInfo, new EntryCallback() {
@Override
public void callback(int code, String desc) {
if (code == 0) {
//上传成功
}
}
});
}
/**
* 获取用户信息
*
* @param activity
* @return
*/
public LdUserInfo getUserInfo(Activity activity) {
/**
* uid; 用户id
* username; 用户账号
* password; 用户密码
* nickName; 用户昵称
* phoneNumber; 用户手机号码
* email; 用户邮箱
* realName; 用户实名认证姓名
* birthday; 用户实名认证出生日期(格式:20190101)
* isAuthenticated; 用户是否实名认证
*/
LdUserInfo ldUserInfo = LdSdkManger.getInstance().getUserInfo();
return ldUserInfo;
}
/**
* 浮窗
*
* @param activity
*/
public void onResume(Activity activity) {
LdSdkManger.getInstance().showFloatView(activity);
}
public void onPause(Activity activity) {
LdSdkManger.getInstance().hideFlowView(activity);
}
public void onDestroy(Activity activity) {
//释放SDK
LdSdkManger.getInstance().DoRelease(activity);
}
}
雷电SDK接入到此结束!
三.网易MUMU SDK
- 确保minSdkVersion要大于等于15;
- targetSdkVersion目前最高支持到26;
注意:
- SDK提供的三种闪屏方式,必须接入任意一种,否则后面的功能都无法使用。
- 使用非AndroidX
接口代码:
public class MuMuProxy {
private static final String TAG = MuMuProxy.class.getSimpleName();
private static MuMuProxy muMuProxy = null;
private static final String SDK_VERSION = "1.0.6";
private HubAction hubAction;
public static MuMuProxy getInstance() {
if (null == muMuProxy) {
muMuProxy = new MuMuProxy();
}
return muMuProxy;
}
/**
* 初始化
*
* @param activity
*/
public void init(Activity activity) {
hubAction = new HubAction() {
@Override
public void onInit(int i, String s) {
}
@Override
public void onSplash() {
}
@Override
public void onLogin(int code, String msg, UserInfo info) {
if (code == HubCode.OK) {
/**
* 登录成功
* info.getUid()
* info.getToken()
* 上传服务端验证
*/
} else {
//登录失败
}
}
@Override
public void onPay(int code, String msg, PayInfo info) {
// 请处理支付的结果
if (code == HubCode.OK) {
//支付成功
} else {
//支付失败
}
}
@Override
public void onLogout() {
// 请处理账户登出事件
// 注意:此接口触发条件为两种:
// 1.主动调用退出登录接口
// 2.菜单中点击切换账号。
// 切换账号导致的接口回调会重新触发登录操作
// 所以请不要再在此接口处调用SDK的退出操作
}
@Override
public void onQuit(boolean realQuit) {
// 请处理关闭游戏的逻辑
if (realQuit) {
//确认退出应用
} else {
//取消退出应用
}
}
};
Api.getInstance().register(hubAction);
Api.getInstance().splashCreate(activity);
}
/**
* 登录
*
* @param activity
*/
public void login(Activity activity) {
Api.getInstance().login(activity);
}
/**
* 登出
*
* @param activity
*/
public void logout(Activity activity) {
Api.getInstance().logout(activity);
}
/**
* 退出
*
* @param activity
*/
public void exitGame(Activity activity) {
Api.getInstance().quit(activity);
}
/**
* 储值
*
* @param activity
*/
public void pay(Activity activity) {
PayInfo info = new PayInfo();
//请求服务端创单 或者其它方式生成订单号
info.setGameOrderId("hub_test_" + System.currentTimeMillis());
info.setGoodsId("product_01");//商品id
info.setGoodsName("一堆钻石");//商品名称
info.setGoodsCount(1);//商品数量
/**
* 注意:以下3个价格参数均为同一参数
* 单位:分
*/
info.setGoodsPrice(1);
info.setOrderPrice(1);
info.setActualPrice(1);
info.setCurrency("CNY");//币种
//储值回调
info.setNotifyUrl("xxxxx");
try {
/**
* 需要出入更多的参数,可以按一下方式传入
*/
JSONObject reserveInfo = new JSONObject();
reserveInfo.put("key1", "value1");
reserveInfo.put("key2", "value2");
reserveInfo.put("key3", "value3");
info.setReserved(reserveInfo.toString());
} catch (Exception e) {/*ignore it*/}
Api.getInstance().pay(activity, info);
}
}
MUMU SDK接入到此结束!
四.游戏饭(长尾)SDK
注意事项:
- 健康游戏忠告(8句)
- SDK所有接口都必须调用且在主线程中调用
- apk的签名只能使用V1签名
接口代码:
public class YXFProxy {
private static final String TAG = YXFProxy.class.getSimpleName();
private static YXFProxy yxfProxy = null;
private static final String SDK_VERSION = "6.4";
private GameInfo gameInfo;
private ICallback callback;
private boolean isPaySuccess = false;
public static YXFProxy getInstance() {
if (null == yxfProxy) {
yxfProxy = new YXFProxy();
}
return yxfProxy;
}
public void init(Activity activity) {
callback = new ICallback() {
@Override
public void onError(int type, String message) {
switch (type) {
case ICallback.INIT:
//初始化失败
break;
case ICallback.LOGIN:
//登陆失败
break;
case ICallback.CREATE_ROLE:
//创建角色失败
break;
case ICallback.UPLOAD_GAME_INFO:
//更新角色信息失败
break;
case ICallback.PAY:
//支付失败
break;
case ICallback.PAY_FINISH:
/**
* 这是坑,记得好好踩
* 注意:支付弹窗点击外部消失 和 支付成功都会回调这个接口
* 默认回调成功,是否真正成功由原厂判断,提示语用比较婉转的文案
*/
if (!isPaySuccess) {
//取消支付
}
isPaySuccess = false;
break;
case ICallback.LOGOUT:
//登出失败
break;
case ICallback.EXIT:
//取消退出应用
break;
default:
Log.i(TAG, "onError type = " + type + " , message = " + message);
break;
}
}
@Override
public void logoutSuccess() {
//登出成功
}
@Override
public void paySuccess(String orderId) {
//支付成功
isPaySuccess = true;
}
@Override
public void initSuccess() {
//初始化成功
}
@Override
public void loginSuccess(UserInfoModel userInfoModel) {
//
/**
* 登陆验证 token的有效时间为2分钟
* 获取pid,userInfoModel.sessionId
* 进行登录验证
*/
String pid = userInfoModel.pid;
String sessionId = userInfoModel.sessionId;
}
@Override
public void setGameInfoSuccess(String loginTime) {
}
@Override
public void exitSuccess() {
// 推荐退出方法
Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.startActivity(startMain);
Process.killProcess(Process.myPid());
}
@Override
public void createRoleSuccess() {
}
};
YYReleaseSDK.getInstance().sdkInit(activity, callback);
}
public void login(Activity activity) {
YYReleaseSDK.getInstance().sdkLogin(activity, callback);
}
public void logout(Activity activity) {
YYReleaseSDK.getInstance().onSdkLogOut(activity, gameInfo, callback);
}
public void exitGame(Activity activity) {
YYReleaseSDK.getInstance().onSdkExit(activity, gameInfo, callback);
}
public void pay(Activity activity) {
//所有参数不能为空,否则报错
GamePayInfo payInfo = new GamePayInfo();
GameInfo gameInfo = getGameInfo();
//自定义参数
payInfo.setExtInfo("cusompay");
//支付金额(只支持定额支付,以分为单位,值不能 少于 100 分)
payInfo.setMoney("100");
//充值回调
payInfo.setNotifyUrl("xxxxx");
//订单号,请求服务端创单 或 其它方式创单
String orderId = "jh_" + System.currentTimeMillis();
payInfo.setCpOrderId(orderId);
//商品数量
payInfo.setProductCount(10);
//商品id
payInfo.setProductId("001");
//商品名称
payInfo.setProductName("钻石");
//秘钥,服务端生成返回
payInfo.setSign(sign);
YYReleaseSDK.getInstance().doPay(activity, gameInfo, payInfo, callback);
}
private GameInfo getGameInfo() {
/**
* 注意:这个渠道会分应用宝的包
* setZoneId 和setServerId 传的值应该相同
*/
String 区服ID = "123";
String 角色名称 = "哈哈哈";
gameInfo = new GameInfo();
gameInfo.setRoleId("111111");
gameInfo.setRoleLevel("11");
gameInfo.setRoleName(角色名称);
gameInfo.setZoneId(区服ID);
gameInfo.setServerId(区服ID);
gameInfo.setZoneName("big");
gameInfo.setVipLevel("1");
gameInfo.setRolePower("7465");
return gameInfo;
}
/**
* 创角
*
* @param activity
*/
public void createRole(Activity activity) {
YYReleaseSDK.getInstance().createRole(activity, gameInfo, callback);
}
/**
* 角色升级
*
* @param activity
*/
public void levelUpdate(Activity activity) {
YYReleaseSDK.getInstance().levelUpdate(activity, gameInfo);
}
/**
* 角色信息上报
*
* @param activity
*/
public void updateRoleInfo(Activity activity) {
getGameInfo();
YYReleaseSDK.getInstance().setGameInfo(activity, gameInfo, true, callback);
}
public void onCreate(Activity activity) {
YYReleaseSDK.getInstance().onCreate(activity);
}
public void onStart(Activity activity) {
YYReleaseSDK.getInstance().onSdkStart(activity);
}
public void onRestart(Activity activity) {
YYReleaseSDK.getInstance().onRestart(activity);
}
public void onResume(Activity activity) {
YYReleaseSDK.getInstance().onSdkResume(activity);
}
public void onPause(Activity activity) {
YYReleaseSDK.getInstance().onSdkPause(activity);
}
public void onStop(Activity activity) {
YYReleaseSDK.getInstance().onSdkStop(activity);
}
public void onDestroy(Activity activity) {
YYReleaseSDK.getInstance().onSdkDestory(activity);
}
public void onNewIntent(Intent intent) {
YYReleaseSDK.getInstance().onNewIntent(intent);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
//必须接入
YYReleaseSDK.getInstance().onActivityResult(requestCode, resultCode, data);
}
}
游戏饭(长尾) SDK接入到此结束!
所有demo下载:demo下载地址
如无法下载,可私信获取。