微信JS-SDK是微信公眾平台提供給網頁開發者的以微信內為基礎的網頁開發工具包。
透過使用微信JS-SDK,網頁開發者可藉助微信有效地使用拍照、選圖、語音、位置等手機系統的能力,同時可以直接使用微信分享、掃一掃、卡券、支付等微信特有的能力,為微信用戶提供更優質的網頁體驗
我們如果要實現在公眾號的內嵌h5中實現微信分享,支付等功能,就得引入js- sdk。
使用js-sdk有一個關鍵的環節,就是透過config介面注入權限來驗證配置,而配置中有個signature參數是需要藉助服務端取得的,這裡就不過多探討了,大家透過官方文件可以深入了解。
Hash or History?
上篇文章,我推薦大家在vue中設定vue-router使用hash模式,那麼hash模式和history模式到底有什麼差別呢?我舉個栗子,假設我們都透過http://domain.com
進入,然後跳到路由為/jssdk
的頁面需要用到jssdk,那麼實際js-sdk進行簽名校驗時所取得的目前頁面url在ios和andrioid是不同的,這裡我透過表格展示出來:
怎麼辦呢,只能硬著腦子解決history問題咯,其實也好解決,就是
iOS需要使用第一次進入頁面的URL獲取簽名,安卓每次路由切換都重新配置簽名。我在這裡羅列兩個方案:
- 入口文件中記錄頁面URL,在頁面元件建立完成後,ios取得記錄的url進行簽名,android取得目前路由(
window .location.href.split('#')[0]
),請移步我的上一篇部落格
- 入口檔中直接進行簽名和注入配置,僅針對android在每次切換路由時再重新簽署和配置。這個方案適合所有頁面都需要用到js-sdk的情況
- 安卓設備能分享ios設備不能分享;
- ios裝置進入頁面時不能分享,手動刷新頁面後才能分享;
- 點擊連結能正常分享,點擊別人分享的圖文訊息之後不能分享;
` ?from=singlemessage&isappinstalled=0'這個部分去掉,結果依舊是分享失敗,而我自己隨意加一個參數,分享則正常,我隨意加兩個參數的時候,分享卻又不正常了。
url = location.href.split('&')[0],驗證後發現是錯誤的,再仔細一想我居然有這麼可怕的想法,連官方文件都不相信了。
url = encodeURIComponent(window.location.href.split('#')[0])經我多次debug,終於找到問題,就是需要對簽名的url進行編碼,word哥,不容易啊
只需要對簽名的url進行編碼,分享配置中的url不需要編碼
只需要對簽名的url進行編碼,分享配置中的url不需要編碼
只需要對簽名的url進行編碼,分享配置中的url不需要編碼
Coding
分享我怎麼按照第二種方案進行微信分享配置的
由於我專案中需求是基本所有頁面都需要能分享,所以在每個page元件中去獲取簽名是不實際的,所以我就想藉助vue-router的after鉤子去完成分享配置的操作,對於android則還需要重新進行簽名。
// main.js ... import wx from 'weixin-js-sdk' import request from 'axios' ... router.afterEach((to, from) => { let _url = window.location.origin + to.fullPath // 非ios设备,切换路由时候进行重新签名 if (window.__wxjs_is_wkwebview !== true) { request.get('/api/jssdk?url=' + encodeURIComponent(_url)).then(function (_lists) { // 注入配置 wx.config({ ... }) }) } // 微信分享配置 wx.ready(function () { wx.onMenuShareTimeline({ ... }) wx.onMenuShareAppMessage({ ... }) }) }) ... // ios 设备进入页面则进行js-sdk签名 if (window.__wxjs_is_wkwebview === true) { let _url = window.location.href.split('#')[0] request.get('/api/jssdk?url=' + encodeURIComponent(_url)).then(function (res) { let _lists = res wx.config({ debug: false, appId: _lists.appId, timestamp: _lists.timestamp, nonceStr: _lists.nonceStr, signature: _lists.signature, jsApiList: ['chooseImage', 'uploadImage', 'previewImage', 'onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareTimeline', 'chooseWXPay'] }) }) }
呼叫微信支付
兩個方案何去何從
h5使用微信支付,細心的人會發現,微信是有兩個方案的,我大致了解了一個,一個是js-sdk中開放的能力,一個是微信支付開放平台提供的介面
js-sdk版本:
#微信支付版本:
如果你只需要在公眾號中呼叫支付,兩個方法都可以,筆者由於已經使用js-sdk接入了其他功能,所以這裡就選擇了chooseWXPay方式。
接入步驟
在其他功能都接入成功的前提下,接支付就很快很方便了,筆者把主要步驟列下:
微信公眾平台中配置好js安全介面網域(例如www.imwty.com),這個是呼叫js-sdk的前提,公眾號支付也是基於js-sdk;
- ##微信支付平台中設定支付目錄,請參閱微信支付開發文檔,這裡要說明的是,你需要進行支付的頁面路由是什麼,就要配置什麼,而且需要在後邊加上/(例如www.imwty .com/pay/)
- 呼叫js-sdk簽章設定(wechat.config),上文已有提及。
- 在點擊支付按鈕的邏輯中,呼叫wechat.chooseWXPay()方法,該方法也涉及到支付簽名,需要從服務端去獲取簽名資訊
/,微信那邊會嚴格比較調用第4步驟時你所在的頁面路由和支付平台中設定的路由是否一致。
... methods () { handlerPay () {**粗体文本** let self = this // 进行支付签名 apiUtil.get('/api/jssdk/pay', {amount: this.amount}).then(function (wxmsg) { self.$wechat.chooseWXPay({ // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 appId: wxmsg.appId, timestamp: wxmsg.timeStamp, nonceStr: wxmsg.nonceStr, // 支付签名随机串,不长于 32 位 package: wxmsg.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***) signType: wxmsg.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5' paySign: wxmsg.paySign, // 支付签名 success: function (res) { // 支付成功的回调函数 }, cancel: function (res) { // 支付取消的回调函数 }, error: function (res) { // 支付失败的回调函数 } }).catch(function () { ... }) } }相關推薦:
以上是vue微信公眾號開發踩坑紀錄的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 Linux新版
SublimeText3 Linux最新版

Dreamweaver CS6
視覺化網頁開發工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。