微信开发之使用java获取签名signature

一、前言

微信接口调用验证最终需要用到的三个参数noncestr、timestamp、signature:

接下来将会给出获取这三个参数的详细代码
本文的环境eclipse + maven
本文使用到的技术HttpClient、Json字符串转map、sha1加密

二、需要用到的jar包

maven依赖的包有:

1、HttpClient包依赖

<dependency>
 <groupId>org.apache.httpcomponents</groupId>
 <artifactId>httpcore</artifactId>
 <version>4.4.3</version>
</dependency>
<dependency>
 <groupId>org.apache.httpcomponents</groupId>
 <artifactId>httpclient</artifactId>
 <version>4.5.1</version>
</dependency>

2、json转map相关包依赖

<dependency>
 <groupId>net.sf.json-lib</groupId>
 <artifactId>json-lib</artifactId>
 <version>2.4</version>
 <classifier>jdk15</classifier>
</dependency>
<dependency>
 <groupId>xom</groupId>
 <artifactId>xom</artifactId>
 <version>1.2.5</version>
</dependency>

三、运行结果

四、详细代码

package com.luo.util;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import net.sf.json.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

public class HttpXmlClient {

 public static String post(String url, Map<String, String> params) {
 DefaultHttpClient httpclient = new DefaultHttpClient();
 String body = null;
 HttpPost post = postForm(url, params);
 body = invoke(httpclient, post);
 httpclient.getConnectionManager().shutdown();
 return body;
 }

 public static String get(String url) {
 DefaultHttpClient httpclient = new DefaultHttpClient();
 String body = null;
 HttpGet get = new HttpGet(url);
 body = invoke(httpclient, get);
 httpclient.getConnectionManager().shutdown();
 return body;
 }

 private static String invoke(DefaultHttpClient httpclient,
  HttpUriRequest httpost) {
 HttpResponse response = sendRequest(httpclient, httpost);
 String body = paseResponse(response);
 return body;
 }

 private static String paseResponse(HttpResponse response) {
 HttpEntity entity = response.getEntity();
 String charset = EntityUtils.getContentCharSet(entity);
 String body = null;
 try {
  body = EntityUtils.toString(entity);
 } catch (ParseException e) {
  e.printStackTrace();
 } catch (IOException e) {
  e.printStackTrace();
 }
 return body;
 }

 private static HttpResponse sendRequest(DefaultHttpClient httpclient,
  HttpUriRequest httpost) {
 HttpResponse response = null;
 try {
  response = httpclient.execute(httpost);
 } catch (ClientProtocolException e) {
  e.printStackTrace();
 } catch (IOException e) {
  e.printStackTrace();
 }
 return response;
 }

 private static HttpPost postForm(String url, Map<String, String> params) {

 HttpPost httpost = new HttpPost(url);
 List<NameValuePair> nvps = new ArrayList<NameValuePair>();

 Set<String> keySet = params.keySet();
 for (String key : keySet) {
  nvps.add(new BasicNameValuePair(key, params.get(key)));
 }

 try {
  httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
 } catch (UnsupportedEncodingException e) {
  e.printStackTrace();
 }

 return httpost;
 }

 public static void main(String[] args) {
 //获取access_token
 Map<String, String> params = new HashMap<String, String>();
 params.put("corpid","wx5f24fa0db1819ea2");
 params.put("corpsecret","uQtWzF0bQtl2KRHX0amekjpq8L0aO96LSpSNfctOBLRbuYPO4DUBhMn0_v2jHS-9");
 String xml = HttpXmlClient.post("https://qyapi.weixin.qq.com/cgi-bin/gettoken",params);
 JSONObject jsonMap = JSONObject.fromObject(xml);
 Map<String, String> map = new HashMap<String, String>();
 Iterator<String> it = jsonMap.keys();
 while(it.hasNext()) {
  String key = (String) it.next();
  String u = jsonMap.get(key).toString();
  map.put(key, u);
 }
 String access_token = map.get("access_token");
 System.out.println("access_token=" + access_token);

 //获取ticket
 params.put("access_token",access_token);
 xml = HttpXmlClient.post("https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket",params);
 jsonMap = JSONObject.fromObject(xml);
 map = new HashMap<String, String>();
 it = jsonMap.keys();
 while(it.hasNext()) {
  String key = (String) it.next();
  String u = jsonMap.get(key).toString();
  map.put(key, u);
 }
 String jsapi_ticket = map.get("ticket");
 System.out.println("jsapi_ticket=" + jsapi_ticket);

 //获取签名signature
 String noncestr = UUID.randomUUID().toString();
 String timestamp = Long.toString(System.currentTimeMillis() / 1000);
 String url="http://mp.weixin.qq.com";
 String str = "jsapi_ticket=" + jsapi_ticket +
  "&noncestr=" + noncestr +
  "&timestamp=" + timestamp +
  "&url=" + url;
 //sha1加密
 String signature = SHA1(str);
 System.out.println("noncestr=" + noncestr);
 System.out.println("timestamp=" + timestamp);
 System.out.println("signature=" + signature);
 //最终获得调用微信js接口验证需要的三个参数noncestr、timestamp、signature
 }

 /**
 * @author:罗国辉
 * @date: 2015年12月17日 上午9:24:43
 * @description: SHA、SHA1加密
 * @parameter: str:待加密字符串
 * @return: 加密串
 **/
 public static String SHA1(String str) {
 try {
  MessageDigest digest = java.security.MessageDigest
   .getInstance("SHA-1"); //如果是SHA加密只需要将"SHA-1"改成"SHA"即可
  digest.update(str.getBytes());
  byte messageDigest[] = digest.digest();
  // Create Hex String
  StringBuffer hexStr = new StringBuffer();
  // 字节数组转换为 十六进制 数
  for (int i = 0; i < messageDigest.length; i++) {
  String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
  if (shaHex.length() < 2) {
   hexStr.append(0);
  }
  hexStr.append(shaHex);
  }
  return hexStr.toString();

 } catch (NoSuchAlgorithmException e) {
  e.printStackTrace();
 }
 return null;
 }
}

五、工程下载

微信获取签名工程

更多精彩内容请点击《Android微信开发教程汇总》,《java微信开发教程汇总》欢迎大家学习阅读。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 基于微信签名signature获取(实例讲解)

    微信分享的签名算法微信也写有,主要是调用接口需要使用服务器(微信官方文档是这么说的,试了下前端居然特么也可以),不过微信的access_token和jsapi_ticket是有使用次数限制的,所以还是用服务器来获取,得到以后存下来,下次使用判断超时以后再重新获取,这样就够用了,要不然就会出现接口调用次数超出限制这种尴尬的事情了. 如果需要使用自定义分享文案的时候,服务号或者订阅号一定要是已认证的(我的是个人类型的订阅号,不能认证,所以不能使用分享功能) 我这边用的是node做的后台,所以代码用的

  • 微信开发之使用java获取签名signature

    一.前言 微信接口调用验证最终需要用到的三个参数noncestr.timestamp.signature: 接下来将会给出获取这三个参数的详细代码 本文的环境eclipse + maven 本文使用到的技术HttpClient.Json字符串转map.sha1加密 二.需要用到的jar包 maven依赖的包有: 1.HttpClient包依赖 <dependency> <groupId>org.apache.httpcomponents</groupId> <ar

  • 详解Java接口签名(Signature)实现方案

    目录 一.要求 二.流程 三.实现 大家好,我是程序员田同学! 今天上午收到一个需求,针对当前的系统开发一个对外开放的接口. 既然是对外开放,那么调用者一定没有我们系统的Token,就需要对调用者进行签名验证,签名验证采用主流的验证方式,采用Signature 的方式. 一.要求 下图为具体要求 二.流程 ​1.线下分配appid和appsecret,针对不同的调用方分配不同的appid和appsecret 2.加入timestamp(时间戳),10分钟内数据有效 3.加入流水号noncestr

  • 微信开发之网页授权获取用户信息(二)

    在公众号的配置过程中,许多开发者会在菜单中加入HTML5页面,有时在页面内需要访问页面的用户信息,此时就需要网页授权获取用户基本信息 我们提醒大家:本文介绍讲述的内容是基于yii2.0框架 1.设置授权回调域名:开发 ---> 接口权限 找到"网页授权获取用户基本信息",点击后面对应的"修改",在弹框响应位置填写授权回调域名即可,此处的域名不需要加http:// (关于网页授权回调域名的说明详情可参考公众平台开发者文档) 2.获取授权 关于OAuth2.0博主

  • Java微信公众平台开发(6) 微信开发中的token获取

    (一)token的介绍 引用:access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保留512个字符空间.access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效! (二)token的获取参考文档 获取的流程我们完全可以参考微信官方文档:http://mp.weixin.qq.com/wiki/14/9f9c82c1af308e3b14

  • nodejs微信开发之授权登录+获取用户信息

    上一篇:获取access_token+自定义菜单 这部分代码是之前就已经完成了,但是考虑篇幅的问题就和上篇分开了,这部分相较前面的方式较为复杂一点,但是也是很容易理解的. 这里简单介绍一下微信网页授权. 微信网页授权配置回调域名: 注:下面引自官方文档 1.在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的"开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息"的配置选项中,修改授权回调域名.请注意,这里填写的是域名(是一个字符串),而不是URL,

  • 微信开发 网页授权获取用户基本信息

    微信公众平台最近新推出微信认证,认证后可以获得高级接口权限,其中一个是OAuth2.0网页授权,很多朋友在使用这个的时候失败了或者无法理解其内容,希望我出个教程详细讲解一下,于是便有了这篇文章. 一.什么是OAuth2.0 官方网站:http://oauth.net/   http://oauth.net/2/ 权威定义:OAuth is An open protocol to allow secure authorization in a simple and standard method

  • java微信开发第二步 获取消息和回复消息

    接着上一篇java微信开发API第一步 服务器接入进行学习,下面介绍java微信开发第二步:获取消息和回复消息,具体内容如下 * 本示例根据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/2016 5:34:36 PM )进行开发演示. * 编辑平台:myeclipse10.7+win32+jdk1.7+tomcat7.0  * 服务器:阿里云 windows server 2008 64bits * 平台要求:servlet

  • java微信开发API第二步 获取和回复消息

    微信开发API如何获取和回复消息,下面就为大家进行介绍 一.说明 * 本示例根据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/2016 5:34:36 PM )进行开发演示. * 编辑平台:myeclipse10.7+win32+jdk1.7+tomcat7.0  * 服务器:阿里云 windows server 2008 64bits * 平台要求:servlet使用注解方式,平台要求:j2ee6.0+.jdk6.0+.t

  • java微信开发API第一步 服务器接入

    微信开发API如何接入服务器,下面就为大家进行介绍 一.说明 * 本示例根据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/2016 5:34:36 PM )进行开发演示. * 编辑平台:myeclipse10.7+win32+jdk1.7+tomcat7.0  * 服务器:阿里云 windows server 2008 64bits * 平台要求:servlet使用注解方式,平台要求:j2ee6.0+.jdk6.0+.tom

随机推荐