首先,類庫方面,Vue中引入JSSDK的話,請引入weixin-js-sdk,而不是weixin-jsapi,原因在於weixin-jsapi不是最新版;還要注意JS接口安全域名,不需要http前綴,直接輸入網址即可!
第二,開發流程官網已經說得很清楚,需要獲取微信配置,然后才能調用微信的JSSDK相關API:
所有需要使用JS-SDK的頁面必須先注入配置信息,否則將無法調用(同一個url僅需調用一次,對於變化url的SPA的web app可在每次url變化時進行調用
獲取配置方面,由於路由采用hash模式,URL只有一個,因此直接傳入#前面的部分即可:
const getWxConfig = () => {
let currentUrl = encodeURIComponent(window.location.href.split("#")[0]);
//請求配置
post(api_getWxConfig, {requestUrl: currentUrl}).then((res) => {
//let {data} = res;
// config信息驗證后會執行ready方法,所有接口調用都必須在config接口獲得結果之后,config是一個客戶端的異步操作
wx.config({
debug: false, // 開啟調試模式,開發時可以開啟
appId: res.appId, // 必填,公眾號的唯一標識 由接口返回
timestamp: res.timestamp, // 必填,生成簽名的時間戳 由接口返回
nonceStr: res.nonceStr, // 必填,生成簽名的隨機串 由接口返回
signature: res.signature, // 必填,簽名 由接口返回
jsApiList: ['getLocation', 'openLocation', 'chooseImage', 'previewImage', 'uploadImage', 'downloadImage', 'getLocalImgData'] // 此處填你所用到的方法
});
});
};
然后服務端處理方面,簽名算法,請注意:
簽名生成規則如下:參與簽名的字段包括noncestr(隨機字符串), 有效的jsapi_ticket, timestamp(時間戳), url(當前網頁的URL,不包含#及其后面部分) 。對所有待簽名參數按照字段名的ASCII 碼從小到大排序(字典序)后,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串string1。這里需要注意的是所有參數名均為小寫字符。對string1作sha1加密,字段名和字段值都采用原始值,不進行URL 轉義。
然后注意前台用得字段名稱為nonceStr,簽名算法中拼接的為noncestr。
第三,接口調用方面,微信下載圖片等素材的接口已經變為如下的鏈接,而不是百度搜索出來的鏈接
https://api.weixin.qq.com/cgi-bin/material/get_material?access_token=ACCESS_TOKEN
http請求方式: POST,https協議
第四,iOS網頁適配方面,獲取本地圖片接口的時候,需要判斷是否為WKWebview,用於兼容 iOS WKWebview 不支持 localId 直接顯示圖片的問題:
if (window.__wxjs_is_wkwebview) { wx.getLocalImgData({ localId: localId, // 圖片的localID success: (result) => { let localData = result.localData; //console.log("getLocalImgData", localData); } });
第五,獲取地理位置描述,即將微信接口返回的坐標轉換為真實的地址,需要借助騰訊地圖webservice接口,注意這里需要使用gcj02坐標:
import wx from "weixin-js-sdk"; wx.getLocation({ type: 'gcj02', // 默認為wgs84的gps坐標,如果要返回直接給openLocation用的火星坐標,可傳入'gcj02' success: function (res) { let latitude = res.latitude; // 緯度,浮點數,范圍為90 ~ -90 let longitude = res.longitude; // 經度,浮點數,范圍為180 ~ -180。 let speed = res.speed; // 速度,以米/每秒計 let accuracy = res.accuracy; // 位置精度 Vue.jsonp('http://apis.map.qq.com/ws/geocoder/v1/', { location: `${latitude},${longitude}`, coord_type: 5, key: 'xxxx', output: 'jsonp', callback: 'calllocation' }).then(json => { let {address, formatted_addresses} = json.result; //處理數據 }); } });