文档章节

微信认证signature timestamp nonce echostr

xpttxsok
 xpttxsok
发布于 2016/04/19 16:47
字数 778
阅读 18
收藏 0
点赞 1
评论 0
  1. 微信认证原理

    2.填写服务器配置

    3.验证服务器地址的有效性,验证原理,Token, timestamp, nonce三个参数按照字典排序,拼接成string,然后判断是否和signature相等

    4.依据接口文档实现业务逻辑

package com.xp.cn.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.logging.Logger;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;
import net.sf.json.xml.XMLSerializer;

public class WeiXinParamServlet extends HttpServlet{

	    private Logger log =Logger.getLogger(this.getClass().getName());  
	    private static final long serialVersionUID = 1L;  
	    private   String Token;
	    private   String echostr;
	    @Override  
	    protected void doGet(HttpServletRequest request, HttpServletResponse response)  
	            throws ServletException, IOException {  
	         connect(request,response);  
	    }  
	  
	    @Override  
	    protected void doPost(HttpServletRequest request, HttpServletResponse response)  
	            throws ServletException, IOException {  
	        message(request,response);  
	    }  
	  
	    @Override  
	    public void init() throws ServletException {  
	        Token="xp******************";  
	    } 
	      
	    /** 
	     *@author xp
	     *@desc 接入连接生效验证</p> 
	     */  
	    private void connect(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{  
	        log.info("RemoteAddr: "+ request.getRemoteAddr());  
	        log.info("QueryString: "+ request.getQueryString());  
	         if(!accessing(request, response)){  
	             log.info("服务器接入失败.......");  
	             return ;  
	         }  
	        String echostr=getEchostr();  
	        if(echostr!=null && !"".equals(echostr)){  
	                log.info("服务器接入生效..........");  
	                response.getWriter().print(echostr);//完成相互认证  
	        }  
	    }  
	    /** 
	     * @author xp
	     * Date 2013-04-19 
	     * @desc用来接收微信公众平台的验证 
	     */  
	    private boolean accessing(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {  
	    	//微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
	        String signature = request.getParameter("signature");//微信加密签名
	        String timestamp = request.getParameter("timestamp");//时间戳  
	        String nonce = request.getParameter("nonce");//随机数
	        String echostr = request.getParameter("echostr");//随机数字符串
	        
	        if(isEmpty(signature)){  
	            return false;  
	        }  
	        if(isEmpty(timestamp)){  
	            return false;  
	        }  
	        if(isEmpty(nonce)){  
	            return false;  
	        }  
	        if(isEmpty(echostr)){  
	            return false;  
	        }  
	        String[] ArrTmp = { Token, timestamp, nonce };  
	        Arrays.sort(ArrTmp);  
	        StringBuffer sb = new StringBuffer();  
	        for (int i = 0; i < ArrTmp.length; i++) {  
	            sb.append(ArrTmp[i]);  
	        }  
	        String pwd = Encrypt(sb.toString());
	        //pwd 8052946b7c82d34982bcfcf04ddaa065917dd33f
	        //signature 8052946b7c82d34982bcfcf04ddaa065917dd33f
	           
	        log.info("signature:"+signature+"timestamp:"+timestamp+"nonce:"+nonce+"pwd:"+pwd+"echostr:"+echostr);  
	          
	        if(trim(pwd).equals(trim(signature))){  
	            this.echostr =echostr;  
	            return true;  
	        }else{  
	            return false;  
	        }  
	    }  
	    private String Encrypt(String strSrc) {  
	        MessageDigest md = null;  
	        String strDes = null;  
	  
	        byte[] bt = strSrc.getBytes();  
	        try {  
	            md = MessageDigest.getInstance("SHA-1");  
	            md.update(bt);  
	            strDes = bytes2Hex(md.digest()); //to HexString  
	        } catch (NoSuchAlgorithmException e) {  
	            System.out.println("Invalid algorithm.");  
	            return null;  
	        }  
	        return strDes;  
	    }  
	  
	    public String bytes2Hex(byte[] bts) {  
	        String des = "";  
	        String tmp = null;  
	        for (int i = 0; i < bts.length; i++) {  
	            tmp = (Integer.toHexString(bts[i] & 0xFF));  
	            if (tmp.length() == 1) {  
	                des += "0";  
	            }  
	            des += tmp;  
	        }  
	        return des;  
	    }  
	      
	       
	    public String getEchostr(){  
	        return echostr;  
	    }  
	    /** 
	     *@author xp
	     *@desc XML组装组件</p> 
	     */  
	     private void message(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{  
	           
	            InputStream is = request.getInputStream();  
	            // 取HTTP请求流长度  
	            int size = request.getContentLength();  
	            // 用于缓存每次读取的数据  
	            byte[] buffer = new byte[size];  
	            // 用于存放结果的数组  
	            byte[] xmldataByte = new byte[size];  
	            int count = 0;  
	            int rbyte = 0;  
	            // 循环读取  
	            while (count < size) {   
	                // 每次实际读取长度存于rbyte中  
	                rbyte = is.read(buffer);   
	                for(int i=0;i<rbyte;i++) {  
	                    xmldataByte[count + i] = buffer[i];  
	                }  
	                count += rbyte;  
	            }  
	            is.close();  
	            String requestStr = new String(xmldataByte, "UTF-8");  
	              
	              
	            try{  
	                manageMessage(requestStr,request,response);  
	            }catch(Exception e){  
	                e.printStackTrace();  
	            }  
	              
	        }  
	   
	       
	    /** 
	     * @author xp 
	     * @param 
	     * @desc 业务转发组件 
	     *  
	     */  
	      private void  manageMessage(String requestStr,HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{  
	            String responseStr;  
	            try {  
	                 XMLSerializer xmlSerializer=new XMLSerializer();  
	                 JSONObject jsonObject =(JSONObject) xmlSerializer.read(requestStr);  
	                 String event =jsonObject.getString("Event");  
	                 String msgtype =jsonObject.getString("MsgType");  
	                 if("CLICK".equals(event) && "event".equals(msgtype)){ //菜单click事件  
	                     String eventkey =jsonObject.getString("EventKey");  
	                     if("hytd_001".equals(eventkey)){ // hytd_001 这是好友团队按钮的标志值  
	                         jsonObject.put("Content", "欢迎使用好友团队菜单click按钮.");  
	                     }  
	                      
	                 }  
	                 responseStr =creatRevertText(jsonObject);//创建XML  
	                 log.info("responseStr:"+responseStr);  
	                 OutputStream os =response.getOutputStream();  
	                 os.write(responseStr.getBytes("UTF-8"));  
	            }   catch (Exception e) {  
	                e.printStackTrace();  
	            }  
	              
	    }  
	    private String creatRevertText(JSONObject jsonObject){  
	            StringBuffer revert =new StringBuffer();  
	            revert.append("<xml>");  
	            revert.append("<ToUserName><![CDATA["+jsonObject.get("ToUserName")+"]]></ToUserName>");  
	            revert.append("<FromUserName><![CDATA["+jsonObject.get("FromUserName")+"]]></FromUserName>");  
	            revert.append("<CreateTime>"+jsonObject.get("CreateTime")+"</CreateTime>");  
	            revert.append("<MsgType><![CDATA[text]]></MsgType>");  
	            revert.append("<Content><![CDATA["+jsonObject.get("Content")+"]]></Content>");  
	            revert.append("<FuncFlag>0</FuncFlag>");  
	            revert.append("</xml>");  
	            return revert.toString();  
	        }  
	    
	    private boolean isEmpty(String str){  
	        return null ==str || "".equals(str) ? true :false;  
	    } 
	    
	    private String trim(String str){  
	        return null !=str  ? str.trim() : str;  
	    }  
	      
	
}


© 著作权归作者所有

共有 人打赏支持
xpttxsok
粉丝 5
博文 174
码字总数 101229
作品 0
徐汇
程序员
微信公众号开发之连简单的自动回复都不能实现

各位网友: 我们公司安排我们做微信公众号接口开发,就是由编辑模式进入开发模式,接入自己的服务器。所以我就去图书馆借了本书《微信公众平台搭建、开发与实践指南》照着搭建环境和敲代码,...

在我的歌声里
2017/02/04
557
2
tornado wechat

配置wexin, 开启tornado 服务器 code ser: WECHAT_TOKEN = "hyhlinux" class WeChatHandler(RequestHandler): def get(self): signature = self.get_argument('signature') #get发过来的,我......

hyhlinux
2016/11/19
12
0
微信token验证,参数都对的,为什么验证一直失败?

如题,在服务器上如何检查微信token验证。 第一、三个参数是否与微信公众号上面的一样。 第二、验证token的url是否正确。 第三、以上验证都正确,还是一直验证失败。原因不在意代码问题,在于...

Louis_88
2016/12/24
14
0
微信开发【接口配置信息和网页授权】

接口配置信息:登录微信管理后台填写接口配置信息;接口配置信息是微信服务器调用公众号服务器验证的 请填写接口配置信息,此信息需要你有自己的服务器资源,填写的URL需要正确响应微信发送的...

_______-
2016/12/14
36
0
微信开发第一步 微信demo详解 文本

<?php /** * @author heqing * @version v1.0 */ //define your token define("TOKEN", "weixin");//这里填写的是你在微信上设置的TOKEN,但是必须保证与微信公众平台接口配置信息一致 $wec...

einsqing
2013/10/17
0
0
微信公众平台开发(1)-接入指南

接入指南 第一步:申请消息接口 登录https://mp.weixin.qq.com/ 后,在公众平台后台管理页面 – 开发者中心页,点击“修改配置”按钮,填写URL、Token和EncodingAESKey, 其中URL是开发者用来...

当时我就震惊啦
2014/11/26
0
0
为什么我的action里echostr接收值为null,其他的都有值呢?

为什么我的action里echostr接收值为null,其他的都有值呢? /** 接入验证 */ public String checkSignature() throws IOException{ String signature = this.getRequest().getParameter("sig......

wqhq
2016/04/28
138
1
微信公众号“成为开发者”实践代码

1、建立一个sha1加密文件,详细代码如下: import java.security.*; public class SHA1Encoder { //加密方法 bgy 2013-10-30 public static String encode(String inStr) { MessageDigest m......

专注97
2015/11/30
5
0
python+django+新浪sae+有道API实现微信服务号自动翻译

先看效果:你可以自己用微信搜下"黛莱美北京总代理"找下这个公众。 公众号是在淘宝上买的,最偏的那种,无法改名字了,自己玩,就这样了。 直接贴截图,代码,欢迎评论: index.wsgi文件内容...

NLGBZJ
2015/09/23
0
10

没有更多内容

加载失败,请刷新页面

加载更多

下一页

知识点总结

jq如何拿到data-info的自定义属性 1.1 原生可以获取到所有属性el.attrbutes 1.2 jq的$(el).attr('属性名称') 继承的几种方式,原型链 2.1 扩展原型对象实现继承 2.2 替换原型对象实现继承 2....

litCabbage
5分钟前
0
0
python语言规范

http://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/...

ghou-靠墙哭
9分钟前
0
0
istio 监控,遥测 (理论)

Istio提供了一种灵活的模型来强制执行授权策略并收集网格中服务的遥测。 基础架构后端旨在提供用于构建服务的支持功能。它们包括诸如访问控制系统,遥测捕获系统,配额执行系统,计费系统等之...

xiaomin0322
11分钟前
0
0
阿里资深专家面试问题收集

corejava hashcode相等的两个对象一定相等吗?equals呢?反过来相等吗? 介绍一下集合框架? hashtable,hashmap底层实现是什么?hashtable和concurrenthashmap底层实现的区别? hashmap和treemap的...

undefine
12分钟前
6
0
alpine安装软件指定安装源

linux-alpine安装软件指定安装源 一、永久修改apk下载源地址 vi etc/apk/repositories 替换成阿里源 http://mirrors.aliyun.com/alpine/v3.8/main/http://mirrors.aliyun.com/alpine/v3...

我心中有猛狗
13分钟前
0
0
Centos7通过yum安装nginx

添加源地址(直接install可能不是最新版本的) sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm 安装 sudo yum install -y ng......

iplusx
14分钟前
0
0
ef .core Dapper Helper

using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Threading.Tasks; using Dapper; using Dap......

Lytf
16分钟前
0
0
iOS 小笔记

1.以下代码打印什么     __block int val = 10;    void (^blk)(void) = ^{        printf("val=%d\n",val);        };       val = 2;    blk(); /...

风了个1
18分钟前
0
0
【Spring Boot 系列 Spring Boot示例程序】

入门程序步骤,创建一个Maven项目。继承Spring Boot官方提供的父工程。再引入一个Web的应用启动器。 1、选择一个合适的IDEA工具 创建一个Maven工程,并添加如下配置 <parent> <...

HansonReal
19分钟前
0
0
217. Contains Duplicate - LeetCode

Question 217. Contains Duplicate Solution 题目大意:判断数组中是否有重复元素 思路:构造一个set,不重复就加进去,重复返回true,如果数据量大的话,可以用布隆过滤器 Java实现: publ...

yysue
24分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部