使用微信的用户地理位置接口就要配置这里。
前端代码:
function configWx() {
var thisPageUrl = location.href.split('#')[0];
$.ajax({
url:"http://这里是自己设置的名字.free.idcfengye.com/weixin/locationServlet",
type:"POST",
data:{'thisPageUrl':thisPageUrl},
async:true,
dataType:"text",
success: function (data) {
var dataObj=eval("("+data+")");
// alert(dataObj);
// alert("dataobj.signature:"+dataObj.signature);
if(data!=null){
configWeiXin(dataObj.timestamp, dataObj.nonceStr,
dataObj.signature);
}else {
console.log("配置weixin jsapi失败");
}
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
//status :返回的HTTP状态码,比如常见的404,500等错误代码。
alert(XMLHttpRequest.status);
//readyState :当前状态,0-未初始化,1-正在载入,2-已经载入,3-数据进行交互,4-完成。
alert(XMLHttpRequest.readyState);
//statusText :对应状态码的错误信息,比如404错误信息是not found,500是Internal Server Error。
alert(textStatus);
//responseText :服务器响应返回的文本信息
//第二个参数 String textStatus:返回的是字符串类型,表示返回的状态,根据服务器不同的错误可能返回下面这些信息:"timeout"(超时), "error"(错误), "abort"(中止), "parsererror"(解析错误),还有可能返回空值。
//第三个参数 String errorThrown:也是字符串类型,表示服务器抛出返回的错误信息,如果产生的是HTTP错误,那么返回的信息就是HTTP状态码对应的错误信息,比如404的Not Found,500错误的Internal Server Error。
}
});
}
function configWeiXin(timestamp,nonceStr,signature){
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '自己的APPID', // 必填,公众号的唯一标识
timestamp:timestamp , // 必填,生成签名的时间戳
nonceStr: nonceStr, // 必填,生成签名的随机串
signature: signature,// 必填,签名
jsApiList: [
'getLocation',
] // 必填,需要使用的JS接口列表
});
}
function getMyLocation(){
wx.ready(function(){
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
wx.getLocation({
type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02',后面精度高
success: function (res) {
var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
var speed = res.speed; // 速度,以米/每秒计
var accuracy = res.accuracy; // 位置精度
$.ajax({
url:"http://这里是自己设置的名字.free.idcfengye.com/weixin/addLocation",
type:"POST",
data:{'latitude':latitude,'longitude':teaNum,'openid':openid},
async:true,
//dataType:"text",
success: function (data) {
alert(data);
console.log(data);
},
error: function(data) {
alert("定位发送失败");
}
});
}
});
});
wx.error(function(res){
console.log(res);
alert("获取位置信息失败");
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});
}
在进行微信公众号开发的时候,我遇到了跨域问题。下述函数的前面部分就是解决跨域问题的。
locationServlet:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Post");
HttpServletResponse res = (HttpServletResponse) response;
HttpServletRequest req = (HttpServletRequest) request;
res.setHeader("Access-Control-Allow-Origin", "*");//这是解决跨域问题,对所有都开放
//res.setHeader("Access-Control-Allow-Origin", "http://ouyang.free.idcfengye.com/weixin");//对此网址开放
//res.setHeader("Access-Control-Allow-Origin", req.getHeader("Origin"));
res.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACES");
res.setHeader("Access-Control-Max-Age", "3600");
res.setHeader("Access-Control-Allow-Headers", "Accept,Origin,X-Requested-With,Content-Type,X-Auth-Token");
res.setHeader("Access-Control-Allow-Credentials", "true");
String url = request.getParameter("thisPageUrl");
WxService wx = new WxService();
JSAPIReturn jsapi = wx.createJsapiSignature(url);
StringBuilder sb = new StringBuilder();
sb.append('{').append("\"timestamp\":").append("" + jsapi.getTimestamp() + "").append(",");
sb.append("\"nonceStr\":").append("\"" + jsapi.getNonceStr() + "\"").append(",");
sb.append("\"signature\":\"").append(jsapi.getSignature());
sb.append("\"}");
PrintWriter out = response.getWriter();
out.print(sb.toString());
out.flush();
out.close();
}
createJsapiSignature函数:
public JSAPIReturn createJsapiSignature(String url) {
JSAPIReturn jsapi = new JSAPIReturn();
//准备参数
String ticket = getAPITicket();
//String base_access_token = getAccessToken();
String timestamp = Long.toString(System.currentTimeMillis() / 1000);
String nonceStr = createNonceStr(16);
//sha1加密
String requesturl = "jsapi_ticket=" + ticket + "&noncestr=" + nonceStr + "×tamp=" + timestamp + "&url=" + url;
System.out.println("requesturl=" + requesturl);
String signature = SHA1(requesturl);
System.out.println("signature=" + signature);
jsapi.setNonceStr(nonceStr);
jsapi.setSignature(signature);
jsapi.setTimestamp(timestamp);
return jsapi;
}
getAPITicket函数:
public static String getAPITicket() {
if(apiTicket == null || apiTicket.isExpired()) {
getJSAPITicket();
}
return apiTicket.getJsapiTicket();
}
getJSAPITicket函数:
private static JSAPITicket apiTicket;
public static void getJSAPITicket() {
String Url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
Url = Url.replace("ACCESS_TOKEN",getAccessToken());//之前的bug:token无效的,Url=Url.replace();
//System.out.println("执行到ticket之前");
String ticketStr = Util.get(Url);
System.out.println(ticketStr);
//System.out.println("执行到ticket之后");
//System.out.println("后"+getAccessToken());
JSONObject jsonObj = JSONObject.parseObject(ticketStr);
String ticket = jsonObj.getString("ticket");
String expireIn = jsonObj.getString("expires_in");
apiTicket = new JSAPITicket(ticket,expireIn);
}
JSAPITicket类:
public class JSAPITicket {
private String jsapiTicket;
private long expireTime;
public JSAPITicket(String jsapiTicket,String expireIn) {
super();
this.jsapiTicket = jsapiTicket;
expireTime = System.currentTimeMillis()+Integer.parseInt(expireIn)*1000;
}
/* Token是否过期 */
public boolean isExpired() {
return System.currentTimeMillis()>expireTime;
}
public long getExpireTime() {
return expireTime;
}
public void setExpireTime(long expireTime) {
this.expireTime = expireTime;
}
public String getJsapiTicket() {
return jsapiTicket;
}
public void setJsapiTicket(String jsapiTicket) {
this.jsapiTicket = jsapiTicket;
}
}
JSAPIReturn类:
public class JSAPIReturn {
private String timestamp;
private String nonceStr;
private String signature;
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
public String getNonceStr() {
return nonceStr;
}
public void setNonceStr(String nonceStr) {
this.nonceStr = nonceStr;
}
public String getSignature() {
return signature;
}
public void setSignature(String signature) {
this.signature = signature;
}
}