溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用Java怎么在微信公眾平臺(tái)中獲取地理位置

發(fā)布時(shí)間:2021-02-22 16:03:04 來源:億速云 閱讀:187 作者:Leah 欄目:編程語言

本篇文章為大家展示了使用Java怎么在微信公眾平臺(tái)中獲取地理位置,內(nèi)容簡明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

Java的特點(diǎn)有哪些

Java的特點(diǎn)有哪些 1.Java語言作為靜態(tài)面向?qū)ο缶幊陶Z言的代表,實(shí)現(xiàn)了面向?qū)ο罄碚摚试S程序員以優(yōu)雅的思維方式進(jìn)行復(fù)雜的編程。 2.Java具有簡單性、面向?qū)ο?、分布式、安全性、平臺(tái)獨(dú)立與可移植性、動(dòng)態(tài)性等特點(diǎn)。 3.使用Java可以編寫桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序等。

一、JS-SDK引入

1.先登錄微信公眾平臺(tái)進(jìn)入“公眾號(hào)設(shè)置”的“功能設(shè)置”里填寫“JS接口安全域名”,和網(wǎng)頁授權(quán)一樣只是個(gè)域名。

2.在需要調(diào)用JS接口的頁面引入如下JS文件之一

<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接口注入權(quán)限驗(yàn)證配置

wx.config({ 
 debug: true, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會(huì)通過log打出,僅在pc端時(shí)才會(huì)打印。 
 appId: '', // 必填,公眾號(hào)的唯一標(biāo)識(shí) 
 timestamp: , // 必填,生成簽名的時(shí)間戳 
 nonceStr: '', // 必填,生成簽名的隨機(jī)串 
 signature: '',// 必填,簽名 
 jsApiList: [] // 必填,需要使用的JS接口列表 
});

首先生成這個(gè)signature之前需要獲取到一個(gè)臨時(shí)票據(jù)jsapi_ticket,jsapi_ticket是公眾號(hào)用于調(diào)用微信JS接口的臨時(shí)票據(jù)。正常情況下,jsapi_ticket的有效期為7200秒,通過access_token來獲取。由于獲取jsapi_ticket的api調(diào)用次數(shù)非常有限,頻繁刷新jsapi_ticket會(huì)導(dǎo)致api調(diào)用受限,影響自身業(yè)務(wù),同樣也需要個(gè)中控服務(wù)器控制刷新。

1、獲取臨時(shí)票據(jù)

封裝返回結(jié)果

package com.phil.wechatauth.model.resp; 
 
import com.phil.common.result.ResultState; 
 
/** 
 * jsapi_ticket是公眾號(hào)用于調(diào)用微信JS接口的臨時(shí)票據(jù) 
 * @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 調(diào)用微信JS接口的臨時(shí)票據(jù) 
 * @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、生成簽名并返回參數(shù)

signature生成規(guī)則如下:參與簽名的字段包括noncestr(隨機(jī)字符串), 有效的jsapi_ticket, timestamp(時(shí)間戳), url(當(dāng)前網(wǎng)頁的URL,不包含#及其后面部分) 。對(duì)所有待簽名參數(shù)按照字段名的ASCII 碼從小到大排序(字典序)后,使用URL鍵值對(duì)的格式(即key1=value1&key2=value2…)拼接成字符串string1。這里需要注意的是所有參數(shù)名均為小寫字符。對(duì)string1作sha1加密,字段名和字段值都采用原始值,不進(jìn)行URL 轉(zhuǎn)義。

string1示例如下

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

這里有個(gè)坑,頁面是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()); 
 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"; 
 } 
}

簽名方法

/** 
 * 通過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接口處理成功驗(yàn)證

以上執(zhí)行完成,進(jìn)入的完整的頁面

<%@ 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, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會(huì)通過log打出,僅在pc端時(shí)才會(huì)打印。 
 appId: '${jsWechatConfig.appId}', // 必填,公眾號(hào)的唯一標(biāo)識(shí) 
 timestamp: '${jsWechatConfig.timestamp}' , // 必填,生成簽名的時(shí)間戳 
 nonceStr: '${jsWechatConfig.noncestr}', // 必填,生成簽名的隨機(jī)串 
 signature: '${jsWechatConfig.signature}',// 必填,簽名,見附錄1 
 jsApiList: [ 'checkJsApi', 'openLocation', 'getLocation'] // 必填,需要使用的JS接口列表,所有JS接口列表見附錄2 
 }); 
 
 wx.checkJsApi({ 
 jsApiList: ['getLocation'], // 需要檢測(cè)的JS接口列表,所有JS接口列表見附錄2, 
 success: function(res) { 
  if (res.checkResult.getLocation == false) { 
  alert('你的微信版本太低,不支持微信JS接口,請(qǐng)升級(jí)到最新的微信版本!'); 
  return; 
  } 
 } 
 }); 
 var latitude; 
 var longitude; 
 var speed; 
 var accuracy; 
 wx.ready(function(){ 
 // config信息驗(yàn)證后會(huì)執(zhí)行ready方法,所有接口調(diào)用都必須在config接口獲得結(jié)果之后,config是一個(gè)客戶端的異步操作,所以如果需要在頁面加載時(shí)就調(diào)用相關(guān)接口,則須把相關(guān)接口放在ready函數(shù)中調(diào)用來確保正確執(zhí)行。對(duì)于用戶觸發(fā)時(shí)才調(diào)用的接口,則可以直接調(diào)用,不需要放在ready函數(shù)中。 
 wx.getLocation({ 
  success : function(res) { 
  latitude = res.latitude; // 緯度,浮點(diǎn)數(shù),范圍為90 ~ -90 
  longitude = res.longitude; // 經(jīng)度,浮點(diǎn)數(shù),范圍為180 ~ -180。 
  speed = res.speed; // 速度,以米/每秒計(jì) 
  accuracy = res.accuracy; // 位置精度 
  alert(latitude); 
  alert(accuracy); 
  }, 
  cancel : function(res) { 
  alert('未能獲取地理位置'); 
  } 
 }); 
 }); 
 
 wx.error(function(res){ 
 // config信息驗(yàn)證失敗會(huì)執(zhí)行error函數(shù),如簽名過期導(dǎo)致驗(yàn)證失敗,具體錯(cuò)誤信息可以打開config的debug模式查看,也可以在返回的res參數(shù)中查看,對(duì)于SPA可以在這里更新簽名。 
 alert("驗(yàn)證出錯(cuò)"); 
 }); 
</script> 
</html>

上述內(nèi)容就是使用Java怎么在微信公眾平臺(tái)中獲取地理位置,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI