发布时间:2025-06-24 18:22:16 作者:北方职教升学中心 阅读量:656
首先需要在微信公众号上把测试的环境弄好。
图文/视频推送就稍微麻烦些步骤分为 上传素材到临时/永久库->上传图文消息->消息推送。请求参数Stringparams ="{\n"+" \"touser\":\""+openId +"\",\n"+" \"template_id\":\""+wxMagPushReq.getTemplateId()+"\",\n"+" \"data\":"+wxMagPushReq.getData()+" }";HttpRequestrequest =HttpUtil.createPost(url);request.body(params);Stringstr =request.execute().body();JSONObjectjson =JSONObject.parseObject(str);Integererrcode =json.getInteger("errcode");if(0!=errcode){list.add(openId);}}returnResult.ok(list);}privateStringgetToken(){Stringurl ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid +"&secret="+secret;
@Value("${weixin.msg.secret}")privateStringsecret;@Value("${weixin.msg.appid}")privateStringappid;privatestaticWxTokenwxToken =newWxToken();@OverridepublicResultwxMsgPush(WxMagPushReqwxMagPushReq){privateStringcontent_source_url;@Schema(description ="图文消息页面的内容")wxToken.setAccessToken(accessToken);wxToken.setExpire(expiresIn);HttpRequestrequest =HttpUtil.createGet(url);StringresultJSON =request.execute().body();JSONObjectjsonObject =JSONObject.parseObject(resultJSON);StringaccessToken =jsonObject.getString("access_token");LongexpiresIn =jsonObject.getLong("expires_in");returnwxToken.getAccessToken();}publicStringgetTokenString(){StringaccessToken =wxToken.getAccessToken();if(accessToken ==null){synchronized(wxToken){if(wxToken.getAccessToken()==null){getToken();}}}returnwxToken.getAccessToken();}
代码中注释掉的tel就是模板中对应的参数名称。返回TokenreturnwxToken.getAccessToken();}publicStringgetTokenString(){StringaccessToken =wxToken.getAccessToken();if(accessToken ==null){synchronized(wxToken){if(wxToken.getAccessToken()==null){getToken();}}}returnwxToken.getAccessToken();}
:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Batch_Sends_and_Originality_Checks.html
:https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/New_temporary_materials.html
:https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index&type=%E5%9F%BA%E7%A1%80%E6%94%AF%E6%8C%81&form=%E5%A4%9A%E5%AA%92%E4%BD%93%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E6%8E%A5%E5%8F%A3%20/media/upload
网上那些都是零零碎碎的,不完整,重新整理下,代码可直接使用。以下是模板方式推送,在图片/视频推送中会使用自定义内容推送演示。privateStringcontent;@Schema(description ="图文消息的描述")privateStringdigest;@Schema(description ="是否显示封面,1为显示,0为不显示")privateIntegershow_cover_pic;}controller
@Operation(summary ="微信公众号消息推送--推送全部用户")@PostMapping("/wxMsgPushAll")publicResultwxMsgPushAll(@RequestBody@ValidWxMagPushAllReqwxMagPushAllReq){returnmessageService.wxMsgPushAll(wxMagPushAllReq);}@Operation(summary ="微信公众号消息推送--上传临时素材")@PostMapping("/addMaterial")publicResultaddMaterial(@RequestParam("media")MultipartFilemedia,@RequestParam("type")Stringtype){returnmessageService.addMaterial(media,type);}@Operation(summary ="微信公众号消息推送--上传图文消息素材")@PostMapping("/uploadnews")publicResultuploadnews(@RequestBody@ValidWxTuwenwxTuwen){returnmessageService.uploadnews(wxTuwen);}
serveice
ResultwxMsgPushAll(WxMagPushAllReqwxMagPushAllReq);ResultaddMaterial(MultipartFilemedia,Stringtype);Resultuploadnews(WxTuwenwxTuwen);
serviceImpl
@Value("${weixin.msg.secret}")privateStringsecret;@Value("${weixin.msg.appid}")privateStringappid;privatestaticWxTokenwxToken =newWxToken();@OverridepublicResultwxMsgPushAll(WxMagPushAllReqwxMagPushAllReq){Stringlist =getWxUserOpenid(getTokenString(),"","");if(StringUtils.isEmpty(list)){returnResult.ok();}Stringurl ="https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token="+getTokenString();Stringparams ="";if("1".equals(wxMagPushAllReq.getType())){params ="{\n"+" \"touser\":["+list.substring(0,list.length()-1)+"],\n"+" \"msgtype\": \"text\",\n"+" \"text\": { \"content\": \""+wxMagPushAllReq.getContent()+"\"}"+" }";}else{params ="{\n"+" \"touser\":["+list.substring(0,list.length()-1)+"],\n"+" \"mpnews\":{n"+" "media_id":""+wxMagPushAllReq.getMediaId()+""n"+"},\n"+" \"msgtype\":\"mpnews\",\n"+" \"send_ignore_reprint\":0\n"+"}";}HttpRequestrequest =HttpUtil.createPost(url);request.body(params);Stringstr =request.execute().body();System.out.println(str);returnResult.ok(str);}@OverridepublicResultaddMaterial(MultipartFilemedia,Stringtype){try{StringmediaId =uploadFile(transferToFile(media),getTokenString(),type);returnResult.ok(mediaId);}catch(Exceptione){thrownewRuntimeException(e);}}@OverridepublicResultuploadnews(WxTuwenwxTuwen){Stringurl ="https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token="+getTokenString();Stringstr =JSONObject.toJSONString(wxTuwen);str ="{"+""articles":["+str +"]"+"}";HttpRequestrequest =HttpUtil.createPost(url);request.body(str);Stringbody =request.execute().body();JSONObjectjsonObject =JSONObject.parseObject(body);returnResult.ok(jsonObject.getString("media_id"));}publicFiletransferToFile(MultipartFilefile){try{FileconvFile =newFile(file.getOriginalFilename());convFile.createNewFile();InputStreamin =file.getInputStream();OutputStreamout =newFileOutputStream(convFile);byte[]bytes =newbyte[1024];intread;while((read =in.read(bytes))!=-1){out.write(bytes,0,read);}returnconvFile;}catch(Exceptione){thrownewRuntimeException();}}publicStringuploadFile(Filefile,StringaccessToken,Stringtype)throwsException{Stringurl1 ="https://api.weixin.qq.com/cgi-bin/media/upload?access_token="+accessToken +"&type="+type;if(!file.exists()||!file.isFile()){thrownewIOException("文件不存在!");}URLurlObj =newURL(url1);HttpURLConnectionconn =(HttpURLConnection)urlObj.openConnection();conn.setRequestMethod("POST");conn.setDoInput(true);conn.setDoOutput(true);conn.setUseCaches(false);conn.setRequestProperty("Connection","Keep-Alive");conn.setRequestProperty("Charset","UTF-8");StringBOUNDARY="----------"+System.currentTimeMillis();conn.setRequestProperty("Content-Type","multipart/form-data;boundary="+BOUNDARY);StringBuildersb =newStringBuilder();sb.append("--");sb.append(BOUNDARY);sb.append("\r\n");sb.append("Content-Disposition:form-data;name=\"file\";filename=\""+file.getName()+"\"\r\n");sb.append("Content-Type:application/octet-stream\r\n\r\n");System.out.println(sb);byte[]head =sb.toString().getBytes("UTF-8");OutputStreamout =newDataOutputStream(conn.getOutputStream());out.write(head);DataInputStreamin =newDataInputStream(newFileInputStream(file));intbytes =0;byte[]bufferOut =newbyte[1024];while((bytes =in.read(bufferOut))!=-1){out.write(bufferOut,0,bytes);}in.close();byte[]foot =("\r\n--"+BOUNDARY+"--\r\n").getBytes("utf-8");out.write(foot);out.flush();out.close();StringBufferbuffer =newStringBuffer();BufferedReaderreader =null;Stringresult =null;reader =newBufferedReader(newInputStreamReader(conn.getInputStream()));Stringline =null;while((line =reader.readLine())!=null){buffer.append(line);}if(result ==null){result =buffer.toString();}reader.close();JSONObjectjson =JSONObject.parseObject(result);System.out.println(json);StringmediaId =json.getString("thumb_media_id");returnresult;}privateStringgetToken(){Stringurl ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid +"&secret="+secret;
微信公众号消息推送大致分为两类,一是文本推送,二是带图片/视频推送。拿到请求路径Stringurl ="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+getTokenString();if(wxMagPushReq ==null||wxMagPushReq.getOpenIdList().size()==0||StringUtils.isEmpty(wxMagPushReq.getData())||StringUtils.isEmpty(wxMagPushReq.getTemplateId())){throwServiceException.error(ErrorCode.PARAM_EXCEPTION,"参数为空");}List<String>list =newLinkedList<>();List<String>collect =wxMagPushReq.getOpenIdList().stream().distinct().collect(Collectors.toList());for(StringopenId :collect){wxToken.setAccessToken(accessToken);wxToken.setExpire(expiresIn);HttpRequestrequest =HttpUtil.createGet(url);StringresultJSON =request.execute().body();JSONObjectjsonObject =JSONObject.parseObject(resultJSON);StringaccessToken =jsonObject.getString("access_token");LongexpiresIn =jsonObject.getLong("expires_in");