JAVA 获取微信公众号发布的文章列表内容

文章目录


代码业务场景

最近在给客户开发一款小程序,然后客户还有自己运营的公众号,想要把公众号里面发布的一些内容能够同步到小程序里面进行展示。如下所示,获取公众号里面的发表记录→发布→发表成功的文章内容,删除的内容是获取不到的。

一、介绍

开始翻了下微信公众号的开发文档,其实文档里面些的很清楚,怎么访问,怎么获取,怎么解析写的一清二处,不清楚的同学可以看下链接:微信开放平台公众号开发文档
看了下网上说的一些还要公众号绑定小程序,其实如果只是单纯的获取公众号里面的文章信息的话,是不需要绑定的,如果要在小程序里面打开公众号返回的文章url的话,才需要绑定。

二、开始操作

1.获取公众号的开发者id(AppID)和开发者密码(AppSecret),以及设置IP白名单

登录微信开放平台,然后用公众号的账号扫描进入,在基本设置里面设置开发者密码和服务器访问的白名单ip,多个ip用回车隔开。

 ​​​

 如本地调试不知道自己本地外网IP的话,可以先不设置,后面debug报错的提示信息里面会有你的ip

如果需要绑定小程序的话,可以点击左侧的小程序管理,没有操作过的话,右边会显示开通。

我自己点击开通点了五六次,等了十分钟才显示出来,不知道是微信的问题还是本地的网络问题。

开通之后,会有添加,填入自己的小程序AppID,即可关联

2.代码操作

package com.ruoyi.common.core.domain.entity.miniprogram;

import java.util.List;

public class OfficialAccountVo {
    private Integer pageIndex;

    private Integer pageSize;

    private Integer totalPage;

    private List<OfficialAccount> objectList;

    public Integer getPageIndex() {
        return pageIndex;
    }

    public void setPageIndex(Integer pageIndex) {
        this.pageIndex = pageIndex;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(Integer totalPage) {
        this.totalPage = totalPage;
    }

    public List<OfficialAccount> getObjectList() {
        return objectList;
    }

    public void setObjectList(List<OfficialAccount> objectList) {
        this.objectList = objectList;
    }
}
package com.ruoyi.common.core.domain.entity.miniprogram;

public class OfficialAccount {
    private String  title;

    private String url;

    private String thumbUrl;

    private String thumbMedialId;

    private String isDelete;

    private String author;

    private String digest;

    private String content;

    private String onlyFansCanComment;

    private String showOverPic;

    private String contentSourceUrl;

    private String needOpenComment;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getThumbUrl() {
        return thumbUrl;
    }

    public void setThumbUrl(String thumbUrl) {
        this.thumbUrl = thumbUrl;
    }

    public String getThumbMedialId() {
        return thumbMedialId;
    }

    public void setThumbMedialId(String thumbMedialId) {
        this.thumbMedialId = thumbMedialId;
    }

    public String getIsDelete() {
        return isDelete;
    }

    public void setIsDelete(String isDelete) {
        this.isDelete = isDelete;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getDigest() {
        return digest;
    }

    public void setDigest(String digest) {
        this.digest = digest;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getOnlyFansCanComment() {
        return onlyFansCanComment;
    }

    public void setOnlyFansCanComment(String onlyFansCanComment) {
        this.onlyFansCanComment = onlyFansCanComment;
    }

    public String getShowOverPic() {
        return showOverPic;
    }

    public void setShowOverPic(String showOverPic) {
        this.showOverPic = showOverPic;
    }

    public String getContentSourceUrl() {
        return contentSourceUrl;
    }

    public void setContentSourceUrl(String contentSourceUrl) {
        this.contentSourceUrl = contentSourceUrl;
    }

    public String getNeedOpenComment() {
        return needOpenComment;
    }

    public void setNeedOpenComment(String needOpenComment) {
        this.needOpenComment = needOpenComment;
    }
}
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.miniprogram.OfficialAccount;
import com.ruoyi.common.core.domain.entity.miniprogram.OfficialAccountVo;
import org.springframework.web.bind.annotation.*;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.*;

@RestController
@RequestMapping("/miniApp/officialAccount")
public class OfficialAccountController {
    /**
     * 获取公众号发布文章列表
     * @param officialAccountVo
     * @return
     * @throws IOException
     */
    @ResponseBody
    @PostMapping(value = "/getContentList")
    private AjaxResult getContentList(@RequestBody OfficialAccountVo officialAccountVo) throws IOException {
        String result1 = getWxAppToken();
        Map<String, Object> token1 = (Map<String, Object>) JSON.parseObject(result1);
//        String path = "https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=" + token1.get("access_token").toString(); --获取素材
        String path = "https://api.weixin.qq.com/cgi-bin/freepublish/batchget?access_token=" + token1.get("access_token").toString();
        //模拟http请求
        URL url = new URL(path);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        connection.setDoOutput(true);
        connection.setRequestProperty("content-type", "application/json");
        connection.connect();
        // post发送的参数
        Map<String, Object> map = new HashMap<>();
        map.put("offset", (officialAccountVo.getPageIndex()-1)* officialAccountVo.getPageSize()); //分页内容起始index
        map.put("count", officialAccountVo.getPageSize());  //显示内容数量
        map.put("no_content", 0);  //1 表示不返回 content 字段,0 表示正常返回,默认为 0
        // 将map转换成json字符串
        String paramBody = JSON.toJSONString(map);
        OutputStream out = connection.getOutputStream();
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
        bw.write(paramBody); // 向流中写入参数字符串
        bw.flush();
        InputStream in = connection.getInputStream();
        byte[] b = new byte[100];
        int len = -1;
        StringBuffer sb = new StringBuffer();
        while ((len = in.read(b)) != -1) {
            sb.append(new String(b, 0, len));
        }
        in.close();
        JSONObject json = JSONObject.parseObject(sb.toString());
        //以上是已经获取到文章列表,下面是视业务场景进行json操作,如不需要则直接返回sb.toString()。
        //取出json中的item
        String item = json.getString("item");
        //查看返回的总数
        String total = json.getString("total_count");
        officialAccountVo.setTotalPage(Integer.valueOf(total));
        List<OfficialAccount> arrayList = new ArrayList<>();
        //如果返回的列表总数为0就没必要解析了
        if(Integer.valueOf(total)>0) {
            //item为数组json类型,这时需要转换成JSONArray
            JSONArray jsonArray = JSONObject.parseArray(item);
            int size = jsonArray.size();
            List<String> contentList = new ArrayList<>();
            for (int i = 0; i < size; i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                String content = jsonObject.getString("content");
                contentList.add(content);
            }
           //解析文章内容
            contentList.forEach(data -> {
                //content为文章模块
                JSONObject jsonObject = JSON.parseObject(data);
                //取出文章列表信息并转成json
                String news = jsonObject.getString("news_item");
                JSONArray jsonArray1 = JSONObject.parseArray(news);
                //循环数组json
                for (int i = 0; i < jsonArray1.size(); i++) {
                    JSONObject jsonObject1 = jsonArray1.getJSONObject(i);
                    OfficialAccount jsonEntity = new OfficialAccount();
                    jsonEntity.setThumbUrl(jsonObject1.getString("thumb_url"));
                    jsonEntity.setThumbMedialId(jsonObject1.getString("thumb_media_id"));
                    jsonEntity.setIsDelete(jsonObject1.getString("is_deleted"));
                    jsonEntity.setAuthor(jsonObject1.getString("author"));
                    jsonEntity.setOnlyFansCanComment(jsonObject1.getString("only_fans_can_comment"));
                    jsonEntity.setDigest(jsonObject1.getString("digest"));
                    jsonEntity.setShowOverPic(jsonObject1.getString("show_cover_pic"));
                    jsonEntity.setContentSourceUrl(jsonObject1.getString("content_source_url"));
                    jsonEntity.setNeedOpenComment(jsonObject1.getString("need_open_comment"));
                    jsonEntity.setTitle(jsonObject1.getString("title"));
                    jsonEntity.setContent(jsonObject1.getString("content"));
                    jsonEntity.setUrl(jsonObject1.getString("url"));
                    arrayList.add(jsonEntity);
                }
            });
        }
        officialAccountVo.setObjectList(arrayList);
        return AjaxResult.success(officialAccountVo);
    }


    /**
     * 获取公众号token
     * @return
     * @throws MalformedURLException
     * @throws IOException
     * @throws ProtocolException
     */
    private String getWxAppToken() throws MalformedURLException, IOException, ProtocolException {
        String path = " https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential";
        String appid = "*******"; //公众号的开发者ID(AppID)
        String secret = "*******"; //公众号的开发者密码(AppSecret)
        URL url = new URL(path + "&appid=" + appid + "&secret=" + secret);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
        connection.connect();
        InputStream in = connection.getInputStream();
        byte[] b = new byte[100];
        int len = -1;
        StringBuffer sb = new StringBuffer();
        while ((len = in.read(b)) != -1) {
            sb.append(new String(b, 0, len));
        }
        in.close();
        return sb.toString();
    }
}

上面最后一段代码里面需要讲自己公众号的AppIDAppSecret替换进去;

不知道自己本地外网ip的话,可以在这里打个断点,会提示你的ip信息不在白名单访问名单里面,然后去公众号平台里面添加一下就可以本地测试了

 本地测试结果:


总结

  代码也比较简单,参考开发文档直接写就好了,有不对的地方还希望各位多多指教。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: 要获取微信公众号的code,需要使用Java编程语言和微信公众号的开发接口。以下是详细步骤: 第一步,通过微信官方网站注册一个公众,并在开发者下载微信公众号的SDK。 第二步,使用Java进行开发,编写相应的代码,实现接收微信公众平台的消息、回复微信公众平台的消息等功能。同时,在代码需要配置微信公众平台的各种参数,例如APPID、APPSECRET、SIGNATURE等。 第三步,通过调用微信公众平台提供的接口获取微信公众号的code。 在Java代码,可以使用HttpClient这个类库来请求微信公众平台提供的获取code的接口,然后通过解析返回的json数据,获取到相应的code。 最后,获取到code之后,可以使用该code来获取access_token等重要信息,在公众开发应用。通过这些方法,可以成功获取微信公众号的code,进而实现更加多样化的公众开发。 ### 回答2: Java 获取微信公众号code 的方法有以下两种: 1. 使用微信官方提供的开发接口 微信官方提供了开发者工具包 Weixin-java-tools,其包含了获取微信公众号code 的方法。 具体步骤如下: a. 在 pom.xml 文件引入 Weixin-java-tools 工具包: ```xml <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-tools</artifactId> <version>3.4.0</version> </dependency> ``` b. 在代码调用 Weixin-java-tools 的方法实现获取 code: ```java public String getCode() throws WxErrorException { WxMpService wxMpService = new WxMpServiceImpl(); wxMpService.setWxMpConfigStorage(wxMpInMemoryConfigStorage); String redirectUrl = wxMpService.oauth2buildAuthorizationUrl( "http://example.com/wx/oauth/callback", WxConsts.OAuth2Scope.SNSAPI_USERINFO, null); return redirectUrl; } ``` 2. 使用第三方开源库 除了使用微信官方提供的工具包外,还有第三方开源库 WeChat-Java-SDK,也可以实现获取微信公众号 code。 具体步骤如下: a. 在 pom.xml 文件引入 WeChat-Java-SDK 工具包: ```xml <dependency> <groupId>com.github.sd4324530</groupId> <artifactId>wechat-java-sdk</artifactId> <version>1.3.8.2</version> </dependency> ``` b. 在代码调用 WeChat-Java-SDK 的方法实现获取 code: ```java public String getCode() { WeChat weChat = new WeChat(config); String redirectUrl = weChat.getOpenOauthUrl(WxConsts.OAuth2Scope.SNSAPI_USERINFO, callbackUrl, null); return redirectUrl; } ``` 以上就是 Java 获取微信公众号 code 的两种方法,开发者可以根据自己的需求选择相应的方法。 ### 回答3: 在 Java 获取微信公众号 code 通常涉及到两个主要步骤,首先是在前端页面获取 code,然后是使用 Java 后端将 code 传递给微信服务器进行验证,最终获得用户信息。 第一步,前端页面获取 code 在前端页面获取微信公众号 code 可以通过使用微信官方提供的 JS-SDK 来实现。首先需要在页面引入 JS-SDK,然后使用微信提供的方法获取 code。其获取 code 的过程需要用户在微信客户端内打开并登录公众,否则获取 code 会失败。 以下是获取 code 的示例代码: ```javascript $.ajax({ type: 'GET', url: 'https://open.weixin.qq.com/connect/oauth2/authorize?appid={APPID}&redirect_uri={REDIRECT_URI}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect', dataType: 'json', success: function (data) { var code = data.code; console.log(code); }, error: function (xhr, errorType, error) { console.log(error); } }); ``` 在以上代码,{APPID} 是公众的 AppID,{REDIRECT_URI} 指定了用户授权后重定向的页面路径。获取到的 code 可以通过 AJAX 请求发送到后端进行验证。 第二步,使用 Java 后端将 code 传递给微信服务器进行验证 在 Java 后端,我们可以通过使用 Spring 框架提供的 RestTemplate 类进行 HTTP 请求。同样需要注意的是,在进行 HTTP 请求之前需要在公众后台配置安全域名,否则会出现请求失败的情况。 以下是使用 RestTemplate 类进行 HTTP 请求的示例代码: ```java RestTemplate restTemplate = new RestTemplate(); String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={APPID}&secret={SECRET}&code={CODE}&grant_type=authorization_code"; String appId = "****"; // 公众的 AppID String secret = "****"; // 公众的 AppSecret String code = "****"; // 前端获取到的 code String result = restTemplate.getForObject(url, String.class, appId, secret, code); System.out.println(result); ``` 以上代码,url 指定了微信接口的地址和参数,其 appId、secret 和 code 分别是公众的 AppID、AppSecret 和前端获取到的 code。getForObject() 方法用于发送 HTTP GET 请求,并返回接口返回的字符串结果。 最终,我们可以通过解析微信接口返回的 JSON 字符串,获取用户的 openid、access_token 等信息。获取到用户信息后,我们可以将其存储到数据库,或者再次发送 HTTP 请求获取更多信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值