java对接微信公众号发布文章

前言

在工作中遇到一个需求,需要向微信公众号发布文章,通过查询资料以及查阅微信的开发文档,最终实现.
微信开发文档:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html

一.准备工作

通过前期的准备工作我们发现,想要实现微信公众号发布文章的功能,主要分为三步.1.上传图片素材2.发布草稿箱3.将草稿箱内容发布出去.当然,还有一个功能贯彻这三部,就是获取token.

1.获取token

首先定义实体

package com.sinosoft.springbootplus.znts.domain.entity;
/**
 * json格式化accessToken
 * @author   mc
 * @version  1.0
 * @创建时间 2023年3月07日
 * @修改时间 2023年3月07日
 */
public class Token {
    // 接口访问凭证
    private String accessToken;
    // 凭证有效期,单位:秒
    private int expiresIn;

    public String getAccessToken() {
        return accessToken;
    }

    public void setAccessToken(String accessToken) {
        this.accessToken = accessToken;
    }

    public int getExpiresIn() {
        return expiresIn;
    }

    public void setExpiresIn(int expiresIn) {
        this.expiresIn = expiresIn;
    }
}

调用获取token的地址,和所需的appid(凭证)以及appsecret(密钥).

 package com.sinosoft.springbootplus.znts.utils;
/**
 * 微信常量定义
 * 版权:(C) 版权所有 2015-2018 中科软科技股份有限公司
 * <功能名称>
 * <详细描述>
 * @author   mc
 * @version  1.0
 * @创建时间 2021年12月30日
 * @修改时间 2021年12月30日
 */
public class ConstantUtil {
    // 公众号开发者APPID  
    public final static String app_id = "";
    // 公众号开发者密码  
    public final static String app_secret = "";
    // 凭证获取(GET)
    public final static String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
    // 获取用户openid集合
    //发布
    public final static String sendSucaiUrl = "https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=ACCESS_TOKEN";

    //上传素材
    public final static String uploadUrl = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN";

    //发布
    public final static String ufabuUrl = "https://api.weixin.qq.com/cgi-bin/freepublish/submit?access_token=ACCESS_TOKEN";

    //新增草稿
    public final static String sendtemplateUrl = "https://api.weixin.qq.com/cgi-bin/draft/add?access_token=ACCESS_TOKEN";

}

然后获取token

    /**
     * 获取接口访问凭证
     *
     * @param appid 凭证
     * @param appsecret 密钥
     * @return
     */
    public static Token getToken(String appid, String appsecret) {
        Token token = null;
        String requestUrl = ConstantUtil.token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
        // 发起GET请求获取凭证
        JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);

        if (null != jsonObject) {
            try {
                token = new Token();
                token.setAccessToken(jsonObject.getString("access_token"));
                token.setExpiresIn(jsonObject.getInt("expires_in"));
            } catch (JSONException e) {
                token = null;
                // 获取token失败
                log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
            }
        }
        return token;
    }

2.上传图片素材

上传图片主要是因为在新增草稿箱时需要图片来做封面,还必须是永久的,所以在调用时需注意不要选错接口
在这里插入图片描述
在这里插入图片描述

    public String uploadimg() throws IOException {

        final File file = new File("D:\\software\\3.jpg");

        RequestBody fileBody = RequestBody.create(file,okhttp3.MediaType.parse(MediaType.APPLICATION_OCTET_STREAM_VALUE));
        MultipartBody body = new MultipartBody.Builder()
                .setType(Objects.requireNonNull(okhttp3.MediaType.parse("multipart/form-data")))
                .addFormDataPart("media",file.getName(),fileBody)
                .build();
        Request request = new Request.Builder()
                .post(body)
                .url("https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=" + CommonUtil.getToken(ConstantUtil.app_id, ConstantUtil.app_secret).getAccessToken() + "&type=image").build();
        final String string = Objects.requireNonNull(client.newCall(request).execute().body()).string();
        log.info(string);
        return string;
    }

在这里插入图片描述
上传成功后拿到media_id即可,这里需要注意如果上传失败,有可能是图片涉及敏感字,可以先换一张照片试一下.

3.新增草稿

在这里插入图片描述

    /**
     * 新增草稿想
     * @return
     */
    public static String addDraft(String title,String author,String content){
        Object mediaId;
        String access_token = "";
        String strResult = "";
        try {
            JSONObject EventTraceInput = new JSONObject();
            access_token = CommonUtil.getToken(ConstantUtil.app_id, ConstantUtil.app_secret).getAccessToken();
            String url = ConstantUtil.sendtemplateUrl.replace("ACCESS_TOKEN", access_token);
            JSONArray EventArray = new JSONArray();
            JSONObject jsonArray = new JSONObject();
            jsonArray.put("title", title);
            jsonArray.put("author", author);
            jsonArray.put("content", content);
            jsonArray.put("thumb_media_id", "");
            jsonArray.put("need_open_comment", 0);
            jsonArray.put("only_fans_can_comment", 0);
            EventArray.add(jsonArray);
            EventTraceInput.put("articles", EventArray);
            strResult = WX_TemplateMsgUtil.sendPost(EventTraceInput, url);
            JSONObject jsonObject = JSONObject.parseObject(strResult);
            mediaId = jsonObject.get("media_id");
        }catch (Exception e){
            log.error("调用微信公众号接口出错,access_token为:【{}】,调用草稿箱接口返回值为:【{}】", access_token,strResult);
            throw new BusinessException(e.getMessage());
        }
       return mediaId.toString();
    }

在这里我们只需要根据接口文档的信息传入想对应的值即可,thumb_media_id是上一步上传永久素材返回的media_id

4.发布文章

发布文章就比较简单了,只需要上传上一步上传草稿返回的media_id即可,具体代码如下:

  /**
     * 发布
     * @return
     */
    public static String publishWx(String mediaId){
        String info="";
        String access_token="";
      try{
        access_token = CommonUtil.getToken(ConstantUtil.app_id, ConstantUtil.app_secret).getAccessToken();
        String url = ConstantUtil.sendSucaiUrl.replace("ACCESS_TOKEN",access_token);
        JSONObject jsonObject = new JSONObject();
        //素材的类型,图片(image)、视频(video)、语音 (voice)、图文(news)
        jsonObject.put("media_id", mediaId);
        //发起POST请求
        info = WX_TemplateMsgUtil.sendPost(jsonObject, url);
      }catch (Exception e){
          log.error("调用微信公众号接口出错,access_token为:【{}】,调用发布文章接口返回值为:【{}】", access_token,info);
          throw new BusinessException(e.getMessage());
      }
       return info;
    }
### 回答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 请求获取更多信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值