最近完成了一整套的微信公众号开发,赶忙来分享一下。刚好专栏申请下来了,就在专栏里写点东西吧。我本身是做javaweb开发的,现在工作做的是android,之前可谓是从来没有做过这个东西,官网的文档写的还是不错的,不过一开始入门的话难免有些摸不到头脑,看了这个再去看文档继续深度开发的话事半功倍;
注册帐号什么的就不说了,那方面是个人就会注册。建议是去弄个开发者测试帐号,因为功能都是一样的,而且开发者帐号的权限还比较多。如果自身有公司资料的话也可以便审核资料,边用公众号学习嘛,后台代码都是一样的,开发完成之后只需要改一下后台配置即可,根本不用动代码。当然了,我是说的在代码写的漂亮的前提下;
附上2个地址,分别是公众号和测试号的地址:
公众号主页
测试号地址
注册登录之后,进入正文,配置方面正式版和测试帐号是差不多的,我就以正式版为例了;
首先设置开发者密码(appsecret)和ip白名单,这个密码生成之后你就复制粘贴保存好,这个之后就看不到了,除非重置新密码才能在看到。ip白名单指的是你的服务允许访问的连接ip,这里暂时设置的是我的服务器的ip地址;
服务器地址指向的是你处理微信请求的地址,使用全称,http://。。。,这个地址必须是被设置了ip地址白名单的地址才可以。配置好之后这个地址就会是以后微信所有网络请求访问的地址了。而且微信默认访问80端口,不要使用其他端口。令牌token的话自己随意设置就好了,通用语配置服务器时的验证操作;消息加密密钥也是随机生成的,这个用的时候来复制就是了;
启用的时候回去url地址发送一个请求,这个后台要处理一下,其实也很简单,就是比对一下token,看一下是不是自己的验证请求,然后把他发送的一个随机码再给他发回去就可以了,代码如下:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//先验证是否是配置token的url
if (Sign.checkSignature(request.getParameter("signature"), request.getParameter("timestamp"), request.getParameter("nonce"))) {
Utils.out(response, request.getParameter("echostr"));//微信公众号验证Token,只需要将传入的echostr参数原封不动输出即可
return;}
}
我后台这边就是简单的用servlet写的,道理都是一样的,对微信信息的处理主要集中在控制层和业务层;这里处理一个get请求,只需要写一个工具类,来验证一下微信的签名就可以了;
package com.wx.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
/**
* 微信签名验证工具类
* @author Baidu
*/
public class Sign {
// 与接口配置信息中的Token要一致
private static String wxToken = "yoursToken";
/**
* 微信验证签名
* @param signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
* @param timestamp 时间戳
* @param nonce 随机数
* @return 是否正确
*/
public static boolean checkSignature(String signature, String timestamp,String nonce) {
// 1.将token、timestamp、nonce三个参数进行字典序排序
String[] arr = new String[] { wxToken, timestamp, nonce };
Arrays.sort(arr);
// 2. 将三个参数字符串拼接成一个字符串进行sha1加密
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
content.append(arr[i]);
}
MessageDigest md = null;
String tmpStr = null;
try {
md = MessageDigest.getInstance("SHA-1");
// 将三个参数字符串拼接成一个字符串进行sha1加密
byte[] digest = md.digest(content.toString().getBytes());
tmpStr = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
content = null;
// 3.将sha1加密后的字符串可与signature对比,标识该请求来源于微信
return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
}
/**
* 将字节数组转换为十六进制字符串
* @param byteArray 字节数组
* @return String
*/
private static String byteToStr(byte[] byteArray) {
String strDigest = "";
for (int i = 0; i < byteArray.length; i++) {
strDigest += byteToHexStr(byteArray[i]);
}
return strDigest;
}
/**
* 将字节转换为十六进制字符串
* @param mByte 字节对象
* @return String
*/
private static String byteToHexStr(byte mByte) {
char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A','B', 'C', 'D', 'E', 'F' };
char[] tempArr = new char[2];
tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
tempArr[1] = Digit[mByte & 0X0F];
String s = new String(tempArr);
return s;
}
}
如果验证通过,前端会显示配置成功,那么就代表配置完成,可以开始下一步的开发了!