应用宝电脑版SDK怎么在服务器上面用Java判断当前是否重复游戏

一个人默默的耕耘。by MasterChen
应用宝省流量更新sdk接入指南
转载请声明原文地址:
app的自动更新,是一个非常重要的功能。而要实现一套更新机制,技术上来说其实很简单。但对于小公司来说,其实很没有必要,因为你需要一台文件服务器提供下载,万一app火了,那这台文件服务器的压力就相当大了。现在有很多做平台的大公司会有在做这一套自动更新的服务,算是给小公司减轻成本吧。
以前几个app用的是友盟的自动更新服务,因为也使用友盟的统计服务,所以就选择了友盟。但是自从被阿里收购后,友盟的更新服务即将关闭,所以不得不寻求其它方案。 有找到几家:腾讯的应用宝、360手机助手、百度手机助手 都有提供自动更新的服务,只需集成相应的SDK便可。从中进行了对比,发现应用宝的app上架审核速度最快,所以建议还是使用应用宝的自动更新服务,这样更新的下发会更及时。
下面来讲讲应用宝自动更新SDK的接入。
首先要收,腾讯开放平台的文档确实是个坑,文档的参考价值不是很大,很多还是得靠自己去摸索。按照开放平台上的,发送邮件,获取到渠道号,并下载sdk,会得到一个jar文件“tmassistantsdk_selfupdate_v1.0_16.jar”,将此jar引入项目当中,并按照sdk使用指南进行配置。
AndroidManifest.xml中加入以下权限和Service
&uses-permission android:name="android.permission.INTERNET" /&
&uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&
&uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /&
&uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&
&uses-permission android:name="android.permission.READ_PHONE_STATE" /&
&uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /&
android:name="com.tencent.tmdownloader.TMAssistantDownloadService"
android:exported="false"
android:process=":TMAssistantDownloadSDKService" /&
配置好后进行SDK的初始化,配置好后先简单的进行更新检测操作
TMSelfUpdateManager.getInstance().init(getApplicationContext(), "申请到的渠道号", new ITMSelfUpdateListener() {
public void onDownloadAppStateChanged(int i, int i1, String s) {
public void onDownloadAppProgressChanged(long l, long l1) {
public void onUpdateInfoReceived(TMSelfUpdateUpdateInfo tmSelfUpdateUpdateInfo) {
}, new YYBDownloadListener() {
public void onDownloadYYBStateChanged(String s, int i, int i1, String s1) {
public void onDownloadYYBProgressChanged(String s, long l, long l1) {
public void onCheckDownloadYYBState(String s, int i, long l, long l1) {
TMSelfUpdateManager.getInstance().checkSelfUpdate();//检测更新运行后 发现个问题,老是会报错,提示找不到类,导致崩溃
I/art(12010): Rejecting re-init on previously-failed class java.lang.Class&com.tencent.tmapkupdatesdk.internal.logic.protocol.jce.AppInfoForUpdate&
E/AndroidRuntime(12010): FATAL EXCEPTION: apkupdate_asyctask
E/AndroidRuntime(12010): Process: com.hikvision.ivms.isp, PID: 12010
E/AndroidRuntime(12010): java.lang.NoClassDefFoundError: com.tencent.tmapkupdatesdk.internal.logic.protocol.jce.AppInfoForUpdate
E/AndroidRuntime(12010):
at com.tencent.tmapkupdatesdk.internal.logic.a.a(ProGuard:183)
E/AndroidRuntime(12010):
at com.tencent.tmapkupdatesdk.internal.logic.a.handleMessage(ProGuard:98)
E/AndroidRuntime(12010):
at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime(12010):
at android.os.Looper.loop(Looper.java:148)
E/AndroidRuntime(12010):
at android.os.HandlerThread.run(HandlerThread.java:61)
可能是由于art的问题,但也表示这个SDK多少还是存在着问题会影响使用的。
谷歌了下应用宝自动更新SDK,发现资料也挺少的,但发现了一个14年老版本,可以在,引入下载到的jar包“jce.jar”和“TMAssistantSDK_selfUpdate_.jar”,权限配置跟上面的一样,SDK的初始化如下
TMSelfUpdateSDK.getInstance().initTMSelfUpdateSDK(getApplicationContext(), 应用的APP ID, "渠道号",
new ITMSelfUpdateSDKListener() {
public void OnDownloadYYBStateChanged(String arg0, int arg1, int arg2, String arg3) {
public void OnDownloadYYBProgressChanged(String arg0, long arg1, long arg2) {
public void OnDownloadAppStateChanged(int arg0, int arg1, String arg2) {
public void OnDownloadAppProgressChanged(long arg0, long arg1) {
public void OnCheckNeedUpdateInfo(TMSelfUpdateSDKUpdateInfo arg0) {
if (arg0 != null) {
StringBuilder sb = new StringBuilder();
sb.append("NewApkSize=")
.append(arg0.getNewApkSize())
.append("NewFeature=")//更新日志
.append(arg0.getNewFeature())
.append("PatchSize=")
.append(arg0.getPatchSize())
.append("Status=").append(arg0.getStatus())
.append("UpdateDownloadUrl=")//apk下载地址
.append(arg0.getUpdateDownloadUrl())
.append("UpdateMethod=")
.append(arg0.getUpdateMethod());
System.out.println("SelfUpdate " + sb.toString());
System.out.println("SelfUpdate already latest!!!");
TMSelfUpdateSDK.getInstance().checkNeedUpdate();
运行后,可以正常检测到应用宝上的最新版本信息。如果返回的TMSelfUpdateSDKUpdateInfo为null,则说明已经是最新了。
返回有新版本后,可以自定义进行新版本的提示,并提示进行更新。SDK提供了省流量的更新方式,即使用应用宝进行更新,通过调用SDK中的方法进行实现
TMSelfUpdateSDK.getInstance().startSaveUpdate(getApplicationContext());
不过这里需要说明的是,最好判断下当前本机是否有安装应用宝app,如果已安装,则会自动拉起应用宝并自动进入到我们app的更新界面;如果是没有安装应用宝,则会去下载应用宝app,下载安装完打开应用宝app后,自动进入我们app的更新界面。判断应用宝是否安装的方法如下
if (TMSelfUpdateSDK.getInstance().checkYYBInstalled() == TMAssistantDownloadSDKTaskState.ALREADY_INSTALLED)所以,建议在已装有应用宝的时候,进行调用startSaveUpdate进行更新;在未装有应用宝的时候,通过 返回的UpdateDownloadUrl进行下载apk安装包进行更新,下载apk的方式可以根据自己的喜好进行实现。这样不会强制用户进行应用宝的捆绑安装。
转载请声明原文地址:
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!腾讯开放平台为广大开发者整理了以下SDK列表,辅助开发者快速完成将应用接入QQ空间、腾讯朋友等平台的开发工作。
使用时请注意:
1. 以下有 标志的是腾讯开放平台提供的官方版本。
2. 对于非官方SDK包,由于腾讯未对其进行验证,因此无法保证其可用性。使用时遇到问题请直接与作者联系,腾讯公司将不提供相关的技术支持。
3. 本页面列出的都是官方SDK,如果开发者自己封装SDK,需注意处理100-continue问题。否则在发送POST请求时可能会出现异常,导致OpenAPI调用失败(问题描述详见)。
4. 欢迎广大开发爱好者自行开发其他语言版本的SDK,并分享到。
特别提示:OpenAPI V3.0 SDK对应于腾讯开放平台推出的升级版OpenAPI V3.0(详见)。
最近更新日期
版本命名说明:
腾讯开放平台V3版OpenAPI的PHP SDK,3.0表示OpenAPI版本,小数点第二位表示SDK版本。
SDK适用性说明:
本SDK基于V3版OpenAPI,适用于腾讯开放平台上所有使用PHP开发的应用接入时使用。
SDK使用限制说明:
本SDK不支持部署在CEE_V1上的应用去调用支付接口,目前CEE_V1本身不支持应用接入支付。
最近修改说明:
:去掉SDK校验openkey是否为空的逻辑。
:修复method为GET时导致签名验证不通过的bug。
:重新规范了SDK的返回码,避免和OpenAPI本身返回码重合。
:部署在CEE_V2上的应用调用支付类OpenAPI时,支持POST方式发送请求。
:为方便开发者自助联调,新版本中支持打印请求串和结果。
:支持以multipart/form-data格式发post请求的接口,例如上传文件类OpenAPI。支持部署在CEE_V2上的应用调用支付类OpenAPI。
:支持支付回调协议签名验证,并修正了当参数中含有“~”符号时会签名验证会失败的bug。
版本命名说明:
腾讯开放平台V3版OpenAPI的Python SDK第一版发布,3.0表示OpenAPI版本,小数点第二位表示SDK版本。
SDK适用性说明:
本SDK基于V3版OpenAPI,适用于腾讯开放平台上所有使用Python开发的应用接入时使用。
SDK使用限制说明:
本SDK不支持部署在CEE(包括CEE_V1和CEE_V2)上的应用去调用支付接口。
目前CEE_V1本身不支持应用接入支付;
CEE_V2支持应用接入支付,但是需要开发者自己进行相关代码开发(详见:)。
最近修改说明:
:重新规范了SDK的返回码,避免和OpenAPI本身返回码重合。
:支持支付回调协议签名验证。
版本命名说明:
腾讯开放平台V3版OpenAPI的Java SDK,3.0表示OpenAPI版本,小数点第二位表示SDK版本。
SDK适用性说明:
本SDK基于V3版OpenAPI,适用于腾讯开放平台上所有使用Java开发的应用接入时使用。
SDK使用限制说明:
本SDK不支持部署在CEE(包括CEE_V1和CEE_V2)上的应用去调用支付接口。
目前CEE_V1本身不支持应用接入支付;
CEE_V2支持应用接入支付,但是需要开发者自己进行相关代码开发(详见:)。
最近修改说明:
:去掉SDK校验openkey是否为空的逻辑。
:修复上报统计,漏报interface参数的bug。
:支持以multipart/form-data格式发post请求的接口,例如上传文件类OpenAPI。
:为方便开发者自助联调,新版本中支持打印请求串和结果。
:支持支付回调协议签名验证。添加接口统计上报功能,开发者使用本SDK以后,腾讯后台服务器可以统计OpenAPI各接口的访问延时、访问量等信息,用于后续的信息挖掘和OpenAPI优化。
版本命名说明:
腾讯开放平台V3版OpenAPI的.NET SDK,3.0表示OpenAPI版本,小数点第二位表示SDK版本。
SDK适用性说明:
本SDK基于V3版OpenAPI,适用于腾讯开放平台上所有使用.NET开发的应用接入时使用。
SDK使用限制说明:
本SDK不支持部署在CEE上的应用去调用支付接口。
CEE_V2支持应用接入支付,但是需要开发者自己进行相关代码开发(详见:)。
最近修改说明:
:针对开发商反馈的多线程下有连接主动关闭而导致执行超时返回1901的现象,增大了http的默认连接限制,如果单线程情况下可以考虑将SnsNetWork.cs中的“ServicePointManager.DefaultConnectionLimit = 500;”注释掉。
:去掉SDK校验openkey是否为空的逻辑。
:重新规范了SDK的返回码,避免和OpenAPI本身返回码重合。
:腾讯开放平台V3版OpenAPI的.NET SDK第一版发布。
最近更新日期
修复了已有的bug
优化了数据上报日志类型
1. 修改AGENT协议,提高效率;
2. 兼容使用1.0 API的代码,只需替换库头文件重新编译即可;
3. 解决了1.0 SDK网络通讯的一些BUG;
4. 对于实时转发的数据也写容灾(1.0是不写容灾的),提升安全性;
5. 落地标识已经不在 API控制,杜绝第三方写错的情况。水清,山秀,奇为境;天高,云淡,任我行。
JAVA项目接入腾讯应用宝YSDK平台之道具直购支付模式接入详解
前言道具直购模式:简单的说就是Q币(人民币)兑换游戏中的货币。可以先看下官网介绍,
在看下面这篇博客,
这时, 你就应该理解掌握了80%,
最后关键的20%,
再看我下面的介绍,
就可以完美的接入成功!官方网址:1.米大师介绍——道具直购模式介绍 - 腾讯开放平台参考博客:android平台接入服务器总结(二)腾讯qq应用宝接入 - CSDN博客http://blog.csdn.net/fanyun7654/article/details/我的博客:1.腾讯开放平台配置回调地址。2.客户端下单。3.平台根据回调地址来调用我们回调方法。4.接受平台传过来的很多参数,除了sig签名参数外将其他所有参数传入map中用来生成我们本地自己的签名(两个签名要进行比较)。5.生成我们本地签名的方法是SnsSigCheck.makeSig(“GET”,“回调地址后半部分”,“(上面的)map”,“沙箱/现网的key”);6.将接受到的sig和我们本地生成的新签名sig_new,进行比较,若不相等,支付无效;若相等,支付有效。但是不管相等或不相等,都要自动回复给米大师平台一个json数据:相等的{"ret":0,"msg":"ok"},不相等的{"ret":-5,"msg":"签名错误"}。7.json数据是自动回复,不管是签名验证失败或是成功都要发送。若是2个签名相等,则可以在里面进行(给用户增加钻石)等功能。支付回调接口(真实项目:)最后
支付接入中有两个难点,也是关键点.
一个是最好也是必须用YSDK的官方工具类,不要做过多的修改,里面涉及到了各种各样签名计算方法,不用官方工具类根本不行.
另一个是,我们项目部署在什么服务器上的问题,
若是腾讯云,那没什么要修改的,直接用就行; 若是阿里云服务器,则需要修改为443端口, 还有nginx反向代理, 安装证书等操作,相当麻烦.
我贴下下载工具和nginx反向代理教程http://download.csdn.net/download/jianzhonghao/
JAVA版官方工具包,在网上随便搜搜就有.
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!在程序开发中寻找一份属于自己的快乐
腾讯应用宝(道具直购模式)支付经验总结
本周主要在对接腾讯应用宝(道具直购模式)支付,期间遇到了几个大坑。现在以问答的形式总结如下,以免后来之人再纠结于相同问题。
一、配置支付通知地址为什么收不到腾讯服务器端发送来的支付通知?
在说明这个问题之前,必须明白对接腾讯应用宝(道具直购模式)支付,需要在腾讯后台配置一个腾讯云上的内网地址,并且通知地址必须使用9001端口。我公司服务器在腾讯云上很容易配置一个内网通知地址,不过配置之后测试多次都不能收到腾讯服务器端的支付通知。检查之后,确认网络正常,并且模拟一个支付通知,我方服务器可以接受和处理。多次和腾讯应用宝技术人员沟通之后,他们表示“可以通知到,不过你方服务器给他们返回0字节数据”。后面通过仿佛查看对方的开发文档和提供的错误日志,和大量网上查找资料,打算从“是否是对方使用了Https协议”和“假设已经收到数据了是不是我方服务器不能正常处理”。
将我们处理支付通知请求的tomcat容器,改造得能够同时处理Http和Https请求。按照网上文章(http://blog.csdn.net/lanwenbing/article/details/)进行改造之后,我方服务器tomcat容器已经能够处理https请求了。再进行测试发现还是不行。使用命令sudo tcpdump
9001 -X 抓取监听端口数据包,之后看到如下数据。
我方服务器端口收到的信息:
我方服务器回复的信息:
看到从端口的抓取的数据分析可知,端口确实返回了数据,我服务器却报404错误。现在只能怀疑为什么服务器收到数据却没有处理,仔细对比查发现腾讯服务器通知使用的HTTP/1.0(对比上图截图红框中内容)。在网上查找“HTTP1.1与HTTP1.0的比较”的文章,终于找到问题。
将tomcat的&Engine name="Catalina" defaultHost="处理支付请求的web站点"&做一修改之后,问题解决,站点可以正常接收到腾讯服务器端发送的支付通知。
二、调用购买道具下单接口和服务器端支付通知的签名验证的时候都很容易报(sig error)签名错误怎么办?
调用购买道具下单接口报sig error错误,通常是你的参数值里面包含了一些特殊字符(比如空格、下划线等)。“(编码规则为:除了 0~9 a~z A~Z !*() 之外其他字符按其ASCII码的十六进制加%进行表示,例如“-”编码为“%2D”)”这是文档中着重强调的,但是使用的时候要注意接口传递的参数值和加密生sig的源字符串之间的区别,一定要统一和前后一致(我在尝试的时候,经常sig源字符串按照文档处理了,但是接口传递的参数值没有做一致性处理,导致一致sig
error错误)。还要一个地方也要强调一下,因为sig是使用的HmacSHA1加密之后Base64之后的值,所以里面可能会出现"+",但是我们tomcat接收到参数值里面的“+”会自动把它转化为空格。所以为了避免这种情况下的验签失败,请比较之前先将这个字符替换一下。
参考文献:
1.http://blog.csdn.net/lanwenbing/article/details/ 将tomcat改造成支持Http和Https请求;
2.http://blog.csdn.net/woshixuye/article/details/ HTTP1.1与HTTP1.0的比较;
3.http://open.qq.com/tools?,检查工具计算出的
腾讯官方加密工具;
4.http://blog.csdn.net/zzw182100/article/details/ ASCII码与16进制转化对照表;
5.http://wiki.open.qq.com/wiki/回调发货URL的协议说明_V3
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!游戏sdk接入教程:接入应用宝渠道SDK之一登录篇
官方文档及SDK的下载地址为:http://wiki.open.qq.com/wiki/YSDK%E4%B8%8B%E8%BD%BD
在接入之前,需先在应用宝后台创建游戏,获取一些接入参数。
客户端所需要参数包括:手Q的app_id、微信的app_id 。
准备工作做为,正式开始接入,首先把应用宝的YSDKLibrary引用库导入到我们的工作环境中去,然后用我们demo工程去引用那个工程。
我这边的接入环境是Eclipse
至于demo工程如何创建在上一篇的接入文档中有详细教程,请至:
首先我们打开我们demo工程的AndroidManifest.xml文件。
然后复制以下代码
&?xml version="1.0" encoding="utf-8"?&
&manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.demo"
android:versionCode="1"
android:versionName="1.0" &
android:minSdkVersion="8"
android:targetSdkVersion="19" /&
&supports-screens
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="true"
android:resizeable="true"
android:smallScreens="true" /&
&!-- TODO GAME SDK接入必须权限模块 START --&
&uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /&
&uses-permission android:name="android.permission.GET_TASKS" /&
&uses-permission android:name="android.permission.RESTART_PACKAGES" /&
&uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /&
&!-- TODO GAME SDK Midas接入配置 设置屏幕兼容声明 START --&
&uses-permission android:name="android.permission.INTERNET" /&
&uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&
&uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&
&uses-permission android:name="android.permission.READ_PHONE_STATE" /&
&uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /&
&uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /&
&uses-permission android:name="android.permission.RESTART_PACKAGES" /&
&uses-permission android:name="android.permission.GET_TASKS" /&
&uses-permission android:name="android.permission.READ_SMS" /&
&uses-permission android:name="android.permission.SEND_SMS" /&
&uses-permission android:name="android.permission.WRITE_SETTINGS" /&
&uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /&
&application
android:allowBackup="false"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" &
android:name=".MainActivity"
android:label="@string/app_name" &
&intent-filter&
&action android:name="android.intent.action.MAIN" /&
&category android:name="android.intent.category.LAUNCHER" /&
&/intent-filter&
&/activity&
&!-- TODO GAME SDK接入YSDK登陆接入配置 START --&
android:name="com.tencent.ysdk.module.realName.impl.RegisterRealNameActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.Translucent.NoTitleBar" &
&/activity&
&!-- TODO GAME SDK接入YSDK登陆接入配置 END --&
&!-- TODO GAME SDK QQ接入配置 START --&
android:name="com.tencent.tauth.AuthActivity"
android:launchMode="singleTask"
android:noHistory="true" &
&intent-filter&
&action android:name="android.intent.action.VIEW" /&
&category android:name="android.intent.category.DEFAULT" /&
&category android:name="android.intent.category.BROWSABLE" /&
&data android:scheme="tencent@qq_app_id@" /&
&!-- TODO GAME 这里为游戏QQ登录的配置,游戏需要修改为自己手Q的appid --&
&/intent-filter&
&/activity&
android:name="com.tencent.connect.common.AssistActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" /&
&!-- TODO GAME SDK QQ接入配置 END --&
&!-- TODO GAME SDK 微信接入配置 START --&
android:name="com.tencent.tmgp.yybtestsdk.wxapi.WXEntryActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:excludeFromRecents="true"
android:exported="true"
android:label="WXEntryActivity"
android:launchMode="singleTop"
android:taskAffinity="@package@.diff"
android:theme="@android:style/Theme.Translucent.NoTitleBar" &
&!-- TODO GAME 这里为游戏微信登录的配置,游戏需要修改为自己的包名加.diff --&
&intent-filter&
&action android:name="android.intent.action.VIEW" /&
&category android:name="android.intent.category.DEFAULT" /&
&data android:scheme="@wx_app_id@" /&
&!-- TODO GAME 这里为游戏微信登录的配置,游戏需要修改为自己的微信appid --&
&/intent-filter&
&/activity&
&!-- TODO GAME SDK 微信接入配置 END --&
&!-- TODO GAME SDK Midas接入配置 START --&
android:name="com.tencent.midas.proxyactivity.APMidasPayProxyActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="sensorLandscape"
android:theme="@android:style/Theme.Translucent.NoTitleBar" /&
android:name="com.tencent.midas.wx.APMidasWXPayActivity"
android:exported="true"
android:theme="@android:style/Theme.Translucent.NoTitleBar" /&
android:name="com.tencent.midas.qq.APMidasQQWalletActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:exported="true"
android:launchMode="singleTop"
android:theme="@android:style/Theme.Translucent.NoTitleBar" &
&intent-filter&
&action android:name="android.intent.action.VIEW" /&
&category android:name="android.intent.category.BROWSABLE" /&
&category android:name="android.intent.category.DEFAULT" /&
&data android:scheme="qwallet" /&
&!-- TODO GAME 这里为米大师的默认配置,游戏不要修改 --&
&/intent-filter&
&/activity&
android:name="com.tencent.midas.jsbridge.APWebJSBridgeActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:windowSoftInputMode="stateAlwaysHidden" /&
&!-- TODO GAME SDK Midas接入配置 END --&
&/application&
&/manifest&
以上是需要添加在AndroidManifest.xml中的。(@xxx@部分请注意替换修改)
然后到我们demo工程的AndroidManifest.xml全选替换粘贴
这样AndroidManifest.xml修改好了。
做完以上步骤,接下来,我们开始接入SDK的接口。
首先打开我们的MainActivity.java
打开的MainActivity.java应该是这个样子的
然后把下面的代码复制进去,注意别把第一行的代码覆盖了。
import java.io.UnsupportedEncodingE
import java.security.MessageD
import java.security.NoSuchAlgorithmE
import java.util.HashM
import java.util.M
import com.tencent.ysdk.api.YSDKA
import com.tencent.ysdk.framework.common.eF
import com.tencent.ysdk.framework.common.eP
import com.tencent.ysdk.module.user.PersonI
import com.tencent.ysdk.module.user.UserL
import com.tencent.ysdk.module.user.UserLoginR
import com.tencent.ysdk.module.user.UserRelationR
import com.tencent.ysdk.module.user.WakeupR
import android.app.A
import android.content.C
import android.content.I
import android.os.AsyncT
import android.os.B
import android.util.L
public class MainActivity extends Activity {
private final static String TAG = "demo";
public static String openId = "";
public static String pf = "";
public static String pfKey = "";
public static String accessToken = "";
public static String payToken = "";
public Context context =
public Activity activity = MainActivity.
public boolean isLogin =
int logintype = 0;// 1是qq登录,2是微信登录
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
YSDKApi.onCreate(activity);
YSDKApi.setUserListener(ysdkUser);
YSDKApi.handleIntent(activity.getIntent());
/*--------------------------------登录接口-----------------------------------------*/
public void qqLogin(){
YSDKApi.login(ePlatform.QQ);
public void wxLogin(){
YSDKApi.login(ePlatform.WX);
public void logout(){
YSDKApi.logout();
/*--------------------------------生命周期-----------------------------------------*/
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
YSDKApi.onDestroy(activity);
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
YSDKApi.onPause(activity);
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
YSDKApi.onRestart(activity);
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
YSDKApi.onResume(activity);
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
YSDKApi.onStop(activity);
protected void onNewIntent(Intent intent) {
// TODO Auto-generated method stub
super.onNewIntent(intent);
YSDKApi.handleIntent(intent);
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
YSDKApi.onActivityResult(requestCode, resultCode,data);
/*--------------------------------监听回调-----------------------------------------*/
UserListener ysdkUser = new UserListener() {
public void OnWakeupNotify(WakeupRet ret) {
// TODO Auto-generated method stub
Log.d(TAG, "called");
Log.d(TAG, "flag:" + ret.flag);
Log.d(TAG, "msg:" + ret.msg);
Log.d(TAG, "platform:" + ret.platform);
int platform = ret.
// TODO GAME 游戏需要在这里增加处理异账号的逻辑
if (eFlag.Wakeup_YSDKLogining == ret.flag) {
// 用拉起的账号登录,登录结果在OnLoginNotify()中回调
} else if (ret.flag == eFlag.Wakeup_NeedUserSelectAccount) {
// 异账号时,游戏需要弹出提示框让用户选择需要登录的账号
Log.d(TAG, "diff account");
} else if (ret.flag == eFlag.Wakeup_NeedUserLogin) {
// 没有有效的票据,登出游戏让用户重新登录
Log.d(TAG, "need login");
Log.d(TAG, "logout");
public void OnRelationNotify(UserRelationRet ret) {
// TODO Auto-generated method stub
String result = "";
result = result + "flag:" + ret.flag + "\n";
result = result + "msg:" + ret.msg + "\n";
result = result + "platform:" + ret.platform + "\n";
if (ret.persons != null && ret.persons.size() & 0) {
PersonInfo personInfo = (PersonInfo) ret.persons.firstElement();
StringBuilder builder = new StringBuilder();
builder.append("UserInfoResponse json: \n");
builder.append("nick_name: " + personInfo.nickName + "\n");
builder.append("open_id: " + personInfo.openId + "\n");
builder.append("userId: " + personInfo.userId + "\n");
builder.append("gender: " + personInfo.gender + "\n");
builder.append("picture_small: " + personInfo.pictureSmall
builder.append("picture_middle: " + personInfo.pictureMiddle
builder.append("picture_large: " + personInfo.pictureLarge
builder.append("provice: " + personInfo.province + "\n");
builder.append("city: " + personInfo.city + "\n");
builder.append("country: " + personInfo.country + "\n");
result = result + builder.toString();
result = result + "relationRet.persons is bad";
Log.d(TAG, "OnRelationNotify" + result);
// 发送结果到结果展示界面
public void OnLoginNotify(UserLoginRet ret) {
// TODO Auto-generated method stub
switch (ret.flag) {
case eFlag.Succ:
Log.e(TAG, "Login success:" + ret.toString());
openId = ret.open_
payToken = ret.getPayToken();
pfKey = ret.pf_
accessToken = ret.getAccessToken();
Log.i(TAG, "platform:" + ret.platform);
logintype = ret.
// token和uid
Log.d(TAG, "uid:" + openId + "token:" + accessToken);
new NetHelper().execute();
// 游戏逻辑,对登录失败情况分别进行处理
case eFlag.QQ_UserCancel:
Log.e(TAG, "用户取消授权,请重试");
// showTips("用户取消授权,请重试",localContext);
case eFlag.QQ_LoginFail:
Log.e(TAG, "QQ登录失败,请重试");
// showTips("QQ登录失败,请重试",localContext);
case eFlag.QQ_NetworkErr:
Log.e(TAG, "QQ登录失败,请重试");
// showTips("QQ登录失败,请重试",localContext);
case eFlag.QQ_NotInstall:
Log.e(TAG, "手机未安装手Q,请安装后重试");
// showTips("手机未安装手Q,请安装后重试", localContext);
case eFlag.QQ_NotSupportApi:
Log.e(TAG, "手机手Q版本太低,请升级后重试");
// showTips("手机手Q版本太低,请升级后重试", localContext);
case eFlag.WX_NotInstall:
Log.e(TAG, "手机未安装微信,请安装后重试");
// showTips("手机未安装微信,请安装后重试", localContext);
case eFlag.WX_NotSupportApi:
Log.e(TAG, "手机微信版本太低,请升级后重试");
// showTips("手机微信版本太低,请升级后重试", localContext);
case eFlag.WX_UserCancel:
Log.e(TAG, "用户取消授权,请重试");
// showTips("用户取消授权,请重试",localContext);
case eFlag.WX_UserDeny:
Log.e(TAG, "用户拒绝了授权,请重试");
// showTips("用户拒绝了授权,请重试",localContext);
case eFlag.WX_LoginFail:
Log.e(TAG, "微信登录失败,请重试");
// showTips("微信登录失败,请重试",localContext);
case eFlag.Login_TokenInvalid:
Log.e(TAG, "您尚未登录或者之前的登录已过期,请重试");
// showTips("您尚未登录或者之前的登录已过期,请重试",localContext);
case eFlag.Login_NotRegisterRealName:
// 显示登录界面
Log.e(TAG, "您的账号没有进行实名认证,请实名认证后重试");
// showTips("您的账号没有进行实名认证,请实名认证后重试", localContext);
// 显示登录界面
// 客户端收到登录成功回调(正常登录,票据刷新),发送SDK服务端刷新票据
private class NetHelper extends AsyncTask&Integer, Void, Integer& {
protected Integer doInBackground(Integer... params) {
// TODO Auto-generated method stub
Map&String, Object& map = new HashMap&String, Object&();
map.put("openid", openId);
map.put("openkey", accessToken);
map.put("pf", pf);
map.put("pfkey", pfKey);
map.put("payToken", payToken);
String beforeSignString = "openid=" + openId + "&openkey="
+ accessToken + "&payToken=" + payToken + "&pf=" + pf
+ "&pfkey=" + pfKey + "clientKey";
Log.e(TAG, "login beforeSignString:" + beforeSignString);
String sign = md5(beforeSignString);
map.put("sign", sign);
// 以下为把map post到服务端
// refreshResult = HttpUtil._post(TypeSDKBonjour_Tencent
// .Instance().platform.GetData("tokenUrl"), map);
// Log.i(TAG, "tokenUrl reuslt:" + refreshResult);
} catch (Exception e) {
e.printStackTrace();
protected void onPostExecute(Integer result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
public static String md5(String string) {
hash = MessageDigest.getInstance("MD5").digest(
string.getBytes("UTF-8"));
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("Huh, MD5 should be supported?", e);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("Huh, UTF-8 should be supported?", e);
StringBuilder hex = new StringBuilder(hash.length * 2);
for (byte b : hash) {
if ((b & 0xFF) & 0x10)
hex.append("0");
hex.append(Integer.toHexString(b & 0xFF));
return hex.toString();
至此我们就把所有应用宝上线所需的登录接口完成了,添加UI并添加相应事件调用相应接口后,就是一个最简单的demo了
如果想要了解具体的接口作用,和相应参数的说明,查看代码中的注释或查看官方文档
如果想了解更多,请联系我们或关注官网
了解更多:www.typesdk.com
问题解答:
联系邮箱:
项目地址:https://github.com/typesdk
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 应用宝开放平台 的文章

 

随机推荐