Java 微信JS SDK 入门(网页内获取地理信息)

阅读前,请保证对微信开发有过了解。

1.准备

1.一个微信公众(本文以测试号为例子)

2.微信web开发者工具,官网有下载

2.新建一个jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" %>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
    <script>
        //用于测试时确保URL与后端的一样,这很重要!!!
        alert("当前URL:"+location.href.split('#')[0]);
        wx.config({
            debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
            appId: '${appId}', // 必填,企业号的唯一标识,此处填写企业号corpid
            timestamp: parseInt("${timestamp}",10), // 必填,生成签名的时间戳
            nonceStr: '${noncestr}', // 必填,生成签名的随机串
            signature: '${signature}',// 必填,签名,见附录1
            jsApiList: ['getLocation'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
        });
        wx.ready(function(){
        });

        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>

上面可以看到,前端想要调用js sdk,就需要后台提供下面几个信息

  1. appId 这个不用说了吧
  2. timestamp 时间戳,开发者自己生成
  3. nonceStr 随机字符串,开发者自己生成
  4. signature 签名,需要计算出来,这个才是最重要的

备注一下坑:前端的参数名注意书写规则。前端参数命名以驼峰式命名,后台就以全小写。。。。大公司就不能专业一点吗

 

3.后台Java代码(Spring MVC)

详细的注释代码都有

 @RequestMapping("/wx/jsSDK")
    public String jsSDK(Model model, HttpServletRequest request) {
        //获取jsSDK临时票据ticket
        String ticket = CommonUtil.getJsApiTicket();
        log.info(ticket);
        //计算签名signature
        String noncestr = UUID.randomUUID().toString();//生成一段随机数
        String timestamp = Long.toString(System.currentTimeMillis() / 1000);//生成timestamp
        //获取当前请求url,#前面所有
        String url;
        String queryString = request.getQueryString();//URL参数,即?后的xx=xxx
        if (queryString == null) {
            queryString = "";
        } else {
            queryString = "?" + queryString;
        }

        url = request.getScheme() + "://"
                + request.getServerName() + ":"
                + request.getServerPort()
                + request.getContextPath()
                + request.getServletPath()
                + queryString;
        /*
        注意,无论你的URL是否带参数,都必须判断他是否有参数
        因为有时候微信跳转的时候会在你的URL后面加参数用于统计,
        比如你的URL是 http://域名/项目名/xxx/jsSDK
        跳转的时候微信会在后面加参数,变成 http://域名/项目名/xxx/jsSDK?nsukey=xxxxxxxx
        这样,计算出来的签名就会不正确了,这也是坑之一

        下面几句代码是方便测试用的,为什么?
        以我为例,测试时候URL是http://127.0.0.1:8080/wx/jsSDK
        发布的时候,URL是     http://域名/wx/jsSDK
        发现什么了,端口80自动隐藏了,也就是说发布的时候,是不能把80写进去,不然计算出来的签名会出错
        一句说完,这里的URL与你访问的URL 必须完全一致
        */

        boolean degug = true;
        //如果是正式发布,把“:80” 去掉
        if (degug == false) {
            url = url.replace(":80", "");
        }
        log.info("地址:" + url);


        //把这些信息组合起来,使用SHA1加密,得到 signature
        String str = "jsapi_ticket=" + ticket +
                "&noncestr=" + noncestr +
                "&timestamp=" + timestamp +
                "&url=" + url;
        String signature = SignUtil.SHA1(str).toLowerCase();


        //把信息传到前台
        model.addAttribute("signature", signature);
        model.addAttribute("timestamp", timestamp);
        model.addAttribute("noncestr", noncestr);
        model.addAttribute("appId", wxEnum.APPID.getValue());
        return "jssdk";
    }

上面调用了两个工具的方法

  1. 获取accessToken,这个就不贴出来
  2. 获取ticket的贴出来参考
  3. SHA1加密,这个自己百度
    public static String jsapi_ticket = null;
    public static long time = 0;


    public static String getJsApiTicket() {
        if (jsapi_ticket != null) {
            //ticket有效期7200s,无需在有效时间内重复申请。
            if (((new Date().getTime() - time) / 1000) > 7000) {
                return jsapi_ticket;
            }
        }
        //获取token
        Token token = CommonUtil.getToken(wxEnum.APPID.getValue(), wxEnum.APPSECRET.getValue());
        String accessToken = token.getAccessToken();
        //根据token获取ticket
        String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
        String requestUrl = url.replace("ACCESS_TOKEN", accessToken);
        // 发起GET请求获取凭证
        JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);
        if (null != jsonObject) {
            try {
                jsapi_ticket = jsonObject.getString("ticket");
                time = new Date().getTime();
                return jsapi_ticket;
            } catch (JSONException e) {
                log.error("获取token失败" + jsonObject.getInt("errcode") + jsonObject.getString("errmsg"));
            }
        }
        return null;
    }


	public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
		JSONObject jsonObject = null;
		try {
			// 创建SSLContext对象,并使用我们指定的信任管理器初始化
			TrustManager[] tm = { new MyX509TrustManager() };
			SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
			sslContext.init(null, tm, new java.security.SecureRandom());
			// 从上述SSLContext对象中得到SSLSocketFactory对象
			SSLSocketFactory ssf = sslContext.getSocketFactory();

			URL url = new URL(requestUrl);
			HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
			conn.setSSLSocketFactory(ssf);
			
			conn.setDoOutput(true);
			conn.setDoInput(true);
			conn.setUseCaches(false);
			// 设置请求方式(GET/POST)
			conn.setRequestMethod(requestMethod);

			// 当outputStr不为null时向输出流写数据
			if (null != outputStr) {
				OutputStream outputStream = conn.getOutputStream();
				// 注意编码格式
				outputStream.write(outputStr.getBytes("UTF-8"));
				outputStream.close();
			}

			// 从输入流读取返回内容
			InputStream inputStream = conn.getInputStream();
			InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
			BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
			String str = null;
			StringBuffer buffer = new StringBuffer();
			while ((str = bufferedReader.readLine()) != null) {
				buffer.append(str);
			}

			// 释放资源
			bufferedReader.close();
			inputStreamReader.close();
			inputStream.close();
			inputStream = null;
			conn.disconnect();
			jsonObject = JSONObject.fromObject(buffer.toString());
		} catch (ConnectException ce) {
			log.error("连接超时:{}", ce);
		} catch (Exception e) {
			log.error("https请求异常:{}", e);
		}
		return jsonObject;
	}

开启tomcat,在微信开发工具里测试

看都这个提示,表示代码没问题,还需要到微信公众平台 设置的公众号的JS接口安全域名

为127.0.0.1:8080再次刷新即提示成功

转载于:https://my.oschina.net/yejunxi/blog/721084

微信网页开发JS-SDK获取签名signature 获取js-sdk签名signature 阅读详情

相关推荐

微信开发系列(六)_js调用微信扫码

项目里面需要用到用户通过网址来进行授权 需要用到微信的扫码(请用微信打开 看效果  http://lg.kezir.com/testSaoMa/jsDemo.html?a=1 ) 微信JS-SDK说明文档 概述 微信JS-SDK微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。 通过使用微信JS-SDK网页开发者可借助微信高效地使用拍照、选

XuTen的博客 1万+

微信接入js-sdk-获取地理位置,打开微信内置地图

1.第一步当然是已经正确接入了微信并且配置好了回调安全域名。不会的朋友可以看看《微信开发-初级接入微信公众平台MP》 2.   引用微信js-sdk, http://res.wx.qq.com/open/js/jweixin-1.0.0.js,然后通过config接口注入权限验证配置。先在自己的服务器上写个获取数据的接口: /** * 获取页面需要的配置信息的参数 *

陈袁的博客 7万+

【实战篇】微信公众号JS-SDK获取当前经纬度及地址信息

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

风中追风 4223

微信公众号获取用户地址

JS-SDK获取用户地区经纬度 getArea() { this.doConfig(); let that = this; //创建百度地图控件 wx.getLocation({ type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02' success: function (res) { ...

guanguan0_0的博客 1827

微信jssdk获取当前位置,以及打开微信地图

$(function() {     var url = window.location.href;     var userId = $("#userId").val();     // var openId = $("#sessionOpenId").val();     // alert("openId = " + openId);     if ($("#path").val()

qq_33786626的博客 1510

微信公众号JS-SDK获取当前经纬度及地址信息

微信公众号开发的项目中,我们经常会遇到关于定位这样的功能, 当然我就遇到了这样的事情,大概翻阅了一下资料,基本思路如下: 首先H5开发本身不具备这样的功能,所以肯定要借助三方接口来实现。 选择性就很多啦!比如:腾讯地图、百度地图、淘宝IP等很多。 其次,我们要考虑的就是前端应用还是后端应用,这里就有明显的区别啦! **前端应用:**页面在打开以后执行后传给后端; **后端应用:**在页面打开前后端执行获取后连同页面渲染给前端。 这个就要根据你的应用场景进行选择啦,这里我们主要说一下前端的应用,至于后端应用大

cocosinu的博客 3877

微信公众号JS-SDK获取用户位置信息

CSDN已弃用 3220

微信开发 Java SDK微信公众支付(获取openid)

获取openid 1 第一步:用户同意授权,获取code 2 第二步:通过code换取网页授权access_token 3 第三步:刷新access_token(如果需要) 4 第四步:拉取用户信息(需scope为 snsapi_userinfo) 5 附:检验授权凭证(access_token)是否有效 微信公众平台官方文档——微信网页授权 微信支付 用户点击一个支付按钮–&amp;gt;{后台一...

揣金磊 的博客 4092

JS-SDK获取微信接口权限

微信JS-SDK通过config接口注入权限验证配置: 前端页面JS代码: wx.config({ // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 debug: true, appId: '', // 必填,公众号的唯一标识 t...

weixin_43619368的博客 1135

微信 JS-SDK 认识 JSBridge

前段时间由于要实现 H5 移动端拉取微信卡包并同步卡包数据的功能,于是在项目中引入了 **`微信 JS-SDK(jweixin)`**[1] 相关包实现功能,但也由此让我对其产生了好奇心,于是打算好好了解下相关的内容,通过查阅相关资料发现这其实属于 JSBridge的一种实现方式。因此,只要了解 JSBridge就能明白 微信 JS-SDK是怎么一回事。以上通过微信 JS-SDKJSBridge的一个简单介绍,大家现在应该不至于认为JSBridge。

2401_83384536的博客 2207

整合微信支付JS-SDKJAVA后端实现支付接口

在涉及资金交易的API调用中,签名验证机制是保证请求安全性的重要环节。其核心思想是,将请求中的所有参数按照一定规则进行排序和拼接,然后使用商户平台的密钥进行加密,生成一个签名字符串。这个签名字符串会与API请求一同发送到服务器,服务器接收到请求后,会根据相同的规则进行签名验证,以确保请求的合法性。一般而言,签名算法使用的是哈希函数,例如MD5或SHA256。在微信支付场景中,通常使用的是随机字符串加商户密钥进行加密的机制,以保证数据的不可预测性和不可篡改性。

weixin_42593701的博客 907

微信 JS-SDK 实现自定义分享、手机选图拍照、图片音频处理、地理位置、摇一摇等功能

学习微信网页开发工具包,高效利用微信生态能力

国内某知名游戏公司小菜鸡工程师 3719

微信小程序实现定位(小白专用)

微信小程序实现定位 需要引入腾讯地图的api 腾讯地图下载地址 创建libs文件夹引入地图js 在需要定位的页面写js //引入地图 var QQMapWX = require('../../libs/qqmap-wx-jssdk.js'); var qqmapsdk; Page({ onLoad: function () { // 实例化API核心类 qqmapsdk = new QQMapWX({ key: '申请的key'

H_eartbeat的博客 1万+

微信js-sdk获取用户位置信息(经纬度)

官方文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#36 js: $.ajax({ url: "/wx/getInfoMation", type: "post", data: {url:link}, dataType: "json", succes

ccyy 1080

小程序定位

一、小程序定位 需要用到腾讯位置服务官网–>微信小程序JavaScript SDK(用来获取当前地址信息) https://lbs.qq.com/miniProgram/jsSdk/jsSdkGuide/jsSdkOverview 微信小程序官网 https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html 1.使用步骤 代码如下(示例): 申请开发者密钥(key) 申请密钥 下

weixin_46016219的博客 980

微信JSSDK获取当前地理位置信息

最近在研究微信JS-SDK文档中的地理位置接口部分,小有心得,在此和大家分享一下。首先是JSSDK的接入,可参照官方文档来做,在此略过。 下面进入本文的正题: 如果获取当前地理位置的信息, 包括经纬度和位置详细信息,并在微信公众号页面中打开当前位置的图 步骤如下: 1. 在页面上放置一个按钮,用来点击触发获取地理位置接口的事件: 获取地理位置接口 getLocation

hunan961的博客 1万+

引入js-sdk,调用扫描二维码和获取位置功能。解决ios定位正常,安卓报错getlocation invalid signature问题。

vue3项目中使用微信jssdk的扫描和定位功能。解决安卓手机定位报错getlocation invalid signature。

cyyyeahey的博客 1665
上一篇: Java 实时论坛 - Sym 1.4.0 发布
下一篇: POJ2488 A Knight's Journey
weixin_34411563
博客等级 码龄10年 9196粉丝 673原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值