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

前端代码:

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 ~ -90var 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;}}

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

  1. 微信公众平台开发之获取用户地理位置

    在进行微信运营的时候,用户地理位置是我们进行营销策划.广告活动投放.用户精准营销的重要依据,今天我们就来分析一下微信开发中如何获取获取用户地理位置. 获取用户地理位置,你需要在微信公众平台开发者中心开 ...

  2. 微信公众号开发之获取用户信息

    微信获取用户信息的方式有两种,静默授权(无需用户同意)和非静默授权(需要用户" 手动点击 "拉取授权,可以用户无需关注公众号即可获取用户信息) 整体的代码请查看最后,前边为原理介绍 ...

  3. 微信公众号开发之获取用户列表和用户基本信息(五)

    一.获取用户列表 公众号可通过本接口来获取帐号的关注者列表,关注者列表由一串OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的)组成.一次拉取调用最多拉取10000个关注者的Op ...

  4. php下载 微信头像图片_php微信公众号开发,获取用户头像,并下载

    前一篇文章说了获取用户个人信息,下面来说一下获取用户微信头像,很多开发者在显示用户信息的时候都要获取用户头像,通常获取的都是url连接, 我们需要将图片下载下来并保存,以方便我们调用:. 上一篇文章我 ...

  5. php微信公众号开发,获取用户头像,并下载;

    前一篇文章说了获取用户个人信息,下面来说一下获取用户微信头像,很多开发者在显示用户信息的时候都要获取用户头像,通常获取的都是url连接, 我们需要将图片下载下来并保存,以方便我们调用:. 上一篇文章我 ...

  6. 【微信公众号开发】获取用户信息时,有时成功获取,有时提示“invalid openid hint”

    原因:保存openid的session在某个方法里被重新赋新值了.所以一旦调用了这个方法,再去获取用户信息时,就会报错.

  7. 关于微信公众号开发时获取用户昵称作为参数乱码的问题

    客户需要做个网页小游戏,玩家在玩完后可以分享自己的昵称  分数与排名 于是开发出来后安卓环境下无任何的问题,但是ios下却不能分享,还有就是有的微信昵称是表情的 思考后做出一些判断 首先在后台取出微信 ...

  8. 微信公众号中 JavaScript 获取用户周边的标志性建筑列表

    微信公众号中 JavaScript 获取用户周边的标志性建筑列表 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致& ...

  9. Spring boot 项目(十三)——实现微信公众号授权登录获取用户信息

    引言 微信公众号开发中,必不可少的一环:公众号授权登录.获取微信用户信息 前期准备 内网渗透=>生成本地指定端口映射的外网域名 链接:内网渗透工具natapp使用详解 域名生成之后修改yml文件 ...

最新文章

  1. 没有什么效果的html标签,你知道却不常用的HTML标签(一)
  2. 想“看见”高性能计算嘛?戳这里开始
  3. 新口令范筹(Token Scope)- viewables:read
  4. 文末送书丨深度迁移学习方法的基本思路
  5. XCTF WEB weak_auth
  6. Thread的join方法使用解析
  7. Windows Phone 8.1 新特性 - 控件之应用程序栏
  8. Java基础篇(02):特殊的String类,和相关扩展API
  9. javaScript面向对象是什么?(一)
  10. mysql 信号_MySQL
  11. Clover 驱动文件夹_四叶草Clover相关
  12. execution表达式里写多个条件
  13. DOM SAXReader
  14. ATtiny85单片机制作PCB小提琴
  15. 计算机专业论文评定意见,毕业论文评定意见(级).doc
  16. 查找bug的方法(随笔)
  17. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day39】—— 数据库6
  18. Excel的MATCH函数及其用法
  19. 录屏怎么录?你知道多少录屏软件?
  20. m.2槽分类_什么是M.2扩展槽,如何使用?

热门文章

  1. 生物特征识别技术的标准化工作
  2. 李沐论文精读系列四:CLIP和改进工作串讲(LSeg、GroupViT、VLiD、 GLIPv1、 GLIPv2、CLIPasso)
  3. Node.js全局对象
  4. RMAN-06817: Pluggable Database CHARLESPDB cannot be backed up in NOARCHIVELOG mode.
  5. 【创业】产品开发:什么是敏捷产品开发?
  6. STM32学习笔记(6):PWM控制
  7. 外部联接(Outer Join)和笛卡尔积(Cartesian Product)
  8. C语言程序设计教程_第四章:键盘输入与屏幕输出_笔记整理
  9. android模拟器 diy,DIY泡沫黏液模拟器
  10. CC00039.scala——|HadoopScala.V01|——|Scala.v01|特质|作为接口|使用特质|