序文
仕事で必要なことがあり、WeChat パブリック アカウントに記事を公開する必要がありました。情報をクエリし、WeChat 開発ドキュメントを参照することで、最終的にそのことに気づきました。WeChat 開発ドキュメント
: https://developers.weixin.qq.com/doc/offiaccount /はじめに /概要.html
1. 準備作業
事前の準備作業を通じて、WeChat パブリックアカウントで記事を公開する機能を実現するには、主に 1. 画像素材をアップロードする 2. 下書きボックスを公開する 3. 下書きの内容を公開する 3 つのステップがあることがわかりました。もちろん、これら 3 つのステップを実装する別の機能として、トークンを取得する機能があります。
1. トークンを取得する
まずエンティティを定義します
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;
}
}
を呼び出して、トークンのアドレス、必要な 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";
}
次にトークンを取得します
/**
* 获取接口访问凭证
*
* @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;
}