微信公众号开发之开发模式的启用——学习笔记
启用开发者模式的必备条件
1)完善账号信息,如公众账号的头像,功能介绍,运营地区等信息。公众平台的设置模块可以看到公众账号的全部信息。
2)请求校验程序:启用开发模式的过程中会要求填写接口配置信息,需要先完成请求校验程序的开发。
请求校验程序的开发:参考微信开发者文档中“新手介入”中的“接入指南”。
开发者文档中说明在启用开发模式时,需要填写URl和token。
第二步在开发者文档中说明了请求校验的作用和流程。我们开发的请求校验程序必须能够处理Http GET请求,并且要对请求者进行身份校验,确保请求来自微信服务器。
请求校验的流程:
(1)获取HTTP GET请求的signature,timestamp,nonce和echostr参数
(2)将token,timestamp和nonce3个参数字典排序
(3)将排序后的3个参数按顺序拼接成一个字符串,并对字符串进行sha-1加密
(4)将sha-1加密后的字符串与参数signature进行对比,如果相等即请求来自微信服务器,需要原样返回参数echostr。
核心代码段:
CoreServlet.java
package org.weixin.servlet.CoreServlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.weixin.util.SignUtil; @WebServlet("/CoreServlet") /* * 核心请求处理类 * */ public class CoreServlet extends HttpServlet { private static final long serialVersionUID = 1L; public CoreServlet() { super(); } /* * 确认请求来自微信服务器 * */ protected 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; } /* * 处理微信服务器发来的消息 * */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
SignUtil类
package org.weixin.util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; /* * 请求校验工具类 */ public class SignUtil { private static String token="weixin2016"; /* * 验证签名 */ public static boolean checkSignature(String signature,String timestamp,String nonce) { String[] paramArr=new String[]{token,timestamp,nonce}; Arrays.sort(paramArr); String content=paramArr[0].concat(paramArr[1]).concat(paramArr[2]); String ciphertext=null; try{ MessageDigest md=MessageDigest.getInstance("SHA-1"); byte[] digest=md.digest(content.toString().getBytes()); ciphertext=byteToStr(digest); }catch(NoSuchAlgorithmException e){ e.printStackTrace(); } return ciphertext!=null?ciphertext.equals(signature.toUpperCase()):false; } private static String byteToStr(byte[] byteArray) { String strDigest=""; for(int i=0;i<byteArray.length;i++) { strDigest+=byteToHexStr(byteArray[i]); } return strDigest; } 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; } }
必要的公网环境,在这里我使用的是新浪云服务SAE,微博账号登入。进入云应用SAE
点击创建新应用。说明一下SAE使用时需要付费,可以查看其收费标准。填写相应的项目信息。创建成功。在eclipse中导出已编写的后台接口核心程序(war格式导出)。
在SAE界面中的代码管理中选择上传war包。