打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
android安卓集成接入微信sdk登陆,wechat集成详细步骤-实用功能系列_wechat-sdk-android-without-mta
userphoto

2023.11.24 北京

关注

android安卓集成wechat SDK 微信登录

    • 功能简介

    • 实现步骤

    • 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.在微信开放平台注册开发者帐号,并拥有一个已审核通过的移动应用,并获得相应的 AppIDAppSecret,申请微信登录且通过审核后,可开始接入流程。打开官网
2.浏览微信开放文档官网 打开官网
3.项目中导入微信SDK implementation '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 返回数据给调用方

返回值说明
ErrCodeERR_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_tokenunionid信息。注意!获取这两个信息最好是从后端获取,因为可能造成安全泄漏,这里只做演示
这里需要4个参数,APPIDSECRETcodeauthorization_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_inaccess_token 接口调用凭证超时时间,单位(秒)
refresh_token用户刷新 access_token
openid授权用户唯一标识
scope用户授权的作用域,使用逗号(,)分隔
unionid当且仅当该移动应用已获得该用户的 userinfo 授权时,才会出现该字段

11.当GET请求成功后,我们可以获得数据accessTokenopenid并再次通过GET请求,去获取用微信用户数据
请求连接: “https://api.weixin.qq.com/sns/userinfo?access_token=” + accessToken + “&openid=” + openid
12.获取微信用户数据成功后,我们就可以使用这些数据(包含微信用户名,头像url等)创建相对应的用户了。

java代码 WXAuthorization.java

//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();
        }
    }
}

java代码 WXEntryActivity.java

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,昵称,等信息。
    }

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Django微信公众号开发(一)公众号内网页授权登录后微信获取用户信息
PHP实现一个二维码同时支持支付宝和微信支付
微信公众号支付功能开发
微信获取用户信息的两个接口和两个ACCESS_TOKEN
网站应用微信登录
Django Wechat: 为博客添加微信公众号查询
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服