时间:2021-05-02
本部分需要用到微信的js-sdk,微信js-sdk是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。
通过使用微信js-sdk,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验。
官方文档
一、js-sdk引入
1.先登录微信公众平台进入“公众号设置”的“功能设置”里填写“js接口安全域名”,和网页授权一样只是个域名。
2.在需要调用js接口的页面引入如下js文件之一
? 1 2 <script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> <script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>二、通过config接口注入权限验证配置
? 1 2 3 4 5 6 7 8 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、获取临时票据
封装返回结果
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 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; } }获取方法
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 /** * 获取jsapi_ticket 调用微信js接口的临时票据 * @return */ public string getticket(string accesstoken) { jsapiticket jsapiticket = null; map<string,string> params = new treemap<string,string>(); 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配置信息
添加配置信息到页面
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 /** * */ 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()); sortedmap<object,object> map = new treemap<object,object>(); 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"; } }签名方法
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 /** * 通过map<sortedmap,object>中的所有元素参与签名 * * @param map 待参与签名的map集合 * @params apikey apikey中 如果为空则不参与签名,如果不为空则参与签名 * @return */ public static string createsha1sign(sortedmap<object, object> map, 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接口处理成功验证
以上执行完成,进入的完整的页面
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 <%@ page language="java" contenttype="text/html; charset=utf-8" pageencoding="utf-8"%> <!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>获取地理位置</title> <!-- 微信 js-sdk --> <script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css"> <script src="http://cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script> </head> <body> <br> <div class="container"> <div class="form-group"> <label for="firstname" class="col-sm-2 control-label">地址:</label> <div class="col-sm-10" id="item-ifo"> <input type="text" value="" class="form-control" name="location.address" id="address" placeholder="正在获取地理位置" tabindex="1" autocomplete="off" /> <div class="i-name ico" id="i-name"></div> </div> </div> </div> </body> <script type="text/javascript"> wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appid: '${jswechatconfig.appid}', // 必填,公众号的唯一标识 timestamp: '${jswechatconfig.timestamp}' , // 必填,生成签名的时间戳 noncestr: '${jswechatconfig.noncestr}', // 必填,生成签名的随机串 signature: '${jswechatconfig.signature}',// 必填,签名,见附录1 jsapilist: [ 'checkjsapi', 'openlocation', 'getlocation'] // 必填,需要使用的js接口列表,所有js接口列表见附录2 }); wx.checkjsapi({ jsapilist: ['getlocation'], // 需要检测的js接口列表,所有js接口列表见附录2, success: function(res) { if (res.checkresult.getlocation == false) { alert('你的微信版本太低,不支持微信js接口,请升级到最新的微信版本!'); return; } } }); var latitude; var longitude; var speed; var accuracy; wx.ready(function(){ // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。 wx.getlocation({ success : function(res) { latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90 longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。 speed = res.speed; // 速度,以米/每秒计 accuracy = res.accuracy; // 位置精度 alert(latitude); alert(accuracy); }, cancel : function(res) { alert('未能获取地理位置'); } }); }); wx.error(function(res){ // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于spa可以在这里更新签名。 alert("验证出错"); }); </script> </html>可以通过微信官方提供的微信web开发者工具调试。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/phil_jing/article/details/77466371
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了php微信公众开发之获取周边酒店信息的方法。分享给大家供大家参考。具体分析如下:关注微信公众之后发送回复地理位置信息,即可回复周边附近的酒店信息列
微信小程序实例-获取当前的地理位置、经纬度微信小程序官方文档https://mp.weixin.qq.com/debug/wxadoc/dev/api/loca
在本文微信小程序--获取用户地理位置名称(无须用户授权)之前需要先看看微信小程序-获取用户session_key,openid,unionid-后端为nodej
微信公众号中默认会提供地理位置,想要关闭地理定位功能,该怎么关闭呢?下面我们就来看看详细的教程。软件名称:微信V6.5.6forAndroid官方中文免费正式版
在Android应用中,往往有获取当前地理位置的需求,比如微信获取附近的人需要获取用户当前的位置,不多说,直接上例子。复制代码代码如下:publicLocati