现在实习的公司要做微信开发,然而一直没安排任务,所以一直在看微信接口,记录下学习的内容
微信开发肯定要看的就是微信公众平台开发者文档,上面有每种接口的调用格式,刚开始学习的时候自己申请了一个订阅号,个人类型的,这个玩玩还可以,学习的话,貌似有点接口没有权限调用,所以我学习的时候是用的微信测试号,至于测试号的申请,很简单,在文档里面,开发者工具下面就可以看到。
微信开发,第一步,接入指南,看文档上面的
当然,弄这个之前要有一个服务器,或者就应用放在网上,微信后台其实和网站开发后台差不多
url填写域名加action的地址,比如说我的一个servlet ,
@WebServlet("/msg") public class TestWeixin extends HttpServlet {
那么我的url就应该填写 域名/msg
token是用来校验请求是不是微信服务器发过来的,这里填写的token就是程序里面用的token,
至于EncodingAESKey 随机生成,我自己测试接口的时候没用这个,是以明文形式,真正开发的时候应该会用这个,我还没接触正在的微信开发。
填写完提交后,微信服务器会根据填写的url发get请求,带上4个参数signature,timestamp,nonce,echostr
参数的作用,我就抄开发者文档的:
signature:微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp:时间戳
nonce:随机数
echostr:随机字符串
加密/校验流程如下: 1. 将token、timestamp、nonce三个参数进行字典序排序 2. 将三个参数字符串拼接成一个字符串进行sha1加密 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
加密后的字符串和signature相等,则返回echostr,此时校验成功
根据上面的步骤,可以看到,微信服务器是判断是否校验成功 是 根据 是否返回 echostr这个随机字符串的,
如果不进行校验,直接把得到的echostr返回给微信服务器也是可以校验成功的。当然,最好还是进行校验。
校验的代码,就是新建一个servlet
在doGet方法里面进行校验
@WebServlet("/msg") public class TestWeixin extends HttpServlet { private static final long serialVersionUID = 1L; private String TOKEN = "luolei"; /** * @see HttpServlet#HttpServlet() */ public TestWeixin() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub String signature = request.getParameter("signature"); String timestamp = request.getParameter("timestamp"); String nonce = request.getParameter("nonce"); String echostr = request.getParameter("echostr"); String[] str={TOKEN,timestamp,nonce}; Arrays.sort(str); String yanzheng = str[0]+str[1]+str[2]; String result = DigestUtils.sha1Hex(yanzheng.getBytes()); if(result.equals(signature)) { response.getWriter().print(echostr); } }
上面的 token换成自己的token
还有DigestUtils.sha1Hex()方法 是commons-codec jar包里面的类。可以自己搜索怎么sha1加密,
刚刚说了,可以不进行校验,doget里面只留:
String echostr = request.getParameter("echostr");
response.getWriter().print(echostr);
这两行也是可以校验成功的
最后上传服务器,我是用bae应用引擎,上传应用,将得到的二级域名+action的key填到url里面,token按照情况自己填写,就可以了