企業(yè)微信小程序
獲取用戶信息
海馬匯與企業(yè)微信小程序
企業(yè)微信小程序訪問的是在線子應(yīng)用(即可直接通過瀏覽器訪問),因此只需將海馬匯打包部署到服務(wù)器上即可。
海馬匯子應(yīng)用目前使用過兩種模式:
-
純?cè)qR匯框架開發(fā)
該模式所有子應(yīng)用/頁面都需要自己開發(fā),不存在標(biāo)準(zhǔn)子應(yīng)用,因此開發(fā)工作量大,但無冗余的內(nèi)容
-
uni-app殼子嵌套含標(biāo)準(zhǔn)子應(yīng)用海馬匯(srm-uni-app-map & srm-fronr-app-map)
該模式擁有大量標(biāo)準(zhǔn)子應(yīng)用,因此有類似開發(fā)需求可直接使用標(biāo)準(zhǔn)子應(yīng)用頁面或在標(biāo)準(zhǔn)頁面上進(jìn)行二開,開發(fā)工作量會(huì)相對(duì)較少,但會(huì)存在冗余內(nèi)容(未使用的標(biāo)準(zhǔn)子應(yīng)用)
第一種模式需要自己根據(jù)企業(yè)微信提供的信息獲取token等;第二種模式uni-app殼子已經(jīng)做好相對(duì)應(yīng)的功能,因此不需要前端再次獲取相應(yīng)信息。
本篇文章主要講第一種模式下企業(yè)微信對(duì)接海馬匯子應(yīng)用的一些內(nèi)容。
企業(yè)微信是如何傳遞用戶信息的?
在講海馬匯獲取企業(yè)微信用戶信息之前,先了解一下企業(yè)微信是如何將用戶信息傳遞給小程序的,這有利于了解后續(xù)的步驟。
首先,需要在企業(yè)微信管理平臺(tái)創(chuàng)建小程序并填寫相關(guān)信息,然后在“應(yīng)用管理”中點(diǎn)擊對(duì)應(yīng)的子應(yīng)用可以查看子應(yīng)用的相關(guān)信息。如下圖:
主要關(guān)注這個(gè)應(yīng)用主頁信息,該信息是企業(yè)微信傳遞用戶信息的關(guān)鍵。該鏈接中對(duì)應(yīng)參數(shù)如下:
參數(shù) | 說明 |
---|---|
appid | 第三方應(yīng)用id(即ww或wx開頭的suite_id)。注意與企業(yè)的網(wǎng)頁授權(quán)登錄不同 |
redirect_uri | 授權(quán)后重定向的回調(diào)鏈接地址(即子應(yīng)用首頁),請(qǐng)使用urlencode對(duì)鏈接進(jìn)行處理 ,注意域名需要設(shè)置為第三方應(yīng)用的可信域名 |
response_type | 返回類型,此時(shí)固定為:code |
scope | 應(yīng)用授權(quán)作用域。 snsapi_base:靜默授權(quán),可獲取成員的的基礎(chǔ)信息(UserId與DeviceId); snsapi_userinfo:靜默授權(quán),可獲取成員的詳細(xì)信息,但不包含手機(jī)、郵箱; snsapi_privateinfo:手動(dòng)授權(quán),可獲取成員的詳細(xì)信息,包含手機(jī)、郵箱 注意:**企業(yè)自建應(yīng)用可以根據(jù)userid獲取成員詳情,無需使用snsapi_userinfo和snsapi_privateinfo兩種scope。**更多說明見scope |
agentid | 企業(yè)應(yīng)用的id。 當(dāng)scope是snsapi_userinfo或snsapi_privateinfo時(shí),該參數(shù)必填 注意redirect_uri的域名必須與該應(yīng)用的可信域名一致。 |
state | 重定向后會(huì)帶上state參數(shù),企業(yè)可以填寫a-zA-Z0-9的參數(shù)值,長度不可超過128個(gè)字節(jié) |
#wechat_redirect | 終端使用此參數(shù)判斷是否需要帶上身份信息 |
當(dāng)進(jìn)入小程序時(shí)會(huì)首先訪問該鏈接,企業(yè)微信根據(jù)該鏈接校驗(yàn)相關(guān)信息無誤后會(huì)重定向至redirect_uri
并攜帶兩個(gè)參數(shù)。
重定向地址格式如: redirect_uri?code=CODE&state=STATE
將參數(shù)傳遞給后端,后端可根據(jù)企業(yè)微信官方API獲取到用戶userId從而返回token。
關(guān)于這部分的詳細(xì)內(nèi)容詳見企業(yè)微信API文檔(https://developer.work.weixin.qq.com/document/path/91120)
注:分享頁面如需獲取用戶信息,則分享鏈接應(yīng)根據(jù)該要求進(jìn)行分享,從而保證進(jìn)入分享頁面時(shí)獲取到相關(guān)信息
前端獲取Token
了解了企業(yè)微信傳遞用戶信息的過程,那獲取企業(yè)微信token就容易了許多,以下是某個(gè)項(xiàng)目獲取企業(yè)微信token的代碼示例
// 頁面mounted獲取token相關(guān)代碼
let url = location.href;
const code = url.match(/code=(.*)&/)[1];
const state = url.match(/state=(.*?)(&|#)/)[1];
const [ thirdPartyCode, srmAccount ] = state.split('-');
const params = {
code,
srmAccount,
thirdPartyCode,
clientId: "srm-front",
clientSecret: "secret",
changeDefaultTenantFlag: true,
};
await api.getToken(params);
// 接口axios代碼
/**
* 獲取token
* @param {Object} params - 請(qǐng)求參數(shù)
*/
getToken: async (params) => {
const url = `/smbl/v1/map-third-party-oauth/user/auto-login-by-phone`;
const res = await noAuthHttp.post(url, params);
if (res.accessToken !== '') {
window.localStorage.setItem("user-token", res.accessToken);
} else {
console.log('獲取Token失??!')
}
console.log('設(shè)置TOKEN成功,Token為', window.localStorage.getItem('user-token'));
},
企業(yè)微信JSSDK
使用JSSDK
如果在企業(yè)微信中需要使用掃一掃、分享、獲取設(shè)備信息等相關(guān)功能(更詳細(xì)的功能詳見官方文檔),則需要使用企業(yè)微信JSSDK。
引入JSSDK文件
由于官方推薦的是script導(dǎo)入的方式,因此我們需要在public/index.html
文件中導(dǎo)入JSSDK文件
配置JSSDK
所有需要使用JS-SDK的頁面必須先注入配置信息,否則將無法調(diào)用(同一個(gè)url僅需調(diào)用一次,對(duì)于變化url的SPA(single-page application)的web app可在每次url變化時(shí)進(jìn)行調(diào)用)。
一般在子應(yīng)用首頁配置JSSDK,項(xiàng)目配置JSSDK如下
/**
* 設(shè)置wxjssdk配置
* @param{String} url - 當(dāng)前地址
*/
async setJSSDK(url) {
const wx = parent.wxBridge || window.wx;
if (url.includes('#')) {
url = url.match(/(.*)#/)[1];
}
const config = await api.getJSSDK({ url });
const {
appId = '',
timestamp = new Date().getTime(),
nonceStr,
signature,
} = config;
// 注入的是企業(yè)的身份與權(quán)限
wx.config({
beta: true, // 必須這么寫,否則wx.invoke調(diào)用形式的jsapi會(huì)有問題
debug: false, // 是否開啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會(huì)通過log打出,僅在pc端時(shí)才會(huì)打印。
appId, // 必填,企業(yè)微信的corpID
timestamp, // 必填,生成簽名的時(shí)間戳,精確到秒
nonceStr, // 必填,生成簽名的隨機(jī)串
signature, // 必填,簽名,見 附錄-JS-SDK使用權(quán)限簽名算法
jsApiList: [ 'setClipboardData', 'onMenuShareAppMessage' ], // 必填,需要使用的JS接口列表,凡是要調(diào)用的接口都需要傳進(jìn)來
});
},
其中appId, timestamp, nonceStr, signature信息推薦后端處理返回,因?yàn)槊總€(gè)環(huán)境的企業(yè)微信小程序的appId都不一樣,后端處理返回利于上線。
若由前端生成對(duì)應(yīng)信息,則需要符合企業(yè)微信對(duì)應(yīng)信息規(guī)則。(規(guī)則地址:https://work.weixin.qq.com/api/doc/90001/90144/90539)
使用JSSDK接口
配置完成后即可在對(duì)應(yīng)頁面使用JSSDK接口,如要在配置完JSSDK后立即使用則需要在wx.ready函數(shù)內(nèi)使用。因?yàn)閖ssdk配置是異步的,直接使用JSSDK相關(guān)接口會(huì)導(dǎo)致在配置未完成之前使用從而導(dǎo)致報(bào)錯(cuò)。
項(xiàng)目使用JSSDK接口示例如下(此處使用的是轉(zhuǎn)發(fā)配置接口)文章來源:http://www.zghlxwxcb.cn/news/detail-676912.html
// 轉(zhuǎn)發(fā)單據(jù)
async shareTicket() {
const { poPlanHeaderId } = this.$route.params;
const { poPlanNumber } = this.baseData;
const wx = parent.wxBridge || window.wx;
const baseURL = process.env.VUE_APP_DOMAIN_NAME;
console.log(baseURL);
// 獲取鏈接配置信息
const {
appId,
state,
// secret,
agentId,
} = await api.getLinkConfig();
// 獲取“轉(zhuǎn)發(fā)”按鈕點(diǎn)擊狀態(tài)及自定義分享內(nèi)容接口
wx.ready(() => {
wx.onMenuShareAppMessage({
title: '標(biāo)題', // 分享標(biāo)題
desc: `描述號(hào): ${poPlanNumber}`, // 分享描述
link: `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${baseURL}/SRM_Platform_Map/#/purchaseMaintain/detail/${poPlanHeaderId}?fromShare=true&response_type=code&scope=snsapi_base&agentid=${agentId}&state=${state}#wechat_redirect`, // 分享鏈接;在微信上分享時(shí),該鏈接的域名必須與企業(yè)某個(gè)應(yīng)用的可信域名一致
imgUrl: 'https://oss-agri-map-srm-public-bucket.oss-cn-beijing.aliyuncs.com/hpfm05/1173/04b99e226752432b9a07c34937aadcdc@MAP_LOGO.png', // 分享圖標(biāo)
success: function () {
// 用戶確認(rèn)分享后執(zhí)行的回調(diào)函數(shù)
console.log('轉(zhuǎn)發(fā)成功');
},
cancel: function () {
// 用戶取消分享后執(zhí)行的回調(diào)函數(shù)
this.$hips.toast({
message: '轉(zhuǎn)發(fā)失??!',
});
},
});
})
},
JSSDK常用API
基礎(chǔ)接口
API | 作用 | 示例 |
---|---|---|
wx.checkJsApi | 判斷當(dāng)前客戶端版本是否支持指定JS接口 | https://developer.work.weixin.qq.com/document/path/94324 |
wx.agentConfig | 通過agentConfig注入應(yīng)用的權(quán)限 | https://developer.work.weixin.qq.com/document/path/94325 |
wx.invoke(‘getContext’, fn) | 獲取進(jìn)入H5頁面的入口環(huán)境 | https://developer.work.weixin.qq.com/document/path/94326 |
界面接口
API | 作用 | 示例 |
---|---|---|
wx.onMenuShareAppMessage | 獲取“轉(zhuǎn)發(fā)”按鈕點(diǎn)擊狀態(tài)及自定義分享內(nèi)容接口 | https://developer.work.weixin.qq.com/document/path/90523 |
wx.onHistoryBack | 在用戶返回上個(gè)頁面時(shí),回調(diào)開發(fā)者注冊(cè)的函數(shù),處理業(yè)務(wù)需要的邏輯(如確認(rèn)或重定向到指定的頁面) | https://developer.work.weixin.qq.com/document/path/90524 |
wx.hideOptionMenu | 隱藏右上角菜單接口 | https://developer.work.weixin.qq.com/document/path/90524 |
wx.showOptionMenu | 顯示右上角菜單接口 | https://developer.work.weixin.qq.com/document/path/90524 |
wx.closeWindow | 關(guān)閉當(dāng)前網(wǎng)頁窗口接口 | https://developer.work.weixin.qq.com/document/path/90524 |
wx.hideMenuItems | 批量隱藏功能按鈕接口 | https://developer.work.weixin.qq.com/document/path/90524 |
wx.showMenuItems | 批量顯示功能按鈕接口 | https://developer.work.weixin.qq.com/document/path/90524 |
wx.hideAllNonBaseMenuItem | 隱藏所有非基礎(chǔ)按鈕接口 | https://developer.work.weixin.qq.com/document/path/90524 |
wx.showAllNonBaseMenuItem | 顯示所有功能按鈕接口 | https://developer.work.weixin.qq.com/document/path/90524 |
wx.invoke(‘openDefaultBrowser’, fn) | 打開系統(tǒng)默認(rèn)瀏覽器 | https://developer.work.weixin.qq.com/document/path/90524 |
wx.onUserCaptureScreen | 用戶截屏事件 | https://developer.work.weixin.qq.com/document/path/90524 |
wx.scanQRCode | 調(diào)起企業(yè)微信掃一掃接口 | https://developer.work.weixin.qq.com/document/path/90525 |
wx.invoke(‘launchMiniprogram’, obj, fn) | 在企業(yè)微信內(nèi)快速跳轉(zhuǎn)到指定的小程序頁面 | https://developer.work.weixin.qq.com/document/path/93114 |
媒體接口
API | 作用 | 示例 |
---|---|---|
wx.getLocalImgData | 獲取本地圖片接口 | https://developer.work.weixin.qq.com/document/path/90528 |
wx.chooseImage | 拍照或從手機(jī)相冊(cè)中選圖接口 | https://developer.work.weixin.qq.com/document/path/90528 |
wx.previewImage | 預(yù)覽圖片接口 | https://developer.work.weixin.qq.com/document/path/90528 |
wx.uploadImage | 上傳圖片接口 | https://developer.work.weixin.qq.com/document/path/90528 |
wx.downloadImage | 下載圖片接口 | https://developer.work.weixin.qq.com/document/path/90528 |
wx.startRecord | 開始錄音接口 | https://developer.work.weixin.qq.com/document/path/90529 |
wx.stopRecord | 停止錄音接口 | https://developer.work.weixin.qq.com/document/path/90529 |
wx.onVoiceRecordEnd | 監(jiān)聽錄音自動(dòng)停止接口 | https://developer.work.weixin.qq.com/document/path/90529 |
wx.playVoice | 播放語音接口 | https://developer.work.weixin.qq.com/document/path/90529 |
wx.pauseVoice | 暫停播放接口 | https://developer.work.weixin.qq.com/document/path/90529 |
wx.previewFile | 預(yù)覽文件接口 | https://developer.work.weixin.qq.com/document/path/90530 |
設(shè)備接口
API | 作用 | 示例 |
---|---|---|
wx.setClipboardData | 設(shè)置系統(tǒng)剪貼板的內(nèi)容 | https://developer.work.weixin.qq.com/document/path/90535 |
wx.getLocation | 獲取地理位置接口 | https://developer.work.weixin.qq.com/document/path/90537 |
常見錯(cuò)誤
調(diào)用config接口的時(shí)候傳入?yún)?shù)debug: true 可以開啟debug模式,頁面會(huì)alert出錯(cuò)誤信息。以下為常見錯(cuò)誤及解決方法:文章來源地址http://www.zghlxwxcb.cn/news/detail-676912.html
報(bào)錯(cuò)信息/具象 | 報(bào)錯(cuò)原因及解決辦法 |
---|---|
invalid url domain | 當(dāng)前頁面所在域名與使用的corpid沒有綁定(可在該應(yīng)用的可信域名中配置域名) |
invalid signature簽名錯(cuò)誤 | 解決辦法: \1) 確認(rèn)簽名算法正確,可用http://work.weixin.qq.com/api/jsapisign頁面工具進(jìn)行校驗(yàn)。 \2) 確認(rèn)config中nonceStr(js中駝峰標(biāo)準(zhǔn)大寫S), timestamp與用以簽名中的對(duì)應(yīng)noncestr, timestamp一致。 \3) 確認(rèn)url是頁面完整的url(請(qǐng)?jiān)诋?dāng)前頁面alert(location.href.split(‘#’)[0])確認(rèn)),包括’http(s)??/‘部分,以及’?‘后面的GET參數(shù)部分,但不包括’#'hash后面的部分。 \4) 確認(rèn)config中的appid與用來獲取jsapi_ticket的corpid一致。 \5) 確保一定緩存access_token和jsapi_ticket。 \6) 確保你獲取用來簽名的url是動(dòng)態(tài)獲取的,動(dòng)態(tài)頁面可參見實(shí)例代碼中php的實(shí)現(xiàn)方式。如果是html的靜態(tài)頁面在前端通過ajax將url傳到后臺(tái)簽名,前端需要用js獲取當(dāng)前頁面除去’#‘hash部分的鏈接(可用location.href.split(’#')[0]獲取,而且需要encodeURIComponent),因?yàn)轫撁嬉坏┓窒恚髽I(yè)微信客戶端會(huì)在你的鏈接末尾加入其它參數(shù),如果不是動(dòng)態(tài)獲取當(dāng)前鏈接,將導(dǎo)致分享后的頁面簽名失敗。 |
the permission value is offline verifying 或者 fail_nopermission | 錯(cuò)誤原因: config沒有正確執(zhí)行,或者是調(diào)用的JSAPI沒有傳入config的jsApiList參數(shù)中 解決辦法: \1) 確認(rèn)config正確通過。 \2) 如果是在頁面加載好時(shí)就調(diào)用了JSAPI,則必須寫在wx.ready的回調(diào)中。 \3) 確認(rèn)config的jsApiList參數(shù)包含了這個(gè)JSAPI。 |
permission denied | 該應(yīng)用沒有權(quán)限使用這個(gè)接口 |
function not exist | 當(dāng)前客戶端版本不支持該接口,請(qǐng)升級(jí)到新版體驗(yàn)。 |
服務(wù)上線之后無法獲取jsapi_ticket,自己測試時(shí)沒問題 | 因?yàn)閍ccess_token和jsapi_ticket必須要在自己的服務(wù)器緩存,否則上線后會(huì)觸發(fā)頻率限制。請(qǐng)確保在服務(wù)上線前一定全局緩存access_token和jsapi_ticket,兩者有效期均為7200秒(以返回結(jié)果中的expires_in為準(zhǔn)),否則一旦上線觸發(fā)頻率限制,服務(wù)將不再可用。 |
uploadImage怎么傳多圖 | 目前只支持一次上傳一張,多張圖片需等前一張圖片上傳之后再調(diào)用該接口 |
通過a鏈接(例如先通過企業(yè)微信授權(quán)登錄)跳轉(zhuǎn)到b鏈接,invalid signature簽名失敗 | 后臺(tái)生成簽名的鏈接為使用jssdk的當(dāng)前鏈接,也就是跳轉(zhuǎn)后的b鏈接,請(qǐng)不要用企業(yè)微信登錄的授權(quán)鏈接進(jìn)行簽名計(jì)算,后臺(tái)簽名的url一定是使用jssdk的當(dāng)前頁面的完整url除去’#'部分。 |
出現(xiàn)config:fail錯(cuò)誤 | 這是由于傳入的config參數(shù)不全導(dǎo)致,請(qǐng)確保傳入正確的appId、timestamp、nonceStr、signature和需要使用的jsApiList。 |
到了這里,關(guān)于企業(yè)微信小程序用戶信息獲取以及JSSDK使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!