写这篇文章的初衷在于:市面上的继承方式都是比较老的,故此为了给初级接入者少走弯路,写了这篇文章。
如果大家看官网文档能力比较强,可以看官网继承。我一般继承第三方都是看官网集成,不怎么看别人博客。
官网:链接: [link(https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_Login/Development_Guide.html).
集成步骤
1)准备工作(注册,拿AppID&AppID)
微信开放平台注册开发者账号,并拥有 一个已经审核通过的移动应用(没有则创建等审核通过),并获取相应的AppID & AppSecret ,申请微信登录且通过审核后,可以开始接入流程;
2)提醒
1、目前移动应用上微信登录只提供原生的登录方式,需要用户安装微信客户端才能配合使用。
2、对于Android应用,建议总是显示微信登录按钮,当用户手机没有安装微信客户端时,请引导用户下载安装微信客户端。
授权流程说明
微信 OAuth2.0 授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信 OAuth2.0 的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过 access_token 可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。
微信 OAuth2.0 授权登录目前支持 authorization_code 模式,适用于拥有 server 端的应用授权。该模式整体流程为:
-
第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
-
通过code参数加上AppID和AppSecret等,通过API换取access_token;
-
通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。
我们看一下时序图:
第一步:请求 CODE
移动应用微信授权登录
开发者需要配合使用微信开放平台提供的 SDK 进行授权登录请求接入。正确接入 SDK 后并拥有相关授权域(scope)权限后,开发者移动应用会在终端本地拉起微信应用进行授权登录,微信用户确认后微信将拉起开发者移动应用,并带上授权临时票据(code)。
{
// send oauth request
Final SendAuth.Req req = new SendAuth.Req();
req.scope = “snsapi_userinfo”;
req.state = “wechat_sdk_demo_test”;
api.sendReq(req);
}
appid 是 应用唯一标识,在微信开放平台提交应用审核通过后获得
scope 是 应用授权作用域,如获取用户个人信息则填写 snsapi_userinfo
state 否 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止 csrf 攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加 session 进行校验;
返回说明
用户点击授权后,微信客户端会被拉起,跳转至授权界面,用户在该界面点击允许或取消,SDK 通过 SendAuth 的 Resp 返回数据给调用方。
返回值 说明
ErrCode ERR_OK = 0(用户同意) ERR_AUTH_DENIED = -4(用户拒绝授权) ERR_USER_CANCEL = -2(用户取消)
code 用户换取 access_token 的 code,仅在 ErrCode 为 0 时有效
state 第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用 sendReq 时传入,由微信终端回传,state 字符串长度不能超过 1K
lang 微信客户端当前语言
country 微信用户当前国家信息
;
到此处,我们可以和微信的交互结束,接下来我们就和我们自己的云服务器进行交互;
具体交互是什么样子呢,请往下看(如果看完有人不懂可以加我微信hejunzhuo11,单独开小灶)
因为微信平台建议我们把建议将Appsecret、用户数据(如access_token)放在App云端服务器,由云端中转接口调用请求。 具体为啥这么做呢,其实大家可以思考。(目的其实为了安全性)答案我贴出来:
1. Appsecret 是应用接口使用密钥,泄漏后将可能导致应用数据泄漏、应用的用户数据泄漏等高风险后果;存储在客户端,极有可能被恶意窃取(如反编译获取Appsecret);
2.access_token 为用户授权第三方应用发起接口调用的凭证(相当于用户登录态),存储在客户端,可能出现恶意获取access_token 后导致的用户数据泄漏、用户微信相关接口功能被恶意发起等行为;
3.refresh_token 为用户授权第三方应用的长效凭证,仅用于刷新access_token,但泄漏后相当于access_token 泄漏,风险同上。
扯了这么多我们开始代码集成:
1.申请你的 AppID
请到 开发者应用登记页面 进行登记,登记并选择移动应用进行设置后,将该应用提交审核,只有审核通过的应用才能进行开发。
2.下载 SDK 及 API 文档
Android Studio 环境下:
在 build.gradle 文件中,添加如下依赖即可:
dependencies {
api ‘com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+’
}
3.在代码中使用开发工具包
[1] AndroidManifest.xml 设置
添加必要的权限支持(其中网络权限如果没有使用扫码登录功能非必要;后三个权限,如果没有使用 mta,也非必要,即使有使用 mta,去掉也不影响功能):
[2] 注册到微信
要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的 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));
}
[3] 发送请求或响应到微信
现在,你的程序要发送请求或发送响应到微信终端,可以通过 IWXAPI 的 sendReq 和 sendResp 两个方法来实现。
boolean sendReq(BaseReq req);
实战代码:
case R.id.login_wechat://微信登录
if (wechatTip == 1) return;(防止用户多次点击按钮做的变量阻挡,很多大厂app都没有做,但是我做了,可以向我学习。大家可以不加阻挡,多次点击试试,会有bug。wechatTip 在生命周期里onPause() onResume() 做更改 )
if (wxapi.isWXAppInstalled()) {
ToastUtils.MyToastCenter(“正在启动微信”);
SendAuth.Req req = new SendAuth.Req();
req.scope = "s nsapi_userinfo";
req.state = "manniu_wechat_sdk_callback";
wxapi.sendReq(req);
} else {
ToastUtils.MyToastCenter(“您的设备未安装微信客户端”);
}
**break;**
这个时候不要急, 我们app会唤醒微信app。等微信客户端出现,授权之后,就会返回我们自己app了。同时接收微信给我们的回调;哪里接收回调呢。在这个类(WXEntryActivity)里接收就可以了 。细节如下:
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
/**
* 发送到微信请求的响应结果将回调到onResp方法
* @param baseResp
*/
@Override
public void onResp(BaseResp baseResp) {
SendAuth.Resp authResp = (SendAuth.Resp) baseResp;
String code = authResp.code;
//这个code(临时票据拿到了)
//这里这个code我们就可以和我们后台服务器(服务器自己设计接口)进行交互了; 服务器拿到我们的code服务器就知道微信第三方平台和我们自己的云服务器的账号是否进行绑定了,如果没绑定,ui设计界面进行交互处理,如果已经绑定了我们就可以登录了 (让服务器返回我们可以登录的字段直接登录就好了)
}
}
代码就不贴了,因为涉及到实战项目,不懂得可以加我微信,单独开小灶。