您的位置:首页 > 移动开发 > 微信开发

微信公众平台开发2-接入指南(验证服务器地址有效性)

2016-04-07 09:39 671 查看
接入指南

一、填写服务器配置

在测试号管理中填写接口配置信息



服务器地址URL,URL是开发者用来接收微信消息和事件的接口URL;

Token可以任意填写;

这是测试时填写的,真实项目的填写还要填写EncodingAESKey,可以由开发者手动填写或随机生成,将用作消息体加解密密钥;

开发者还可选择消息加解密方式:明文模式、兼容模式和安全模式;

具体可参看开发者文档。

二、验证服务器地址的有效性

开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带四个参数



通过检验signature对请求进行校验。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。

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


示例代码:

WebChatCallBackServlet:

public class WebChatCallBackServlet extends HttpServlet {

/**
* 确认请求来自微信服务器
*/
@Override
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();
// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
if (SignatureUtil.checkSignature(signature, timestamp, nonce)) {
out.print(echostr);
}
out.close();
out = null;
}
/**
* 处理微信发来的请求
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

}
}


SignatureUtil类:

/**
* 验证Signature工具类
* @author 洋
*
*/
public class SignatureUtil {

// 与接口配置信息中的Token要一致
private static String token = "weixin101";

/**
* 验证签名
*
* @param signature
* @param timestamp
* @param nonce
* @return
*/
public static boolean checkSignature(String signature, String timestamp, String nonce) {
boolean isEqual=false;
String[] arr = new String[] { token, timestamp, nonce };
// 将token、timestamp、nonce三个参数进行字典序排序
Arrays.sort(arr);

//三个参数组合成一个字符串
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
content.append(arr[i]);
}

String tmpStr = null;
//进行SHA1加密,返回16进制字符串
tmpStr=encryptSHA1(content.toString());

// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
if(tmpStr!=null&&tmpStr.equals(signature)){
isEqual=true;
}else{
isEqual=false;
}
content = null;

return isEqual;
}
/**
* SHA1加密
*
* @param data
* @return
*/
public static String encryptSHA1(String data){
String str=null;
try {
// 获得SHA1摘要算法的 MessageDigest 对象
MessageDigest md=MessageDigest.getInstance("SHA-1");
// 使用指定的字节更新摘要
md.update(data.getBytes());
//获得密文
byte[] bytes=md.digest();
//字节数组转化为16进制字符串
str=bytesToHexString(bytes);

} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return str;
}
/**
* 字节数组转化为16进制字符串
* @param bytes
* @return
*/
public static String bytesToHexString(byte[] bytes){
StringBuffer sb=new StringBuffer();
if(bytes==null||bytes.length<=0){
return null;
}
for(int i=0;i<bytes.length;i++){
int temp=bytes[i]&0xFF;//与运算,将byte转化为整型
String hex=Integer.toHexString(temp);//int型转化为16进制字符串
if(hex.length()<2){
sb.append(0);
}
sb.append(hex);
}
return sb.toString();
}

}


三、根据接口文档实现业务逻辑

验证URL有效性成功后即接入生效。

现在你就可以根据微信接口文档进行开发了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: