本篇文章将教大家如何建立微信个人公众账号,(注意:后台全部是用javaweb相关技术开发),大家知道,现在微信公众账号分服务号和订阅号,现在我要讲的主要是个人微信公众账号的建立以及后台的开发,个人公众账号一旦申请成功一般为订阅号,详细情况,大家可以到微信官网了解。先来看一下我自己的微信个人公众账号:ipastor,大家可以关注体验一下。
完成个人公众账号的开发,必需的原材料有:
1,个人微信公众账号一个(没有的可以去微信公众平台申请);
2,自己的服务器(网络可以访问到的,主要用于后台开发);
3,自己需要会javaweb相关技术(这个不必我说了吧)。
大家再看我这篇文章之前,最好看一下微信公众平台开发者文档,看个大概后,再来看这篇文章会达到事半功倍的效果。申请个人公众账号需要七天审核时间,通过前,高级功能是无法使用的,通过后,在网页登录微信公众平台,会看到下图所示:
审核通过后的账号默认是编辑模式开启,我们要选择开启开发者模式,当点击进入开发者模式时会出现
然后点击成为开发者出现:
上图中的URL就是开发者服务器上的接口地址,以接受微信服务器发向自己服务器的信息,在这里有必要了解一下消息传递方式,首先用户向开发者发送信息后,首先会通过微信服务器,然后微信服务器处理用户的信息为特定格式后,再发向开发者服务器,其中包含了用户的id(加密后),开发者id,消息形式(包括文本,语音,视频,地理位置,图片等类型),消息内容,以及随机的消息id,全部为xml格式,如图:
每个标签代表什么意思不用我说了吧,而URL就是处理接收到的消息的服务接口,这里我是用servlet完成的,接收消息并根据消息内容返回信息,Token主要作用则是用于开发者后台做出对消息是否来自微信服务器的判断,这个值由开发者自定义,而上图中填写的token值一定要与自定义的一致。开发者文档中有详细说明:
开发者可以在servlet中的get方法接收get请求来判断消息是否来源于微信服务器,如果是,则原样返回echostr字符串,接入成功,否则失败,用户将收不到开发者回复信息!
具体怎么检验可以详细看上图中的加密检验流程,当然我已经把检验过程写好了,大家可以参考,以下是servlet中的get方法:
/** * 确认请求来自微信服务器 */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String signature = request.getParameter("signature");// 微信加密签名 String timestamp = request.getParameter("timestamp");// 时间戳 String nonce = request.getParameter("nonce");// 随机数 String echostr = request.getParameter("echostr");// 随机字符串 PrintWriter out = response.getWriter(); //校验过程 if (SignUtil.checkSignature(signature, timestamp, nonce)) { out.print(echostr); } out.close(); out = null; }
其中,SignUtil.checkSignature(signature, timestamp, nonce)返回true,则表示校验成功,否则校验失败,SignUtil类的代码如下:
public class SignUtil { //与接口中的配置要一致 private static String token="bylcss"; /** *验证签名 * @param signature * @param timestamp * @param nonce * * */ public static boolean checkSignature(String signature,String timestamp,String nonce){ String [] arr=new String[]{token,timestamp,nonce}; //将signature,timestamp,nonce进行字典排序 Arrays.sort(arr); 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; // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信 return tmpStr!=null?tmpStr.equals(signature.toUpperCase()):false; } /** * 将字节数组转换为十六进制字符串 * @param byteArray * @return */ 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 */ 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; } }
这个验证过程应该很简单吧,校验成功,则原样返回微信服务器发过来的随机字符串echostr。
而上面的URL指向的就是我们的这个servlet,若想成功成为开发者,这个过程必须能够走通,
比如:URL:http://服务器地址/项目名/servlet
Token:我上面定义的Token为bylcss,那么这里就填bylcss
点击提交,如果通过验证,则会提示成为开发者成功,便可进入开发模式。
这个过程,我们的后台web项目,至少包含两个文件,一个是servlet,一个是检验工具类SignUtil。
下一篇将讲述如何接收并处理用户消息。