A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 考拉是只猫 中级黑马   /  2014-12-2 16:40  /  2180 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在微信服务平台的具体实现中,确实不是一帆风顺的。而且也是在我们公司中投入人员最少的一个项目。刚开始我甚至有些感觉孤立无援。因为,微信的功能测试需要真正发到客户的手机上才能看到效果,可是,由于公司没有提供满足条件的测试服务器,刚开始真的有些措手不及,无从下手。经过几天的资料收集,终于发现一个开源免费的平台——百度网络应用开发平台,虽然比较辛苦,但却很开心,因为终于可以把我们的微信服务平台部署到上面,进行调试和开发了。这是一个全新的旅程,充满挑战和难度。面临多重新技术的学习:

虽然腾讯提供了一些接口,但是还远远不能满足我们的业务需求。所以应用现有的技术,编写一些小的插件来实现接口没有提供的功能就显得势在必行。经过不断的努力和无数次的试验,终于实现了像下行微信消息、提取客户语音文件及图片信息、应用第三方API实现股票查询等这些腾讯接口没用提供的功能,还是得以实现。由于涉及的内容比较多,所以下面就对微信公众平台开发中的结合BAE进行IO操作的一些要点进行整理,主要是为了实现图文消息的上传,和用模拟登陆的方式下载客户发送给公众账号的语音消息、图片消息等。
在这里我写了一个工具类,内容如下:

  1. package com.weinxin.utils;

  2. import com.baidu.inf.iis.bcs.BaiduBCS;
  3. import com.baidu.inf.iis.bcs.auth.BCSCredentials;

  4. public class BaiduBCSTools {

  5.     public static String ACCESSKEY = "F0909c0717a319bb6e2**********";
  6.     public static String SECRETKEY = "84c09d2f43873b15c310**********";
  7.     public static String IMAGE_BUCKET = "myimage";// 图片容器
  8.     public static String VOICE_BUCKET = "hwnvoice";// 音频容器
  9.     public static String OTHER_BUCKET = "otherfile";// 其他类型的容器
  10.     public static String HOST = "bcs.duapp.com";
  11.     // 目录
  12.     public static String IMAGE_FOLDER = "/image/";
  13.     public static String VOICE_FOLDER = "/voice/";
  14.     public static String OTHER_FOLDER = "/other/";
  15.    
  16.     /**
  17.      *
  18.      * 功能说明:  获取BaiduBCS对象      
  19.      * @return BaiduBCS对象
  20.      */
  21.     public static BaiduBCS getBaiduBCS(){
  22.         BCSCredentials credentials = new BCSCredentials(ACCESSKEY, SECRETKEY);
  23.         BaiduBCS baiduBCS = new BaiduBCS(credentials, HOST);
  24.         baiduBCS.setDefaultEncoding("UTF-8"); // Default UTF-8
  25.         return baiduBCS;
  26.     }
  27. }
复制代码

基于此编写的,通过模拟登陆的方式获取微信附件的工具代码如下:


  1. package com.weixin.utils;

  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStream;
  7. import java.net.HttpURLConnection;
  8. import java.net.URL;

  9. import com.baidu.inf.iis.bcs.BaiduBCS;
  10. import com.baidu.inf.iis.bcs.model.ObjectMetadata;
  11. import com.baidu.inf.iis.bcs.request.PutObjectRequest;
  12. import com.baidu.inf.iis.bcs.response.BaiduBCSResponse;
  13. import com.weixin.modules.model.Message;
  14. import com.weixin.utils.MD5;

  15. public class DownLoadUtils {
  16.     public static final String LOGIN_URL = "http://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN";
  17.     public static String DOWNLOAD_URL = "https://mp.weixin.qq.com/cgi-bin/downloadfile?msgid=#msgId&token=";
  18.     public static final String USERNAME = "******@163.com";
  19.     public static final String PASSWORD = "********";
  20.    
  21.     /**
  22.        *
  23.        * 功能说明:  获取登陆微信公众平台后的cookie
  24.        * @return cookie字符串
  25.        * @throws Exception
  26.        */
  27.     public static String getCookies() throws Exception {

  28.         URL url = new URL(LOGIN_URL);
  29.         HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  30.         connection.setDoOutput(true);// 允许连接提交信息
  31.         connection.setRequestMethod("POST");// 网页提交方式“GET”、“POST”
  32.         connection.setRequestProperty("User-Agent",
  33.                 "Mozilla/4.7 [en] (Win98; I)");
  34.         StringBuffer sb = new StringBuffer();
  35.         sb.append("username=" + USERNAME);
  36.         sb.append("&pwd=" + MD5.getMD5(PASSWORD.getBytes())
  37.                 .toUpperCase());
  38.         OutputStream os = connection.getOutputStream();
  39.         os.write(sb.toString().getBytes());
  40.         os.close();

  41.         BufferedReader br = new BufferedReader(new InputStreamReader(
  42.                 connection.getInputStream()));
  43.         String cookieVal = null;
  44.         String response_cookie = "";
  45.         String key=null;
  46.         for (int i = 1; (key = connection.getHeaderFieldKey(i)) != null; i++ ) {
  47.             if (key.equalsIgnoreCase("Set-Cookie")) {
  48.                 cookieVal = connection.getHeaderField(i);
  49.                 cookieVal = cookieVal.substring(0, cookieVal.indexOf(";"));
  50.                 response_cookie = response_cookie + cookieVal + ";";
  51.             }
  52.         }
  53.         System.out.println("response_cookie==" + response_cookie);
  54.         
  55.         String line = br.readLine();
  56.         while (line != null) {
  57.             // 获取token
  58.             if(line.contains("ErrMsg")){
  59.                 DOWNLOAD_URL += line.substring(line.lastIndexOf("=") + 1, line.lastIndexOf("\""));
  60.             }
  61.             line = br.readLine();// 打出登录的网页
  62.         }
  63.         return response_cookie;
  64.     }
  65.    
  66.      /**
  67.       *
  68.       * 功能说明: 下载指定消息ID的文件并保存到百度空间
  69.        * @param msgId 消息ID
  70.       * @param message 消息体
  71.        * @param fileType 文件类型
  72.        * @return 消息保存到百度空间后的名字
  73.        * @throws Exception
  74.        */
  75.     public static String download(String msgId, Message message, String fileType) throws Exception{
  76.         String cookies = getCookies();
  77.         String file_name = null;
  78.         if("voice".equalsIgnoreCase(fileType)){
  79.             file_name = BaiduBCSTools.VOICE_FOLDER + msgId;
  80.         }else if("image".equalsIgnoreCase(fileType)){
  81.             file_name = BaiduBCSTools.IMAGE_FOLDER + msgId;
  82.         }else {
  83.             file_name = BaiduBCSTools.OTHER_FOLDER + msgId;
  84.         }
  85.         String url = DOWNLOAD_URL.replace("#msgId", msgId);
  86.         URL download_url = new URL(url);
  87.         HttpURLConnection download_conn = (HttpURLConnection) download_url
  88.                 .openConnection();
  89.         download_conn.setRequestProperty("Cookie", cookies);// 设置服务器送登录后的cookie
  90.         
  91.         ObjectMetadata metadata = new ObjectMetadata();
  92.         String type = download_conn.getContentType();
  93.         // 后缀名称
  94.         String suffix = type.substring(type.lastIndexOf("/") + 1);
  95.         file_name += "." + suffix;
  96.         System.out.println("type=" + type + ",suffix=" + suffix);
  97.         long length = download_conn.getContentLength();
  98.         if(message != null){
  99. //            message.setFileLength(length + "");
  100.         }
  101.         metadata.setContentType(type);
  102.         metadata.setContentLength(length);
  103.         PutObjectRequest request = null;
  104.         try {
  105.             InputStream in = download_conn.getInputStream();
  106.             BaiduBCS baiduBCS = BaiduBCSTools.getBaiduBCS();
  107.             String bucket = null;
  108.             if("voice".equalsIgnoreCase(fileType)){
  109.                 bucket = BaiduBCSTools.VOICE_BUCKET;
  110.             }else if("image".equalsIgnoreCase(fileType)){
  111.                 bucket = BaiduBCSTools.IMAGE_BUCKET;
  112.             }else {
  113.                 bucket = BaiduBCSTools.OTHER_BUCKET;
  114.             }
  115.             request = new PutObjectRequest(bucket, file_name, in, metadata);
  116.             BaiduBCSResponse<ObjectMetadata> response = baiduBCS.putObject(request);
  117.             ObjectMetadata objectMetadata = response.getResult();
  118.             System.out.println("objectMetadata="+objectMetadata+",request-id="+response.getRequestId());
  119.         } catch (IOException e) {
  120.             e.printStackTrace();
  121.         }
  122.         return file_name;
  123.     }
  124.    
  125.     public static void main(String[] args) {
  126.         String msgId = "5885899705870713317";
  127.         try {
  128.             String file_name = download(msgId, null, "image");
  129.             System.out.println("file_name==" + file_name);
  130.         } catch (Exception e) {
  131.             e.printStackTrace();
  132.         }
  133.     }
  134. }
复制代码







1 个回复

倒序浏览
赞一个。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马