功能简介
实现步骤
java代码 WXAuthorization.java
java代码 WXEntryActivity.java
Android技术生活交流
更多其他页面-自定义View-实用功能合集:点击查看
Android技术生活-QQ交流群:723592501
相关文章信息:
微信开放文档官网:
打开官网
微信开放平台注册账号并注册应用:
打开官网
获取apk签名工具:
点击下载
需导入的SDK:
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
APP可以使用微信进行登录注册账号,国内市场上常见的app几乎都接入了腾讯微信第三方登录功能
大致流程:>> 授权跳转微信->用户登陆微信同意授权后返回参数code->根据code通过GET请求获取 access_token,openId等信息->在用这些信息去获取微信用户数据。最后App就可以根据微信用户数据创建相对应的账户了。
1.在微信开放平台注册开发者帐号,并拥有一个已审核通过的移动应用,并获得相应的
AppID
和AppSecret
,申请微信登录且通过审核后,可开始接入流程。打开官网
2.浏览微信开放文档官网 打开官网
3.项目中导入微信SDKimplementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
4.在AndroidManifest.xml
文件内添加权限
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
5.在项目中创建文件夹命名为
wxapi
,一定要确保文件夹名一致,并且处在包名的下一级。 例如:包名是 com.yfz。那么文件夹wxapi应处在 com.yfz.wxapi
6.在wxapi
文件夹内创建WXAuthorization.java
名字可以自定义(具体代码贴在下方)
7.在wxapi
文件夹内创建WXEntryActivity.java
继承AppCompatActivity
并实现IWXAPIEventHandler
。文件名字要确保一致,不可自定义。(具体代码贴在下方)
8.我们在WXAuthorization.java
里实现微信授权登录,需要3个参数.
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 应用唯一标识,在微信开放平台提交应用审核通过后获得 |
scope | 是 | 应用授权作用域,如获取用户个人信息则填写 snsapi_userinfo |
state | 否 | (可自定义)用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止 csrf 攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加 session 进行校验 |
9.当用户进行授权操作后,会有调起
WXEntryActivity
跳转到微信app,结束操作后我们可以在onResp(BaseResp baseResp)
拿到回调返回的信息
用户点击授权后,微信客户端会被拉起,跳转至授权界面,用户在该界面点击允许或取消,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 |
code | 用户换取 access_token 的 code,仅在 ErrCode 为 0 时有效 |
lang | 微信客户端当前语言 |
country | 微信用户当前国家信息 |
10.我们拿到
code
后,在利用code
通过GET请求获取access_token
和unionid
信息。注意!获取这两个信息最好是从后端获取,因为可能造成安全泄漏,这里只做演示
这里需要4个参数,APPID
,SECRET
,code
和authorization_code
请求连接:https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
参数 | 说明 |
---|---|
APPID | 应用唯一标识,在微信开放平台提交应用审核通过后获得 |
SECRET | 应用SECRET,跟appID一样审核通过后获得。为了确保安全,该参数需要放在后端。写在前端的话可能被人反编译获取,造成安全泄漏 |
CODE | 用户登陆微信并同意授权后,在回调中拿到的code |
authorization_code | 自定义内容 |
GET成功后的参数 | 说明 |
---|---|
access_token | 接口调用凭证 |
expires_in | access_token 接口调用凭证超时时间,单位(秒) |
refresh_token | 用户刷新 access_token |
openid | 授权用户唯一标识 |
scope | 用户授权的作用域,使用逗号(,)分隔 |
unionid | 当且仅当该移动应用已获得该用户的 userinfo 授权时,才会出现该字段 |
11.当GET请求成功后,我们可以获得数据
accessToken
和openid
并再次通过GET请求,去获取用微信用户数据
请求连接: “https://api.weixin.qq.com/sns/userinfo?access_token=” + accessToken + “&openid=” + openid
12.获取微信用户数据成功后,我们就可以使用这些数据(包含微信用户名,头像url等)
创建相对应的用户了。
//Android技术生活-QQ交流群:723592501 public class WXAuthorization { private Activity mActivity; private final static String TAG= WXAuthorization.class.getName(); private final static String APP_ID ="这里写你的appId"; private IWXAPI api; public WXAuthorization(Activity activity) { mActivity = activity; api = WXAPIFactory.createWXAPI(mActivity, APP_ID, true); api.registerApp(APP_ID); mActivity.registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { api.registerApp(APP_ID); } }, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP)); doAuthorizing(); } //Android 平台应用授权登 public void doAuthorizing() { if(api.isWXAppInstalled()) { //检测是否安装了微信 SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; //应用授权作用域,如获取用户个人信息则填写 snsapi_userinfo req.state = "wx_getAuthorization"; //用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止 csrf 攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加 session 进行校验 api.sendReq(req); }else { Toast.makeText(mActivity.getApplicationContext(),"未安装微信",Toast.LENGTH_SHORT).show(); } } }
public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler { private static final String TAG=WXEntryActivity.class.getName(); private static final String APPID = "这里放你的APPID,在微信注册并通过审核后拿到"; private static final String SECRET = "这里放你的SECRET,在微信注册并通过审核后拿到"; private IWXAPI api; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); api = WXAPIFactory.createWXAPI(this, APPID, false); try { Intent intent = getIntent(); api.handleIntent(intent, this); } catch (Exception e) { e.printStackTrace(); } } @Override protected void onNewIntent(Intent intent) { //微信 sdk必须 super.onNewIntent(intent); setIntent(intent); api.handleIntent(intent, this); } private void done() { //微信 sdk完成之后关闭该activity this.finish(); } @Override public void onReq(BaseReq baseReq) { this.done(); } @Override public void onResp(BaseResp baseResp) { switch (baseResp.errCode) { //ERR_OK = 0(用户同意) ERR_AUTH_DENIED = -4(用户拒绝授权) ERR_USER_CANCEL = -2(用户取消) case BaseResp.ErrCode.ERR_OK: Toast.makeText(this,"用户同意微信授权", Toast.LENGTH_SHORT).show(); SendAuth.Resp authResp = (SendAuth.Resp) baseResp; DoGetRequestToGetAccessTokenAndOpenId(APPID,SECRET,authResp.code);//Get请求获取AccessToken和OpenId break; case BaseResp.ErrCode.ERR_USER_CANCEL: Toast.makeText(this,"用户取消微信登陆", Toast.LENGTH_SHORT).show(); break; case BaseResp.ErrCode.ERR_AUTH_DENIED: Toast.makeText(this,"用户拒绝微信授权", Toast.LENGTH_SHORT).show(); break; default: break; } this.done(); } /** * Get请求获取AccessToken和OpenId。这两个信息最好从后端获取,在这里只做演示。 * @param appId * @param secret 因为secret写在前端有被人反编译出来的风险,破坏安全性。 * @param code */ private void DoGetRequestToGetAccessTokenAndOpenId(String appId,String secret,String code){ //用Get网络请求调下面的url连接即可,不过获取AccessToken和OpenId最好从后端获取。 String getUrl_accessToken_unionId = "https://api.weixin.qq.com/sns/oauth2/access_token?" +"appid="+ appId + "&secret="+ secret + "&code=" + code + "&grant_type=authorization_code"; //当Get成功后,在用拿到的 accessToken 和 OpenId 去获取微信用户信息。 DoGetRequestWeChatUserInfo(accessToken,OpenId); } private void DoGetRequestWeChatUserInfo(String accessToken,String OpenId){ //用Get网络请求调下面的url连接即可 String getUrl_WeChatUserInfo = "https://api.weixin.qq.com/sns/userinfo?" +"access_token=" + accessToken +"&openid=" + OpenId; //写个Get请求集合。请求成功后就可以拿到微信用户的信息啦。里面有头像url,昵称,等信息。 }
联系客服