微信 Open SDK for Android 是微信开放平台面向 Android 端第三方应用提供的开发工具包,支持分享与收藏、微信登录、微信支付等能力。本文档面向已具备 Android Studio(或 Eclipse)基本使用经验的开发者,介绍 Open SDK 的接入与使用方法。
注 1:接入 Open SDK 的开发者,请先认真阅读《微信 Open SDK 个人信息处理规则》及《微信 Open SDK 开发者合规使用指南》,并确保对 OpenSDK 的接入使用情况符合上述指南中的相关要求。
注 2:jCenter 服务将在 2021 年 5 月 1 日之后关停,微信 SDK 已迁移到 Maven Central,请开发者及时修改引用仓库。
注 3:微信 SDK 已迁移到 Maven Central 发布,包名从原来的 com.tencent.mm.sdk 修改为 com.tencent.mm.opensdk,需要开发者同步修改对应的 import 语句。
注 4:本文为微信 Android 终端开发工具的新手使用教程,只涉及教授 SDK 的使用方法,默认读者已经熟悉 IDE 的基本使用方法(Android Studio(推荐)或 Eclipse),以及具有一定的编程知识基础等。
注 5:Open SDK for Android 的资源可前往《微信Open SDK for Android》下载。
注意:Eclipse 是 Google 已停止维护的开发工具,新接入项目建议直接使用 Android Studio。
关于 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 环境下:
请前往《微信Open SDK for Android》 下载最新 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>