java微信签名,验证微信发送的signature,还有获取access_token和ticket

controller

@RequestMapping("/weixin")
    @ResponseBody
    public String  weixin(String signature,String timestamp 
            ,String nonce,String echostr) throws NoSuchAlgorithmException {
        String token="umaiw";
         String tmpStr=  getSHA1(token, timestamp, nonce);
        
   System.out.println("+++++++++++++++++++++tmpStr   "+tmpStr);
   System.out.println("---------------------signature   "+signature);
     
     if(tmpStr.equals(signature)){
         return echostr;
     }else{
         return null;
     }

 /**
     * 用SHA1算法生成安全签名
     * @param token 票据
     * @param timestamp 时间戳
     * @param nonce 随机字符串
     * @param encrypt 密文
     * @return 安全签名
     * @throws NoSuchAlgorithmException 
     * @throws AesException 
     */
    public  String getSHA1(String token, String timestamp, String nonce) throws NoSuchAlgorithmException  {
            String[] array = new String[] { token, timestamp, nonce };
            StringBuffer sb = new StringBuffer();
            // 字符串排序
            Arrays.sort(array);
            for (int i = 0; i < 3; i++) {
                sb.append(array[i]);
            }
            String str = sb.toString();
            // SHA1签名生成
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            md.update(str.getBytes());
            byte[] digest = md.digest();

            StringBuffer hexstr = new StringBuffer();
            String shaHex = "";
            for (int i = 0; i < digest.length; i++) {
                shaHex = Integer.toHexString(digest[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexstr.append(0);
                }
                hexstr.append(shaHex);
            }
            return hexstr.toString();
    }

Sign.java

package com.util;

import java.util.UUID;
import java.util.Map;
import java.util.HashMap;
import java.util.Formatter;
import java.util.concurrent.TimeoutException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;  

import javax.servlet.http.HttpServletRequest;

import net.rubyeye.xmemcached.exception.MemcachedException;

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component("Sign")
public class Sign {
    @Autowired
private    WeiXinRequest  weiXinRequest;
    
    @Test
    public Map<String, String>  test(HttpServletRequest requesturl) throws IOException, TimeoutException, InterruptedException, MemcachedException {
      String ticket=  weiXinRequest.getWeiXinTicket();
      
        // 注意 URL 一定要动态获取,不能 hardcode
        String url =  requesturl.getRequestURL().toString();
        Map<String, String> ret = sign(ticket, url);
        for (Map.Entry entry : ret.entrySet()) {
            System.out.println(entry.getKey() + ", " + entry.getValue());
        }
        ret.put("appId",weiXinRequest.appId );
       return ret;
    };

    public static Map<String, String> sign(String jsapi_ticket, String url) {
        Map<String, String> ret = new HashMap<String, String>();
        String nonce_str = create_nonce_str();
        String timestamp = create_timestamp();
        String string1;
        String signature = "";

        //注意这里参数名必须全部小写,且必须有序
        string1 = "jsapi_ticket=" + jsapi_ticket +
                  "&noncestr=" + nonce_str +
                  "&timestamp=" + timestamp +
                  "&url=" + url;
        System.out.println(string1);

        try
        {
            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
            crypt.reset();
            crypt.update(string1.getBytes("UTF-8"));
            signature = byteToHex(crypt.digest());
        }
        catch (NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }

        ret.put("url", url);
        ret.put("jsapi_ticket", jsapi_ticket);
        ret.put("nonceStr", nonce_str);
        ret.put("timestamp", timestamp);
        ret.put("signature", signature);

        return ret;
    }

    private static String byteToHex(final byte[] hash) {
        Formatter formatter = new Formatter();
        for (byte b : hash)
        {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;
    }

    private static String create_nonce_str() {
        return UUID.randomUUID().toString();
    }

    private static String create_timestamp() {
        return Long.toString(System.currentTimeMillis() / 1000);
    }
}

WeiXinRequest.java

package com.util;

import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.TimeoutException;

import javax.servlet.http.HttpServletRequest;
import javax.xml.crypto.Data;

import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.exception.MemcachedException;

import org.activiti.engine.impl.util.json.JSONObject;
import org.activiti.engine.impl.util.json.JSONTokener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.model.CitySession;
@Component("WeiXinRequest")
public class WeiXinRequest {
    @Autowired
    private MemcachedClient memcachedClient;

      String appId = "你扫描后登陆进去的appid 不同人不一样哦";
    private  String appSecret="同上";
    public  String getWeiXinTicket() throws IOException, TimeoutException, InterruptedException, MemcachedException {
        String access_token="";
        String ticket="";
        Object  act=memcachedClient.get("access_token");
        Object  apiticket=memcachedClient.get("ticket");
        Object expires_in ;
        if(null==act){
            
        
        URL url = new URL(
                "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
                        + appId + "&secret=" + appSecret);
        JSONObject json = getConnection(url);

            access_token = (String) json.getString("access_token");
            expires_in=  json.get("expires_in");
            if (access_token == null) {
                return null;
            }
            memcachedClient.set("access_token", 2*60*60, access_token);
        }else{
            access_token=(String) act;
        }
        
        System.out.println("access_token is =====" + access_token);
        
        
        if(null==apiticket){
        URL url1=new URL("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+access_token+"&type=jsapi");
        JSONObject json1 = getConnection(url1);
        ticket=(String) json1.get("ticket");
    
        }else{
            ticket=(String) apiticket;
        }
        
        return ticket;
        // 断开连接

    }

    public  JSONObject getConnection(URL url) throws IOException {

        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setRequestMethod("GET");
        connection.setUseCaches(false);
        connection.setInstanceFollowRedirects(true);
        connection.setRequestProperty("Content-Type",
                "application/x-www-form-urlencoded");

        connection.connect();
        JSONObject jsono = new JSONObject(new JSONTokener(
                new InputStreamReader(connection.getInputStream())));
        connection.disconnect();
        return jsono;
    }

}

js发送请求的controller

/*
     * json数据格式测试
     */
    @RequestMapping(value = "/house/index1")
    public ModelAndView index(HttpServletRequest request,
            HttpServletResponse response, ModelMap modelMap,
            HttpSession session) throws IOException, TimeoutException, InterruptedException, MemcachedException {
        Map<String, String> map=sign.test(request);
        modelMap.addAllAttributes(map);
        return new ModelAndView("/views/index/weixintest",modelMap);
    }
时间: 2024-10-07 09:42:44

java微信签名,验证微信发送的signature,还有获取access_token和ticket的相关文章

【Java】向一个页面发送post请求并获取其处理之后的结果与用javascript创建一个表单后提交的安全性

本文对比与<[Java]读取网页中的内容>(点击打开链接)一文,向一个页面发送get请求,并获取其处理之后的结果,这里是向一个页面发送post请求,并获取其处理之后的结果.如果向一个页面发送get请求,并获取其处理之后的结果,只需要直接读取一个网页用?后接各种用&参数连接的参数即可,而向一个页面发送post请求,并获取其处理之后的结果,就不是这么简单了. 这里方法可能在普通的Java文件中不会太常见,但在jsp.安卓等javaweb的网页编程中却十分常用 import java.io.

微信支付——调用微信客户端支付之【服务端】开发详解

原文:http://blog.csdn.net/seven_cm/article/details/41559301 http://blog.csdn.net/seven_cm/article/details/50019927 2015-09-12 更新: 因微信支付已经升级到V3版本,请大家参考官网的帮助文档. https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=1_2 之前一篇提到微信支付的开发过程,写得有点乱,现在重新整理一下. 好了

微信开发:微信服务器验证通过

申请自己的微信公众号部署后台服务器 代码解析 申请自己的微信公众号,部署后台服务器 公众号 SuperLishun,想要源码的可以关注公众号,给我留言. 百度微信公众号,首先要申请自己的微信公众号,我只申请了个订阅号,先把基本的调通,如下图 这里我们可以手动群发图文消息,设置自动回复消息,设置目录等等,但是作为开发者,我们要学着使用微信的API去做这些事情. 首先你需要有一个服务器,用来供微信调用,我这里用的是阿里云的服务器,作为测试1核2G内存就够了,1个月也就是100块钱,可以用来玩玩,如下

.net 微信Token验证

首次接受这个项目,看了微信的API,云里雾里,经过几经测试,理清思路 开发者自个申请,微信API给出四个参数: 下面我解释下 signature 是微信加密签名 即:微信服务器将 timetamp nonce  token(你提交的)使用SHA1加密后 会使用GET方式发送给你. timestamp是腾讯服务器发送的一个时间戳 nonce是腾讯服务器发送的一个随机数 成功申请的关键是在下面,上面的几个参数只是 微信提供 用户请求--->你自己的网站 的一个验证方式. echostr就是 腾讯服务

一行代码验证微信服务器配置

今天在搞微信小程序验证工作 在配置消息推送里Tokent 一直校验失败 把所有能想到的问题都解决了,但一还是校验失败 经过反复测试和网友的回答终于解决 其实微信向您的服务器发送验证请求时 你只需要将微信发送过来的echostr 再返回给它就可以验证通过了 当然正常情况下按照微信的文档,你应该对微信发送的数据进和你本地的数据进行对比,如果数据一致才告诉它验证通过 我这里只是测试环境为了偷懒才这样做的,正式环境还是应该遵守规则 <?php //只需要将微信发送过来的随机字符串返回给微信即可验证通过

基于Java spring框架的微信企业号开发中关于js-sdk的配置

在调用js-sdk的第一步,我们需要引入js-sdk的js链接,然后执行wx.config,官方示例如下所示: 1 wx.config({ 2 debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印. 3 appId: '', // 必填,企业号的唯一标识,此处填写企业号corpid 4 timestamp: , // 必填,生成签名的时间戳 5 nonceStr: ''

微信TOKEN验证源码

using System;using System.Collections.Generic;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Data;using System.IO;using System.Net;using System.Text;using System.Xml;using System.Web.Security; public partial class w

获取微信签名

微信开发----配置权限获取签名 url @POST @Path("getJsApi") public DataCenter<Object> getJsApi(String url){ DataCenter<Object> netData = new DataCenter<Object>(); String times = Long.toString(System.currentTimeMillis()/1000); String nonceStr

unigui验证微信服务器的有效性

UNIGUI验证微信服务器的有效性: //////////////////////////////////////////// //UniGUIServerModuleHTTPCommand //公众平台验证服务器地址的有效性 //////////////////////////////////////////// procedure TUniServerModule.UniGUIServerModuleHTTPCommand( ARequestInfo: TIdHTTPRequestInfo;