微信公众号开发之获取用户地理位置

使用微信的用户地理位置接口就要配置这里。
1

前端代码:

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 + "&timestamp=" + 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;
	}
    
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值