官方文檔及SDK的下載地址為:http://dev.#/wiki/index/id/73
在接入之前,需先在360后臺(tái)創(chuàng)建游戲,獲取一些接入?yún)?shù)。
客戶端所需要參數(shù)包括:APPID、APPKEY、PRIVATEKEY 三個(gè)值填寫在 AndroidManifest 文件中,不能使用@string 引用;禁止把 AppSecret 保存在手機(jī)客戶端,AndroidManifest 中存放的是 Private Key,而非 App-Secret。
Private Key 的算法為:QHOPENSDK_PRIVATEKEY = MD5(appSecret + "#" + appKey),格式為 32 位小寫。
準(zhǔn)備工作做為,正式開始接入,首先肯定是把所需要的資源如JAR包之類的復(fù)制到我的工程中去。
我這邊的接入環(huán)境是Eclipse
打開我們下載好解壓出來的文檔目錄找到所需要依賴的JAR包
紅框所示就是我們Eclipse所需要的資源文件了。
把a(bǔ)ssets內(nèi)的文件復(fù)制到我們自己工程中的assets目錄內(nèi)。
把libs內(nèi)的文件復(fù)制到我們自己工程中的libs目錄內(nèi)。
下圖中紅框內(nèi)的文件夾按自己所需要復(fù)制
至于demo工程如何創(chuàng)建在上一篇的接入文檔中有詳細(xì)教程,請至:
http://www.cnblogs.com/laohaizei/p/6724250.html
復(fù)制完成之后,我們的demo目錄應(yīng)該是多了這些目錄
至此,我們已經(jīng)把所有需要的東西都復(fù)制到了我們的demo工程中。
首先我們打開我們工程的AndroidManifest.xml文件。
然后復(fù)制以下代碼
<?xml version="1.0" encoding="utf-8"?>
以上是需要添加在AndroidManifest.xml中的。(@xxx@部分請注意替換修改,具體有:@app_key@、@private_key@、@app_id@、@wx_app_id@)
然后到我們demo工程的AndroidManifest.xml全選替換粘貼
這樣AndroidManifest.xml修改好了。
做完以上步驟,接下來,我們開始接入SDK的接口。
首先打開我們的MainActivity.java
打開的MainActivity.java應(yīng)該是這個(gè)樣子的
然后把下面的代碼復(fù)制進(jìn)去,注意別把第一行的代碼覆蓋了。
import java.util.HashMap;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import com.qihoo.gamecenter.sdk.activity.ContainerActivity;
import com.qihoo.gamecenter.sdk.common.IDispatcherCallback;
import com.qihoo.gamecenter.sdk.matrix.Matrix;
import com.qihoo.gamecenter.sdk.protocols.CPCallBackMgr.MatrixCallBack;
import com.qihoo.gamecenter.sdk.protocols.ProtocolConfigs;
import com.qihoo.gamecenter.sdk.protocols.ProtocolKeys;
public class MainActivity extends Activity {
final static String TAG = "demo";
boolean isInit = false;
Activity appActivity = MainActivity.this;
Context appContext = this;
public boolean isLoginFinished = false;
public boolean isInitFinished = false;
private boolean mIsInOffline = false;
private boolean isLandScape = true;
private boolean isShowClose = false; // 是否顯示關(guān)閉按鈕
private boolean isSupportOffline = false; // 可選參數(shù),是否支持離線模式,默認(rèn)值為false
private boolean isShowSwitchButton = true; // 可選參數(shù),是否在自動(dòng)登錄的過程中顯示切換賬號按鈕
private boolean isHideWellcome = false; // 可選參數(shù),是否隱藏歡迎界面
private boolean isShowDlgOnFailedAutoLogin = true; // 可選參數(shù),靜默自動(dòng)登錄失敗后是否顯示登錄窗口,默認(rèn)不顯示
private boolean isAutoLoginHideUI = false; // 可選參數(shù),自動(dòng)登錄過程中是否不展示任何UI,默認(rèn)展示。
private boolean isDebugSocialShare = true; // 測試參數(shù),發(fā)布時(shí)要去掉
protected String mAccessToken = null;
// private ProgressDialog mProgress;
// AccessToken是否有效
protected static boolean isAccessTokenValid = true;
// QT是否有效
protected static boolean isQTValid = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
Matrix.onPause(appActivity);
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
Matrix.onRestart(appActivity);
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Matrix.onResume(appActivity);
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Matrix.onStart(appActivity);
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Matrix.onStop(appActivity);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Matrix.destroy(this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
Matrix.onActivityResult(appActivity, requestCode, resultCode, data);
}
@Override
protected void onNewIntent(Intent intent) {
// TODO Auto-generated method stub
super.onNewIntent(intent);
Matrix.onNewIntent(appActivity, intent);
}
private void init() {
// TODO Auto-generated method stub
MatrixCallBack mSDKCallback = new MatrixCallBack() {
@Override
public void execute(Context context, int functionCode,
String functionParams) {
// TODO Auto-generated method stub
if (functionCode == ProtocolConfigs.FUNC_CODE_SWITCH_ACCOUNT) {
// 調(diào)用 sdk 的切換帳號接口
doSdkSwitchAccount(getLandscape(context));
} else if (functionCode == ProtocolConfigs.FUNC_CODE_INITSUCCESS) {
// 這里返回成功之后才能調(diào)用 SDK 其它接口 TypeSDKLogger.d(
// "initSDK success");
isInit = true;
}
}
};
// 調(diào)用其他SDK接口之前必須先調(diào)用init
Matrix.init(appActivity, mSDKCallback);
}
protected boolean getLandscape(Context context) {
if (context == null) {
return false;
}
boolean landscape = (context.getResources().getConfiguration().orientation
== Configuration.ORIENTATION_LANDSCAPE);
return landscape;
}
/
使用360SDK的切換賬號接口
@param isLandScape
是否橫屏顯示登錄界面
/
protected void doSdkSwitchAccount(boolean isLandScape) {
Intent intent = getSwitchAccountIntent(isLandScape);
IDispatcherCallback callback = mAccountSwitchCallback;
if (isSupportOffline) {
callback = mAccountSwitchSupportOfflineCB;
}
Matrix.invokeActivity(appActivity, intent, callback);
}
/
生成調(diào)用360SDK切換賬號接口的Intent
@param isLandScape
是否橫屏
@param isBgTransparent
是否背景透明
@param clientId
即AppKey
@return Intent
/
private Intent getSwitchAccountIntent(boolean isLandScape) {
Intent intent = new Intent(appActivity, ContainerActivity.class);
// 界面相關(guān)參數(shù),360SDK界面是否以橫屏顯示。
intent.putExtra(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE,
isLandScape);
// 必需參數(shù),使用360SDK的切換賬號模塊。
intent.putExtra(ProtocolKeys.FUNCTION_CODE,
ProtocolConfigs.FUNC_CODE_SWITCH_ACCOUNT);
// 是否顯示關(guān)閉按鈕
intent.putExtra(ProtocolKeys.IS_LOGIN_SHOW_CLOSE_ICON, isShowClose);
// 可選參數(shù),是否支持離線模式,默認(rèn)值為false
intent.putExtra(ProtocolKeys.IS_SUPPORT_OFFLINE, isSupportOffline);
// 可選參數(shù),是否在自動(dòng)登錄的過程中顯示切換賬號按鈕
intent.putExtra(ProtocolKeys.IS_SHOW_AUTOLOGIN_SWITCH,
isShowSwitchButton);
// 可選參數(shù),是否隱藏歡迎界面
intent.putExtra(ProtocolKeys.IS_HIDE_WELLCOME, isHideWellcome);
// 可選參數(shù),登錄界面的背景圖片路徑,必須是本地圖片路徑
// intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTRUE,
// getUiBackgroundPicPath());
// 可選參數(shù),指定assets中的圖片路徑,作為背景圖
// intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTURE_IN_ASSERTS,
// getUiBackgroundPathInAssets());
// -- 以下參數(shù)僅僅針對自動(dòng)登錄過程的控制
// 可選參數(shù),自動(dòng)登錄過程中是否不展示任何UI,默認(rèn)展示。
intent.putExtra(ProtocolKeys.IS_AUTOLOGIN_NOUI, isAutoLoginHideUI);
// 可選參數(shù),靜默自動(dòng)登錄失敗后是否顯示登錄窗口,默認(rèn)不顯示
intent.putExtra(ProtocolKeys.IS_SHOW_LOGINDLG_ONFAILED_AUTOLOGIN,
isShowDlgOnFailedAutoLogin);
// 測試參數(shù),發(fā)布時(shí)要去掉
intent.putExtra(ProtocolKeys.IS_SOCIAL_SHARE_DEBUG, isDebugSocialShare);
return intent;
}
// 切換賬號的回調(diào)
private IDispatcherCallback mAccountSwitchCallback = new IDispatcherCallback() {
@Override
public void onFinished(String data) {
// press back
if (isCancelLogin(data)) {
return;
}
// 顯示一下登錄結(jié)果
// Toast.makeText(appActivity, data, Toast.LENGTH_LONG).show();
// TypeSDKLogger.d( "mAccountSwitchCallback, data is " + data);
// 解析User info
// QihooUserInfo info = parseUserInfoFromLoginResult(data);
// 解析access_token
mAccessToken = parseAccessTokenFromLoginResult(data);
}
};
// 支持離線模式的切換賬號的回調(diào)
private IDispatcherCallback mAccountSwitchSupportOfflineCB = new IDispatcherCallback() {
@Override
public void onFinished(String data) {
// press back
if (isCancelLogin(data)) {
return;
}
// 顯示一下登錄結(jié)果
// Toast.makeText(appActivity, data, Toast.LENGTH_LONG).show();
// TypeSDKLogger.d( "mAccountSwitchSupportOfflineCB, data is " + data);
// 解析User info
// 解析access_token
mAccessToken = parseAccessTokenFromLoginResult(data);
}
};
private void login() {
mIsInOffline = false;
Intent intent = getLoginIntent(isLandScape);
IDispatcherCallback callback = mLoginCallback;
if (isSupportOffline) {
callback = mLoginCallbackSupportOffline;
}
Matrix.execute(appActivity, intent, callback);
}
/
生成調(diào)用360SDK登錄接口的Intent
@param isLandScape
是否橫屏
@return intent
/
private Intent getLoginIntent(boolean isLandScape) {
Intent intent = new Intent(appActivity, ContainerActivity.class);
// 界面相關(guān)參數(shù),360SDK界面是否以橫屏顯示。
intent.putExtra(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE,
isLandScape);
// 必需參數(shù),使用360SDK的登錄模塊。
intent.putExtra(ProtocolKeys.FUNCTION_CODE,
ProtocolConfigs.FUNC_CODE_LOGIN);
// 是否顯示關(guān)閉按鈕
intent.putExtra(ProtocolKeys.IS_LOGIN_SHOW_CLOSE_ICON, isShowClose);
// 可選參數(shù),是否支持離線模式,默認(rèn)值為false
intent.putExtra(ProtocolKeys.IS_SUPPORT_OFFLINE, isSupportOffline);
// 可選參數(shù),是否在自動(dòng)登錄的過程中顯示切換賬號按鈕
intent.putExtra(ProtocolKeys.IS_SHOW_AUTOLOGIN_SWITCH,
isShowSwitchButton);
// 可選參數(shù),是否隱藏歡迎界面
intent.putExtra(ProtocolKeys.IS_HIDE_WELLCOME, isHideWellcome);
// 可選參數(shù),登錄界面的背景圖片路徑,必須是本地圖片路徑
// intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTRUE,
// getUiBackgroundPicPath());
// 可選參數(shù),指定assets中的圖片路徑,作為背景圖
// intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTURE_IN_ASSERTS,
// getUiBackgroundPathInAssets());
// -- 以下參數(shù)僅僅針對自動(dòng)登錄過程的控制
// 可選參數(shù),自動(dòng)登錄過程中是否不展示任何UI,默認(rèn)展示。
intent.putExtra(ProtocolKeys.IS_AUTOLOGIN_NOUI, isAutoLoginHideUI);
// 可選參數(shù),靜默自動(dòng)登錄失敗后是否顯示登錄窗口,默認(rèn)不顯示
intent.putExtra(ProtocolKeys.IS_SHOW_LOGINDLG_ONFAILED_AUTOLOGIN,
isShowDlgOnFailedAutoLogin);
// 測試參數(shù),發(fā)布時(shí)要去掉
intent.putExtra(ProtocolKeys.IS_SOCIAL_SHARE_DEBUG, isDebugSocialShare);
return intent;
}
// 登錄、注冊的回調(diào)
private IDispatcherCallback mLoginCallback = new IDispatcherCallback() {
@Override
public void onFinished(String data) {
// press back
if (isCancelLogin(data)) {
// doSdkLogin(true);
return;
}
// 顯示一下登錄結(jié)果
Log.d(TAG, "login callback data:" + data);
mIsInOffline = false;
// 解析access_token
mAccessToken = parseAccessTokenFromLoginResult(data);
}
};
private IDispatcherCallback mLoginCallbackSupportOffline = new IDispatcherCallback() {
@Override
public void onFinished(String data) {
if (isCancelLogin(data)) {
return;
}
Log.d(TAG, "mLoginCallbackSupportOffline, data is " + data);
try {
JSONObject joRes = new JSONObject(data);
JSONObject joData = joRes.getJSONObject("data");
String mode = joData.optString("mode", "");
if (!TextUtils.isEmpty(mode) && mode.equals("offline")) {
// Toast.makeText(appActivity,
// "login success in offline mode",
// Toast.LENGTH_SHORT).show();
mIsInOffline = true;
// 顯示一下登錄結(jié)果
// Toast.makeText(appActivity, data,
// Toast.LENGTH_LONG).show();
//TypeSDKLogger.e( "token:" + mAccessToken);
// 登錄結(jié)果直接返回的userinfo中沒有qid,需要去應(yīng)用的服務(wù)器獲取用access_token獲取一下帶qid的用戶信息
//getUserInfo(mQihooUserInfo);
} else {
mLoginCallback.onFinished(data);
}
} catch (Exception e) {
Log.e(TAG, "mLoginCallbackSupportOffline exception", e);
}
}
};
private void pay() {
String price = "100";
// 支付基礎(chǔ)參數(shù)
QihooPayInfo payInfo = getQihooPay(
price,//_in_pay.GetData(AttName.REAL_PRICE)
"商品名",
"玩家名",
"玩家ID",
"服務(wù)器ID",
"訂單號",
"回調(diào)地址",
"360用戶ID");
Intent intent = getPayIntent(isLandScape, payInfo);
// 必需參數(shù),使用360SDK的支付模塊。
intent.putExtra(ProtocolKeys.FUNCTION_CODE,
ProtocolConfigs.FUNC_CODE_PAY);
// 啟動(dòng)接口
Matrix.invokeActivity(appActivity, intent, mPayCallback);
}
/
生成調(diào)用360SDK支付接口的Intent
@param isLandScape
@param pay
@return Intent
/
protected Intent getPayIntent(boolean isLandScape, QihooPayInfo pay) {
Bundle bundle = new Bundle();
// 界面相關(guān)參數(shù),360SDK界面是否以橫屏顯示。
bundle.putBoolean(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE,
isLandScape);
// 以下非界面相關(guān)參數(shù)
// 設(shè)置QihooPay中的參數(shù)。
// 必需參數(shù),用戶access token,要使用注意過期和刷新問題,最大64字符。
bundle.putString(ProtocolKeys.ACCESS_TOKEN, pay.getAccessToken());
// 必需參數(shù),360賬號id,整數(shù)。
bundle.putString(ProtocolKeys.QIHOO_USER_ID, pay.getQihooUserId());
// 必需參數(shù),所購買商品金額, 以分為單位。金額大于等于100分,360SDK運(yùn)行定額支付流程; 金額數(shù)為0,360SDK運(yùn)行不定額支付流程。
bundle.putString(ProtocolKeys.AMOUNT, pay.getMoneyAmount());
// 必需參數(shù),人民幣與游戲充值幣的默認(rèn)比例,例如2,代表1元人民幣可以兌換2個(gè)游戲幣,整數(shù)。
bundle.putString(ProtocolKeys.RATE, pay.getExchangeRate());
// 必需參數(shù),所購買商品名稱,應(yīng)用指定,建議中文,最大10個(gè)中文字。
bundle.putString(ProtocolKeys.PRODUCT_NAME, pay.getProductName());
// 必需參數(shù),購買商品的商品id,應(yīng)用指定,最大16字符。
bundle.putString(ProtocolKeys.PRODUCT_ID, pay.getProductId());
// 必需參數(shù),應(yīng)用方提供的支付結(jié)果通知uri,最大255字符。360服務(wù)器將把支付接口回調(diào)給該uri,具體協(xié)議請查看文檔中,支付結(jié)果通知接口–應(yīng)用服務(wù)器提供接口。
bundle.putString(ProtocolKeys.NOTIFY_URI, pay.getNotifyUri());
// 必需參數(shù),游戲或應(yīng)用名稱,最大16中文字。
bundle.putString(ProtocolKeys.APP_NAME, pay.getAppName());
// 必需參數(shù),應(yīng)用內(nèi)的用戶名,如游戲角色名。 若應(yīng)用內(nèi)綁定360賬號和應(yīng)用賬號,則可用360用戶名,最大16中文字。(充值不分區(qū)服,
// 充到統(tǒng)一的用戶賬戶,各區(qū)服角色均可使用)。
bundle.putString(ProtocolKeys.APP_USER_NAME, pay.getAppUserName());
// 必需參數(shù),應(yīng)用內(nèi)的用戶id。
// 若應(yīng)用內(nèi)綁定360賬號和應(yīng)用賬號,充值不分區(qū)服,充到統(tǒng)一的用戶賬戶,各區(qū)服角色均可使用,則可用360用戶ID最大32字符。
bundle.putString(ProtocolKeys.APP_USER_ID, pay.getAppUserId());
// 可選參數(shù),應(yīng)用擴(kuò)展信息1,原樣返回,最大255字符。
bundle.putString(ProtocolKeys.APP_EXT_1, pay.getAppExt1());
// 可選參數(shù),應(yīng)用擴(kuò)展信息2,原樣返回,最大255字符。
bundle.putString(ProtocolKeys.APP_EXT_2, pay.getAppExt2());
// 可選參數(shù),應(yīng)用訂單號,應(yīng)用內(nèi)必須唯一,最大32字符。
bundle.putString(ProtocolKeys.APP_ORDER_ID, pay.getAppOrderId());
// 必需參數(shù),使用360SDK的支付模塊。
bundle.putInt(ProtocolKeys.FUNCTION_CODE, ProtocolConfigs.FUNC_CODE_PAY);
Intent intent = new Intent(appActivity, ContainerActivity.class);
intent.putExtras(bundle);
return intent;
}
/
@param moneyAmount
金額數(shù),使用者可以自由設(shè)定數(shù)額。金額數(shù)為100的整數(shù)倍,360SDK運(yùn)行定額支付流程;
金額數(shù)為0,360SDK運(yùn)行不定額支付流程。
@return QihooPay
/
private QihooPayInfo getQihooPay(String moneyAmount, String itemName,
String userName, String roleId, String productId,
String billNumber, String pauBackUrl, String userId) {
// String qihooUserId = (mQihooUserInfo != null) ?
// mQihooUserInfo.getId() : null;
// 創(chuàng)建QihooPay
QihooPayInfo qihooPay = new QihooPayInfo();
qihooPay.setQihooUserId(userId);
qihooPay.setMoneyAmount(moneyAmount);
qihooPay.setAccessToken(mAccessToken);
qihooPay.setExchangeRate("1");
qihooPay.setProductName(itemName);
qihooPay.setProductId(productId);
qihooPay.setNotifyUri(pauBackUrl);
qihooPay.setAppName("123");
qihooPay.setAppUserName(userName);
qihooPay.setAppUserId(roleId);
// 可選參數(shù)
qihooPay.setAppExt1("ext1");
qihooPay.setAppExt2("ext2");
qihooPay.setAppOrderId(billNumber);
return qihooPay;
}
// 支付的回調(diào)
protected IDispatcherCallback mPayCallback = new IDispatcherCallback() {
@Override
public void onFinished(String data) {
Log.d(TAG, "mPayCallback, data is " + data);
if (TextUtils.isEmpty(data)) {
return;
}
boolean isCallbackParseOk = false;
JSONObject jsonRes;
try {
jsonRes = new JSONObject(data);
// error_code 狀態(tài)碼: 0 支付成功, -1 支付取消, 1 支付失敗, -2 支付進(jìn)行中,
// 4010201和4009911 登錄狀態(tài)已失效,引導(dǎo)用戶重新登錄
// error_msg 狀態(tài)描述
int errorCode = jsonRes.optInt("error_code");
isCallbackParseOk = true;
switch (errorCode) {
case 0:
Log.d(TAG, "支付結(jié)果回調(diào)成功");
break;
case 1:
Log.d(TAG, "支付失敗");
break;
case -1:
Log.d(TAG, "支付取消");
break;
case -2:
isAccessTokenValid = true;
isQTValid = true;
// String errorMsg = jsonRes.optString("error_msg");
// String text =
// appActivity.getString(R.string.pay_callback_toast,
// errorCode, errorMsg);
// Toast.makeText(appActivity, text,
// Toast.LENGTH_SHORT).show();
break;
case 4010201:
// acess_token失效
isAccessTokenValid = false;
// Toast.makeText(appActivity,
// R.string.access_token_invalid,
// Toast.LENGTH_SHORT).show();
break;
case 4009911:
// QT失效
isQTValid = false;
// Toast.makeText(appActivity, R.string.qt_invalid,
// Toast.LENGTH_SHORT).show();
break;
default:
break;
}
} catch (JSONException e) {
e.printStackTrace();
}
// 用于測試數(shù)據(jù)格式是否異常。
if (!isCallbackParseOk) {
// Toast.makeText(appActivity,
// appActivity.getResources().getString(R.string.data_format_error),
// Toast.LENGTH_LONG).show();
}
}
};
private void sendUserInfo(String type) {
HashMap eventParams=new HashMap();
//----------------------------參數(shù)設(shè)置說明--------------------
//以下列出的五項(xiàng)只是作為參考,請按照上述表格中的參數(shù)說明進(jìn)行補(bǔ)充添加
//僅按 demo 樣例上傳無法通過審核!請務(wù)必仔細(xì)閱讀上述表格!
eventParams.put("zoneid",1);//當(dāng)前角色所在游戲區(qū)服 id
eventParams.put("zonename","123");//當(dāng)前角色所在游戲區(qū)服名稱
eventParams.put("roleid","321");//當(dāng)前角色 id
eventParams.put("rolename","111");//當(dāng)前角色名稱
eventParams.put("professionid",0);
eventParams.put("profession","無");
eventParams.put("gender","無");
eventParams.put("professionroleid",0);
eventParams.put("professionrolena me","無");
eventParams.put("rolelevel","1");
eventParams.put("power",0);
eventParams.put("vip",0);
eventParams.put("balance",0);
eventParams.put("partyid",0);
eventParams.put("partyname","無");
eventParams.put("partyroleid",0);
eventParams.put("partyrolename","無");
eventParams.put("friendlist","無");
eventParams.put("ranking","無");
eventParams.put("type",type);//角色信息接口觸發(fā)的場景
//----------------------------------------------------------
Matrix.statEventInfo(appContext, eventParams);
}
private void logout() {
Intent intent = getLogoutIntent();
Matrix.execute(appActivity, intent, new IDispatcherCallback() {
@Override
public void onFinished(String data) {
Log.d(TAG, "logout_success");
// Toast.makeText(appActivity, data, Toast.LENGTH_SHORT).show();
// System.out.println(data);
}
});
}
private Intent getLogoutIntent() {
/
必須參數(shù): function_code : 必須參數(shù),表示調(diào)用SDK接口執(zhí)行的功能
/
Intent intent = new Intent();
intent.putExtra(ProtocolKeys.FUNCTION_CODE,
ProtocolConfigs.FUNC_CODE_LOGOUT);
return intent;
}
private void exit() {
Bundle bundle = new Bundle();
// 界面相關(guān)參數(shù),360SDK界面是否以橫屏顯示。
bundle.putBoolean(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE,
isLandScape);
// 必需參數(shù),使用360SDK的退出模塊。
bundle.putInt(ProtocolKeys.FUNCTION_CODE,
ProtocolConfigs.FUNC_CODE_QUIT);
// 可選參數(shù),登錄界面的背景圖片路徑,必須是本地圖片路徑
bundle.putString(ProtocolKeys.UI_BACKGROUND_PICTRUE, "");
Intent intent = new Intent(appActivity, ContainerActivity.class);
intent.putExtras(bundle);
Matrix.invokeActivity(appActivity, intent, mQuitCallback);
}
// 退出的回調(diào)
private IDispatcherCallback mQuitCallback = new IDispatcherCallback() {
@Override
public void onFinished(String data) {
// TypeSDKLogger.d( "mQuitCallback, data is " + data);
JSONObject json;
try {
json = new JSONObject(data);
int which = json.optInt("which", -1);
// String label = json.optString("label");
// Toast.makeText(appActivity,
// "按鈕標(biāo)識(shí):" + which + ",按鈕描述:" + label, Toast.LENGTH_LONG)
// .show();
switch (which) {
case 0: // 用戶關(guān)閉退出界面
Log.d(TAG, "用戶關(guān)閉退出界面");
return;
case 1: //進(jìn)入論壇
Log.d(TAG, "exit_success");
System.exit(0);
break;
case 2://退出游戲
Log.d(TAG, "exit_success");
System.exit(0);
break;
default:
Log.d(TAG, "exit which:" + which);
return;
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
private boolean isCancelLogin(String data) {
try {
JSONObject joData = new JSONObject(data);
int errno = joData.optInt("errno", -1);
if (-1 == errno) {
// Toast.makeText(appActivity, data, Toast.LENGTH_LONG).show();
return true;
}
} catch (Exception e) {
}
return false;
}
private String parseAccessTokenFromLoginResult(String loginRes) {
try {
JSONObject joRes = new JSONObject(loginRes);
JSONObject joData = joRes.getJSONObject("data");
return joData.getString("access_token");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
再然后,我們需要新創(chuàng)建一個(gè)類:
如下圖,我們在com.xxx這里右鍵
名字輸入:QihooPayInfo
這樣就會(huì)在這邊多出一個(gè)類文件,我們打開他
把下面的代碼復(fù)制到下圖標(biāo)記處
代碼:
// 必需參數(shù),用戶access token,要使用注意過期和刷新問題,最大64字符。
private String accessToken;
// 必需參數(shù),360賬號id,整數(shù)。
private String qihooUserId;
// 必需參數(shù),應(yīng)用app key。
private String appKey;
// 必需參數(shù),值為md5(app_secret +“#”+
// app_key)全小寫,用于簽名的密鑰不能把a(bǔ)pp_secret寫到應(yīng)用客戶端程序里因此使用這樣一個(gè)特殊的KEY,應(yīng)算出值直接寫在app中,而不是寫md5的計(jì)算過程。
private String privateKey;
// 必需參數(shù),所購買商品金額,以分為單位。金額大于等于100分,360SDK運(yùn)行定額支付流程; 金額數(shù)為0,360SDK運(yùn)行不定額支付流程。
private String moneyAmount;
// 必需參數(shù),人民幣與游戲充值幣的默認(rèn)比例,例如2,代表1元人民幣可以兌換2個(gè)游戲幣,整數(shù)。
private String exchangeRate;
// 必需參數(shù),所購買商品名稱,應(yīng)用指定,建議中文,最大10個(gè)中文字。
private String productName;
// 必需參數(shù),購買商品的商品id,應(yīng)用指定,最大16字符。
private String productId;
// 必需參數(shù),應(yīng)用方提供的支付結(jié)果通知uri,最大255字符。360服務(wù)器將把支付接口回調(diào)給該uri,具體協(xié)議請查看文檔中,支付結(jié)果通知接口–應(yīng)用服務(wù)器提供接口。
private String notifyUri;
// 必需參數(shù),游戲或應(yīng)用名稱,最大16中文字。
private String appName;
// 必需參數(shù),應(yīng)用內(nèi)的用戶名,如游戲角色名。 若應(yīng)用內(nèi)綁定360賬號和應(yīng)用賬號,則可用360用戶名,最大16中文字。(充值不分區(qū)服,
// 充到統(tǒng)一的用戶賬戶,各區(qū)服角色均可使用)。
private String appUserName;
// 必需參數(shù),應(yīng)用內(nèi)的用戶id。 若應(yīng)用內(nèi)綁定360賬號和應(yīng)用賬號, 充值不分區(qū)服, 充到統(tǒng)一的用戶賬戶, 各區(qū)服角色均可使用,
// 則可用360用戶ID。最大32字符。
private String appUserId;
// 可選參數(shù),應(yīng)用擴(kuò)展信息1,原樣返回,最大255字符。
private String appExt1;
// 可選參數(shù),應(yīng)用擴(kuò)展信息2,原樣返回,最大255字符。
private String appExt2;
// 可選參數(shù),應(yīng)用訂單號,應(yīng)用內(nèi)必須唯一,最大32字符。
private String appOrderId;
// 可選參數(shù),支付類型定制
private String[] payTypes;
public String[] getPayTypes() {
return payTypes;
}
public void setPayTypes(String[] payTypes) {
this.payTypes = payTypes;
}
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public String getQihooUserId() {
return qihooUserId;
}
public void setQihooUserId(String qihooUserId) {
this.qihooUserId = qihooUserId;
}
public String getAppKey() {
return appKey;
}
public void setAppKey(String appKey) {
this.appKey = appKey;
}
public String getPrivateKey() {
return privateKey;
}
public void setPrivateKey(String privateKey) {
this.privateKey = privateKey;
}
public String getMoneyAmount() {
return moneyAmount;
}
public void setMoneyAmount(String moneyAmount) {
this.moneyAmount = moneyAmount;
}
public String getAppName() {
return appName;
}
public void setAppName(String appName) {
this.appName = appName;
}
public String getAppUserName() {
return appUserName;
}
public void setAppUserName(String appUserName) {
this.appUserName = appUserName;
}
public String getAppUserId() {
return appUserId;
}
public void setAppUserId(String appUserId) {
this.appUserId = appUserId;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
public String getNotifyUri() {
return notifyUri;
}
public void setNotifyUri(String notifyUri) {
this.notifyUri = notifyUri;
}
public String getExchangeRate() {
return exchangeRate;
}
public void setExchangeRate(String exchangeRate) {
this.exchangeRate = exchangeRate;
}
public String getAppExt1() {
return appExt1;
}
public void setAppExt1(String appExt1) {
this.appExt1 = appExt1;
}
public String getAppExt2() {
return appExt2;
}
public void setAppExt2(String appExt2) {
this.appExt2 = appExt2;
}
public String getAppOrderId() {
return appOrderId;
}
public void setAppOrderId(String appOrderId) {
this.appOrderId = appOrderId;
}
至此我們就把所有360上線所需的接口完成了,添加UI并添加相應(yīng)事件調(diào)用相應(yīng)接口后,就是一個(gè)最簡單的demo了
如果想要了解具體的接口作用,和相應(yīng)參數(shù)的說明,請繼續(xù)閱讀以下內(nèi)容,或查看官方文檔
第一步初始化:
在Activity onCreate中調(diào)用360的初始化接口:(必須在UI線程調(diào)用)
private void init() {
// TODO Auto-generated method stub
MatrixCallBack mSDKCallback = new MatrixCallBack() {
@Override
public void execute(Context context, int functionCode, String
functionParams) {
// TODO Auto-generated method stub
if (functionCode == ProtocolConfigs.FUNC_CODE_SWITCH_ACCOUNT) {
// 調(diào)用 sdk 的切換帳號接口
doSdkSwitchAccount(getLandscape(context));
}else if (functionCode == ProtocolConfigs.FUNC_CODE_INITSUCCESS) {
//這里返回成功之后才能調(diào)用 SDK 其它接口 TypeSDKLogger.d( "initSDK success");
isInit = true;
}
}
};
// 調(diào)用其他SDK接口之前必須先調(diào)用init
Matrix.init(appActivity,mSDKCallback);
}
調(diào)用登錄接口:
/
使用 360SDK 的登錄接口, 生成 intent 參數(shù)
@param isLandScape 是否橫屏顯示登錄界面
/
private Intent getLoginIntent(boolean isLandScape) {
Intent intent = new Intent(this, ContainerActivity.class);
// 必需參數(shù),使用 360SDK 的登錄模塊
intent.putExtra(ProtocolKeys.FUNCTION_CODE,
ProtocolConfigs.FUNC_CODE_LOGIN);
// 可選參數(shù),360SDK 界面是否以橫屏顯示,默認(rèn)為 true,橫屏
intent.putExtra(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE,
isLandScape);
//可選參數(shù),是否顯示關(guān)閉按鈕,默認(rèn)不顯示
intent.putExtra(ProtocolKeys.IS_LOGIN_SHOW_CLOSE_ICON,
getCheckBoxBoolean(R.id.isShowClose));
// 可選參數(shù),是否支持離線模式,默認(rèn)值為 false
intent.putExtra(ProtocolKeys.IS_SUPPORT_OFFLINE,
getCheckBoxBoolean(R.id.isSupportOffline));
// 可選參數(shù),是否在自動(dòng)登錄的過程中顯示切換賬號按鈕,默認(rèn)為 false
intent.putExtra(ProtocolKeys.IS_SHOW_AUTOLOGIN_SWITCH,
getCheckBoxBoolean(R.id.isShowSwitchButton));
// 可選參數(shù),是否隱藏歡迎界面
intent.putExtra(ProtocolKeys.IS_HIDE_WELLCOME,
getCheckBoxBoolean(R.id.isHideWellcome));
/
指定界面背景(可選參數(shù)):
1.ProtocolKeys.UI_BACKGROUND_PICTRUE 使用的系統(tǒng)路徑,如/sdcard/1.png
2.ProtocolKeys.UI_BACKGROUND_PICTURE_IN_ASSERTS 使用的 assest 中的圖片
資源,
如傳入 bg.png 字符串,就會(huì)在 assets 目錄下加載這個(gè)指定的文件
3.圖片大小不要超過 5M,尺寸不要超過 1280x720,后綴只能是 jpg、jpeg 或 png
/
// 可選參數(shù),登錄界面的背景圖片路徑,必須是本地圖片路徑
intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTRUE,
getUiBackgroundPicPath());
// 可選參數(shù),指定 assets 中的圖片路徑,作為背景圖
intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTURE_IN_ASSERTS,
getUiBackgroundPathInAssets());
// 可選參數(shù),是否需要用戶輸入激活碼,用于游戲內(nèi)測階段。
// 如果不需激活碼相關(guān)邏輯,客戶傳 false 或者不傳入該參數(shù)。
intent.putExtra(ProtocolKeys.NEED_ACTIVATION_CODE,
getCheckBoxBoolean(R.id.isNeedActivationCode));
//-- 以下參數(shù)僅僅針對自動(dòng)登錄過程的控制
// 可選參數(shù),自動(dòng)登錄過程中是否不展示任何 UI,默認(rèn)展示。
intent.putExtra(ProtocolKeys.IS_AUTOLOGIN_NOUI,
getCheckBoxBoolean(R.id.isAutoLoginHideUI));
// 可選參數(shù),靜默自動(dòng)登錄失敗后是否顯示登錄窗口,默認(rèn)不顯示
intent.putExtra(ProtocolKeys.IS_SHOW_LOGINDLG_ONFAILED_AUTOLOGIN,
getCheckBoxBoolean(R.id.isShowDlgOnFailedAutoLogin));
// 社交分享測試參數(shù),發(fā)布時(shí)要去掉,具體說明見分享接口
// intent.putExtra(ProtocolKeys.IS_SOCIAL_SHARE_DEBUG,
// getCheckBoxBoolean(R.id.isDebugSocialShare));
return intent;
}
// 調(diào)用接口
protected void doSdkLogin(boolean isLandScape) {
mIsInOffline = false;
Intent intent = getLoginIntent(isLandScape);
IDispatcherCallback callback = mLoginCallback;
if (getCheckBoxBoolean(R.id.isSupportOffline)) {
callback = mLoginCallbackSupportOffline; //離線模式
}
Matrix.execute(this, intent, callback);
}
// 登錄接口回調(diào)(不支持離線模式)
// 登錄、注冊的回調(diào)
privateIDispatcherCallback mLoginCallback = newIDispatcherCallback() {
@Override
publicvoid onFinished(String data) {
// press back
if (isCancelLogin(data)) {
return;
}
// 顯示一下登錄結(jié)果
Toast.makeText(SdkUserBaseActivity.this, data,
Toast.LENGTH_LONG).show();
mIsInOffline = false;
mQihooUserInfo = null;
// 解析 access_token
mAccessToken = parseAccessTokenFromLoginResult(data);
if (!TextUtils.isEmpty(mAccessToken)) {
// 需要去應(yīng)用的服務(wù)器獲取用 access_token 獲取一下用戶信息
getUserInfo();
} else {
Toast.makeText(SdkUserBaseActivity.this, "get access_token
failed!", Toast.LENGTH_LONG).show();
}
}
};
// 登錄結(jié)果回調(diào)(支持離線模式)
private IDispatcherCallback mLoginCallbackSupportOffline
= new IDispatcherCallback() {
@Override
public void onFinished(String data) {
if (isCancelLogin(data)) {
return;
}
Log.d(TAG, "mLoginCallbackSupportOffline, data is " + data);
try {
JSONObject joRes = new JSONObject(data);
JSONObject joData = joRes.getJSONObject("data");
String mode = joData.optString("mode", "");
if (!TextUtils.isEmpty(mode) && mode.equals("offline")) 、
{
Toast.makeText(SdkUserBaseActivity.this,
"login success in offline mode",
Toast.LENGTH_SHORT).show();
mIsInOffline = true;
// 顯示一下登錄結(jié)果
Toast.makeText(SdkUserBaseActivity.this, data,
Toast.LENGTH_LONG).show();
} else {
mLoginCallback.onFinished(data);
}
} catch (Exception e) {
Log.e(TAG, "mLoginCallbackSupportOffline exception", e);
}
}
};
private boolean isCancelLogin(String data) {
try {
JSONObject joData = new JSONObject(data);
int errno = joData.optInt("errno", -1);
if (-1 == errno) {
// Toast.makeText(appActivity, data, Toast.LENGTH_LONG).show();
return true;
}
} catch (Exception e) {
}
return false;
}
private String parseAccessTokenFromLoginResult(String loginRes) {
try {
JSONObject joRes = new JSONObject(loginRes);
JSONObject joData = joRes.getJSONObject("data");
return joData.getString("access_token");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
調(diào)用支付接口:
注意:
1、 必選參數(shù)不能為空, 不能為 0,否則支付失敗。
2、 參數(shù)名,以 ProtocolKeys 中定義的常量為準(zhǔn)。
3、 請務(wù)必對 case 0、1、-1 加入處理語句,如果為空的會(huì)導(dǎo)致游戲崩潰。
/
使用 360SDK 的支付接口
@param isLandScape 是否橫屏顯示支付界面
@param isFixed 是否定額支付
@param functioncode 標(biāo)示支付模塊類型。
/
protected void doSdkPay(QihooUserInfo usrinfo, boolean isLandScape,int functionCode) {
if(!isAccessTokenValid) {
Toast.makeText(SdkUserBaseActivity.this, R.string.access_token_invalid,
Toast.LENGTH_SHORT).show();
return;
}
if(!isQTValid) {
Toast.makeText(SdkUserBaseActivity.this, R.string.qt_invalid,
Toast.LENGTH_SHORT).show();
return;
}
boolean isFixed = getCheckBoxBoolean(R.id.isPayFixed);
// 支付基礎(chǔ)參數(shù)
QihooPayInfo payInfo = getQihooPay(
price,//_in_pay.GetData(AttName.REAL_PRICE)
_in_pay.GetData(AttName.ITEM_NAME).isEmpty()?"商品
":_in_pay.GetData(AttName.ITEM_NAME),
userInfo.GetData(AttName.ROLE_NAME).isEmpty() ? "玩家" :
userInfo.GetData(AttName.ROLE_NAME),
userInfo.GetData(AttName.ROLE_ID).isEmpty()?"1":
userInfo.GetData(AttName.ROLE_ID),
_in_pay.GetData(AttName.ITEM_SERVER_ID).isEmpty()?"1":
_in_pay.GetData(AttName.ITEM_SERVER_ID),
_in_pay.GetData(AttName.BILL_NUMBER),
platform.GetData(AttName.PAY_CALL_BACK_URL),
userInfo.GetData(AttName.USER_ID));
Intent intent = getPayIntent(isLandScape, isFixed, functionCode);
// 必需參數(shù),使用 360SDK 的支付模塊:CP 可以根據(jù)需求選擇使用 帶有收銀臺(tái)的支付模
// 塊 或者 直接 調(diào)用微信支付模塊或者直接調(diào)用支付寶支付模塊。
// functionCode 對應(yīng)三種類型的支付模塊:
// ProtocolConfigs.FUNC_CODE_PAY;//支付模塊。(有收銀臺(tái),顯示多種支付方式) // ProtocolConfigs.FUNC_CODE_WEIXIN_PAY;//微信支付模塊。
//(無收銀臺(tái),直接用微信進(jìn)行支付)
//ProtocolConfigs.FUNC_CODE_ALI_PAY;
//支付寶支付模塊。(無收銀臺(tái),直接用支付寶進(jìn)行支付)
intent.putExtra(ProtocolKeys.FUNCTION_CODE, functionCode);
// 可選參數(shù),登錄界面的背景圖片路徑,必須是本地圖片路徑
intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTRUE, "");
Matrix.invokeActivity(this, intent, mPayCallback);
}
/
@param moneyAmount
金額數(shù),使用者可以自由設(shè)定數(shù)額。金額數(shù)為100的整數(shù)倍,360SDK運(yùn)行定額支付流程;
金額數(shù)為0,360SDK運(yùn)行不定額支付流程。
@return QihooPay
/
private QihooPayInfo getQihooPay(String moneyAmount, String itemName,
String userName, String roleId, String productId,
String billNumber, String pauBackUrl, String userId) {
// String qihooUserId = (mQihooUserInfo != null) ?
// mQihooUserInfo.getId() : null;
// 創(chuàng)建QihooPay
QihooPayInfo qihooPay = new QihooPayInfo();
qihooPay.setQihooUserId(userId);
qihooPay.setMoneyAmount(moneyAmount);
qihooPay.setAccessToken(mAccessToken);
qihooPay.setExchangeRate("1");
qihooPay.setProductName(itemName);
qihooPay.setProductId(productId);
qihooPay.setNotifyUri(pauBackUrl);
qihooPay.setAppName(platform.GetData(AttName.CP_ID));
qihooPay.setAppUserName(userName);
qihooPay.setAppUserId(roleId);
// 可選參數(shù)
qihooPay.setAppExt1("ext1");
qihooPay.setAppExt2("ext2");
qihooPay.setAppOrderId(billNumber);
return qihooPay;
}
/
生成調(diào)用 360SDK 支付接口基礎(chǔ)參數(shù)的 Intent
@param isLandScape 是否橫屏顯示登錄界面
@param isFixed 是否定額支付
@return Intent
/
protected Intent getPayIntent(boolean isLandScape, boolean isFixed) {
Bundle bundle = new Bundle();
QihooPayInfo pay = getQihooPayInfo(isFixed);
// 界面相關(guān)參數(shù),360SDK 界面是否以橫屏顯示。
bundle.putBoolean(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE, isLandScape);
// 可選參數(shù),登錄界面的背景圖片路徑,必須是本地圖片路徑
bundle.putString(ProtocolKeys.UI_BACKGROUND_PICTRUE, "");
// 以下非界面相關(guān)參數(shù)
// 設(shè)置 QihooPay 中的參數(shù)。
// 必需參數(shù),用戶 access token,要使用注意過期和刷新問題,最大 64 字符。 bundle.putString(ProtocolKeys.ACCESS_TOKEN, pay.getAccessToken());
// 必需參數(shù),360 賬號 id。
bundle.putString(ProtocolKeys.QIHOO_USER_ID, pay.getQihooUserId());
//必需參數(shù),所購買商品金額, 以分為單位。金額大于等于 100 分,360SDK 運(yùn)行定額支
//付流程; 金 額數(shù)為 0,360SDK 運(yùn)行不定額支付流程。
bundle.putString(ProtocolKeys.AMOUNT, pay.getMoneyAmount());
// 必需參數(shù),所購買商品名稱,應(yīng)用指定,建議中文,最大 10 個(gè)中文字。
bundle.putString(ProtocolKeys.PRODUCT_NAME, pay.getProductName());
// 必需參數(shù),購買商品的商品 id,應(yīng)用指定,最大 16 字符。
bundle.putString(ProtocolKeys.PRODUCT_ID, pay.getProductId());
// 必需參數(shù),應(yīng)用方提供的支付結(jié)果通知 uri,最大 255 字符。360 服務(wù)器將把支付接口
//回調(diào)給該 uri, 具體協(xié)議請查看文檔中,支付結(jié)果通知接口–應(yīng)用服務(wù)器提供接口。
bundle.putString(ProtocolKeys.NOTIFY_URI, pay.getNotifyUri());
// 必需參數(shù),游戲或應(yīng)用名稱,最大 16 中文字。
bundle.putString(ProtocolKeys.APP_NAME, pay.getAppName());
// 必需參數(shù),應(yīng)用內(nèi)的用戶名,如游戲角色名。 若應(yīng)用內(nèi)綁定 360 賬號和應(yīng)用賬號,則
//可用 360 用戶 名,最大 16 中文字。(充值不分區(qū)服,充到統(tǒng)一的用戶賬戶,各區(qū)服角
//色均可使用)。
bundle.putString(ProtocolKeys.APP_USER_NAME, pay.getAppUserName());
// 必需參數(shù),應(yīng)用內(nèi)的用戶 id。 // 若應(yīng)用內(nèi)綁定 360 賬號和應(yīng)用賬號,充值
//不分區(qū)服,充到統(tǒng)一的用戶賬戶,各區(qū)服角色均可使用, 則可用 360 用戶 ID 最大 32 //字符。
bundle.putString(ProtocolKeys.APP_USER_ID, pay.getAppUserId());
// 必需參數(shù),應(yīng)用訂單號,應(yīng)用內(nèi)必須唯一,最大 32 字符。
bundle.putString(ProtocolKeys.APP_ORDER_ID, pay.getAppOrderId());
// 可選參數(shù),應(yīng)用擴(kuò)展信息 1,原樣返回,最大 255 字符。
bundle.putString(ProtocolKeys.APP_EXT_1, pay.getAppExt1());
// 可選參數(shù),應(yīng)用擴(kuò)展信息 2,原樣返回,最大 255 字符。
bundle.putString(ProtocolKeys.APP_EXT_2, pay.getAppExt2());
Intent intent = new Intent(this, ContainerActivity.class);
intent.putExtras(bundle);
return intent;
}
/
支付的回調(diào)
/
protected IDispatcherCallback mPayCallback = new IDispatcherCallback() {
@Override
public void onFinished(String data) {
Log.d(TAG, "mPayCallback, data is " + data);
if(TextUtils.isEmpty(data)) {
return;
}
boolean isCallbackParseOk = false;
JSONObject jsonRes;
try {
jsonRes = new JSONObject(data);
// error_code 狀態(tài)碼:0 支付成功,-1 支付取消,1 支付失敗,-2 支付進(jìn)行中。
// 請務(wù)必對 case 0、1、-1 加入處理語句,如果為空會(huì)導(dǎo)致游戲崩潰 // error_msg 狀態(tài)描述
int errorCode = jsonRes.optInt("error_code");
isCallbackParseOk = true;
switch (errorCode) {
case 0:
case 1:
case -1:
case -2: {
isAccessTokenValid = true;
String errorMsg = jsonRes.optString("error_msg");
String text = getString(R.string.pay_callback_toast, errorCode, errorMsg);
Toast.makeText(SdkUserBaseActivity.this, text, Toast.LENGTH_SHORT).show();
}
break;
case 4010201:
isAccessTokenValid = false;
Toast.makeText(SdkUserBaseActivity.this, R.string.access_token_invalid,
Toast.LENGTH_SHORT).show();
break;
case 4009911:
//QT 失效
isQTValid = false;
Toast.makeText(SdkUserBaseActivity.this, R.string.qt_invalid,
Toast.LENGTH_SHORT).show();
break;
default:
break;
}
} catch (JSONException e) {
e.printStackTrace();
}
// 用于測試數(shù)據(jù)格式是否異常。
if (!isCallbackParseOk) {
Toast.makeText(SdkUserBaseActivity.this, getString(R.string.data_format_error),
Toast.LENGTH_LONG).show();
}
}
};
接入提交游戲角色數(shù)據(jù)信息:(可選客戶端接入還是服務(wù)端接入,以下只展示客戶端接入示例)
數(shù)據(jù)提交時(shí)機(jī):
1、玩家進(jìn)入游戲區(qū)服時(shí)調(diào)用該接口。
2、角色創(chuàng)建時(shí)調(diào)用該接口。
3、角色升級時(shí)調(diào)用該接口。
4、角色退出游戲時(shí)調(diào)用該接口。
/
角色信息采集接口
/
protected void doSdkGetUserInfoByCP() {
HashMap eventParams=new HashMap();
//----------------------------參數(shù)設(shè)置說明--------------------
//以下列出的五項(xiàng)只是作為參考,請按照上述表格中的參數(shù)說明進(jìn)行補(bǔ)充添加
eventParams.put("zoneid",1);//當(dāng)前角色所在游戲區(qū)服 id
eventParams.put("zonename","刀塔傳奇 1 區(qū)");//當(dāng)前角色所在游戲區(qū)服名稱 eventParams.put("roleid","12345678");//當(dāng)前角色 id
eventParams.put("rolename","三國風(fēng)吹來的魚");//當(dāng)前角色名稱 eventParams.put("type","levelUp");//角色信息接口觸發(fā)的場景
//----------------------------------------------------------
Matrix.statEventInfo(getApplicationContext(), eventParams);
}
參數(shù)說明:
接入切換賬號接口:
/
使用 360SDK 的切換賬號接口
@param isLandScape 是否橫屏顯示登錄界面
/
protected void doSdkSwitchAccount(boolean isLandScape) {
Intent intent = getSwitchAccountIntent(isLandScape);
if (isSupportOffline) {
callback = mAccountSwitchSupportOfflineCB;//離線模式
}
Matrix.invokeActivity(this, intent, mAccountSwitchCallback);
}
/
生成調(diào)用360SDK切換賬號接口的Intent
@param isLandScape
是否橫屏
@param isBgTransparent
是否背景透明
@param clientId
即AppKey
@return Intent
/
private Intent getSwitchAccountIntent(boolean isLandScape) {
Intent intent = new Intent(appActivity, ContainerActivity.class);
// 界面相關(guān)參數(shù),360SDK界面是否以橫屏顯示。
intent.putExtra(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE,
isLandScape);
// 必需參數(shù),使用360SDK的切換賬號模塊。
intent.putExtra(ProtocolKeys.FUNCTION_CODE,
ProtocolConfigs.FUNC_CODE_SWITCH_ACCOUNT);
// 是否顯示關(guān)閉按鈕
intent.putExtra(ProtocolKeys.IS_LOGIN_SHOW_CLOSE_ICON, isShowClose);
// 可選參數(shù),是否支持離線模式,默認(rèn)值為false
intent.putExtra(ProtocolKeys.IS_SUPPORT_OFFLINE, isSupportOffline);
// 可選參數(shù),是否在自動(dòng)登錄的過程中顯示切換賬號按鈕
intent.putExtra(ProtocolKeys.IS_SHOW_AUTOLOGIN_SWITCH,
isShowSwitchButton);
// 可選參數(shù),是否隱藏歡迎界面
intent.putExtra(ProtocolKeys.IS_HIDE_WELLCOME, isHideWellcome);
// 可選參數(shù),登錄界面的背景圖片路徑,必須是本地圖片路徑
// intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTRUE,
// getUiBackgroundPicPath());
// 可選參數(shù),指定assets中的圖片路徑,作為背景圖
// intent.putExtra(ProtocolKeys.UI_BACKGROUND_PICTURE_IN_ASSERTS,
// getUiBackgroundPathInAssets());
// -- 以下參數(shù)僅僅針對自動(dòng)登錄過程的控制
// 可選參數(shù),自動(dòng)登錄過程中是否不展示任何UI,默認(rèn)展示。
intent.putExtra(ProtocolKeys.IS_AUTOLOGIN_NOUI, isAutoLoginHideUI);
// 可選參數(shù),靜默自動(dòng)登錄失敗后是否顯示登錄窗口,默認(rèn)不顯示
intent.putExtra(ProtocolKeys.IS_SHOW_LOGINDLG_ONFAILED_AUTOLOGIN,
isShowDlgOnFailedAutoLogin);
// 測試參數(shù),發(fā)布時(shí)要去掉
intent.putExtra(ProtocolKeys.IS_SOCIAL_SHARE_DEBUG, isDebugSocialShare);
return intent;
}
// 切換賬號的回調(diào)
private IDispatcherCallback mAccountSwitchCallback = new IDispatcherCallback() {
@Override
public void onFinished(String data) {
// press back
if (isCancelLogin(data)) {
return;
}
// 顯示一下登錄結(jié)果
// Toast.makeText(appActivity, data, Toast.LENGTH_LONG).show();
// TypeSDKLogger.d( "mAccountSwitchCallback, data is " + data);
// 解析access_token
mAccessToken = parseAccessTokenFromLoginResult(data);
}
};
// 支持離線模式的切換賬號的回調(diào)
private IDispatcherCallback mAccountSwitchSupportOfflineCB = new IDispatcherCallback() {
@Override
public void onFinished(String data) {
// press back
if (isCancelLogin(data)) {
return;
}
// 顯示一下登錄結(jié)果
// Toast.makeText(appActivity, data, Toast.LENGTH_LONG).show();
// TypeSDKLogger.d( "mAccountSwitchSupportOfflineCB, data is " + data);
// 解析access_token
mAccessToken = parseAccessTokenFromLoginResult(data);
}
};
parseAccessTokenFromLoginResult (String data) 此函數(shù)登錄時(shí)就有用到,解析TOKEN
接入退出接口:
/
使用 360SDK 的退出接口
@param isLandScape 是否橫屏顯示支付界面
/
protected void doSdkQuit(boolean isLandScape) {
Bundle bundle = new Bundle();
// 界面相關(guān)參數(shù),360SDK 界面是否以橫屏顯示。
bundle.putBoolean(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE, isLandScape);
// 可選參數(shù),登錄界面的背景圖片路徑,必須是本地圖片路徑
bundle.putString(ProtocolKeys.UI_BACKGROUND_PICTRUE, "");
// 必需參數(shù),使用 360SDK 的退出模塊。
bundle.putInt(ProtocolKeys.FUNCTION_CODE, ProtocolConfigs.FUNC_CODE_QUIT);
Intent intent = new Intent(this, ContainerActivity.class);
intent.putExtras(bundle);
Matrix.invokeActivity(this, intent, mQuitCallback);
}
// 退出的回調(diào)
private IDispatcherCallback mQuitCallback = new IDispatcherCallback() {
@Override
public void onFinished(String data) {
// TODO your job
}
};
接入銷毀接口:
@Override
protected void onDestroy() {
super.onDestroy();
Matrix.destroy(this);
}
游戲 activity 生命周期接口:
//游戲 Activity 必接 生命周期接口
public static void onStart(Activity activity)
//游戲 Activity 必接生命周期接口
public static void onResume(Activity activity)
//游戲 Activity 必接生命周期接口
public static void onPause(Activity activity)
//游戲 Activity 必接生命周期接口
public static void onStop(Activity activity)
//游戲 Activity 必接生命周期接口
public static void onReStart(Activity activity)
//游戲 Activity 必接生命周期接口
public static void onActivityResult (Activity activity,int requestCode, int resultCode, Intent data)
//游戲 Activity 必接生命周期接口
public static void onNewIntent (Activity activity,Intent intent)
代碼混淆要求
如果游戲發(fā)布時(shí)采用proguard進(jìn)行代碼混淆,請?jiān)趐roguard配置文件加入以下代碼,以避免對SDK進(jìn)行混淆,否則會(huì)造成SDK部分功能不正常。
-keep class a.a.a. { ; }
-keep class cn.pp. { ; }
-keep class com.alipay. {;}
-keep class com.qihoo. {;}
-keep class com.qihoo360.** { ; }
-keep class com.qihoopp. { ; }
-keep class com.yeepay.safekeyboard. { ; }
-keep class com.amap. {;}
-keep class com.aps. {*;}
-keep class com.iapppay. {;}
-keep class com.ipaynow. {;}
-keep class com.junnet.heepay. {;}
-keep class com.tencent.mm. {;}
-keep class com.ta.utdid2.** {;}
-keep class com.ut.device. {;}
-keep class com.qihoo.sdkplugging.host. {;}
-keep public class com.qihoo.gamecenter.sdk.matrix.PluggingHostProxy {;}
-dontwarn cn.pp.
-dontwarn com.alipay.android.app.
-dontwarn com.qihoo.
-dontwarn com.qihoo360.
-dontwarn com.qihoopp.
-dontwarn com.yeepay.safekeyboard.
-dontwarn com.amap.**
-dontwarn org.apache.http.conn.ssl.SSLSocketFactory
如果想了解更多,請聯(lián)系我們或關(guān)注官網(wǎng)
了解更多:www.typesdk.com問題解答:1771930259聯(lián)系郵箱:qianyuzhou@typesdk.com項(xiàng)目地址:https://github.com/typesdk
更多建議: