平台概述
平台简介 开发者协议 开放平台服务条款开发者指引
开发者注册流程 开发者注册流程(新) 应用提交流程 应用提交流程(新) 应用首发 应用下线 应用认领开发者规范
审核规范 软件首发规范 游戏首发规范 新品自荐规范 认领规范 特权规范 下线申请规范 回退版本规范SDK接入文档
支付SDK(网游) 支付SDK(单机) 360登录SDK 游戏社交SDK 数据分析SDK 消息推送SDK推广渠道
助手推广渠道展示 软件应用付费推广手机游戏单机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的类了。