获取签名工具类(httpclient和sha1加密)
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) {
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);
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);
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 +
"×tamp=" + timestamp +
"&url=" + url;
String signature = SHA1(str);
System.out.println("noncestr=" + noncestr);
System.out.println("timestamp=" + timestamp);
System.out.println("signature=" + signature);
}
public static String SHA1(String str) {
try {
MessageDigest digest = java.security.MessageDigest
.getInstance("SHA-1");
digest.update(str.getBytes());
byte messageDigest[] = digest.digest();
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;
}
}
controller代码(尽可能仔细阅读下面的每一行代码,特别是url部分)
package com.luo.controller
import java.util.HashMap
import java.util.Iterator
import java.util.Map
import java.util.UUID
import javax.servlet.http.HttpServletRequest
import net.sf.json.JSONObject
import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.servlet.ModelAndView
import com.luo.util.HttpXmlClient
@Controller
public class UserController {
@RequestMapping("/")
public ModelAndView getIndex(HttpServletRequest request){
ModelAndView mav = new ModelAndView("index")
//获取access_token
Map<String, String> params = new HashMap<String, String>()
params.put("corpid","wx7099477f2de8aded")
params.put("corpsecret","4clWzENvHVmpcyuA4toys0URkfYanIqWtxZ5plbisn6Cd5AVTF0thpaK6UAhjIvN")
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")
//获取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")
//获取签名signature
String noncestr = UUID.randomUUID().toString()
String timestamp = Long.toString(System.currentTimeMillis() / 1000)
//获取请求url
String path = request.getContextPath()
//以为我配置的菜单是http://yo.bbdfun.com/first_maven_project/,最后是有"/"的,所以url也加上了"/"
String url = request.getScheme() + "://" + request.getServerName() + path + "/"
String str = "jsapi_ticket=" + jsapi_ticket +
"&noncestr=" + noncestr +
"×tamp=" + timestamp +
"&url=" + url;
//sha1加密
String signature = HttpXmlClient.SHA1(str);
mav.addObject("signature", signature);
mav.addObject("timestamp", timestamp);
mav.addObject("noncestr", noncestr);
mav.addObject("appId", "wx7099477f2de8aded");
System.out.println("jsapi_ticket=" + jsapi_ticket);
System.out.println("noncestr=" + noncestr);
System.out.println("timestamp=" + timestamp);
System.out.println("url=" + url);
System.out.println("str=" + str);
System.out.println("signature=" + signature);
return mav;
}
}
前端js代码(尽可能仔细阅读下面的每一行代码)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script>
wx.config({
beta: true,
debug: true,
appId: '${appId}',
timestamp: parseInt("${timestamp}",10),
nonceStr: '${noncestr}',
signature: '${signature}',
jsApiList: ['getLocation','openLocation']
});
wx.ready(function(){
var isCheck=false;
wx.checkJsApi({
jsApiList: [
'getLocation'
],
})
});
wx.error(function(res){
});
</script>
</head>
<body>
<button id="getBBS" style="width:1000px;height:600px;font-size:150px;" onclick="submitOrderInfoClick();">获取地理位置</button>
</body>
<script type="text/javascript">
function submitOrderInfoClick(){
wx.getLocation({
success: function (res) {
alert("经纬度为:(" + res.latitude + "," + res.longitude + ")" );
},
fail: function(error) {
AlertUtil.error("获取地理位置失败,请确保开启GPS且允许微信获取您的地理位置!");
}
});
}
</script>
</html>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no;" />
<script type="text/javascript" src="../../js/jquery.1.11.1.min.js"></script>
<script type="text/javascript" src="../../js/jweixin-1.0.0.js"></script>
<script type="text/javascript">
$(function () {
wx.config({
debug: false,
appId: '<%=app_Id%>',
timestamp: <%=timestamp%>,
nonceStr: '<%=nonceStr%>',
signature: '<%=signature%>',
jsApiList: [
'checkJsApi',
'getLocation'
]
});
wx.ready(function () {
var isCheck=false;
wx.checkJsApi({
jsApiList: [
'checkJsApi',
'getLocation'
],
success: function (res) {
isCheck=res.checkResult.getLocation;
}
});
document.querySelector('#btnLocation').onclick = function () {
if(!isCheck){
msgtip("您的微信版本不支持获取位置!");
return;
}
wx.getLocation({
success: function (res) {
alert(JSON.stringify(res));
},
cancel: function (res) {
alert('发生错误');
}
});
};
});
wx.error(function (res) {
alert(res.errMsg);
});
});
</script>
</head>
<body>
<form id="form1" runat="server">
<header class="ui-header ui-header-positive ui-border-b">
<i class="ui-icon-return" onclick="history.back()"></i><h1>获取地址位置</h1><a href="Default.aspx?open_id=" class="sp-back sp-home"></a>
</header>
<div class="panel-body" style="margin-top:45px;">
<input type="button" id="btnLocation" value="取得位置" />
<asp:Literal ID="lblInfo" runat="server"></asp:Literal>
</div>
<div class="ui-poptips ui-poptips-warn" id="divInfo" style="display:none;">
<div class="ui-poptips-cnt"><i></i><span id="spntool"></span></div><input type="hidden" id="hideCard_no" />
</div><div id="datePlugin"></div><asp:HiddenField ID="hideOpen_id" runat="server" />
</form>
</body>
</html>