Android 微信登录授权、微信分享

简介: Android 微信登录授权、微信分享

1.先去微信开放平台注册账号,然后创建应用,签名工具下载(在页面最下面),不细说。


创建成功得到appid和secret(注册到微信、获取参数什么的都会用到)


有个注意点,就是添加应用的时候会要签名,你测试的签名跟线上的签名不一样,会出现测试环境下可以调起微信,但是线上发布的不行,原因就是签名的问题,注意及时更换。




2.配置环境,添加依赖



dependencies {
    compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}
dependencies {
    compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}

(其中,前者包含统计功能)



3.添加权限


<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"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


4.注册到微信(在需要的地方调用,比如onCreate)


private static final String APP_ID = "wx......";
    private IWXAPI api;
    private void regToWx() {
        api = WXAPIFactory.createWXAPI(this, APP_ID, true);
        api.registerApp(APP_ID);
    }


5.调用微信登录授权


private void wxLogin() {
        // send oauth request
        SendAuth.Req req = new SendAuth.Req();
        req.scope = "snsapi_userinfo";
        req.state = "wechat_sdk_demo_test";
        api.sendReq(req);
    }



6.在包名下创建wxapi包和WXEntryActivity类(继承Activity并实现IWXAPIEventHandler接口)




public class WXEntryActivity extends Activity implements IWXAPIEventHandler

WXEntryActivity是微信回调的一个类,通常给个透明的主题或者处理完业务逻辑就直接finish。




这个回调是有点绕的(用第三方集成的话就没有这么麻烦...),需要在回调中拿到code,然后再根据code去获取AccessToken,然后再根据AccessToken和OpenId去获取UserInfo。(根据固定的url和参数去请求就能拿到,下面的代码也可以直接用,改改参数就行,请求方式也没有特别要求,官网要求get,反手一个post也拿到了...)




在onCreate中



// 通过WXAPIFactory工厂,获取IWXAPI的实例
        api = WXAPIFactory.createWXAPI(this, GlobalConstant.APP_ID, false);
        api.handleIntent(getIntent(), this);
// 微信发送请求到第三方应用时,会回调到该方法
    @Override
    public void onReq(BaseReq baseReq) {
        LogUtil.i("onReq" + baseReq.getType());
    }




// 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
    @Override
    public void onResp(BaseResp baseResp) {
        // baseresp.getType 1:第三方授权, 2:分享
//        Toast.makeText(this, "baseresp.getType = " + baseResp.getType(), Toast.LENGTH_SHORT).show();
        int result = 0;
        switch (baseResp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
                result = R.string.errcode_success;//发送成功
                String code = ((SendAuth.Resp) baseResp).code;
                LogUtil.i(code);
                getAccessToken(code);
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL://发送取消
                result = R.string.errcode_cancel;
                finish();
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED://发送被拒绝
                result = R.string.errcode_deny;
                break;
            case BaseResp.ErrCode.ERR_UNSUPPORT:
                result = R.string.errcode_unsupported;//不支持错误
                break;
            default:
                result = R.string.errcode_unknown;//发送返回
                break;
        }
        Toast.makeText(this, result, Toast.LENGTH_LONG).show();
    }


/**
     * @param code 根据code再去获取AccessToken
     */
    private void getAccessToken(String code) {
        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
        HttpUtil httpUtil = new HttpUtil();
        Map<String, String> params = new HashMap<>();
        params.put("appid", GlobalConstant.APP_ID);
        params.put("secret", GlobalConstant.SECRET);
        params.put("code", code);
        params.put("grant_type", "authorization_code");
        httpUtil.postRequest(url, params, new MyStringCallBack() {
            @Override
            public void onError(Call call, Exception e, int id) {
                super.onError(call, e, id);
            }
            @Override
            public void onResponse(String response, int id) {
                LogUtil.i(response);
                AccessToken mAccessToken = GsonUtil.GsonToBean(response, AccessToken.class);
                getUserInfo(mAccessToken.access_token, mAccessToken.openid);
            }
        });
    }
/**
     * @param access_token 根据access_token再去获取UserInfo
     */
    private void getUserInfo(String access_token, String openid) {
        String url = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
        HttpUtil httpUtil = new HttpUtil();
        Map<String, String> params = new HashMap<>();
        params.put("access_token", access_token);
        params.put("openid", openid);
        httpUtil.postRequest(url, params, new MyStringCallBack() {
            @Override
            public void onError(Call call, Exception e, int id) {
                super.onError(call, e, id);
            }
            @Override
            public void onResponse(String response, int id) {
                LogUtil.i(response);
                WXUserInfo mWXUserInfo = GsonUtil.GsonToBean(response, WXUserInfo.class);
                ......
                finish();
            }
        });
    }

到此登录授权就结束了




7.微信分享


关于分享的介绍:官方文档,以分享网页为例


private void shareWebPage() {
        //初始化一个WXWebpageObject对象,填写url
        WXWebpageObject wxWebpageObject = new WXWebpageObject();
        wxWebpageObject.webpageUrl = "www.baidu.com";
        //用WXWebpageObject对象初始化一个WXMediaMessage对象,填写标题和描述
        WXMediaMessage wxMediaMessage = new WXMediaMessage(wxWebpageObject);
        wxMediaMessage.title = "网页标题";
        wxMediaMessage.description = "网页描述";
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.icon);//图标
        wxMediaMessage.thumbData = bmpToByteArray(bitmap, true);
        //构造一个Req
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = buildTransaction("webpage");//transaction字段用于唯一标示的一个请求
        req.message = wxMediaMessage;
        req.scene = SendMessageToWX.Req.WXSceneSession;//发送到聊天界面——WXSceneSession
        //调用api接口发送数据到微信
        api.sendReq(req);
    }



附上两个上面用到的方法:


private String buildTransaction(final String type) {
        return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
    }
    public static byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.PNG, 100, output);
        if (needRecycle) {
            bmp.recycle();
        }
        byte[] result = output.toByteArray();
        try {
            output.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }



关于分享类型:

发送到聊天界面——WXSceneSession
发送到朋友圈——WXSceneTimeline
添加到微信收藏——WXSceneFavorite


需要就都写上



流程稍微繁琐,但是没有难度,很多人都说官方文档写的不清不楚,毕竟写文档的人跟没用过的人视角不一样,所以还是多看看文档吧。

目录
相关文章
|
13天前
|
存储 小程序 前端开发
微信小程序与Java后端实现微信授权登录功能
微信小程序极大地简化了登录注册流程。对于用户而言,仅仅需要点击授权按钮,便能够完成登录操作,无需经历繁琐的注册步骤以及输入账号密码等一系列复杂操作,这种便捷的登录方式极大地提升了用户的使用体验
133 12
|
4月前
|
小程序 算法 前端开发
微信小程序---授权登录
微信小程序---授权登录
133 0
|
6月前
|
存储 前端开发 安全
|
6月前
|
存储 小程序 JavaScript
|
6月前
|
开发工具 Android开发
|
6月前
|
小程序 JavaScript API
|
8月前
|
JSON 安全 Java
Spring Security 6.x 微信公众平台OAuth2授权实战
上一篇介绍了OAuth2协议的基本原理,以及Spring Security框架中自带的OAuth2客户端GitHub的实现细节,本篇以微信公众号网页授权登录为目的,介绍如何在原框架基础上定制开发OAuth2客户端。
292 4
Spring Security 6.x 微信公众平台OAuth2授权实战
|
6月前
|
存储 前端开发 Java
|
8月前
|
XML JSON 数据安全/隐私保护
如何使用Fiddler抓取APP接口和微信授权网页源代码
Fiddler是一款强大的抓包工具,用于捕获HTTP/HTTPS流量,包括手机APP和微信授权页面的数据。下载安装Fiddler后,需设置电脑代理,如端口8888,并在手机上配置相同代理,确保两者在同一局域网。通过安装Fiddler证书,可解密HTTPS请求。在手机上打开目标应用或网页,Fiddler将显示请求详情,便于接口调试和数据查看。
317 0
如何使用Fiddler抓取APP接口和微信授权网页源代码

热门文章

最新文章

  • 1
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    14
  • 2
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    28
  • 3
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    34
  • 4
    Android历史版本与APK文件结构
    121
  • 5
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    29
  • 6
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    23
  • 7
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    60
  • 8
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    37
  • 9
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
    73
  • 10
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    121