`
heweina2007
  • 浏览: 67606 次
  • 性别: Icon_minigender_2
  • 来自: 沈阳
社区版块
存档分类
最新评论

微信公众平台开发总结

 
阅读更多

       好久没有写东西了,前段时间开发的微信项目也交给其他的同事进行继续开发了。总觉得应该写点什么,记录一下我进行微信开发的一些经验和收获。正好公司要求写一工作总结,就把这些记录下来,也算是对之前工作的一点回忆吧。

  

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

 

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

 

1、程序技术架构的学习

 

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

 

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;
	}
}

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

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();
		}
	}
}

 

 

分享到:
评论

相关推荐

    .NET微信公共平台开发总结

    .NET微信公共平台开发总结,本人在开发微信公共平台时总结的一点,希望对新人有所帮助!

    微信公众平台java开发代码

    微信公众平台深度开发JAVA版 1.课程研发环境 开发语言:JAVA WEBServer:TOMAT DATABASE:MySQL 开发工具:myeclipse、MySQL-Front等 其他:在手机应用中的CSS3+div布局、DWR、mybatis、gson、quartz、generator等 ...

    中国微信公众平台用户研究报告

     2、微信公众平台产生的信息量不足且实用性不佳,基于HTML5的二次开发很有必要;  3、现今网络环境下,用户获取信息的渠道很多,而微信公众平台并非唯一或重要的信息获取手段;  4、利用微信公众平台进行营销并非...

    微信公众平台java开发详解.zip_微信公众平台java开发详解_微信开发 java

    本次的教程主要是对微信公众平台开发者模式的讲解,网络上很多类似文章,但很多都让初学微信开发的人一头雾水,所以总结自己的微信开发经验,将微信开发的整个过程系统的列出,并对主要代码进行讲解分析,让初学者...

    微信公众平台应用开发:方法、技巧与案例.(机械工业.柳峰)

    书名:《微信公众平台应用开发:方法、技巧与案例》(机械工业出版社.柳峰) PDF格式扫描版,全书分为9章,共245页。2014年1月出版。 内容简介 该书系统讲解了微信公众平台应用开发的流程、方法和技巧,并配有若干...

    微信公众平台应用开发:方法、技巧与案例

    《微信公众平台应用开发:方法、技巧与案例》是目前微信公众平台应用开发领域内容最全面、系统和深入的一本书,也是技术版本最新的。由著名的资深微信公众平台应用开发工程师根据最新的微信5.1版撰写,全面解读了...

    微信公众号平台应用开发实战

    内容全面,介绍了微信公众平台应用开发所需各项技术,详细讲解了所有基础接口、9大高级接口以及公众平台的各种高级功能,演示和总结了微信公众平台开发的流程、方法和技巧;实战性强,不仅通过3个案例呈现了娱乐型、...

    微信小程序开发总结

    微信小程序是微信公众平台推出除服务号、订阅号、企业号外的第四种微信内应用类型,它是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的仿原生app的交互使用体验和实用功能。...

    微信公众平台开发教程(二) 基本原理及消息接口总结

    本篇文章主要介绍了微信公众平台开发教程(二) 基本原理及消息接口,具有一定的参考价值,有兴趣的朋友可以了解一下。

    微信公众平台的Java的开发详解(工程代码+解析).docx

    本次的教程主要是对微信公众平台开发者模式的讲解,网络上很多类似文章,但很多都让初学微信开发的人一头雾水,所以总结自己的微信开发经验,将微信开发的整个过程系统的列出,并对主要代码进行讲解分析,让初学者...

    微信公共账号开发

    微信公共账号开发的流程,在网上看了很多资料,最紧要做这方面的东西。所以总结了一下

    微信公众平台开发教程②微信端分享功能图文详解

    本文实例讲述了微信公众平台微信端分享功能。分享给大家供大家参考,具体如下: 背景  初次尝试微信公众号的开发,对于学习方法的探索都是来源于网上的博客、问答,对于参差不齐的信息,自己也是有苦说不出,抽出...

    微信公平平台开发思路

    项目开发过程中总结出来的一套思路,包括类的各种继承图和一些思维导向图,部分功能部分加上了文字说明!有意向开发微信项目的可以参考参考,共同学习!

    微信扫码支付接口开发总结

    appid:appid是微信公众账号或开放平台APP的唯一标识,可在微信公众平台--&gt;开发--&gt;基本配置里面查看,商户的微信支付审核通过邮件中也会包含该字段值。 mch_id:微信支付商户号。商户申请微信支付后,由微信...

    微信OA,微信企业号,深度企业号,微信公众平台

    17、聊天室:以社交、办公、娱乐为主题,成立以贯彻文明聊天、娱乐的原则,开发一系列娱乐、办公的服务工具。 18、工作日志:详细记录所面对的选择、观点、方法、结果和决定,每天日事日清,长期的积累,达到通过...

    微信公众平台开发教程①获取用户Openid及个人信息图文详解

    本文实例讲述了微信公众平台开发获取用户Openid及个人信息。分享给大家供大家参考,具体如下: 前言: 初次尝试微信公众号的开发,对于学习方法的探索都是来源于网上的博客、问答,对于参差不齐的信息,自己也是有...

    C#开发微信门户及应用完整教程

    主要就是参考一些介绍文章以及微信公众平台的相关接口说明,并结合C#的代码开发,整理了自己门户界面,实现了微信工作号的初步用户交互和信息展示工作,随着工作的进一步开展,越来越多的功能可能加入,并希望从应用...

    C#开发微信公众平台-这么简单(附Demo)

    如果你自己仔细研究下,其实那么点东西,C#实现起来也很简单,原本不想写这篇文章的,但是本人当时摸索走了很多弯路,这边总结下,希望初次接触微信公众平台的朋友别像当时的我一样。  自己动手,丰衣足食。  ...

Global site tag (gtag.js) - Google Analytics