微信開(kāi)發(fā)相關(guān)功能之使用微信JS-SDK接口
前言
通過(guò)微信 JS-SDK 接口,可以在自己寫(xiě)的 JS 程序中使用很多微信的功能。例如微信里的卡片式鏈接、拍照上傳下載圖片、錄制播放上傳下載音頻、獲取地理位置、使用搖一搖、掃一掃、微信支付等功能。
準(zhǔn)備工作
首先需要有一個(gè)公眾號(hào),該公眾號(hào)是需要能認(rèn)證的(企業(yè)認(rèn)證)。
然后需要提前看一下開(kāi)發(fā)幫助文檔,了解一下基礎(chǔ)。
接口使用流程
接口使用流程為:
- 開(kāi)發(fā)前端向后端請(qǐng)求微信接口調(diào)用配置信息
- 開(kāi)發(fā)者后端服務(wù)器使用 AppID 和 AppSecret 向微信服務(wù)器獲取
token
- 后端通過(guò)
token
獲取ticket
并創(chuàng)建簽名 - 返回簽名至前端,根據(jù)需要調(diào)用的接口功能創(chuàng)建配置信息
- 前端使用微信提供的 js 方法注入配置信息
- 通過(guò)接口使用驗(yàn)證后,使用相應(yīng)的接口實(shí)現(xiàn)需要的功能
在使用前,需要在微信工作號(hào)里進(jìn)行一些設(shè)置,并獲取 AppID 和 AppSecret。通常 token
的有效期是7200秒,即2小時(shí),此時(shí)間回隨token
一起返回。有效期內(nèi)可以重復(fù)使用,即跳過(guò)步驟2。
公眾號(hào)設(shè)置
- 打開(kāi)微信公眾平臺(tái),使用管理員登錄
- 設(shè)置與開(kāi)發(fā) —> 公眾號(hào)設(shè)置 —> 功能設(shè)置 —> JS接口安全域名,下載 txt 文件放置到經(jīng)過(guò)備案的網(wǎng)址目錄下并確保能夠訪(fǎng)問(wèn),并添加后端服務(wù)訪(fǎng)問(wèn)域名
- 設(shè)置與開(kāi)發(fā) —> 基本配置 —> 公眾號(hào)開(kāi)發(fā)者信息 獲取并記錄 AppID 和 AppSecret
- 設(shè)置與開(kāi)發(fā) —> 基本配置 —> 公眾號(hào)開(kāi)發(fā)者信息 設(shè)置添加 IP白名單
前端向后端請(qǐng)求 ticket
前端在頁(yè)面渲染時(shí)使用 ajax 向后端請(qǐng)求 ticket
。具體的代碼就不寫(xiě)了。
后端向微信獲取 token
后端收到前端的請(qǐng)求后,向微信的 api 接口發(fā)送請(qǐng)求,請(qǐng)求類(lèi)型為 GET:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
參數(shù)說(shuō)明:
- grant_type : 請(qǐng)求
token
固定填寫(xiě) client_credential - appid & secret : 公眾號(hào)設(shè)置里獲取到的 AppID 和 AppSecret
正常情況下,會(huì)返回 json 包:
{"access_token":"ACCESS_TOKEN","expires_in":7200}
這里的 access_token
就是我們需要的 token
了。expires_in
為有效期,單位秒。
如果請(qǐng)求發(fā)生錯(cuò)誤,則會(huì)返回 json 包:
{"errcode":40013,"errmsg":"invalid appid"}
這個(gè)例子是 AppID 無(wú)效,errcode
是錯(cuò)誤碼,errmsg
為錯(cuò)誤信息。
返回碼 | 說(shuō)明 |
---|---|
-1 | 系統(tǒng)繁忙,此時(shí)請(qǐng)開(kāi)發(fā)者稍候再試 |
0 | 請(qǐng)求成功 |
40001 | AppSecret錯(cuò)誤或者AppSecret不屬于這個(gè)公眾號(hào),請(qǐng)開(kāi)發(fā)者確認(rèn)AppSecret的正確性 |
40002 | 請(qǐng)確保grant_type字段值為client_credential |
40164 | 調(diào)用接口的IP地址不在白名單中,請(qǐng)?jiān)诮涌贗P白名單中進(jìn)行設(shè)置。 |
89503 | 此IP調(diào)用需要管理員確認(rèn),請(qǐng)聯(lián)系管理員 |
89501 | 此IP正在等待管理員確認(rèn),請(qǐng)聯(lián)系管理員 |
89506 | 24小時(shí)內(nèi)該IP被管理員拒絕調(diào)用兩次,24小時(shí)內(nèi)不可再使用該IP調(diào)用 |
89507 | 1小時(shí)內(nèi)該IP被管理員拒絕調(diào)用一次,1小時(shí)內(nèi)不可再使用該IP調(diào)用 |
注:后端獲取的 tocken
可以用在別的微信接口通信上,所以最好在有效期內(nèi)保存至緩存。當(dāng)有效期到期時(shí)再獲取新的。
后端根據(jù) token 生成 ticket
獲取 token
后,使用 token
向微信服務(wù)器請(qǐng)求 ticket
,請(qǐng)求類(lèi)型為 GET:
https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
ACCESS_TOKEN 就是之前獲取到的 token
了,準(zhǔn)備使用 JS-SDK 接口 type 參數(shù)就設(shè)置為 jsapi。成功后返回一個(gè) json 包:
{ "errcode":0, "errmsg":"ok", "ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA", "expires_in":7200 }
- errcode : 錯(cuò)誤碼
- errmsg : 錯(cuò)誤信息
- ticket : 獲取到的
ticket
數(shù)據(jù) - expires_in : 有效期,單位秒
注: ticket
最好也保存在緩存內(nèi),到期時(shí)再重新請(qǐng)求。
根據(jù) ticket 創(chuàng)建簽名
創(chuàng)建簽名和配置信息需要這些數(shù)據(jù):
- noncestr : 隨機(jī)字符串
- jsapi_ticket : 微信服務(wù)器發(fā)送的
ticket
- timestamp : 時(shí)間戳
- url : 前端要使用 jsapi 的頁(yè)面地址,注意不包括 # 號(hào)和后面的部分
例如:
noncestr=Wm3WZYTPz0wzccnW
jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg
timestamp=1414587457
url=http://mp.weixin.qq.com?params=value
然后對(duì)這些數(shù)據(jù),按照字段名的 ASCII 碼升序排列(字典序)后,使用 URL 鍵值對(duì)的格式(即 key1=value1&key2=value2…)拼接成字符串,注意所有參數(shù)名均為小寫(xiě)字符。排序?qū)嶋H上就是 jsapi_ticket -> noncerstr -> timestap -> url 。拼接好后是這樣:
jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW×tamp=1414587457&url=http://mp.weixin.qq.com?params=value
最后對(duì)此段字符串進(jìn)行 sha1 簽名,得到 signature:
0f9de62fce790f9a083d5c99e95740ceb90c27ed
將這些數(shù)據(jù)和 appid
返回給前端(其中 url 是前端傳送給后端的)
前端創(chuàng)建配置信息,并注入驗(yàn)證
配置信息是一個(gè)對(duì)象,其格式為:
{ debug: true, // 開(kāi)啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶(hù)端alert出來(lái),若要查看傳入的參數(shù),可以在pc端打開(kāi),參數(shù)信息會(huì)通過(guò)log打出,僅在pc端時(shí)才會(huì)打印。 appId: '', // 必填,公眾號(hào)的唯一標(biāo)識(shí) timestamp: , // 必填,生成簽名的時(shí)間戳 nonceStr: '', // 必填,生成簽名的隨機(jī)串 signature: '',// 必填,簽名 jsApiList: [] // 必填,需要使用的JS接口列表 }
首先引入微信SDK的一個(gè) JS 文件:
http://res.wx.qq.com/open/js/jweixin-1.6.0.js
http://res2.wx.qq.com/open/js/jweixin-1.6.0.js
兩個(gè)均支持 https ,隨便哪個(gè)個(gè)都可以,另一個(gè)是備用
根據(jù)后端傳入的參數(shù)設(shè)置配置對(duì)象,并注入
wx.config({ debug: false, // 開(kāi)啟調(diào)試模式,調(diào)用的所有 api 的返回值會(huì)在客戶(hù)端 alert 出來(lái),若要查看傳入的參數(shù),可以在 pc 端打開(kāi),參數(shù)信息會(huì)通過(guò) log 打出,僅在 pc 端時(shí)才會(huì)打印。 appId: res.data.appId, // 必填,公眾號(hào)的唯一標(biāo)識(shí) timestamp: parseInt(res.data.timestamp), // 必填,生成簽名的時(shí)間戳 nonceStr: res.data.nonceStr, // 必填,生成簽名的隨機(jī)串 signature: res.data.signature, // 必填,簽名 jsApiList: [ "updateAppMessageShareData", "updateTimelineShareData" ] // 必填,需要使用的 JS 接口列表 });
處理驗(yàn)證
可以使用封裝好的 wx.ready
接口來(lái)處理成功驗(yàn)證行為,使用 wx.error
接口來(lái)處理驗(yàn)證失敗行為
wx.ready(function(){ // config信息驗(yàn)證后會(huì)執(zhí)行ready方法,所有接口調(diào)用都必須在config接口獲得結(jié)果之后,config是一個(gè)客戶(hù)端的異步操作,所以如果需要在頁(yè)面加載時(shí)就調(diào)用相關(guān)接口,則須把相關(guān)接口放在ready函數(shù)中調(diào)用來(lái)確保正確執(zhí)行。對(duì)于用戶(hù)觸發(fā)時(shí)才調(diào)用的接口,則可以直接調(diào)用,不需要放在ready函數(shù)中。 });
wx.error(function(res){ // config信息驗(yàn)證失敗會(huì)執(zhí)行error函數(shù),如簽名過(guò)期導(dǎo)致驗(yàn)證失敗,具體錯(cuò)誤信息可以打開(kāi)config的debug模式查看,也可以在返回的res參數(shù)中查看,對(duì)于SPA可以在這里更新簽名。 });
例如實(shí)現(xiàn)將頁(yè)面在微信分享給朋友及分享到朋友圈的功能
// 成功 wx.ready(() => { var shareData = { title: "新聞", desc: "每日新聞", link: window.location.href, imgUrl: "https://xxxxxxx.com/img/logo.jpg" }; //自定義“分享給朋友”及“分享到QQ”按鈕的分享內(nèi)容 wx.updateAppMessageShareData(shareData); //自定義“分享到朋友圈”及“分享到 QQ 空間”按鈕的分享內(nèi)容(1.4.0) wx.updateTimelineShareData(shareData); }); //錯(cuò)誤 wx.error(function (res) { console.log("微信分享錯(cuò)誤信息", res); });
SDK接口調(diào)用說(shuō)明
所有 SDK 接口都是通過(guò)wx對(duì)象(也可使用jWeixin對(duì)象)來(lái)調(diào)用,參數(shù)是一個(gè)對(duì)象,除了每個(gè)接口本身需要傳的參數(shù)之外,還有以下通用參數(shù):
- success:接口調(diào)用成功時(shí)執(zhí)行的回調(diào)函數(shù)。
- fail:接口調(diào)用失敗時(shí)執(zhí)行的回調(diào)函數(shù)。
- complete:接口調(diào)用完成時(shí)執(zhí)行的回調(diào)函數(shù),無(wú)論成功或失敗都會(huì)執(zhí)行。
- cancel:用戶(hù)點(diǎn)擊取消時(shí)的回調(diào)函數(shù),僅部分有用戶(hù)取消操作的api才會(huì)用到。
- trigger: 監(jiān)聽(tīng)Menu中的按鈕點(diǎn)擊時(shí)觸發(fā)的方法,該方法僅支持Menu中的相關(guān)接口。
總結(jié)
到此這篇關(guān)于微信開(kāi)發(fā)相關(guān)功能之使用微信JS-SDK接口的文章就介紹到這了,更多相關(guān)使用微信JS-SDK接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ES6的異步操作之promise用法和async函數(shù)的具體使用
這篇文章主要介紹了ES6的異步操作之promise用法和async函數(shù)的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12讓你的網(wǎng)站可編輯的實(shí)現(xiàn)js代碼
可以讓你編輯瀏覽器中看到網(wǎng)頁(yè)可編輯的實(shí)現(xiàn)代碼。2009-10-10JavaScript內(nèi)置日期、時(shí)間格式化時(shí)間實(shí)例代碼
JS中的 Date 對(duì)象用于處理日期和時(shí)間,Date對(duì)象和Math對(duì)象不一樣,Date是一個(gè)構(gòu)造函數(shù),需要實(shí)例化后才能使用對(duì)象中具體的方法和屬性。這篇文章主要給大家介紹了關(guān)于JavaScript內(nèi)置日期、時(shí)間格式化時(shí)間的相關(guān)資料,需要的朋友可以參考下2021-05-05JavaScript使用encodeURI()和decodeURI()獲取字符串值的方法
這篇文章主要介紹了JavaScript使用encodeURI()和decodeURI()獲取字符串值的方法,實(shí)例分析了encodeURI()和decodeURI()函數(shù)解析字符串的相關(guān)技巧,需要的朋友可以參考下2015-08-0820行JS代碼實(shí)現(xiàn)粘貼板復(fù)制功能
本文給大家分析20行JS代碼實(shí)現(xiàn)粘貼板功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02基于bootstrap插件實(shí)現(xiàn)autocomplete自動(dòng)完成表單
這篇文章主要介紹了基于bootstrap插件實(shí)現(xiàn)autocomplete自動(dòng)完成表單的相關(guān)資料,感興趣的朋友可以參考一下2016-05-05JS實(shí)現(xiàn)隨機(jī)生成字符串(可指定長(zhǎng)度)的示例代碼
本文主要介紹了JS實(shí)現(xiàn)隨機(jī)生成字符串(可指定長(zhǎng)度)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08微信小程序 實(shí)例開(kāi)發(fā)總結(jié)
這篇文章主要介紹了微信小程序 開(kāi)發(fā)過(guò)程中遇到問(wèn)題總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-04-04javascript編程開(kāi)發(fā)中取色器及封裝$函數(shù)用法示例
這篇文章主要介紹了javascript編程開(kāi)發(fā)中取色器及封裝$函數(shù),結(jié)合實(shí)例形式分析了javascript封裝$函數(shù)及數(shù)值運(yùn)算、頁(yè)面元素動(dòng)態(tài)操作實(shí)現(xiàn)取色器功能相關(guān)技巧,需要的朋友可以參考下2017-08-08JS和jQuery通過(guò)this獲取html標(biāo)簽中的屬性值(實(shí)例代碼)
本文通過(guò)實(shí)例代碼給大家分享JS和jQuery通過(guò)this獲取html標(biāo)簽中的屬性值,非常不錯(cuò),具有參考借鑒價(jià)值,需要額朋友參考下吧2017-09-09