概述
接入心德
游戏接入是比较费时间的,也行少些一个字母或多了一个字母,有时候都有可能需要重做,所以一定不要怕麻烦,多余渠道方的技术交流。
本文描述
本文是按照uc6.1.0sdk的文档进行接入的,具体的细节,和步骤,还要根据自己公司的接入框架进行接入,本文只是按照我自己公司的接入框架和个人习惯方式来接入的,仅提供参考作用。
UC 6.1.0-sdk目录
uc的接入方式分为两种:
- android原生代码接入
- 通过u3d引擎接入
本文讲述的是android原生接入的
注意:我用的是eclipse接入的,因为给的android studio demo导入as中有问题,应该是渠道方配置了什么东西, 所以把类全部拷贝到ec中,看着布局,根据点击事件把方法抽出来了。
u3d准备工作
这里只说了游戏工程都有对应的渠道文件,主要是用与我们抽取的接口进行交互的
注:其实这部份是不归我们写的,这些工作是属于前端的。前端忙所以自己比着葫芦画瓢写了
打包方式
这次的打包方式跟以往不同,以往都是通过untiy里的脚本进行一键打包,这次是吧游戏项目以andorid的形式导出来,进行接入的。倒出来以后就跟正常开发app一样了
与play800(爱玩堂)的打包方式一样的:http://blog.csdn.net/qq_34501274/article/details/53404307
sdk初始化
android:
//广播 对登录 支付 退出 登出 角色提交 函数的事件的回调处理等等
SDKEventReceiver receiver = new SDKEventReceiver() {
@Subscribe(event = SDKEventKey.ON_INIT_SUCC)
private void onInitSucc() {
// 初始化成功
}
@Subscribe(event = SDKEventKey.ON_INIT_FAILED)
private void onInitFailed(String data) {
// 初始化失败
Log.e("init失败", "111111111111111111111");
}
@Subscribe(event = SDKEventKey.ON_LOGIN_SUCC)
private void onLoginSucc(String sid) {
Log.e("登录成功", "111111111111111111111");
/**
* 当登录成功时SDKEventKey.ON_LOGIN_SUCC事件被触发,
* 同时通过带回登录sid给游戏,sid为用户的登录会话标识, 用于给游戏服务器校验用户登录状态使用。
* */
//这里向u3d发送数据
UnityPlayer.UnitySendMessage("Main Camera", "LoginResult", sid);
}
@Subscribe(event = SDKEventKey.ON_LOGIN_FAILED)
private void onLoginFailed(String desc) {
Log.e("登录失败", "111111111111111111111");
}
@Subscribe(event = SDKEventKey.ON_LOGOUT_SUCC)
private void onLogoutSucc() {
Log.e("登出成功", "111111111111111111111");
AccountInfo.instance().setSid("");
Login();
}
@Subscribe(event = SDKEventKey.ON_LOGOUT_FAILED)
private void onLogoutFailed() {
Log.e("登出失败", "111111111111111111111");
}
@Subscribe(event = SDKEventKey.ON_EXIT_SUCC)
private void onExit(String desc) {
UnityPlayerNativeActivity.this.finish();
// // 退出程序
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
android.os.Process.killProcess(android.os.Process.myPid());
}
@Subscribe(event = SDKEventKey.ON_EXIT_CANCELED)
private void onExitCanceled(String desc) {
// Toast.makeText(GameActivity.this, desc+"退出失败",
// Toast.LENGTH_SHORT).show();
}
@Subscribe(event = SDKEventKey.ON_CREATE_ORDER_SUCC)
private void onCreateOrderSucc(OrderInfo orderInfo) {
Log.e("支付成功", "pay succ");
}
@Subscribe(event = SDKEventKey.ON_PAY_USER_EXIT)
private void onPayUserExit(OrderInfo orderInfo) {
Log.e("支付失败", "pay fail");
}
};
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
/**
*
* 初始化
*/
initSDK();
/**
*这里的广播是对所有方法事件的回调处理
*/
UCGameSdk.defaultSdk().registeSDKEventReceiver(receiver);
//初始化接口
//根据渠道的不同 即使u3d调取了初始化sdk的方法,也需要 在onCreat方法里在掉一次
public void initSDK() {
GameParamInfo gameParamInfo = new GameParamInfo();
gameParamInfo.setEnablePayHistory(true);// 开启查询充值历史功能
gameParamInfo.setEnableUserChange(true);// 开启账号切换功能
gameParamInfo.setCpId(UCSdkConfig.cpId);
gameParamInfo.setGameId(UCSdkConfig.gameId);
gameParamInfo.setServerId(UCSdkConfig.serverId);
gameParamInfo.setOrientation(UCOrientation.LANDSCAPE);
SDKParams sdkParams = new SDKParams();
sdkParams.put(SDKParamKey.GAME_PARAMS, gameParamInfo);
// FIXME always debug
sdkParams.put(SDKParamKey.DEBUG_MODE, UCSdkConfig.debugMode);
try {
UCGameSdk.defaultSdk().initSdk(this, sdkParams);
Log.e("initSdk", "1------------");
} catch (AliLackActivityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.e("initSdk", "2------------");
}
u3d:
public class uc1GameSdk
{
public static void init()
{
Debug.Log("##--Start init--##");
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
{
jo.Call("initSDK");
}
}
登录
android
/**
* 登录
* */
public void Login() {
ucSdkLogin();
}
public void ucSdkLogin() {
try {
UCGameSdk.defaultSdk().login(this, null);
} catch (AliLackActivityException e) {
e.printStackTrace();
} catch (AliNotInitException e) {
e.printStackTrace();
}
}
u3d
public static void login()
{
Debug.Log("##--Start login--##");
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
{
jo.Call("Login");
}
}
}
支付
android
public void pay(String sign, String signType, String accountId,
String cpOrderId, String notifyUrl, String amount) {
// callSdkApi ("pay", amount, serverId, roleId, roleName, grade,
// customInfo, notifyUrl, transactionNumCP);
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put(SDKParamKey.SIGN, sign);// 必须
paramMap.put(SDKParamKey.SIGN_TYPE, signType);// 必须
paramMap.put(SDKParamKey.ACCOUNT_ID, accountId);// 必须:用户id,充值用户的统一账号ID,由阿里游戏平台生成。
paramMap.put(SDKParamKey.CP_ORDER_ID, cpOrderId);// 订单号
paramMap.put(SDKParamKey.NOTIFY_URL, notifyUrl);// 服务器通知地址,如果为空以服务端配置地址作为通知地址,长度不超过100
paramMap.put(SDKParamKey.AMOUNT, amount);// 价格 必须
// paramMap.put(SDKParamKey.CALLBACK_INFO, customInfo);//
// cp自定义信息,在支付结果通知时回传,CP可以自己定义格式,长度不超过250
SDKParams sdkParams = new SDKParams();
Map<String, Object> map = new HashMap<String, Object>();
map.putAll(paramMap);
sdkParams.putAll(map);
try {
UCGameSdk.defaultSdk().pay(this, sdkParams);
} catch (Exception e) {
e.printStackTrace();
// addOutputResult("charge failed - Exception: " + e.toString() +
// "\n");
}
}
u3d
注:因为根据uc文档来看,支付牵扯到二次请求所以这里在点击商品后和打开sdk的支付界面之间加入了一个post请求,先向服务器下订单,根据服务器返回的数据,在调出sdk支付界面。这样安全性更高点
public static void pay(RechargeConfig config)
{
//用户在我们服务器上的id
//角色id
//服务器id
//用价格
//角色名称
//商品Id
//uc帐号Id
//设备号
long str = PlayerData.curCharacter.id;
// payload["goods"] = config.id;
//向服务器发送生成订单请求
WWWForm form = new WWWForm();
form.AddField("uid", PlayerData.cid.ToString());
form.AddField("charId", str.ToString());
form.AddField("serverId", PlayerData.curServer.id.ToString());
form.AddField("amount", config.price + ".00");
form.AddField("charName", PlayerData.curCharacter.Name.ToString());
form.AddField("goods",config.id.ToString());
form.AddField("accountId", ChannelConstant.accountid.ToString());
form.AddField("device", ChannelConstant.device.ToString());
string api = "支付回调地址";
//www 是服务器返回的数据
ARPGNet.instance.HttpPost(ARPGApplication.instance.host + api, form, (www) =>
{
Debug.Log("##--HTTP POST请求--##");
if (www == null || !String.IsNullOrEmpty(www.error))
{
if (!String.IsNullOrEmpty(www.error))
{
Debuger.LogError(www.error);
}
return;
}
JsonObject result = SimpleJson.SimpleJson.DeserializeObject<JsonObject>(www.text);
Debug.Log("##--result服务器返回结果--##"+www.text);
if(result.ContainsKey("info") )
{
JsonObject info = (JsonObject)result["info"];
Debug.Log("##--result if--##"+info.ToString());
//游戏服务端生成的签名
//签名类型
//uc帐号id
//游戏的服务端订单号
//支付回调地址
//充值金额
string sign = Convert.ToString(info["sign"]);
string signType = Convert.ToString(info["signType"]);
string accountId = Convert.ToString(info["accountId"]);
string cpOrderId = Convert.ToString(info["cpOrderId"]);
string notifyUrl = Convert.ToString(info["notifyUrl"]);
string amount = Convert.ToString(info["amount"]);
Debug.Log("##--服务器返回订单信息--## " +
"sign--"+sign+
"signType--"+signType+
"accountid--"+accountId+
"cpOrderId--"+cpOrderId+
"notifyUrl--"+notifyUrl+
"amount--"+amount);
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
{
Debug.Log("##--uc1SDK pay--##");
jo.Call("pay", sign,signType,accountId,cpOrderId,notifyUrl,amount);
}
}
}
}, 7f, null);
}
本文就说这么多就够了,后面的切换帐号,退出游戏,角色提交,等等,都是大同小异的。游戏接入其实没有想象的那么难,只是比较繁琐而已。
本人描述能力有限,如有不足之处,欢迎留言指出!