# Android 接入指南
注 1:jCenter 服务将在 2021 年 5 月 1 日之后关停,微信 SDK 已迁移到 Maven Central,请开发者及时修改引用仓库。
注 2:微信 SDK 改成通过 Gradle 的方式发布到 Maven Central,包名做了相应修改,从原来的 com.tencent.mm.sdk 修改为 com.tencent.mm.opensdk,需要开发者修改对应的 import 语句。
注 3:接入 Open SDK 的开发者,请先认真阅读《微信 Open SDK 个人信息处理规则》及《微信 Open SDK 开发者合规使用指南》,并确保对 OpenSDK 的接入使用情况符合上述指南中的相关要求。
注 4:本文为微信 Android 终端开发工具的新手使用教程,只涉及教授 SDK 的使用方法,默认读者已经熟悉 IDE 的基本使用方法(Android Studio(推荐)或 Eclipse),以及具有一定的编程知识基础等。
注 5:Open SDK for Android 的资源可前往《更新日志》下载。
# 关于 OpenSDK 6.8.0 的更新说明
微信将于近期发布 targetSdkVersion 30 的客户端版本,因 Android 11 系统特性,该微信版本在 Android 11 及以上系统版本的设备上运行时,授权登录、分享、微信支付等功能受到影响,可能无法正常使用。为了适配 Android 系统新版本特性,保证微信功能正常使用,请第三方应用2021 年 11 月 1 日之前进行更新,点击查看更新指引。
目录
# 接入指南
# 1. 申请你的 AppID
请到开发者应用登记页面进行登记,登记并选择移动应用进行设置后,将该应用提交审核,只有审核通过的应用才能进行开发。
# 2. 下载 SDK 及 API 文档
Android Studio 环境下:
在 build.gradle 文件中,添加如下依赖即可:
dependencies {
api 'com.tencent.mm.opensdk:wechat-sdk-android:+'
}
(从 6.8.0 版本开始,请使用 wechat-sdk-android)
由于 jCenter 服务关停,需要修改成引用 Maven Central,在项目的根 build.gradle 文件中,添加如下代码即可:
buildscript {
repositories {
jcenter() // 原有 jCenter 引用可继续保留
mavenCentral()
}
}
allprojects {
repositories {
jcenter() // 原有 jCenter 引用可继续保留
mavenCentral()
}
}
特别注意,目前 Maven Central 仅支持部分版本:6.6.4、6.6.5、6.6.23、6.7.0、6.7.9、6.8.0,建议开发者升级至最新版本 6.8.0。后续所有版本更新都会上传至 Maven Central。
Eclipse 环境下:
请前往 资源下载页 下载最新 SDK 包。
# 3. 搭建开发环境
Android Studio 环境下:
在 Android Studio 中新建你的工程,并保证网络设置可以成功从 Maven Central 下载微信 SDK 即可。
Eclipse 环境下:
1)在 Eclipse 中建立你的工程。
2)在工程中新建一个 libs 目录,将开发工具包中 libs 目录下的 libammsdk.jar 复制到该目录中(如下图所示,建立了一个名为 SDK_Sample 的工程,并把 jar 包复制到 libs 目录下)。
3)右键单击工程,选择「Build Path」中的「Configure Build Path...」,选中「Libraries」这个 tab,并通过「Add Jars...」导入工程 libs 目录下的 libammsdk.jar 文件(如下图所示)。
在你需要使用微信终端 API 的文件中导入相应的类:
import com.tencent.mm.opensdk.openapi.WXTextObject;
# 4. 在代码中使用开发工具包
1)注册到微信
要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的 id。可以在程序入口 Activity 的 onCreate 回调函数处,或其他合适的地方将你的应用 id 注册到微信。注册函数示例如下:
// APP_ID 替换为你的应用从官方网站申请到的合法 appID
private static final String APP_ID = "wx88888888";
// IWXAPI 是第三方 app 和微信通信的 openApi 接口
private IWXAPI api;
private regToWx() {
// 通过 WXAPIFactory 工厂,获取 IWXAPI 的实例
api = WXAPIFactory.createWXAPI(this, APP_ID, true);
// 将应用的 appId 注册到微信
api.registerApp(APP_ID);
// 建议动态监听微信启动广播进行注册到微信
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// 将该 app 注册到微信
api.registerApp(Constants.APP_ID);
}
}, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));
}
2)发送请求或响应到微信
现在,你的程序要发送请求或发送响应到微信终端,可以通过 IWXAPI 的 sendReq 和 sendResp 两个方法来实现。
boolean sendReq(BaseReq req);:第三方 app 主动发送消息给微信,发送完成之后会切回到第三方 app 界面boolean sendResp(BaseResp resp);:微信向第三方 app 请求数据,第三方 app 回应数据之后会切回到微信界面
sendReq 的实现示例:
// 初始化一个 WXTextObject 对象,填写分享的文本内容
WXTextObject textObj = new WXTextObject();
textObj.text = text;
// 用 WXTextObject 对象初始化一个 WXMediaMessage 对象
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = textObj;
msg.description = text;
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = String.valueOf(System.currentTimeMillis()); // transaction 字段用于唯一标识一个请求
req.message = msg;
req.scene = mTargetScene;
// 调用 api 接口,发送数据到微信
api.sendReq(req);
需要注意的是,SendMessageToWX.Req 的 scene 成员:
- 如果 scene 填
WXSceneSession,消息会发送至微信的会话内 - 如果 scene 填
WXSceneTimeline(微信 4.2 以上支持),消息会发送至朋友圈 - scene 默认值为
WXSceneSession
com.tencent.mm.opensdk.constants.Build.java 里面定义了各个功能支持的版本号,如果需要检查微信版本支持 API 的情况,可调用 IWXAPI 的 getWXAppSupportAPI 方法。比如,要判断微信是否支持分享到朋友圈功能:
if (api.getWXAppSupportAPI() >= Build.TIMELINE_SUPPORTED_SDK_INT) {
// do share
}
sendResp 的实现示例:
// 初始化一个 WXTextObject 对象
WXTextObject textObj = new WXTextObject();
textObj.text = text;
// 用 WXTextObject 对象初始化一个 WXMediaMessage 对象
WXMediaMessage msg = new WXMediaMessage(textObj);
msg.description = text;
// 构造一个 Resp
GetMessageFromWX.Resp resp = new GetMessageFromWX.Resp();
// 将 req 的 transaction 设置到 resp 对象中
// 其中 bundle 为微信传递过来的 Intent 所带的内容,通过 getExtras() 方法获取
resp.transaction = new GetMessageFromWX.Req(bundle).transaction;
resp.message = msg;
// 调用 api 接口,发送数据到微信
api.sendResp(resp);
具体要发送的内容由第三方 app 开发者定义,具体可参考微信开发工具包中的 SDK Sample Demo 源码。
3)接收微信的请求及返回值
如果你的程序需要接收微信发送的请求,或者接收发送到微信请求的响应结果,需要下面 3 步操作:
a. 在你的包名相应目录下新建一个 wxapi 目录,并在该 wxapi 目录下新增一个 WXEntryActivity 类,该类继承自 Activity(例如应用程序的包名为 net.sourceforge.simcpux,则新添加的类如下图所示):
并在 manifest 文件里面加上 exported、taskAffinity 及 launchMode 属性,其中 exported 设置为 true,taskAffinity 设置为你的包名,launchMode 设置为 singleTask,例如:
<activity
android:name=".wxapi.WXEntryActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:exported="true"
android:taskAffinity="填写你的包名"
android:launchMode="singleTask">
</activity>
b. 实现 IWXAPIEventHandler 接口,微信发送的请求将回调到 onReq 方法,发送到微信请求的响应结果将回调到 onResp 方法。
c. 在 WXEntryActivity 中将接收到的 intent 及实现了 IWXAPIEventHandler 接口的对象传递给 IWXAPI 接口的 handleIntent 方法,示例如下:
api.handleIntent(getIntent(), this);
当微信发送请求到你的应用,将通过 IWXAPIEventHandler 接口的 onReq 方法进行回调,类似的,应用请求微信的响应结果将通过 onResp 回调。
注意事项
1)如果需要混淆代码,为了保证 SDK 的正常使用,需要在 proguard.cfg 加上下面配置:
-keep class com.tencent.mm.opensdk.** {
*;
}
-keep class com.tencent.wxop.** {
*;
}
-keep class com.tencent.mm.sdk.** {
*;
}
2)如果需要运行 SDK Sample 工程,需要通过指定的 debug.keystore 来进行签名:
Android Studio 环境下:
signingConfigs {
debug {
storeFile file("../debug.keystore")
}
}
Eclipse 环境下:
请查阅文档《如何运行 SDK Demo 工程》。
至此,你已经能使用微信 Android 开发工具包的 API 内容了。如果想更详细了解每个 API 函数的用法,请查阅 Android 平台参考手册或自行下载阅读微信 SDK Sample Demo 源码。
# Android 11 更新 OpenSDK 适配
针对微信 targetSdkVersion 30 的客户端版本,因 Android 11 系统特性,该微信版本在 Android 11 及以上系统版本的设备上运行时,授权登录、分享、微信支付等功能受到影响,可能无法正常使用。为了适配 Android 系统新版本特性,保证微信功能正常使用,请第三方应用2021 年 11 月 1 日之前进行如下更新:
# 适配方案
1)第三方应用需要更新微信 Android SDK 至 6.8.0 版本,引用代码如下:
dependencies {
api 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.0'
// 或者直接引用最新版本
// api 'com.tencent.mm.opensdk:wechat-sdk-android:+'
}
无论第三方应用 targetSdkVersion 是否升级为 30,均需要进行微信 Android SDK 版本升级适配。
2)targetSdkVersion 升级到 30 的第三方应用,由于 Android 11 软件包可见性 特性的影响,OpenSDK 的接口可能无法正常拉起微信,从而无法使用微信的部分功能,需要在主工程的 AndroidManifest.xml 中增加标签,代码如下:
<manifest package="com.example.app">
...
// 在应用的 AndroidManifest.xml 添加如下 <queries> 标签
<queries>
<package android:name="com.tencent.mm" /> // 指定微信包名
</queries>
...
</manifest>
注:添加以上标签之后,需要开发者升级编译工具,否则会出现编译错误。
- Android Studio 需要升级至 3.3 及以上,建议升级至 4.0 及以上版本
- Android SDK Build-Tools 需要升级至 30 及以上版本
com.android.tools.build:gradle需要升级至 3.6.0 版本及以上
# 验证流程
1)环境准备:
- 系统:Android 11 及以上
- 微信:下载 target30 测试版微信
- 第三方应用:已按照步骤 1 和 2 更新 OpenSDK
2)验证步骤:
1)安装第三方应用后,首次触发微信登录功能(注:该操作前务必不要触发任何分享、跳转等 OpenSDK 功能)
2)若成功完成微信登录功能,即验证 OpenSDK 更新成功
3)若签名验证失败,收到回调 errcode=-6,则需开发者重新检查步骤 1 和 2 是否完成
targetSdkVersion 升级到 30 的第三方应用,具体适配详情另可参考文档 Android 11 系统策略更新,请开发者及时适配。
# Android 13 可能存在的问题适配
# 1. Intent-filter 导致的无法回跳问题
存在的问题
Android 13 开始 Intent 过滤器会屏蔽不匹配的 intent。详见 Android 官网:Android 13 变更说明
因此如果:
- 开发者在 Manifest 内声明
WXEntryActivity时,添加了 intent-filter - 开发者的 APP 运行在 Android 13 的手机上
当满足以上两个条件时,微信内可能将无法回跳到第三方 App。
解决办法
在 manifest 中,尝试去除 WXEntryActivity 的 intent-filter。具体写法应该遵照上面接入方案中提到的示例,如下:
<activity
android:name=".wxapi.WXEntryActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:exported="true"
android:taskAffinity="填写你的包名"
android:launchMode="singleTask">
</activity>