手机游戏单机SDK

手机游戏单机SDK简介:此sdk包主要面向单机或弱联网游戏开发者,包括服务器端和客户端两部分,其中服务器端接入是可选的(支持无服务器单机游戏接入)。

1、手机应用提交指南

接入SDK应用提交发布流程:点击查看

有任何技术问题,欢迎到游戏开发者论坛吐槽,寻求帮助。

2、各版本SDK&接入文档

版本号 发布时间 资源下载 本期更新说明
0.1.2 2014-2-11 请在创建单机游戏的流程中下载
接入文档 
1.增加了银行卡支付方式,支持市面上主流银行卡支付;
2.增加了支付宝支付方式;
3.增加了联通话费支付方式;
4.增加了联通话费支付通道切换功能

 

3、服务端SDK下载

以下服务端SDK代码仅供参考,使用本SDK可能带来的风险请自行承担。

php版服务端SDK,点击下载

python版服务端SDK,点击下载

java版服务端SDK,点击下载

4、360手游数据统计分析服务(专享免费!)

360开放平台联合了国内最专业的数据分析服务提供商TalkingData,正式向您提供最专业的手机游戏数据统计分析服务:“TalkingGame 360开发者专属版”。

使用您的360开发者账户授权进入,即可立即获得免费使用特权。点击查看详情

5、APK自检工具下载

接入过程中遇到的绝大多数问题是由于APK包不完整或基本设置错误导致的,该工具可以协助您在开发过程中自行检测。

APK自检工具下载:点击下载

提供功能:用于检查单机sdk的apk包,检查apk完整性和基本设置。

适用版本:适用于0.1.1及以上所有版本

运行环境:windows + jdk

使用方法:解压后,拖动apk到check_apk.bat即可。apk名请不要包含空格。

6、接入流程FAQ

Q1: 接入过程中遇到问题,如何联系我们?

A1: 请详细阅读下面的FAQ,接入过程中常见的问题我们都给出了解答。
如果仍有问题,可以发邮件到我们的客服邮箱:360box@360.cn,我们会在1-2个工作日内给您答复。

 

Q2: 如何申请appkey和appsecret?

A2: 请参照本页目录第一项:手机应用提交指南,文档中详细讲解了申请appkey和appsecret的步骤,还有配图说明哦。

 

Q3:哪些接口必接,哪些接口可选

A3: 必须接入的接口:
支付的全部接口;
可选接口:
单机支付成功订单统计接口,建议使用,便于开发者统计核对收入

 

Q4: 银行卡支付回调地址填写在什么地方?

A4: 为安全起见,支付回调地址不在后台填写,请在调用支付接口时填写notify_url字段。详情见接入文档支付接口部分。

 

Q5: 如何快速定位问题?

A5: 在发布包的“log_on_jars”目录,或者“开log的jar包”目录下有,开日志的pro.jar和360SDK.jar,替换同名jar包,重新打包。卸载原来的apk,再安装新打包的apk,就可以看见详细日志,这样就可以快速定位问题了。

 

Q6: 如何调试支付通知接口?

A6: 支付通知接口在收到支付结果通知后, 要做订单验签, 数据验证(购买商品, 金额, 用户是否吻合), 然后给用户帐户加上要买的东西. 要做的事情多, 第一次很难保证就能完全走通, 建议按照下述步骤操作
1. 先保证支付通知接口是可访问的. 在浏览器上访问一下就知道了. 用IP地址的话注意不要是内网IP
2. 记录完整的请求日志, 把未经处理的请求参数串, 记在日志里.
3. 直接回应ok.
这样, 只要支付一次, 就可以获取到一个完整的通知参数串. 本地在浏览器上用这个参数串来访问接口, 慢慢调试验签, 数据校验, 以后后续的各种功能吧.

 

Q7: SDK返回给游戏的支付结果有哪些?

A7: 一共有4种返回结果,调用方必须都要处理。

1、支付成功(用户下单支付,并且成功。如果有多个订单,只要有1个成功,就会返回成功。)
返回json:{error_code: 0, error_msg: "支付成功"}

2、支付失败(用户下单支付,但在下单后由于各种原因放弃支付或支付失败)
返回json:{error_code: 1, error_msg: "支付失败"}

3、用户取消(用户没有下单支付,仅仅从支付界面返回游戏界面)
返回json:{error_code: -1, error_msg: "支付取消"}

4、支付正在进行(用户下单支付,但支付结果不是同步得到而且时间不确定,无法让用户长时间等待。所以SDK只能告诉调用方:支付正在进行,最终结果可能成功、也可能失败)
返回json:{error_code: -2, error_msg: "正在进行"}

SDK的支付结果主要作用是通知调用方,用户支付行为结束,最终结果还是以服务器通知为准,所以调用方应该查询自己的服务器确认支付结果。

支付结果中可能包含多条不同结果的充值记录。如果调用方希望1次支付调用仅完成1次支付,那么请在调用支付接口时,显式地传入调用方自己的order id(id不能重复),这样就可以保证1次调用接口,仅完成1次支付操作。

请调用方根据自身情况,处理每一种支付结果。

 

Q8: 如果要混淆java代码,如何配置?

A8: 如果要混淆java代码,请不要混淆联编的jar包中的类。可以添加以下类到proguard配置,排除在混淆之外: 把 <您的包名>换为您在AndroidManifest.xml中定义的apk包名。

-keep public class <您的包名>.R { *; }
-keep public class <您的包名>.R$* { *; }

-keep class com.qihoo.channel.** { *; }
-keep class com.qihoo.gamecenter.sdk.** { *; }
-keep class com.qihoopay.insdk.** { *; }
-keep class com.qihoopay.sdk.protocols.** { *; }

-dontwarn org.apache.http.conn.ssl.SSLSocketFactory

 

Q9: 调用支付宝时,出现崩溃错误: java.lang.NoClassDefFoundError

A9: 请删除原来包含com.alipay.android.app的代码或jar包。

如果不删除原来的支付宝客户端代码或jar包,会导致SDK的支付宝客户端代码无法加载,出现崩溃错误: java.lang.NoClassDefFoundError。

 

Q10 SDK发新版了, 如何替换新包?

A10: 
1. 注意权限的变化
2. 注意assets下资源文件是否完全替换
3. 注意libs下的jar文件是否完全替换

 

Q11: 支付时显示 获取订单失败, 找不到错误

A11: 这种错误一般都是因为参数错误而导致
1. 检查本地日志里有没有错误日志
2. 如果本地没有日志, 使用SDK里打开日志的JAR包, 在本地就可以打出详细日志.

 

Q12: 手机号注册时, 发生了崩溃

A12: 查是否漏掉了配置权限 <uses-permission android:name="android.permission.SEND_SMS"/>

 

Q13: 要做支付接入了, 有测试币吗. 如何测试支付呢?

A13: 抱歉没有测试环境. 只能用真钱. 建议按照下述方法来测试
1. 使用支付宝, 应用指定1元以下的金额,如10分钱, 来做支付. 这样可以减少测试成本. 虽然1元以下的金额在SDK上的显示是0元, 但支付流程不受影响.
2.使用运营商短信代扣业务,测试时请您设置最小支付额:一元

 

Q14: Unity3D进入注册/登录页面,停留较长时间后返回游戏,发现游戏与服务器的Socket通信连接断开

A14:  这是由于手机端游戏与服务器的Socket连接心跳线程优先级过低,Activity进入后台时通信线程被系统杀死所致。可以采用Service作为Socket通信心跳服务,或者将Socket通信线程优先级调高。

 

Q15: 支付时显示Mobile pay signature invalid,为什么?

A15: 遇到这个对话框提示,说明客户端下单时,服务器检测到签名错误。 通常是AndroidManifest.xml中meta-data中的QHOPENSDK_PRIVATEKEY对应的value错误导致。 注意此处value为private_key,不是app_secret,其生成算法为md5(app_secret +”#”+ app_key),全小写,详细算法请看开发文档附录,同时本页面的APK自检工具中有个计算工具。
android:name="QHOPENSDK_PRIVATEKEY"
android:value="4e04fe9ac8e2a73cbb27ba52ac076eb9"

 

Q16: 银联支付不成功,为什么?

A16: 请确认您的银行卡,在银联支持的银行卡类别里,特别是非信用卡。银联支持的银行卡,在银联界面里可以查看。

 

Q17: 出现 java.lang.ClassNotFoundException: com.qihoopay.outsdk.Dispatcher,为什么?

A17: 08-01 11:05:40.870: W/dalvikvm(4847): Link of class 'Lcom/qihoopay/outsdk/Dispatcher;' failed
08-01 11:05:40.870: W/System.err(4847): java.lang.ClassNotFoundException: com.qihoopay.outsdk.Dispatcher
出现这个错误的可能原因有2个。
1、如果assets下的pro.jar没有打包到apk中,会出现这个错误。
2、如果是使用支付宝时报错,是有支付宝相关src或引用的支付宝jar包没有清理干净,清除com\alipay\android\app\相关代码即可。

 

Q18: 在发布的sdk的zip包中,那些文件都是干什么的?

A18: 请查看发布的zip包中的readme.txt。

 

Q19: Unity接入需要注意什么问题?

A19: 接入Unity,SDK和Unity的显示方向要一致。

 

Q20: 为什么在Android 4.1以下手机上从AsyncTask抛出android.view.ViewRoot$CalledFromWrongThreadException

A20: 出现场景:在 AsyncTask.onPostExecute()中修改UI时,AsyncTask 抛出 android.view.ViewRoot$CalledFromWrongThreadException 。
这是一个AsyncTask 在Android 4.1版本之前的bug:在非UI线程上第一次使用AsyncTask,导致AsyncTask的InternalHandler初始化在非UI线程上。
增加以下代码到Application或主Activity的onCreate里,保证第一次初始化AsyncTask静态变量发生在UI线程上,可以规避Android的这个Bug。

        try {
    Class.forName("android.os.AsyncTask");
}catch (ClassNotFoundException e) {
     e.printStackTrace();
}


例如:
        @Override

        protected void onCreate(Bundle savedInstanceState) {
{
    super.onCreate(savedInstanceState);

    try {
        Class.forName("android.os.AsyncTask");
    } catch (ClassNotFoundException e) {
         e.printStackTrace();
    }

        

            if  (savedInstanceState == null)  {
        // 初始化
        Matrix.init(this, false, new IDispatcherCallback() {
            @Override
            public void onFinished(String data) {
                Log.d(TAG, "matrix startup callback,result is " + data);
            }

                 });

                }

        

        }

 

Q21: Unity游戏如何接入?

A21: 已有多款Unity游戏接入。 办法是生成Unity的Android Plugin接入。  可参考Unity开发文档:http://docs.unity3d.com/Documentation/Manual/PluginsForAndroid.html 主要步骤: 1、修改Android工程和Unity工程,保持包名、版本一致。设置Company Name、ProductName等。 2、复制Unity类库到Android工程,编译Android工程,导入jar包到Unity工程\Assets\Plugins\Android\bin下 3、复制其他Android工程下的资源到Unity工程\Assets\Plugins\Android下 4、Unity中使用360SDK的接口 在Unity中调用Android的Java方法,使用360SDK的接口: 示例代码:

 if (GUILayout.Button ("登录", buttonStyle, …) {
    callAndroidJava ("unityCallSdkLogin");
}

        

        private void callAndroidJava (string methodName, params object[] args)

        {
    AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
    AndroidJavaObject jo = jc.GetStatic ("currentActivity");
    jo.Call (methodName, args);
    Debug.Log (methodName + " Called");

}

对应Android的Java方法:
示例代码:
 
        public void unityCallSdkLogin() {
    runOnUiThread(new Runnable() {

    @Override
    public void run() {
        clearLoginResult();
        // 调用360SDK登录(是否横屏显示、不透明背景)
        doSdkLogin(mIsLandscape, false);
    }

        

            });

        }


---------------------------------------------------------------

在Android的Java代码中给Unity发送消息,返回结果:
示例代码:
            private void updateUserInfoUi() {
        UnityPlayer.UnitySendMessage("ShowAllCamera", "setUserInfo", getLoginResultText());
    }


其他接口同理,具体SDK接口调用,请参考《360安卓应用接入文档》。

5、使用Unity File->Build Settings…手动打包。如果未设置Android SDK路径,第一次打包过程会让选择Android SDK路径。

 

 

Q22: 使用SSLSocketFactory类时报错

A22:  这个类在 httpclient-4.2.1.jar 里. 遇到错误时, 检查库的导入顺序, android Dependencies的优先级要高于android.jar的优先级, 这样就能找到httpclient的类了。