微信公众平台开发2-接入指南(验证服务器地址有效性)
2016-04-07 09:39
671 查看
接入指南
一、填写服务器配置
在测试号管理中填写接口配置信息
服务器地址URL,URL是开发者用来接收微信消息和事件的接口URL;
Token可以任意填写;
这是测试时填写的,真实项目的填写还要填写EncodingAESKey,可以由开发者手动填写或随机生成,将用作消息体加解密密钥;
开发者还可选择消息加解密方式:明文模式、兼容模式和安全模式;
具体可参看开发者文档。
二、验证服务器地址的有效性
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带四个参数
通过检验signature对请求进行校验。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
示例代码:
WebChatCallBackServlet:
SignatureUtil类:
三、根据接口文档实现业务逻辑
验证URL有效性成功后即接入生效。
现在你就可以根据微信接口文档进行开发了。
一、填写服务器配置
在测试号管理中填写接口配置信息
服务器地址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有效性成功后即接入生效。
现在你就可以根据微信接口文档进行开发了。
相关文章推荐
- 微信公众平台Token验证失败的解决办法
- 日期的逻辑判断(不用Date和 Calendar)
- 人脸识别测颜值、测脸龄、测相似度微信接口
- 友盟Android 社会化组件SDK v5.0.4中qq,微信,新浪微博的集成
- 微信公众平台开发1-开发配置
- java微信开发API解析(三)-高级功能的前奏----获取以及保存接口调用凭证
- vcard微信电子名片
- 友盟iOS微信登陆没有回调的原因
- 不集成QQ、微信分享官方SDK 分享方法
- 微信开发模式(php)
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- 以蓝牙开发的视觉解读微信Airsync协议
- 微信SDK Undefined symbols for architecture arm64:
- iOS开发之微信支付
- Android 获取取手机中微信聊天记录
- html pc、手机、微信端自适应,app推广下载页面
- 公众号自定义菜单添加特殊符号
- 利用这个利器!微信运营月入上万不再是问题
- java对接微信开发模式的代码
- 微信公众号设计规划与管理