游戲sdk接入教程:360渠道SDK接入

2018-06-20 15:05 更新

官方文檔及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包

01

紅框所示就是我們Eclipse所需要的資源文件了。

把a(bǔ)ssets內(nèi)的文件復(fù)制到我們自己工程中的assets目錄內(nèi)。

把libs內(nèi)的文件復(fù)制到我們自己工程中的libs目錄內(nèi)。

下圖中紅框內(nèi)的文件夾按自己所需要復(fù)制

02

至于demo工程如何創(chuàng)建在上一篇的接入文檔中有詳細(xì)教程,請至:

http://www.cnblogs.com/laohaizei/p/6724250.html

03

復(fù)制完成之后,我們的demo目錄應(yīng)該是多了這些目錄

至此,我們已經(jīng)把所有需要的東西都復(fù)制到了我們的demo工程中。

首先我們打開我們工程的AndroidManifest.xml文件。

04

然后復(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è)樣子的

05

然后把下面的代碼復(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這里右鍵

06

名字輸入:QihooPayInfo

07

這樣就會(huì)在這邊多出一個(gè)類文件,我們打開他

08

把下面的代碼復(fù)制到下圖標(biāo)記處

09

代碼:

// 必需參數(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


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號