Java编程调用微信接口实现图文信息推送功能

本文实例讲述了Java编程调用微信接口实现图文信息等推送功能。分享给大家供大家参考,具体如下:

Java调用微信接口工具类,包含素材上传、获取素材列表、上传图文消息内的图片获取URL、图文信息推送。

微信图文信息推送因注意html代码字符串中将双引号(")替换成单引号('),不然信息页面中包含图片将无法显示且图片后面的内容也不会显示

官方文档:http://mp.weixin.qq.com/wiki/home/

StringBuilder sb=new StringBuilder();
sb.append("{\"articles\":[");
boolean t=false;
for(MicroWechatInfo info:list){
    if(t)sb.append(",");
    Pattern p = Pattern.compile("src\\s*=\\s*'(.*?)'",Pattern.CASE_INSENSITIVE);
    String content = info.getMicrowechatcontent().replace("\"", "'");
   Matcher m = p.matcher(content);
   while (m.find()) {
     String[] str = m.group().split("'");
     if(str.length>1){
        try {
          if(!str[1].contains("//mmbiz.")){
            content = content.replace(str[1], uploadImg(UrlToFile(str[1]),getAccessToken(wx.getAppid(), wx.getAppkey())).getString("url"));
          }
        } catch (Exception e) {
        }
     }
   }
    sb.append("{\"thumb_media_id\":\""+uploadMedia(new File(info.getMicrowechatcover()), getAccessToken(wx.getAppid(), wx.getAppkey()), "image").get("media_id")+"\"," +
        "\"author\":\""+info.getMicrowechatauthor()+"\"," +
        "\"title\":\""+info.getMicrowechattitle()+"\"," +
        "\"content_source_url\":\""+info.getOriginallink()+"\"," +
        "\"digest\":\""+info.getMicrowechatabstract()+"\"," +
        "\"show_cover_pic\":\""+info.getShowcover()+"\"," +
        "\"content\":\""+content+"\"}");
    t=true;
}
sb.append("]}");
package com.xxx.frame.base.util;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import net.sf.json.JSONObject;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.methods.multipart.PartSource;
import org.apache.commons.httpclient.methods.multipart.StringPart;
import org.apache.commons.httpclient.protocol.Protocol;
import com.google.gson.Gson;
import com.xxx.frame.account.entity.MicroWechatAccount;
import com.xxx.frame.account.entity.MicroWechatInfo;
/**
 * 微信工具类
 * @author hxt
 *
 */
public class WeixinUtil {
  public static String appid = "xxxxxxxxxxxxxxxxxxxxxxx";
  public static String secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
  // 素材上传(POST)
 private static final String UPLOAD_MEDIA = "https://api.weixin.qq.com/cgi-bin/material/add_material";
 private static final String UPLOAD_IMG = "https://api.weixin.qq.com/cgi-bin/media/uploadimg";
 private static final String BATCHGET_MATERIAL = "https://api.weixin.qq.com/cgi-bin/material/batchget_material";
 /**
   * 获得ACCESS_TOKEN
   * @param appid
   * @param secret
   * @return ACCESS_TOKEN
   */
  public static String getAccessToken(String appid, String secret) {
    String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret;
    JSONObject jsonObject = httpRequest(url, "GET", null);
    try {
      if(jsonObject.getString("errcode")!=null){
        return "false";
      }
    }catch (Exception e) {
    }
    return jsonObject.getString("access_token");
  }
  public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {
    JSONObject jsonObject = null;
    StringBuffer buffer = new StringBuffer();
    try {
      // 创建SSLContext对象,并使用我们指定的信任管理器初始化
      TrustManager[] tm = { new MyX509TrustManager() };
      SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
      sslContext.init(null, tm, new java.security.SecureRandom());
      // 从上述SSLContext对象中得到SSLSocketFactory对象
      SSLSocketFactory ssf = sslContext.getSocketFactory();
      URL url = new URL(requestUrl);
      HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
      httpUrlConn.setSSLSocketFactory(ssf);
      httpUrlConn.setDoOutput(true);
      httpUrlConn.setDoInput(true);
      httpUrlConn.setUseCaches(false);
      // 设置请求方式(GET/POST)
      httpUrlConn.setRequestMethod(requestMethod);
      if ("GET".equalsIgnoreCase(requestMethod))
        httpUrlConn.connect();
      // 当有数据需要提交时
      if (null != outputStr) {
        OutputStream outputStream = httpUrlConn.getOutputStream();
        // 注意编码格式,防止中文乱码
        outputStream.write(outputStr.getBytes("UTF-8"));
        outputStream.close();
      }
      // 将返回的输入流转换成字符串
      InputStream inputStream = httpUrlConn.getInputStream();
      InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
      BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
      String str = null;
      while ((str = bufferedReader.readLine()) != null) {
        buffer.append(str);
      }
      bufferedReader.close();
      inputStreamReader.close();
      // 释放资源
      inputStream.close();
      inputStream = null;
      httpUrlConn.disconnect();
      jsonObject = JSONObject.fromObject(buffer.toString());
    } catch (ConnectException ce) {
    } catch (Exception e) {
    }
    return jsonObject;
  }
  /**
   * 获得getUserOpenIDs
   * @param accessToken
   * @return JSONObject
   */
  public static JSONObject getUserOpenIDs(String accessToken) {
    String url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token="+accessToken+"&next_openid=";
    return httpRequest(url, "GET", null);
  }
 /**
  * 把二进制流转化为byte字节数组
  * @param instream
  * @return byte[]
  * @throws Exception
  */
 public static byte[] readInputStream(InputStream instream) throws Exception {
  ByteArrayOutputStream outStream = new ByteArrayOutputStream();
  byte[] buffer = new byte[1204];
  int len = 0;
  while ((len = instream.read(buffer)) != -1){
   outStream.write(buffer,0,len);
  }
  instream.close();
  return outStream.toByteArray();
 }
 public static File UrlToFile(String src){
   if(src.contains("http://wx.jinan.gov.cn")){
     src = src.replace("http://wx.jinan.gov.cn", "C:");
     System.out.println(src);
     return new File(src);
   }
   //new一个文件对象用来保存图片,默认保存当前工程根目录
  File imageFile = new File("mmbiz.png");
   try {
     //new一个URL对象
   URL url = new URL(src);
   //打开链接
   HttpURLConnection conn = (HttpURLConnection)url.openConnection();
   //设置请求方式为"GET"
   conn.setRequestMethod("GET");
   //超时响应时间为5秒
   conn.setConnectTimeout(5 * 1000);
   //通过输入流获取图片数据
   InputStream inStream = conn.getInputStream();
   //得到图片的二进制数据,以二进制封装得到数据,具有通用性
   byte[] data = readInputStream(inStream);
   FileOutputStream outStream = new FileOutputStream(imageFile);
   //写入数据
   outStream.write(data);
   //关闭输出流
   outStream.close();
   return imageFile;
    } catch (Exception e) {
      return imageFile;
    }
 }
 /**
  * 微信服务器素材上传
  * @param file 表单名称media
  * @param token access_token
  * @param type type只支持四种类型素材(video/image/voice/thumb)
  */
 public static JSONObject uploadMedia(File file, String token, String type) {
  if(file==null||token==null||type==null){
   return null;
  }
  if(!file.exists()){
   return null;
  }
  String url = UPLOAD_MEDIA;
  JSONObject jsonObject = null;
  PostMethod post = new PostMethod(url);
  post.setRequestHeader("Connection", "Keep-Alive");
  post.setRequestHeader("Cache-Control", "no-cache");
  FilePart media = null;
  HttpClient httpClient = new HttpClient();
  //信任任何类型的证书
  Protocol myhttps = new Protocol("https", new MySSLProtocolSocketFactory(), 443);
  Protocol.registerProtocol("https", myhttps);
  try {
   media = new FilePart("media", file);
   Part[] parts = new Part[] { new StringPart("access_token", token),
     new StringPart("type", type), media };
   MultipartRequestEntity entity = new MultipartRequestEntity(parts,
     post.getParams());
   post.setRequestEntity(entity);
   int status = httpClient.executeMethod(post);
   if (status == HttpStatus.SC_OK) {
    String text = post.getResponseBodyAsString();
    jsonObject = JSONObject.fromObject(text);
   } else {
   }
  } catch (FileNotFoundException execption) {
  } catch (HttpException execption) {
  } catch (IOException execption) {
  }
  return jsonObject;
 }
 /**
  * 微信服务器获取素材列表
  */
 public static JSONObject batchgetMaterial(String appid, String secret,String type, int offset, int count) {
  try {
      return JSONObject.fromObject( new String(HttpsUtil.post(BATCHGET_MATERIAL+"?access_token="+ getAccessToken(appid, secret), "{\"type\":\""+type+"\",\"offset\":"+offset+",\"count\":"+count+"}", "UTF-8"), "UTF-8"));
    } catch (KeyManagementException e) {
      e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return null;
 }
 /**
  * 上传图文消息内的图片获取URL
  * @param file 表单名称media
  * @param token access_token
  */
 public static JSONObject uploadImg(File file, String token) {
  if(file==null||token==null){
   return null;
  }
  if(!file.exists()){
   return null;
  }
  String url = UPLOAD_IMG;
  JSONObject jsonObject = null;
  PostMethod post = new PostMethod(url);
  post.setRequestHeader("Connection", "Keep-Alive");
  post.setRequestHeader("Cache-Control", "no-cache");
  HttpClient httpClient = new HttpClient();
  //信任任何类型的证书
  Protocol myhttps = new Protocol("https", new MySSLProtocolSocketFactory(), 443);
  Protocol.registerProtocol("https", myhttps);
  try {
   Part[] parts = new Part[] { new StringPart("access_token", token), new FilePart("media", file) };
   MultipartRequestEntity entity = new MultipartRequestEntity(parts,
     post.getParams());
   post.setRequestEntity(entity);
   int status = httpClient.executeMethod(post);
   if (status == HttpStatus.SC_OK) {
    String text = post.getResponseBodyAsString();
    jsonObject = JSONObject.fromObject(text);
   } else {
   }
  } catch (FileNotFoundException execption) {
  } catch (HttpException execption) {
  } catch (IOException execption) {
  }
  return jsonObject;
 }
 /**
  * 图文信息推送
  * @param list 图文信息列表
  * @param wx 微信账号信息
  */
  public String send(List<MicroWechatInfo> list,MicroWechatAccount wx){
    StringBuilder sb=new StringBuilder();
    sb.append("{\"articles\":[");
    boolean t=false;
    for(MicroWechatInfo info:list){
      if(t)sb.append(",");
      Pattern p = Pattern.compile("src\\s*=\\s*'(.*?)'",Pattern.CASE_INSENSITIVE);
      String content = info.getMicrowechatcontent().replace("\"", "'");
     Matcher m = p.matcher(content);
     while (m.find()) {
       String[] str = m.group().split("'");
       if(str.length>1){
          try {
            if(!str[1].contains("//mmbiz.")){
              content = content.replace(str[1], uploadImg(UrlToFile(str[1]),getAccessToken(wx.getAppid(), wx.getAppkey())).getString("url"));
            }
          } catch (Exception e) {
          }
       }
     }
      sb.append("{\"thumb_media_id\":\""+uploadMedia(new File(info.getMicrowechatcover()), getAccessToken(wx.getAppid(), wx.getAppkey()), "image").get("media_id")+"\"," +
          "\"author\":\""+info.getMicrowechatauthor()+"\"," +
          "\"title\":\""+info.getMicrowechattitle()+"\"," +
          "\"content_source_url\":\""+info.getOriginallink()+"\"," +
          "\"digest\":\""+info.getMicrowechatabstract()+"\"," +
          "\"show_cover_pic\":\""+info.getShowcover()+"\"," +
          "\"content\":\""+content+"\"}");
      t=true;
    }
    sb.append("]}");
    JSONObject tt = httpRequest("https://api.weixin.qq.com/cgi-bin/material/add_news?access_token="+getAccessToken(wx.getAppid(), wx.getAppkey()), "POST", sb.toString());
    JSONObject jo = getUserOpenIDs(getAccessToken(wx.getAppid(), wx.getAppkey()));
    String outputStr = "{\"touser\":"+jo.getJSONObject("data").getJSONArray("openid")+",\"msgtype\": \"mpnews\",\"mpnews\":{\"media_id\":\""+tt.getString("media_id")+"\"}}";
    httpRequest("https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token="+getAccessToken(wx.getAppid(), wx.getAppkey()), "POST", outputStr);
    return tt.getString("media_id");
  }
}

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java字符与字符串操作技巧总结》、《Java数组操作技巧总结》、《Java数学运算技巧总结》、《Java编码操作技巧总结》和《Java数据结构与算法教程》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • Java微信公众平台开发(13) 微信JSSDK中Config配置

    前端开发工程师和关注前端开发的开发者们在2015年中肯定被腾讯的JSSDk引爆过,搞APP的.搞前端的甚至是是搞后端的都跑过来凑热闹,一时之间也把微信JSSDK捧得特别牛逼,但是在我们的技术眼里它的实现原理和根本是不能够被改变的,这篇文章就不对其js的实现做任何评价和解说了(因为我也不是很懂,哈哈),这里要说的是它的config配置实现,参考文档:http://mp.weixin.qq.com/wiki/11/74ad127cc054f6b80759c40f77ec03db.html  ! 微信

  • Java微信公众平台开发(12) 微信用户信息的获取

    前面的文章有讲到微信的一系列开发文章,包括token获取.菜单创建等,在这一篇将讲述在微信公众平台开发中如何获取微信用户的信息,在上一篇我们有说道微信用户和微信公众账号之间的联系可以通过Openid关联,所以在这里我们就采用openid去获取用户微信信息,并实现一个简单场景应用:当微信新用户关注我们的微信公众平台的时候我们自动回复一篇图文消息,然后在图文消息中标题为:[尊敬的:XXX,你好!],而且在图文消息中的图片就是用户的微信头像,如下图: 有关获取微信用户信息的文档我们可以参照:http:

  • 微信小程序 支付后台java实现实例

    微信小程序 支付后台java实现实例 前言: 前些天使用 LeanCloud 云引擎写了个小程序的支付相关 以前只做过 APP 支付 这次在小程序支付爬了两天的坑 把代码也分享出来 支付流程: 1.小程序前端获取微信 openId 以及订单号 传给后台 2,后台根据 openId 和订单号进行签名 post 微信统一下单接口 3.后台获取微信返回的xml字符串 解析 二次签名以后返回给前端 4.前端调起支付微信支付 API 先看支付函数: //获取支付信息 @EngineFunction("ge

  • java实现微信小程序登录态维护的示例代码

    相信不少喜欢开发的朋友都已经知道微信小程序是个什么物种了,楼主也是从小程序内测期间就开始关注,并且也写过几个已经上线的微信小程序.但是基本上都是写的纯前端,最近楼主从后端到前端写一个完整的小程序项目,中间碰到了一些问题,楼主会找一些个人觉得有学习价值的点不定时的拿出来跟大家分享,希望对你有一些帮助. 本次就从最基本的微信小程序登录态维护开始吧.小程序官方api文档里面有对登录态的一个完整的解释,并且有相关的代码.想看详情,可以出门右转:https://mp.weixin.qq.com/debug

  • Java微信公众平台开发(14) 微信web开发者工具使用

    为帮助开发者更方便.更安全地开发和调试基于微信的网页,微信推出了 web 开发者工具.它是一个桌面应用,通过模拟微信客户端的表现,使得开发者可以使用这个工具方便地在 PC 或者 Mac 上进行开发和调试工作.你可以: 使用自己的微信号来调试微信网页授权 调试.检验页面的 JS-SDK 相关功能与权限,模拟大部分 SDK 的输入和输出 使用基于 weinre 的移动调试功能 利用集成的 Chrome DevTools 协助开发 该工具界面主要由几大部分组成,如下图所示: 顶部菜单栏是刷新.后退.选

  • java服务端微信APP支付接口详解

    一.微信APP支付接入商户服务中心 [申请流程指引] (https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317780&token=84f23b4e9746c5963128711f225476cfd49ccf8c&lang=zh_CN) 二.开始开发 1.配置相关的配置信息 1.1.配置appid(Androi

  • Java实现微信公众平台朋友圈分享功能详细代码

    其实分享的方法在微信官网有较为详细的文档说明,现就其中一些比较绕的步骤进行总结,有问题随时交流哈. 首先微信其实已经自带分享到朋友圈,朋友,qq空间等功能,对于开发微信专门提供了一个接口,可以根据需要修改一些配置.例如修改要分享内容的头像,链接,描述等. 开发步骤: 1.在公众平台配置js-sdk接口 "公众号设置"--"功能设置"--"JS接口安全域名" 2.在要分享的页面引入js http://res.wx.qq.com/open/js/jw

  • Java编程调用微信接口实现图文信息推送功能

    本文实例讲述了Java编程调用微信接口实现图文信息等推送功能.分享给大家供大家参考,具体如下: Java调用微信接口工具类,包含素材上传.获取素材列表.上传图文消息内的图片获取URL.图文信息推送. 微信图文信息推送因注意html代码字符串中将双引号(")替换成单引号('),不然信息页面中包含图片将无法显示且图片后面的内容也不会显示 官方文档:http://mp.weixin.qq.com/wiki/home/ StringBuilder sb=new StringBuilder(); sb.a

  • Java编程调用微信分享功能示例

    本文实例讲述了Java编程调用微信分享功能.分享给大家供大家参考,具体如下: 这篇文章介绍如何使用java开发微信分享功能,因为工作,已经开发完成,可使用. 如果想要自定义微信的分享功能,首先在自己的页面内首先使用AJAX.下面我具体举例. 首先是在页面内写入请求后台的AJAX /** * 调用微信分享接口 * */ public void WXConfig(){ String url = getPara("href"); WXConfigController scan = new W

  • Java编程调用微信支付功能的方法详解

    本文实例讲述了Java编程调用微信支付功能的方法.分享给大家供大家参考,具体如下: 微信开发文档地址:https://mp.weixin.qq.com/wiki/home/ 从调用处开始 我的流程: 1.点击"支付"按钮,去后台 --> 2.后台生成支付所需数据返回页面 --> 3.页面点击"确认支付"调用微信支付js.完成支付功能. 支付按钮 <div class="button" id="pay" onc

  • java调用微信接口实现网页分享小功能

    本文实例为大家分享了java调用微信接口实现网页分享小功能的具体代码,供大家参考,具体内容如下 // 获取access_token  *注意* 经过实际开发测试,微信分享不支持跨域请求,因此获取access_token的请求必须从服务器发起,否则无法获取到access_token所以以下都是服务端操作 微信接口说明参考地址 参考文章:Java微信分享接口开发详解 一.微信util类 public class ShareConstants { //微信获取ticket的接口 public stat

  • 详解使用php调用微信接口上传永久素材

    功能需求 公司新开的公众号需要将公司平台现在的所有精品文章都导入,手动导入会有很多的工作量,所以采用自动化同步文章的方式来达到效果 开发说明 微信open api提供了新增永久素材的接口,本次功能是基于这个接口进行数据同步的 使用到的接口 获取永久素材列表接口:material/batchget_material 新增永久素材接口:material/add_news 新增媒体文件接口:material/add_material 图文类型 单图文(要求有默认的封面,需要提前上传到微信公众号后台)

  • Java编程通过list接口实现数据的增删改查代码示例

    List接口常用的实现ArrayList. 常用方法:add(Object obj)  增加一个元素                      add(int index,Object obj) 在指定索引位置添加元素                      remove(int index) 删除指定位置的元素                      remove(Objiect)  从列表中删除元素                      set(index,Object) 修改指定位

  • java编程调用存储过程中得到新增记录id号的实现方法

    本文实例讲述了java编程调用存储过程中得到新增记录id号的实现方法.分享给大家供大家参考,具体如下: 关于ms sql server2000的存储过程,主要作用是在表test中插入一条记录,然后得到新增加记录的id号. test表三个字段: ID:自动增长 yhm:用户名 字符串类型 kl: 密码   字符串类型 那么在java程序中如何调用这个存储过程才能实现,得到新增加记录的id号 存储过程如下: CREATE PROCEDURE yh_insert @yhm varchar(50),@k

  • C#调用微信接口的相关代码

    调用微信接口前需要准备的内容. 1.微信公众平台的appid 2.微信公众平台的secret 3..获取tokenid 4.获取ticket 5.生成签名的随机串 6.生成签名的时间戳 7.生成签名 具体内容: 1.微信公众平台的appid 2.微信公众平台的secret 这两者需要登录到申请的微信公众平台中去获取,建议写在配置文件中 3.获取tokenid public static string GetWxTokenId() { string token = ""; string

  • Java实现企业微信消息推送功能的详细步骤

    第一步:申请企业微信注册企业(链接:https://work.weixin.qq.com/nl/sem/registe?s=c&from=1011017189&bd_vid=11628667012427618020) 第二步:登录自己的企业微信找到应用管理———>添加应用 第三步:获取到应用的AgentId.Secret.企业id 第四步,准备代码编写: model层代码: package com.toone.itop.formula.function.inte.model; /**

  • 微信公众号服务号推送模板消息设置方法(后端java)

    目录 推送的模板消息示例如下 : 设置模板消息 编码 1. 添加依赖 2. SubscriptionMessageUtil.java 3. 配置参数 4. 使用 微信测试号 总结 模板消息文档 公众号的类型分为服务号.订阅号和企业号,其中服务号和订阅号比较常见.要想实现公众号推动消息给指定的用户,其类型必须为服务号. 推送的模板消息示例如下 : 设置模板消息 此处为正式环境的设置,开发环境可使用微信测试平台提供的测试账号体验和测试公众平台的所有高级接口,无需提前申请审核,详情见本文最后章节. 首

随机推荐