安卓给微信公众号发消息

其实安卓app作为客户端是不需要这个往微信公众号推送消息的功能的,推送消息应该是服务端干的事,不过呢,没有玩过安卓,这次要改安卓里的一个视频云台控制的问题,发现这个安卓的调试也太难了,不晓得这个日志怎么看,就想着把日志发到微信公众号上面去,方便查看,于是乎开始集成!

首先我看了微信公众号的开发文档

https://work.weixin.qq.com/api/doc/90000/90135/90250

文档分客户端API和服务端API

 

 既然要推送消息,那就得看服务端的API了(一开始看Android的开发文档,发现不对劲,后来才发现看的是客户端API,估计因为没有人会把安卓作为服务端,所以这个文档里安卓的只有客户端的API)

服务端的API介绍了获取token和发送文本消息的方式(当然,还有其他接口,只是我只需要这两个接口)

 

 

 

 文档挺清晰的,下面就开始着手集成

首先是考虑到这个token的获取,照抄了项目里原有的访问接口的方式

 

 

 替换下params和url就能访问,还是蛮简单的,万万没想到的是好像并没有那么简单,明明params都传了值,可就是返回参数没有传的错误

 

 

 后来考虑到这个可能是因为post参数和get方式的参数的传递方式不同,这个token的接口是get方式的,于是改成直接拼接字符串的方式传参,果不其然,成功了

 

 

 

 

 

 接下来就是利用获取的token发送文本消息,要仔细看接口说明

 

 

 

 这个access_token传递的方式和下面这个json的传递方式不一样,access_token是url后面拼接的,而其他参数是json格式传递的

项目里原有的传参方式是设置键值对参数集合,很明显不适用这种情况,找到使用参数的地方发现其实就是封装了一个 HttpEntity 对象

 

CTRL + T 查看这个 HttpEntity 对象的继承关系

 

根据多年的开发经验,直觉告诉我,这个 StringEntity 应该就是能够解决我问题的类,我只需要构建自己的数据结构,转成json串,构建这样一个 StringEntity ,传给httpPost, 应该可行,调试后也的确是可行的,代码如下:

 

 

 

 

 接下来考虑到token两个小时才过期,可以保存下来,过期以后才去再次获取

保存的代码:

        /**
     * 初始化的时候调用
     */    
    private void saveToken() {
        SharedPreferences sharedPreferences = context.getSharedPreferences("lcx", Activity.MODE_PRIVATE);
 
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("wxtoken", token);
 
        editor.commit();
    }
    
    /**
     * 初始化的时候调用
     */
    public void getToken() {
        SharedPreferences sharedPreferences = context.getSharedPreferences("lcx", Activity.MODE_PRIVATE);
        String readtoken = sharedPreferences.getString("wxtoken","");
        if (readtoken != null && !"".equals(readtoken)) {
            token = readtoken;
            send("msg: 读取SharedPreferences里的token成功!
token: " + token);
        } else {
            msg = "请求获取token成功!";
            new GetAccessTokenTask().execute(); // 重新获取token
        }
    }    

 

token失效重新获取:

 

 为了保证失效后消息也能在重新获取token后不丢失,在获取token后加上补发的代码

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/LcxSummer/p/13039380.html