本部分需要用到微信的JS-SDK,微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。

通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验。

详细文档点击查看

一、JS-SDK引入

1.先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”,和网页授权一样只是个域名。

2.在需要调用JS接口的页面引入如下JS文件之一

二、通过config接口注入权限验证配置

wx.config({

debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。

appId: '', // 必填,公众号的唯一标识

timestamp: , // 必填,生成签名的时间戳

nonceStr: '', // 必填,生成签名的随机串

signature: '',// 必填,签名

jsApiList: [] // 必填,需要使用的JS接口列表

});

首先生成这个signature之前需要获取到一个临时票据jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,同样也需要个中控服务器控制刷新。

1、获取临时票据

封装返回结果

package com.phil.wechatauth.model.resp;

import com.phil.common.result.ResultState;

/**

* jsapi_ticket是公众号用于调用微信JS接口的临时票据

* @author phil

* @date 2017年8月21日

*

*/

public class JsapiTicket extends ResultState {

/**

*

*/

private static final long serialVersionUID = -357009110782376503L;

private String ticket; //jsapi_ticket

private String expires_in;

public String getTicket() {

return ticket;

}

public void setTicket(String ticket) {

this.ticket = ticket;

}

public String getExpires_in() {

return expires_in;

}

public void setExpires_in(String expires_in) {

this.expires_in = expires_in;

}

} 获取方法

/**

* 获取jsapi_ticket 调用微信JS接口的临时票据

* @return

*/

public String getTicket(String accessToken) {

JsapiTicket jsapiTicket = null;

Mapparams = new TreeMap();

params.put("access_token",accessToken);

params.put("type", "jsapi");

String result = HttpReqUtil.HttpDefaultExecute(HttpReqUtil.GET_METHOD, WechatConfig.GET_TICKET_URL, params,"");

if(StringUtils.isNotBlank(result)){

jsapiTicket = JsonUtil.fromJson(result, JsapiTicket.class);

}

if(jsapiTicket.getErrcode()==0){

return jsapiTicket.getTicket();

}

return null;

}

2、生成签名并返回参数

signature生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。

string1示例如下

jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW×tamp=1414587457&url=http://mp.weixin.qq.com?params=value

这里有个坑,页面是nonceStr,但是签名的字段是noncestr,注意大小写

简单封装下JS-SDK config配置信息

package com.phil.wechatauth.model.resp;

/**

* JS-SDK的页面配置信息

* @author phil

* @date 2017年8月22日

*

*/

public class JsWechatConfig {

private String appId;

private long timestamp;

private String noncestr;

private String signature;

public String getAppId() {

return appId;

}

public void setAppId(String appId) {

this.appId = appId;

}

public long getTimestamp() {

return timestamp;

}

public void setTimestamp(long 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;

}

}

添加配置信息到页面

/**

*

*/

package com.phil.wechatauth.controller;

import java.util.SortedMap;

import java.util.TreeMap;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import com.phil.common.config.SystemConfig;

import com.phil.common.config.WechatConfig;

import com.phil.common.util.DateTimeUtil;

import com.phil.common.util.PayUtil;

import com.phil.common.util.SignatureUtil;

import com.phil.wechatauth.model.resp.JsWechatConfig;

import com.phil.wechatauth.service.WechatAuthService;

/**

* JS-SDK

* @author phil

* @date 2017年8月21日

*

*/

@Controller

@RequestMapping("/auth")

public class WechatAuthController {

@Autowired

private WechatAuthService wechatAuthService;

/**

* 获取地理位置

* @param request

* @return

* @throws Exception

*/

@RequestMapping("/getLocation")

public String getLocation(HttpServletRequest request) throws Exception{

JsWechatConfig jsWechatConfig = new JsWechatConfig();

jsWechatConfig.setAppId(WechatConfig.APP_ID);

jsWechatConfig.setTimestamp(DateTimeUtil.currentTime());

jsWechatConfig.setNoncestr(PayUtil.createNonceStr());

SortedMapmap = new TreeMap();

map.put("jsapi_ticket", wechatAuthService.getTicket(wechatAuthService.findlastestToken()));

map.put("noncestr", jsWechatConfig.getNoncestr());

map.put("timestamp", jsWechatConfig.getTimestamp());

map.put("url", request.getRequestURL().toString());

String signature = SignatureUtil.createSha1Sign(map, null, SystemConfig.CHARACTER_ENCODING);

jsWechatConfig.setSignature(signature);

request.setAttribute("jsWechatConfig", jsWechatConfig);

return "wechatauth/getLocation";

}

}

签名方法

/**

* 通过Map中的所有元素参与签名

*

* @param map 待参与签名的map集合

* @params apikey apikey中 如果为空则不参与签名,如果不为空则参与签名

* @return

*/

public static String createSha1Sign(SortedMapmap, String apiKey, String characterEncoding) {

String result = notSignParams(map, apiKey);

MessageDigest md = null;

try {

md = MessageDigest.getInstance("SHA-1");

byte[] digest = md.digest(result.getBytes());

result = byteToStr(digest);

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

return result;

}

其他的签名方法点击查看

三、通过ready接口处理成功验证

以上执行完成,进入的完整的页面

获取地理位置

地址:

可以通过微信官方提供的微信web开发者工具调试

java微信公众号获取地理位置_Java微信公众平台开发之获取地理位置相关推荐

  1. java微信公众号支付退款_java 微信公众号支付 详细教程【站长吐血整理】

    maven或者gradle 项目记得引用第三方开放的sdk工具类,微信支付的,很全 微信开发者第三方sdk库资料:weixin-popular compile group: 'com.github.w ...

  2. java微信公众号中文乱码_java微信公众平台开发回复中文消息乱码解决方案

    如上图所示,中文乱码,解决方法: 1,找到公众管理平台服务器配置的url请求地址对应的类(java是一个普通的servlet类). 2,在doPost方法中加入以下代码: // 将请求.响应的编码均设 ...

  3. Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理

    在前几节文章中我们讲述了微信公众号环境的搭建.如何接入微信公众平台.以及微信服务器请求消息,响应消息,事件消息以及工具处理类的封装:接下来我们重点说一下-微信服务器post消息体的接收及消息的处理,这 ...

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

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

  5. 微信公众号文章/菜单添加小程序时路径如何获取?

    公众号文章添加素材时或者在公众号菜单可以添加小程序了:添加后用户点击可以一键跳转小程序任何界面,小程序路径获取您可以前往天天外链把路径发送给天天外链即可快速获取小程序路径. 除了公众号文章以及公众号菜 ...

  6. 解决新版微信公众号不能菜单显示历史文章问题,手动获取biz获取历史链接

    开始 biz,最近想给公众号在菜单设置一个历史文章的菜单,记得之前是可以直接选择设置的,新版取消了这个功能,所以我就琢磨了一下. 获取历史链接 先琢磨下微信历史文章链接,我们随便拿一个公众号(新版的微 ...

  7. 微信公众号数据2019_历史微信公众号排名,微信公众号新榜排名

    历史微信公众号排名,微信公众号新榜排名 公众号排名优化的注意事项及细节今天给大家分享一下,作为微信公众号的排名优化对于大多数人来说都已经知道了有这个渠道的事情,其实很多的新产品及渠道出来以后有不少的人 ...

  8. android 微信公众号开发教程,微信公众号-开发者-自定义菜单,公众开发者

    微信公众号-开发者-自定义菜单,公众开发者 我是个初学者,网上找了看了好多,都是第三方实现的,考虑到安全问题,不敢用! 今天终于摸索出了实现方法. 官方api:http://mp.weixin.qq. ...

  9. 点击按钮复制微信号/公众号,并打开微信APP搜索H5如何制作。

    我们在外部浏览器或者APP推广自己的公众号或者企业微信时经常看到别人使用复制搜索模式,具体操作流程是什么样的呢? 一.复制搜索公众号跳转流程 1.用户打开您的H5落地页: 2.点击按钮将公众号复制到剪 ...

  10. 微信公众号掉粉原因分析,公众号运营者请对照排查

    微信公众号每天都想着办法的吸粉.涨粉,可是每天掉粉还是不断,新的粉丝没有吸引来,原有的粉丝却在不停取消关注.其实很多时候运营者的一些微不足道的习惯,直接导致了掉粉,却没有被重视起来 1.        ...

最新文章

  1. 定制linux版本,Instalinux:在线自由定制 Linux 发行版
  2. java 数据类型model_如何在角度2中使用类数据类型的ngModel?
  3. linux系统中acpid的作用,ACPID电源按钮事件本地权限提升漏洞
  4. nodejs的启动方式
  5. 数学到底有多重要?网友:道理都懂,实力不允许啊
  6. mybatis循环map的一些技巧
  7. 成为java架构师需要具备那些技能?
  8. layui表格使用复选框批量删除_layui表格数据复选框回显设置方法,表格复选框...
  9. 10.1 Python图像处理之边缘算子-Sobel算子、Roberts算子、拉普拉斯算子、Canny算子、Prewitt算子、高斯拉普拉斯算子
  10. 信号处理算法方向的一些SCI杂志(他人经验)
  11. softice调试驱动程序
  12. 超高速V系列DMD空间光调制器
  13. 电脑配置单4(自用勿删)
  14. 机器视觉系列(五)——镜头部分
  15. 足球html游戏,[盘点]球迷不可错过的足球类网页游戏
  16. 为何非得选择旧金山测试?通用Cruise讲述无人车炼成记
  17. 一分钟快速将ogg转换成MP3格式
  18. chromedriver、geckodriver、MicrosoftWebDriver、IEDriverServer和operadriver之间的恩怨纠葛
  19. 高德地图搜索结果点击事件
  20. ASP.NET 简介

热门文章

  1. 中国地理知识大全(转载)
  2. C语言:将邻接矩阵转换为邻接表算法
  3. 2022-01-10:路径交叉。给你一个整数数组 distance 。 从 X-Y 平面上的点 (0,0) 开始,先向北移动 distance[0] 米,然后向西移动 distance[1] 米,向南
  4. 【2017年】阿里巴巴算法笔试第二题
  5. 数学实验matlab 韩明,数学实验(MATLAB版)[韩明,王家宝,李林 编著] 2012年版
  6. unity2D:无限跳跃bug和卡墙bug处理
  7. 1.2 InSAR数据处理之软件介绍
  8. cocosCreator 精灵图片加载(一键还原大小+动态修改图片)
  9. 基于STM32和EV1527的无线接收解码程序
  10. mysql数据库表空间压缩,表空间中有数据也可以压缩表空间(数据文件)大小!!...