在二次开发微信,首先要成为微信开发者,在微信开发者平台注册,还要注册一个微信公众号,注册过程很简单,唯一的要求就是要绑定银行卡的微信账号扫一下二维码.然后就能注册成功微信公众号了.
在注册微信公众号之后有两种模式,一个是编辑模式,还有一个就是开发者模式.编辑模式其实也是一个后台操作的过程,在编辑模式下基本上一些基本的功能都能实现,像关键字回复,被关注的时候回复,还有订阅号每天能够推送一条信息给关注此微信的人,这些功能都能符合宣传人的功能,但是我们是开发者,怎么能满足于这些了,我们要动态信息,比如像用户发送一个地名回复那个地名的天气等.
在正式开发的过程中我们首先要搭建好我们的环境,首先我是准备将我的项目上传到百度BAE上面,需要费用,但是每天只要四毛钱,但是我首先还是没有直接将应用上传上去,我是使用一个工具将我自己的ip地址映射到公网上面去的,然后自己打开tomcat,通过映射的地址就能访问到我电脑的应用.
前面有一个很好用的工具,但是现在好像是没用了,我是用的这个ngrok.exe,这个工具的服务器是在美国所以用起来有点慢,但是我觉得是很是适合我们初学者使用,错误能在MyEclipse控制台打印.便于调错!
使用方法:
打开cmd,将目录切到此工具的目录下面
输入nrgok 端口号(tomcat的端口号)然后回车:
然后就会显示映射的地址了
复制http:一直到->前就是你将本地的应用映射到公网的网址了,加上你的项目名,就能访问到应用了
然后在开启开发者模式首先要这几个步骤:
第一步:填写服务器配置:
将映射的地址接上项目名然后加上servlet的访问名字
第二步:验证服务器地址的有效性
由于验证是GET方法,所以在servlet中doGet()方法中实现:
第三步:依据接口文档实现业务逻辑
验证的具体步骤:
1.在doGet方法中获取到微信服务器中发过去的数据,有这几个数据:
signature:微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp:时间戳
nonce::随机数
echostr:随机字符串
2.在request中获取到这几个数据后,创建一个验证的方法传入signature,nonce,timestamp,创建一个token(可以随便写,但是要和微信填写url的时候的token是一样的)
3.验证方法:
贴代码吧:
private static final String TOKEN="weixin";
public static boolean cheackWeinxi(String signature,String nonce,String timestamp){
//将数据存到一个数组中
String[] arr=new String[]{TOKEN,timestamp,nonce};
//排序
Arrays.sort(arr);
//生成字符串
StringBuffer sbf=new StringBuffer();
for(int i=0;inull;
try {
MessageDigest md=MessageDigest.getInstance("SHA-1");
//拼接后额字符串进行sha1
byte[] digest=md.digest(content.toString().getBytes());
con=byteTOStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return con.equals(signature.toUpperCase());
}
private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
private static String byteTOStr(byte[] arrs){
String strs="";
for(int i=0;ireturn strs;
}
/**
* 将字节转换成十六进制的字符
* @param by
* @return
*/
private static String byteToHexStr(byte by){
char[] tempArr=new char[2];
tempArr[0]=HEX_DIGITS[(by>>>4) & 0X0F];
tempArr[1]=HEX_DIGITS[by & 0X0F];
String s=new String(tempArr);
return s;
}
private static String getFormattedText(byte[] bytes) {
int len = bytes.length;
StringBuilder buf = new StringBuilder(len * 2);
// 把密文转换成十六进制的字符串形式
for (int j = 0; j < len; j++) {
buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0X0F]);
buf.append(HEX_DIGITS[bytes[j] & 0X0F]);
}
return buf.toString();
}
public static String encode(String str) {
if (str == null) {
return null;
}
try {
MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
messageDigest.update(str.getBytes());
return getFormattedText(messageDigest.digest());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
在servlet中判断,如果是真则返回echostr,则验证成功,
然后在微信的后台会提醒你验证成功!
写这个博客只是让我以后没有事可以看看,不喜勿喷!