微信公众平台开发教程Java版

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

微信公众平台开发教程Java版一、环境准备篇准备写系列博客,记录下我的微信公众平台学习记录,也为那些摸索中的开发者提供点参考。希望与大家共同进步。微信3.0的时候我开始做微信公众账号,那时候没时间研究开发,先用的是编辑者模式,后用开发者模式,托管于第三方。一直想自己写个服务端来实现个人定制化的需求。废话不多说,进入正题。想要开发微信公众平台需要一些环境一、申请微信公众账号这个就不用废话了。附上地址:=wxm2-realname-reg_tmpl&lang=zh_CN现在申请好严格的说,3.0的时候申请都不需要拍照什么的。友情提示:1、微信公众账号的名字一旦申请,则不能更改。取名请慎重!2、一个身份证只能申请两个公众号3、公众号分两种:订阅号和服务号订阅号可一天群发一次消息,目前不能申请自定义菜单。发送的消息将显示在“订阅号”文件夹中,适合媒体等提供咨询服务的公众号。服务号一个月只能群发一条消息,能申请自定义菜单,发送的消息会显示在用户的聊天列表中,并会提醒用户新消息。适合为用户提供服务的公众号二、外网服务器你需要一台外网服务器,来发布你的代码,用于接收处理用户发送的请求。如果没有的话,也不用担心。可以使用百度BAE,或者是sinasae,国外比较多的是用google的gae。googlegae支持的语言很多。但是在国内经常访问不了,不推荐使用。百度Bae支持java和php(完全免费,百度对于资源方面还是一向很大方的,赞一个,哈哈)sinasae支持java,php,python(可免费使用半年,收费的,但很便宜)三、至少会一种语言java,php,asp,python等,至少得会一样!接下来的文章中我会用java做事例来做微信公众平台的开发二、接口配置微信公众账号申请完成后,默认开启的是编辑模式。我们需要修改为开发模式。登陆微信公众平台》功能》高级功能先关闭编辑模式,再开启开发模式。申请成为开发者,如果是服务号,需要则会有开发者凭证信息如图如果是订阅号,则只显示服务器配置。下一步就是配置接口服务器了。在公众平台网站的高级功能–开发模式页,点击“成为开发者”按钮,填写URL和Token,其中URL是开发者用来接收微信服务器数据的接口URL。(这就是我们开发的程序,并部署到公网上了)Token官网描述:可由开发者任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。总之就是你的程序里面写的token和这里填入的token要一致。还没有url和token?首先需要新建一个javaweb工程。接下来就要看看验证url和token了。下面是官网的描述,已经写的很清楚了核心实现方式就是将三个参数排序,拼接成字符串进行sha1加密,然后与signature比较官网也给了实例,是php的,我们只需要装换成java就可以了。privatefunctioncheckSignature(){$signature=$_GET[signature];$timestamp=$_GET[timestamp];$nonce=$_GET[nonce];$token=TOKEN;$tmpArr=array($token,$timestamp,$nonce);sort($tmpArr);$tmpStr=implode($tmpArr);$tmpStr=sha1($tmpStr);if($tmpStr==$signature){returntrue;}else{returnfalse;}}java代码我的WeixinController类我的项目架构是基于spring3.0的,用到了注解。当get请求的时候会执行get方法,post请求的时候会执行post方法,分别来处理不同的请求,各位也可用servlet等去实现,原理都一样packagecom.ifp.weixin.controller;importjava.io.IOException;importjava.io.PrintWriter;importjava.io.UnsupportedEncodingException;importjavax.annotation.Resource;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;importcom.ifp.weixin.biz.core.CoreService;importcom.ifp.weixin.util.SignUtil;@Controller@RequestMapping(/weixinCore)publicclassWeixinController{@Resource(name=coreService)privateCoreServicecoreService;@RequestMapping(method=RequestMethod.GET)publicvoidget(HttpServletRequestrequest,HttpServletResponseresponse){//微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。Stringsignature=request.getParameter(signature);//时间戳Stringtimestamp=request.getParameter(timestamp);//随机数Stringnonce=request.getParameter(nonce);//随机字符串Stringechostr=request.getParameter(echostr);PrintWriterout=null;try{out=response.getWriter();//通过检验signature对请求进行校验,若校验成功则原样返回echostr,否则接入失败if(SignUtil.checkSignature(signature,timestamp,nonce)){out.print(echostr);}}catch(IOExceptione){e.printStackTrace();}finally{out.close();out=null;}}@RequestMapping(method=RequestMethod.POST)publicvoidpost(HttpServletRequestrequest,HttpServletResponseresponse){//暂时空着,在这里可处理用户请求}}上面类中用到了SignUtil类packagecom.ifp.weixin.util;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;importjava.util.Arrays;importcom.ifp.weixin.constant.Constant;/***验证签名**/publicclassSignUtil{/***验证签名*@paramsignature*@paramtimestamp*@paramnonce*@return*/publicstaticbooleancheckSignature(Stringsignature,Stringtimestamp,Stringnonce){String[]arr=newString[]{Constant.TOKEN,timestamp,nonce};//将token、timestamp、nonce三个参数进行字典排序Arrays.sort(arr);StringBuildercontent=newStringBuilder();for(inti=0;iarr.length;i++){content.append(arr[i]);}MessageDigestmd=null;StringtmpStr=null;try{md=MessageDigest.getInstance(SHA-1);//将三个参数字符串拼接成一个字符串进行sha1加密byte[]digest=md.digest(content.toString().getBytes());tmpStr=byteToStr(digest);}catch(NoSuchAlgorithmExceptione){e.printStackTrace();}content=null;//将sha1加密后的字符串可与signature对比returntmpStr!=null?tmpStr.equals(signature.toUpperCase()):false;}/***将字节数组转换为十六进制字符串**@parambyteArray*@return*/privatestaticStringbyteToStr(byte[]byteArray){StringstrDigest=;for(inti=0;ibyteArray.length;i++){strDigest+=byteToHexStr(byteArray[i]);}returnstrDigest;}/***将字节转换为十六进制字符串**@parammByte*@return*/privatestaticStringbyteToHexStr(bytemByte){char[]Digit={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};char[]tempArr=newchar[2];tempArr[0]=Digit[(mByte4)&0X0F];tempArr[1]=Digit[mByte&0X0F];Strings=newString(tempArr);returns;}}我们看到checkSignature这个方法里使用到了Constant.TOKEN,这个token,我声明的一个常量。要与微信配置接口里面的token值一样/***与接口配置信息中的Token要一致*/publicstaticStringTOKEN=infopower;也贴上web.xml的配置,我的后缀是.html的请求都交给DispatcherServlet了。?xmlversion=1.0encoding=UTF-8?web-appversion=3.0xmlns=:xsi=:schemaLocation=://java.sun.com/xml/ns/javaee/web-app_3_0.xsddisplay-nameweixinHelp/display-namecontext-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:/applicationContext.xml/param-value/context-paramcontext-

1 / 58
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功