• 谈谈微信公众平台开发


    说实话,在进行微信服务平台开发之前,我基本上没怎么使用过微信。但是,任务安排后,我查找了好多资料,然后摸索着整理和设计开发,虽然没有实现全部需要的功能,但也为公司进行微信相关项目的演示做出了一定的努力。

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

    1、程序技术架构的学习

    在这之前虽然也开发过许多web项目,但是Spring MVC还是头一次使用,还好有struts和spring的基础,使用起来还是很容易上手。

    2、百度网络应用平台的学习使用

    这是一个全新的挑战,对于用惯了集成开发工具的我来说,使用它进行代码开发感觉并不太习惯,还好百度提供了基于eclipse的开发插件,使开发变得容易很多。但由于云环境的安全性的控制,一些功能的开发要比之前复杂许多,如IO的一些操作,经过不懈的努力和对相关SDK的学习,最终还是克服了种种限制,实现了我们需要的功能。

    3、微信接口的局限性
    虽然腾讯提供了一些接口,但是还远远不能满足我们的业务需求。所以应用现有的技术,编写一些小的插件来实现接口没有提供的功能就显得势在必行。经过不断的努力和无数次的试验,终于实现了像下行微信消息、提取客户语音文件及图片信息、应用第三方API实现股票查询等这些腾讯接口没用提供的功能,还是得以实现。

    由于涉及的内容比较多,所以下面就对微信公众平台开发中的结合BAE进行IO操作的一些要点进行整理,主要是为了实现图文消息的上传,和用模拟登陆的方式下载客户发送给公众账号的语音消息、图片消息等。
    在这里我写了一个工具类,内容如下:

    package com.weinxin.utils;
    
    import com.baidu.inf.iis.bcs.BaiduBCS;
    import com.baidu.inf.iis.bcs.auth.BCSCredentials;
    
    public class BaiduBCSTools {
    
        public static String ACCESSKEY = "F0909c0717a319bb6e2**********";
        public static String SECRETKEY = "84c09d2f43873b15c310**********";
        public static String IMAGE_BUCKET = "myimage";// 图片容器
        public static String VOICE_BUCKET = "hwnvoice";// 音频容器
        public static String OTHER_BUCKET = "otherfile";// 其他类型的容器
        public static String HOST = "bcs.duapp.com";
        // 目录
        public static String IMAGE_FOLDER = "/image/";
        public static String VOICE_FOLDER = "/voice/";
        public static String OTHER_FOLDER = "/other/";
        
        /**
         * 
         * 功能说明:  获取BaiduBCS对象      
         * @return BaiduBCS对象
         */
        public static BaiduBCS getBaiduBCS(){
            BCSCredentials credentials = new BCSCredentials(ACCESSKEY, SECRETKEY);
            BaiduBCS baiduBCS = new BaiduBCS(credentials, HOST);
            baiduBCS.setDefaultEncoding("UTF-8"); // Default UTF-8
            return baiduBCS;
        }
    }
    View Code

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

    package com.weixin.utils;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    import com.baidu.inf.iis.bcs.BaiduBCS;
    import com.baidu.inf.iis.bcs.model.ObjectMetadata;
    import com.baidu.inf.iis.bcs.request.PutObjectRequest;
    import com.baidu.inf.iis.bcs.response.BaiduBCSResponse;
    import com.weixin.modules.model.Message;
    import com.weixin.utils.MD5;
    
    public class DownLoadUtils {
        public static final String LOGIN_URL = "http://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN";
        public static String DOWNLOAD_URL = "https://mp.weixin.qq.com/cgi-bin/downloadfile?msgid=#msgId&token=";
        public static final String USERNAME = "******@163.com";
        public static final String PASSWORD = "********";
        
        /**
           * 
           * 功能说明:  获取登陆微信公众平台后的cookie
           * @return cookie字符串
           * @throws Exception
           */
        public static String getCookies() throws Exception {
    
            URL url = new URL(LOGIN_URL);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);// 允许连接提交信息
            connection.setRequestMethod("POST");// 网页提交方式“GET”、“POST”
            connection.setRequestProperty("User-Agent",
                    "Mozilla/4.7 [en] (Win98; I)");
            StringBuffer sb = new StringBuffer();
            sb.append("username=" + USERNAME);
            sb.append("&pwd=" + MD5.getMD5(PASSWORD.getBytes())
                    .toUpperCase());
            OutputStream os = connection.getOutputStream();
            os.write(sb.toString().getBytes());
            os.close();
    
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            String cookieVal = null;
            String response_cookie = "";
            String key=null;
            for (int i = 1; (key = connection.getHeaderFieldKey(i)) != null; i++ ) {
                if (key.equalsIgnoreCase("Set-Cookie")) {
                    cookieVal = connection.getHeaderField(i);
                    cookieVal = cookieVal.substring(0, cookieVal.indexOf(";"));
                    response_cookie = response_cookie + cookieVal + ";";
                }
            }
            System.out.println("response_cookie==" + response_cookie);
            
            String line = br.readLine();
            while (line != null) {
                // 获取token
                if(line.contains("ErrMsg")){
                    DOWNLOAD_URL += line.substring(line.lastIndexOf("=") + 1, line.lastIndexOf("""));
                }
                line = br.readLine();// 打出登录的网页
            }
            return response_cookie;
        }
        
         /**
          * 
          * 功能说明: 下载指定消息ID的文件并保存到百度空间
           * @param msgId 消息ID
          * @param message 消息体
           * @param fileType 文件类型
           * @return 消息保存到百度空间后的名字
           * @throws Exception
           */
        public static String download(String msgId, Message message, String fileType) throws Exception{
            String cookies = getCookies();
            String file_name = null;
            if("voice".equalsIgnoreCase(fileType)){
                file_name = BaiduBCSTools.VOICE_FOLDER + msgId;
            }else if("image".equalsIgnoreCase(fileType)){
                file_name = BaiduBCSTools.IMAGE_FOLDER + msgId;
            }else {
                file_name = BaiduBCSTools.OTHER_FOLDER + msgId;
            }
            String url = DOWNLOAD_URL.replace("#msgId", msgId);
            URL download_url = new URL(url);
            HttpURLConnection download_conn = (HttpURLConnection) download_url
                    .openConnection();
            download_conn.setRequestProperty("Cookie", cookies);// 设置服务器送登录后的cookie
            
            ObjectMetadata metadata = new ObjectMetadata();
            String type = download_conn.getContentType();
            // 后缀名称
            String suffix = type.substring(type.lastIndexOf("/") + 1);
            file_name += "." + suffix;
            System.out.println("type=" + type + ",suffix=" + suffix);
            long length = download_conn.getContentLength();
            if(message != null){
    //            message.setFileLength(length + "");
            }
            metadata.setContentType(type);
            metadata.setContentLength(length);
            PutObjectRequest request = null;
            try {
                InputStream in = download_conn.getInputStream();
                BaiduBCS baiduBCS = BaiduBCSTools.getBaiduBCS();
                String bucket = null;
                if("voice".equalsIgnoreCase(fileType)){
                    bucket = BaiduBCSTools.VOICE_BUCKET;
                }else if("image".equalsIgnoreCase(fileType)){
                    bucket = BaiduBCSTools.IMAGE_BUCKET;
                }else {
                    bucket = BaiduBCSTools.OTHER_BUCKET;
                }
                request = new PutObjectRequest(bucket, file_name, in, metadata);
                BaiduBCSResponse<ObjectMetadata> response = baiduBCS.putObject(request);
                ObjectMetadata objectMetadata = response.getResult();
                System.out.println("objectMetadata="+objectMetadata+",request-id="+response.getRequestId());
            } catch (IOException e) {
                e.printStackTrace();
            }
            return file_name;
        }
        
        public static void main(String[] args) {
            String msgId = "5885899705870713317";
            try {
                String file_name = download(msgId, null, "image");
                System.out.println("file_name==" + file_name);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    View Code

    文章转自网络,是JSP的,有机会翻译成asp.net版本的

  • 相关阅读:
    NFS与通配符
    yum管理RPM包与linux网络设置
    git常用命令总结——覆盖日常开发全操作
    inner join on会过滤掉两边空值的条件
    入园第一天
    P3750 [六省联考2017]分手是祝愿 题解
    CSP2021 爆零记
    CSP 前模板记录(黄题篇)
    对拍
    2021.10.20CSP模拟模拟赛 赛后总结
  • 原文地址:https://www.cnblogs.com/ranzige/p/weixin_develop.html
Copyright © 2020-2023  润新知