今天打算开发一个微信公众平台的一个阅读功能,使用开发者模式,第一个件就是要通过验证,就是token的验证.

我写的东西比较直接没有过多的解释性语言,如果有疑问可以通过评论来讨论一下.

接口开发一定要先看好接口说明,这个是很重要的,你对接口文档的理解直接影响到你的接口开发速度与质量.

开发工具:eclipse 3.5

使用技术:struts2 , spring 3.0 , hibernate 3.3 ,dom4j 等等

AIP网址:http://mp.weixin.qq.com/wiki/index.php?title=%E6%B6%88%E6%81%AF%E6%8E%A5%E5%8F%A3%E6%8C%87%E5%8D%97#.E7.94.B3.E8.AF.B7.E6.B6.88.E6.81.AF.E6.8E.A5.E5.8F.A3

http://www.xyz.com/weixin_msg.action

测试token:    token(您在使用的时候别忘了换成你自己的.)

===========接===口===说===明=============================

网址接入

公众平台用户提交信息后,微信服务器将发送GET请求到填写的URL上,并且带上四个参数:

参数

描述

signature

微信加密签名

timestamp

时间戳

nonce

随机数

echostr

随机字符串

请原样返回echostr参数内容,则接入生效,否则接入失败。

signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。


加密/校验流程: 1. 将token、timestamp、nonce三个参数进行字典序排序 2. 将三个参数字符串拼接成一个字符串进行sha1加密 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信


=====================================================

action代码.我使用的是struts2所以是action.


01

import java.io.BufferedReader;



02

import java.io.IOException;



03

import java.io.InputStream;



04

import java.io.StringBufferInputStream;



05

import java.security.MessageDigest;



06

import java.security.NoSuchAlgorithmException;



07

import java.util.Arrays;



08

 



09

import org.springframework.context.annotation.Scope;



10

import org.springframework.stereotype.Controller;



11

 



12

import com.xyz.bbs.weixin.utils.WeixinMessageDigestUtil;



13

import com.xyz.framework.utils.MessageDigestUtil;



14

import com.xyz.framework.web.BaseAction;



15

 



16

@SuppressWarnings("serial")



17

@Controller("WeixinActionId")



18

@Scope("prototype")



19

public class WeixinAction extends BaseAction {



20

 



21

private static final String TOKEN = "token";



22

private static final String GET = "GET";



23

 



24

private String signature;



25

private String timestamp;



26

private String nonce;



27

private String echostr;



28

/**



29

* 微信回调方法、包括doGet & doPost



30

* @return



31

*/



32

public String msg(){



33

if (GET.equals(getRequest().getMethod())) {



34

//get



35

doget();



36

}else {



37

//post <span></span>              <span></span>                 <span></span>            }



38

//为什么返回null?



39

return null;



40

}



41

/**



42

* get方式验证token



43

*/



44

public void doget(){



45

logger.debug("signature" + signature);



46

logger.debug("timestamp" + timestamp);



47

logger.debug("nonce" + nonce);



48

logger.debug("echostr" + echostr); <span></span> Arrays.sort(ArrTmp);



49

StringBuffer sb = new StringBuffer();



50

for (int i = 0; i < ArrTmp.length; i++) {



51

sb.append(ArrTmp[i]);



52

}



53

String pwd = WeixinMessageDigestUtil.getInstance().encipher(sb.toString()); <span></span> if(pwd.equals(signature)){



54

if(!"".equals(echostr) && echostr != null){



55

try {



56

System.out.println("response");



57

<span></span> this.getResponse().getWriter().write(echostr);



58

catch (IOException e) {



59

e.printStackTrace();



60

}



61

}



62

}



63

}



64

//一下代码不用看的.



65

//getter && setter



66

public String getSignature() {



67

return signature;



68

}



69

 



70

public void setSignature(String signature) {



71

this.signature = signature;



72

}



73

 



74

public String getTimestamp() {



75

return timestamp;



76

}



77

 



78

public void setTimestamp(String timestamp) {



79

this.timestamp = timestamp;



80

}



81

 



82

public String getNonce() {



83

return nonce;



84

}



85

 



86

public void setNonce(String nonce) {



87

this.nonce = nonce;



88

}



89

 



90

public String getEchostr() {



91

return echostr;



92

}



93

 



94

public void setEchostr(String echostr) {



95

this.echostr = echostr;



96

}



97

 



98

}


加密工具类


01

import java.security.*;



02

import java.util.Arrays;



03

 



04

/*



05

* SHA1 水印算法工具类



06

* AJ 2013-04-12



07

*/



08

public final class WeixinMessageDigestUtil {



09

private static final WeixinMessageDigestUtil _instance = new WeixinMessageDigestUtil();



10

 



11

private MessageDigest alga;



12

 



13

private WeixinMessageDigestUtil() {



14

try {



15

alga = MessageDigest.getInstance("SHA-1");



16

catch(Exception e) {



17

throw new InternalError("init MessageDigest error:" + e.getMessage());



18

}



19

}



20

 



21

public static WeixinMessageDigestUtil getInstance() {



22

return _instance;



23

}



24

 



25

public static String byte2hex(byte[] b) {



26

String des = "";



27

String tmp = null;



28

for (int i = 0; i < b.length; i++) {



29

tmp = (Integer.toHexString(b[i] & 0xFF));



30

if (tmp.length() == 1) {



31

des += "0";



32

}



33

des += tmp;



34

}



35

return des;



36

}



37

 



38

public String encipher(String strSrc) {



39

String strDes = null;



40

byte[] bt = strSrc.getBytes();



41

alga.update(bt);



42

strDes = byte2hex(alga.digest()); //to HexString



43

return strDes;



44

}



45

 



46

public static void main(String[] args) {



47

String signature="b7982f21e7f18f640149be5784df8d377877ebf9";



48

String timestamp="1365760417";



49

String nonce="1365691777";



50

 



51

String[] ArrTmp = { "token", timestamp, nonce };



52

Arrays.sort(ArrTmp);



53

StringBuffer sb = new StringBuffer();



54

for (int i = 0; i < ArrTmp.length; i++) {



55

sb.append(ArrTmp[i]);



56

}



57

String pwd =WeixinMessageDigestUtil.getInstance().encipher(sb.toString());



58

 



59

if (signature.equals(pwd)) {



60

System.out.println("token 验证成功~!");



61

}else {



62

System.out.println("token 验证失败~!");



63

}



64

}



65

 



66

}


服务搭建完成之后就可以进行测试了,这个测试方法就不用我写了吧..

看到他说明你成功了.

最后简单说一下为什么action返回的是null而不是一个String.

echostr参数要远洋返回,如果是使用浏览器来看的话页面只有echostr的值,没有其他的字符.直接返回response,到页面就输出print了.