微信开发入门
ngrok 下载
http://download.csdn.net/download/knight_black_bob/9121979
ngrok 公网映射
ngrok -config ngrok.cfg -subdomain curiousby 8080
获得 公网地址
http://curiousby.tunnel.mobi
http://www.tunnel.mobi/ 这个网站停止运行了,所以连不上,请下载2.0.17或者2.0.19的版本,直接用ngrok的服务器,命令为:ngrok http 8080
web.xml
<servlet>
<servlet-name>weichatServlet</servlet-name>
<servlet-class>com.curiousby.cn.WeichatServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>weichatServlet</servlet-name>
<url-pattern>/weichat.do</url-pattern>
</servlet-mapping>
WeichatServlet.java
package com.curiousby.cn;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.curiousby.cn.util.WeichatCheckUtils;
/**
* @author baoyou E-mail:curiousby@163.com
* @version 创建时间:2015年9月20日 下午2:06:42
* des:
*/
public class WeichatServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
private String signature; //微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
private String timestamp; // 时间戳
private String nonce; //随机数
private String echostr; //随机字符串
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
signature = req.getParameter("signature");
timestamp = req.getParameter("timestamp");
nonce = req.getParameter("nonce");
echostr = req.getParameter("echostr");
System.out.println("signature timestamp nonce echostr " + signature +" " + timestamp +" " + nonce + " " + echostr );
PrintWriter out = resp.getWriter();
if (WeichatCheckUtils.checkSignature(signature, timestamp, nonce)) {
out.print(echostr);
}
}
}
CommonUtils.java
public class CommonUtils {
public static String ArrayToString (String [] arr){
StringBuffer sb = new StringBuffer();
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]);
}
return sb.toString();
}
}
ShaUtils.java
package com.curiousby.cn.util;
import java.security.MessageDigest;
/**
* @author baoyou E-mail:curiousby@163.com
* @version 创建时间:2015年9月20日 下午2:36:04
* des:
*/
public class ShaUtils {
private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
public static String getSha1(String str){
if (str == null || str.length() ==0) {
return null;
}
try{
MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
messageDigest.update(str.getBytes("UTF-8"));
byte[] md = messageDigest.digest();
int j = md.length;
char [] buf = new char[j*2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
buf[k++] =HEX_DIGITS[byte0 >>> 4 & 0xf ];
buf[k++] =HEX_DIGITS[byte0 & 0xf ];
}
System.out.println(" before sha1 str :"+ str +"\r\n after sha1 string : "+new String(buf));
return new String(buf);
}catch(Exception e){
return null;
}
}
}
WeichatCheckUtils.java
package com.curiousby.cn.util;
import java.util.Arrays;
/**
* @author baoyou E-mail:curiousby@163.com
* @version 创建时间:2015年9月20日 下午2:14:46
* des:
*/
public class WeichatCheckUtils {
private static final String TOKEN ="xxxx";
public static boolean checkSignature(String signature, String timestamp,String nonce){
String[] str = { TOKEN, timestamp, nonce };
Arrays.sort(str); // 字典序排序
String string = CommonUtils.ArrayToString(str);
String temp = ShaUtils.getSha1(string);
return temp.equals(signature);
}
}
接入成功!
捐助开发者
在兴趣的驱动下,写一个免费
的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(右上角的爱心标志,支持支付宝和PayPal捐助),没钱捧个人场,谢谢各位。
谢谢您的赞助,我会做的更好!