zoukankan      html  css  js  c++  java
  • 微信开发之消息回复--图片消息(五)

    一、消息格式

     1 <xml>
     2     <ToUserName>
     3         < ![CDATA[toUser] ]>
     4     </ToUserName>
     5     <FromUserName>
     6         < ![CDATA[fromUser] ]>
     7     </FromUserName>
     8     <CreateTime>12345678</CreateTime>
     9     <MsgType>
    10         < ![CDATA[image] ]>
    11     </MsgType>
    12     <Image>
    13         <MediaId>
    14             < ![CDATA[media_id] ]>
    15         </MediaId>
    16     </Image>
    17 </xml>

    二、参数介绍

    参数是否必须说明
    ToUserName 接收方帐号(收到的OpenID)
    FromUserName 开发者微信号
    CreateTime 消息创建时间 (整型)
    MsgType image
    MediaId 通过素材管理中的接口上传多媒体文件,得到的id。

    三、图片消息实体类

     1 public class Image {
     2 
     3     private String MediaId;
     4 
     5     public String getMediaId() {
     6         return MediaId;
     7     }
     8 
     9     public void setMediaId(String mediaId) {
    10         MediaId = mediaId;
    11     }
    12 
    13     @Override
    14     public String toString() {
    15         return "Image [MediaId=" + MediaId + "]";
    16     }
    17     
    18 }
    public class ImageMessage extends BaseMessge{
    
        private Image Image;//
    
        public Image getImage() {
            return Image;
        }
    
        public void setImage(Image image) {
            Image = image;
        }
    
        @Override
        public String toString() {
            return "ImageMessage [Image=" + Image + "]";
        }
        
    }

    四、添加将图片消息转换为xml方法

     1 /**
     2  * 将图片消息转换为xml
     3  * @param imageMessage
     4  * @return
     5  */
     6 public static String imageMessageToXml(ImageMessage imageMessage){
     7     //XStream xStream = new XStream(new StaxDriver());
     8     xStream.alias("xml", imageMessage.getClass());
     9     return xStream.toXML(imageMessage);
    10 }

    五、添加初始化图片消息代码

     1 //初始化图片消息
     2     public static String initImageMessage(String toUserName,String fromUserName){
     3         String message="";
     4         //获取access_token
     5         String access_token = WeixinUtil.getAccessToken().getToken();
     6         String path = "E:/test.jpg";//需替换图片路径
     7         try{
     8             Image image = new Image();
     9             ImageMessage imageMessage = new ImageMessage();
    10             String mediaId = WeixinUtil.upload(path, access_token, "image");
    11             image.setMediaId(mediaId);
    12             imageMessage.setFromUserName(toUserName);
    13             imageMessage.setToUserName(fromUserName);
    14             imageMessage.setMsgType(MsgTypeParam.MESSAGE_IMAGE);
    15             imageMessage.setCreateTime(new Date().getTime()+"");
    16             imageMessage.setImage(image);
    17             message = MessageUtil.imageMessageToXml(imageMessage);
    18             System.err.println(message);
    19         }catch(Exception e){
    20             e.printStackTrace();
    21         }
    22         return message;
    23     }

    六、修改Servlet中的Post方法,加入如下代码:

    if("图片".equals(content)){
        //调用初始化图片消息的方法
        message = InitMsgContentUtil.initImageMessage(toUserName, fromUserName);
    }

    七、项目部署及查看结果  

      向公众号发送信息,看是否能够正常返回信息。效果图如下:

    以上代码中所用到的其他方法全部如下:

    CommUtil 工具类:
      1 package com.weixin.util;
      2 import java.io.BufferedReader;
      3 import java.io.InputStream;
      4 import java.io.InputStreamReader;
      5 import java.io.OutputStream;
      6 import java.io.UnsupportedEncodingException;
      7 import java.net.ConnectException;
      8 import java.net.URL;
      9 import javax.net.ssl.HttpsURLConnection;
     10 import javax.net.ssl.SSLContext;
     11 import javax.net.ssl.SSLSocketFactory;
     12 import javax.net.ssl.TrustManager;
     13 import net.sf.json.JSONException;
     14 import net.sf.json.JSONObject;
     15 import org.apache.http.HttpResponse;
     16 import org.apache.http.HttpStatus;
     17 import org.apache.http.client.HttpClient;
     18 import org.apache.http.client.methods.HttpGet;
     19 import org.apache.http.impl.client.DefaultHttpClient;
     20 import org.apache.http.util.EntityUtils;
     21 import org.slf4j.Logger;
     22 import org.slf4j.LoggerFactory;
     23 
     24 import com.weixin.entity.AccessToken;
     25 
     26 public class CommUtil {
     27 
     28      private static Logger log = LoggerFactory.getLogger(CommUtil.class);  
     29      // 获取access_token的接口地址(GET) 限200(次/天)  
     30      public final static String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";  
     31         
     32      /** 
     33      * 发起https请求并获取结果 
     34      * @param requestUrl 请求地址 
     35      * @param requestMethod 请求方式(GET、POST) 
     36      * @param outputStr 提交的数据 
     37      * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值) 
     38      */  
     39     public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {  
     40         JSONObject jsonObject = null;  
     41         StringBuffer buffer = new StringBuffer();  
     42         try {  
     43             // 创建SSLContext对象,并使用我们指定的信任管理器初始化  
     44             TrustManager[] tm = { new MyX509TrustManager() };  
     45             SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");  
     46             sslContext.init(null, tm, new java.security.SecureRandom());  
     47             // 从上述SSLContext对象中得到SSLSocketFactory对象  
     48             SSLSocketFactory ssf = sslContext.getSocketFactory();  
     49             URL url = new URL(requestUrl);  
     50             HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();  
     51             httpUrlConn.setSSLSocketFactory(ssf);  
     52             httpUrlConn.setDoOutput(true);  
     53             httpUrlConn.setDoInput(true);  
     54             httpUrlConn.setUseCaches(false);  
     55             // 设置请求方式(GET/POST)  
     56             httpUrlConn.setRequestMethod(requestMethod);  
     57             if ("GET".equalsIgnoreCase(requestMethod)){  
     58                 httpUrlConn.connect();  
     59             }
     60             // 当有数据需要提交时  
     61             if (null != outputStr) {  
     62                 OutputStream outputStream = httpUrlConn.getOutputStream();  
     63                 // 注意编码格式,防止中文乱码  
     64                 outputStream.write(outputStr.getBytes("UTF-8"));  
     65                 outputStream.close();  
     66             }  
     67             // 将返回的输入流转换成字符串  
     68             InputStream inputStream = httpUrlConn.getInputStream();  
     69             InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");  
     70             BufferedReader bufferedReader = new BufferedReader(inputStreamReader);  
     71             String str = null;  
     72             while ((str = bufferedReader.readLine()) != null) {  
     73                 buffer.append(str);  
     74             }  
     75             bufferedReader.close();  
     76             inputStreamReader.close();  
     77             // 释放资源  
     78             inputStream.close();  
     79             inputStream = null;  
     80             httpUrlConn.disconnect();  
     81             jsonObject = JSONObject.fromObject(buffer.toString());  
     82         } catch (ConnectException ce) {  
     83             log.error("Weixin server connection timed out.");  
     84         } catch (Exception e) {  
     85             log.error("https request error:{}", e);  
     86         }  
     87         return jsonObject;  
     88     } 
     89     /** 
     90      *  
     91      * @Description: 获取access_token 
     92      * @param appid  
     93      * @param appsecret  
     94      * @Title: getAccessToken 
     95      * @return AccessToken     
     96      * @date: 2015年9月8日 下午2:23:01 
     97      * @author heboy 
     98      */  
     99     public static AccessToken getAccessToken(String appid, String appsecret) {  
    100         AccessToken accessToken = null;  
    101         String requestUrl = ACCESS_TOKEN_URL.replace("APPID", appid).replace("APPSECRET", appsecret);  
    102         JSONObject jsonObject = httpRequest(requestUrl, "GET", null);  
    103         // 如果请求成功  
    104         if (null != jsonObject) {  
    105             try {  
    106                 accessToken = new AccessToken();  
    107                 accessToken.setToken(jsonObject.getString("access_token"));  
    108                 accessToken.setExpiresIn(jsonObject.getInt("expires_in"));  
    109             } catch (JSONException e) {  
    110                 accessToken = null;  
    111                 // 获取token失败  
    112                 log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));  
    113             }  
    114         }  
    115         return accessToken;  
    116     } 
    117     
    118     /**
    119      * URL编码(utf-8)
    120      * @param source
    121      * @return
    122      */
    123     public static String urlEncodeUTF8(String source) {
    124       String result = source;
    125       try {
    126         result = java.net.URLEncoder.encode(source, "utf-8");
    127       } catch (UnsupportedEncodingException e) {
    128         e.printStackTrace();
    129       }
    130       return result;
    131     }
    132     /**
    133      * 获取URL  
    134      * @param url
    135      * @return
    136      */
    137     public static String getUrl(String url){
    138         String result = null;
    139         try {
    140             // 根据地址获取请求
    141             HttpGet request = new HttpGet(url);
    142             // 获取当前客户端对象
    143             HttpClient httpClient = new DefaultHttpClient();
    144             // 通过请求对象获取响应对象
    145             HttpResponse response = httpClient.execute(request);
    146             // 判断网络连接状态码是否正常(0--200都数正常)
    147             if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
    148                 result= EntityUtils.toString(response.getEntity(),"UTF-8");
    149             } 
    150         } catch (Exception e) {
    151             // TODO Auto-generated catch block
    152             e.printStackTrace();
    153         }
    154         return result;
    155     }
    156 }

    WeixinUtil工具类:

      1 package com.weixin.util;
      2 
      3 import java.io.BufferedReader;
      4 import java.io.DataInputStream;
      5 import java.io.DataOutputStream;
      6 import java.io.File;
      7 import java.io.FileInputStream;
      8 import java.io.IOException;
      9 import java.io.InputStreamReader;
     10 import java.io.OutputStream;
     11 import java.net.HttpURLConnection;
     12 import java.net.URL;
     13 import java.security.KeyManagementException;
     14 import java.security.NoSuchAlgorithmException;
     15 import java.security.NoSuchProviderException;
     16 import net.sf.json.JSONObject;
     17 import org.apache.http.HttpEntity;
     18 import org.apache.http.HttpResponse;
     19 import org.apache.http.client.ClientProtocolException;
     20 import org.apache.http.client.methods.HttpGet;
     21 import org.apache.http.client.methods.HttpPost;
     22 import org.apache.http.entity.StringEntity;
     23 import org.apache.http.impl.client.DefaultHttpClient;
     24 import org.apache.http.util.EntityUtils;
     25 import com.weixin.entity.AccessToken;
     26 
     27 public class WeixinUtil {
     28     
     29     public static final String APPID = "替换你的";
     30     public static final String APPSECRET = "替换你的";
     31     //获取acces_token 接口地址
     32     public static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
     33     //上传文件url接口地址
     34     private static final String UPLOAD_URL = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE";
     35     
     36     /**
     37      * Get请求
     38      * @param url
     39      * @return
     40      * 注意事项 添加jsonobject的jar包及依赖jar包
     41      *       添加httpclient,httpcore的 jar包
     42      */
     43     public static JSONObject doGetStr(String url){
     44         DefaultHttpClient httpClient = new DefaultHttpClient();
     45         HttpGet httpGet = new HttpGet(url);
     46         JSONObject jsonObject = null;
     47         try{
     48             HttpResponse response = httpClient.execute(httpGet);
     49             HttpEntity entity = response.getEntity();
     50             if(entity != null){
     51                 String result = EntityUtils.toString(entity,"UTF-8");
     52                 jsonObject = JSONObject.fromObject(result);
     53             }
     54         }catch(ClientProtocolException e){
     55             e.printStackTrace();
     56         }catch(IOException e){
     57             e.printStackTrace();
     58         }
     59         return jsonObject;
     60     }
     61     
     62     /**
     63      * post请求
     64      * @param url
     65      * @param outStr
     66      * @return
     67      */
     68     public static JSONObject doPostStr(String url,String outStr){
     69         DefaultHttpClient httpClient = new DefaultHttpClient();
     70         HttpPost httpPost = new HttpPost(url);
     71         JSONObject jsonObject = null;
     72         try{
     73             httpPost.setEntity(new StringEntity(outStr,"UTF-8"));
     74             HttpResponse response = httpClient.execute(httpPost);
     75             String result = EntityUtils.toString(response.getEntity(),"UTF-8");
     76             jsonObject = JSONObject.fromObject(result);
     77         }catch(Exception e){
     78             e.printStackTrace();
     79         }
     80         return jsonObject;
     81     }
     82     /**
     83      * 获取access_token
     84      * @return
     85      */
     86     public static AccessToken getAccessToken(){
     87         AccessToken token = new AccessToken();
     88         String url = ACCESS_TOKEN_URL.replace("APPID", APPID).replace("APPSECRET", APPSECRET);
     89         JSONObject jsonObject = doGetStr(url);
     90         if(jsonObject != null){
     91             token.setToken(jsonObject.getString("access_token"));
     92             token.setExpiresIn(jsonObject.getInt("expires_in"));
     93         }
     94         System.err.println(jsonObject);
     95         return token;
     96     }
     97     
     98     /**
     99      * 文件上传
    100      * @param filePath路径
    101      * @param accessToken
    102      * @param type 类型
    103      * @return
    104      * @throws IOException
    105      * @throws NoSuchAlgorithmException
    106      * @throws NoSuchProviderException
    107      * @throws KeyManagementException
    108      */
    109     public static String upload(String filePath, String accessToken,String type) throws IOException, NoSuchAlgorithmException, NoSuchProviderException, KeyManagementException {
    110         File file = new File(filePath);
    111         if (!file.exists() || !file.isFile()) {
    112             throw new IOException("文件不存在");
    113         }
    114         String url = UPLOAD_URL.replace("ACCESS_TOKEN", accessToken).replace("TYPE",type);
    115         URL urlObj = new URL(url);
    116         //连接
    117         HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();
    118         con.setRequestMethod("POST"); 
    119         con.setDoInput(true);
    120         con.setDoOutput(true);
    121         con.setUseCaches(false); 
    122         //设置请求头信息
    123         con.setRequestProperty("Connection", "Keep-Alive");
    124         con.setRequestProperty("Charset", "UTF-8");
    125         //设置边界
    126         String BOUNDARY = "----------" + System.currentTimeMillis();
    127         con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
    128         StringBuilder sb = new StringBuilder();
    129         sb.append("--");
    130         sb.append(BOUNDARY);
    131         sb.append("
    ");
    132         sb.append("Content-Disposition: form-data;name="file";filename="" + file.getName() + ""
    ");
    133         sb.append("Content-Type:application/octet-stream
    
    ");
    134         byte[] head = sb.toString().getBytes("utf-8");
    135         //获得输出流
    136         OutputStream out = new DataOutputStream(con.getOutputStream());
    137         //输出表头
    138         out.write(head);
    139         //文件正文部分
    140         //把文件已流文件的方式 推入到url中
    141         DataInputStream in = new DataInputStream(new FileInputStream(file));
    142         int bytes = 0;
    143         byte[] bufferOut = new byte[1024];
    144         while ((bytes = in.read(bufferOut)) != -1) {
    145             out.write(bufferOut, 0, bytes);
    146         }
    147         in.close();
    148         //结尾部分
    149         byte[] foot = ("
    --" + BOUNDARY + "--
    ").getBytes("utf-8");//定义最后数据分隔线
    150         out.write(foot);
    151         out.flush();
    152         out.close();
    153         StringBuffer buffer = new StringBuffer();
    154         BufferedReader reader = null;
    155         String result = null;
    156         try {
    157             //定义BufferedReader输入流来读取URL的响应
    158             reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
    159             String line = null;
    160             while ((line = reader.readLine()) != null) {
    161                 buffer.append(line);
    162             }
    163             if (result == null) {
    164                 result = buffer.toString();
    165             }
    166         } catch (IOException e) {
    167             e.printStackTrace();
    168         } finally {
    169             if (reader != null) {
    170                 reader.close();
    171             }
    172         }
    173         JSONObject jsonObj = JSONObject.fromObject(result);
    174         System.out.println(jsonObj);
    175         String typeName = "media_id";
    176         if(!"image".equals(type)){
    177             typeName = type + "_media_id";
    178         }
    179         String mediaId = jsonObj.getString(typeName);
    180         System.err.println("----"+mediaId);
    181         return mediaId;
    182     }
    183 }

    MyX509TrustManager类

     1 package com.weixin.util;
     2 import java.security.cert.CertificateException;
     3 import java.security.cert.X509Certificate;
     4 import javax.net.ssl.X509TrustManager;
     5 
     6 /**
     7 * 类名: MyX509TrustManager </br>
     8 * 描述:信任管理器 </br>
     9 * 发布版本:V1.0 </br>
    10  */
    11 public class MyX509TrustManager implements X509TrustManager {
    12 
    13     @Override
    14     public X509Certificate[] getAcceptedIssuers() {
    15         return null;
    16     }
    17 
    18     @Override
    19     public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    20     }
    21 
    22     @Override
    23     public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    24     }
    25 }
  • 相关阅读:
    测序分析软件-phred的安装
    测序分析软件-trimmomatic的记录
    linux-ubuntu下fastQC的安装及使用
    linux 下统计文本行数
    linux .gz文件 解压缩命令
    启用谷歌浏览器Adobe Flash Player
    「三代组装」使用Pilon对基因组进行polish
    用BUSCO来评估基因组完整性
    linux tar.gz 文件解压缩
    查看jobs详情
  • 原文地址:https://www.cnblogs.com/jilongfu/p/8377016.html
Copyright © 2011-2022 走看看