企業微信wecom/jssdk的使用(入門)

概述

記錄一個企業微信jssdk的使用,因為要用到圖片上傳、掃描二維碼等工具。項目是uniapp開發的h5項目,fastadmin(thinkphp5)后端

先看官方文檔

https://developer.work.weixin.qq.com/document/path/90547#%E5%BA%94%E7%94%A8%E8%BA%AB%E4%BB%BD%E6%B3%A8%E5%86%8Chttps://developer.work.weixin.qq.com/document/path/90547#%E5%BA%94%E7%94%A8%E8%BA%AB%E4%BB%BD%E6%B3%A8%E5%86%8C

一、安裝sdk

安裝及使用按照官方文檔的操作,安裝完之后重啟一下編輯器!?

二、接口鑒權

接口鑒權有兩種方式,一種是企業身份注冊,一種是應用身份注冊。

這里我選擇了應用注冊。

涉及到js-sdk簽名算法,見下面的官方文檔:

https://developer.work.weixin.qq.com/document/path/90506

如果已經實現了可以繼續往下。這里展開說說怎么做(前端的童鞋可以先回避,這里依靠后端實現)。

對應的后端代碼,但是我這里實測是簽名無效的,不知道問題出現在哪里,最后選擇 把ticket返回給前端,用官方的簽名算法去計算簽名。

    /*** 企業微信JS-SDK配置接口*/public function wwregister(){$url = $this->request->post('url');if (!$url) {$this->error('缺少URL參數');}try {// 1. 獲取access_token$accessToken = $this->getAccessToken();// 2. 獲取企業級jsapi_ticket$jsapiTicket = $this->getJsapiTicket($accessToken);// 3. 獲取應用級jsapi_ticket$appJsapiTicket = $this->getAppJsapiTicket($this->app_id, $this->app_secret);// 4. 生成企業簽名和應用簽名$configSignature = $this->generateConfigSignature($jsapiTicket, $url);$agentConfigSignature = $this->generateAgentConfigSignature($appJsapiTicket, $url);// 5. 構建響應數據$config = ['corpId' => $this->corpid,'agentId' => $this->app_id,'jsApiList' => ['chooseImage', 'scanQRCode'],'configSignature' => $configSignature,'agentConfigSignature' => $agentConfigSignature,'timestamp' => $configSignature['timestamp'],'nonceStr' => $configSignature['nonceStr'],'tk1'=>$jsapiTicket,'tk2'=>$appJsapiTicket];$this->success('獲取成功', $config);} catch (Exception $e) {$this->error('獲取失敗: ' . $e->getMessage());}}/*** 生成企業級簽名*/private function generateConfigSignature($jsapiTicket, $url){$timestamp = time();$nonceStr = $this->createNonceStr();// 拼接簽名參數$string = "jsapi_ticket={$jsapiTicket}&noncestr={$nonceStr}&timestamp={$timestamp}&url={$url}";// 計算SHA1簽名$signature = sha1($string);return ['timestamp' => $timestamp,'nonceStr' => $nonceStr,'signature' => $signature];}/*** 生成應用級簽名*/private function generateAgentConfigSignature($appJsapiTicket, $url){$timestamp = time();$nonceStr = $this->createNonceStr();// 拼接簽名參數$string = "jsapi_ticket={$appJsapiTicket}&noncestr={$nonceStr}&timestamp={$timestamp}&url={$url}";// 計算SHA1簽名$signature = sha1($string);return ['timestamp' => $timestamp,'nonceStr' => $nonceStr,'signature' => $signature];}/*** 獲取應用jsapi_ticket*/private function getAppJsapiTicket($agentid,$appsecret){// 從緩存獲取或重新請求$jsapiTicket = Cache::get($agentid.'wecom_appjsapi_ticket');if (!$jsapiTicket) {// 這里應該拿應用的accesstoken$accessToken = getAppAccessToken($agentid,$appsecret);// 跟獲取企業jsapi_ticket的卻別在與請求的url不一樣$url = "https://qyapi.weixin.qq.com/cgi-bin/ticket/get?access_token={$accessToken}&type=agent_config";$result = $this->httpGet($url);$result = json_decode($result, true);if (isset($result['ticket'])) {$jsapiTicket = $result['ticket'];Cache::set($agentid.'wecom_appjsapi_ticket', $jsapiTicket, 7100); // 提前100秒過期} else {throw new Exception('獲取jsapi_ticket失敗: ' . json_encode($result));}}return $jsapiTicket;}// 獲取應用的accesstokenpublic function getAppAccessToken($agentid,$appsecret){$token = Cache::get($agentid.'_wecom_access_token');if (!$token) {$config = get_addon_config('wecom');$corpid = $this->corpid;$corpsecret = $appsecret;$url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$corpid}&corpsecret={$corpsecret}";$result = $this->httpGet($url);$result = json_decode($result, true);if (isset($result['access_token'])) {$accessToken = $result['access_token'];Cache::set($agentid.'_wecom_access_token', $accessToken, 7100); // 提前100秒過期} else {throw new Exception('獲取access_token失敗: ' . json_encode($result));}}return $token;}/*** 獲取access_token*/private function getAccessToken(){// 從緩存獲取或重新請求$accessToken = Cache::get('wecom_access_token');if (!$accessToken) {$corpid = $this->corpid;$corpsecret = $this->corpsecret;$url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$corpid}&corpsecret={$corpsecret}";$result = $this->httpGet($url);$result = json_decode($result, true);if (isset($result['access_token'])) {$accessToken = $result['access_token'];Cache::set('wecom_access_token', $accessToken, 7100); // 提前100秒過期} else {throw new Exception('獲取access_token失敗: ' . json_encode($result));}}return $accessToken;}

回到前端,在頁面中寫方法

三、遇到的問題

1、項目調試使用微信開發者工具;

2、項目本地開發,會報錯“invalid url domain”

打包線上之后正常,是否只能一邊改一邊打包上線測試呢~我也沒搞清楚是否有解決辦法,不然不大方便啊!!

項目上線后,可以成功拿到jssdk權限?

3、invalid signature

上面已經提到過了,如果拿后端返回的簽名是無效的(當然不排除我寫的后端方法有問題~)

雖然官方文檔給出排錯的文檔,但是對接的心好累,下回分解了~

四、接口的使用:選擇圖像

經過大費周章的前期準備,萬事俱備,終于可以正常使用工具了,例如圖像選擇

	// 選擇圖片const chooseImage = () => {if (images.value.length >= 5) {uni.showToast({title: '最多上傳5張圖片',icon: 'none'});return;}ww.chooseImage({count: 5 - images.value.length, // 最多可以選擇的圖片張數sizeType: ['original', 'compressed'], // 可以指定是原圖還是壓縮圖,默認二者都有sourceType: ['album', 'camera'], // 可以指定來源是相冊還是相機,默認二者都有success: (res : any) => {// 返回選定照片的本地ID列表,localId可以作為img標簽的src屬性顯示圖片const localIds = res.localIds;// 上傳圖片到微信服務器并獲取服務器IDlocalIds.forEach((localId : string) => {uploadImageToWechat(localId);});},fail: (err : any) => {console.error('選擇圖片失敗', err);uni.showToast({title: '選擇圖片失敗',icon: 'none'});}});};

?

看到這個窗口,前期準備功夫全不費工夫,終于可以上傳文件了。

但是這僅僅是開始~圖片會上傳到企微服務器,還得拉下來保存到自己的服務器。又可以另外寫一篇文章敘述了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87966.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87966.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87966.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大零售生態下開源鏈動2+1模式、AI智能名片與S2B2C商城小程序的協同創新研究

摘要:在流量紅利消退、零售形態多元化的背景下,大零售生態成為商業發展的新趨勢。本文聚焦開源鏈動21模式、AI智能名片與S2B2C商城小程序在零售領域的協同應用,探討其如何打破傳統零售邊界,實現流量變現與用戶資產化。研究表明&am…

Scrapy全流程(一)

創建一個scrapy項目:scrapy startproject mySpider 生成一個爬蟲:scrapy genspider douban movie.douban.com 提取數據:完善spider,使用xpath等方法 保存數據:pipeline中保存數據 2 創建scrapy項目 下面以抓取豆瓣top250來學習scrapy的入門使用:豆瓣…

【Elasticsearch】TF-IDF 和 BM25相似性算法

在 Elasticsearch 中,TF-IDF 和 BM25 是兩種常用的文本相似性評分算法,但它們的實現和應用場景有所不同。以下是對這兩種算法的對比以及在 Elasticsearch 中的使用情況: TF-IDF - 定義與原理:TF-IDF 是一種經典的信息檢索算法&am…

【QT】控件二(輸入類控件、多元素控件、容器類控件與布局管理器)

文章目錄 1.輸入類控件1.1 LineEdit1.2 Text Edit1.3 Combo Box1.4 SpinBox1.5 Date Edit & Time Edit1.6 Dial1.7 Slider 2. 多元素控件2.1 List Widget2.2 Table Widget2.3 Tree Widget 3. 容器類控件3.1 Group Box3.2 Tab Widget 4. 布局管理器4.1 垂直布局4.2 水平布局…

【Docker基礎】Docker鏡像管理:docker pull詳解

目錄 1 Docker鏡像基礎概念 1.1 什么是Docker鏡像? 1.2 鏡像與容器的關系 1.3 鏡像倉庫(Registry) 2 docker pull命令詳解 2.1 基本語法 2.2 參數解釋 2.3 拉取鏡像的基本流程 2.4 鏡像分層結構解析 3 docker pull實戰指南 3.1 基本使用示例 3.2 指定鏡…

PixPin:一個強大且免費的截圖貼圖工具

PixPin 是一款國產免費的截圖工具,支持屏幕截圖、屏幕錄制(GIF)、文字識別(OCR)以及貼圖等功能。 高效截圖 PixPin 支持自由選擇或自動檢測窗口,自定義截圖區域,像素級精確捕捉,延時…

【測試報告】論壇系統

一、項目背景 1.1 測試目標及測試任務 測試目標旨在保障功能無漏洞、流程順暢,實現多端顯示交互一致,達成高并發場景下響應時間<2 秒等性能指標,抵御 SQL 注入等安全攻擊,提升 UI 易用性與提示友好度; 背…

30天pytorch從入門到熟練(day1)

一、總體工作思路 本項目采用“從零構建”的策略,系統性地開展了深度學習模型的開發與優化工作。其目標在于通過全流程自研方式,深入理解模型構建、訓練優化、推理部署的關鍵技術環節。整體路徑分為以下核心階段: 模型初步構建:以…

Subway Surfers Blast × 亞矩陣云手機:手游矩陣運營的終極變現方案

引爆全球:Subway Surfers Blast的流量紅利?? 隨著Sybo Games最新力作《Subway Surfers Blast》全球上線,這款休閑消除游戲迅速席卷各大應用商店榜單。對于手游推廣者而言,如何高效獲取這波流量紅利???亞矩陣云手機專業手游推…

mysql join的原理及過程

連接過程 每獲得一條驅動表記錄,就立即到被驅動表尋找匹配的記錄。 對于兩表連接來說,驅動表只會被訪問一遍,但被驅動表卻要被訪問好多遍;具體訪問幾遍取決于對驅動表執行單表查詢后的結果集中有多少條記錄。 ? 對于內連接來說&#xff0…

Hologres的EXPLAIN和EXPLAIN ANALYZE簡介

文章目錄 一、執行計劃1、概念簡介2、使用方式①、EXPLAIN②、EXPLAIN ANALYZE 二、算子解讀1、SCAN2、Index Scan和 Index Seek3、Filter4、Decode5、Redistribution6、Join7、Broadcast8、Shard prune和Shards selected9、ExecuteExternalSQL10、Aggregate11、Sort12、Limit1…

49-Oracle init.ora-PFILE-SPFILE-啟動參數轉換實操

一早出現EMCC掛了,之后發現EMCC依賴的instance 掛了,重啟startup后發現spfile無法啟動。還是和小伙伴把基礎問題搞清。spfile是動態文件、動態文件、動態文件,linux下vi看起來部分亂碼部分是可編輯的,vi即使可以編輯也需要轉換成p…

spring碎片

包的掃描過程 判斷當前是否是文件夾獲取文件夾里面的所有內容判斷文件夾是否為空,為空的話直接返回如果文件夾不為空,則遍歷文件夾里面的所有內容 遍歷得到每個file對象,繼續進行判斷,如果還是文件,則進一步進行遞歸遍歷得到的file對象不是文件夾,是文件得到包路徑類名稱-字符…

如何形成項目經驗在多個項目間的高效復用?

要實現項目經驗的跨項目高效復用,核心在于建立系統化總結機制、標準化知識表達、平臺化共享工具。其中,標準化知識表達尤為關鍵,它通過統一模板和分類體系,確保不同項目的經驗可以被快速理解、輕松匹配到新場景,從而提…

目標檢測之YOLOV11談談OBB

引言:從軸對齊到定向邊界框的范式轉變 在計算機視覺領域,目標檢測算法長期受限于軸對齊邊界框(AABB)的固有缺陷——當面對航拍圖像中的艦船、遙感影像中的建筑物或工業質檢中的傾斜零件時,傳統邊界框會包含大量背景噪…

Vue2之生命周期

文章目錄 Vue生命周期Vue生命周期鉤子生命周期鉤子小案例在created中獲取數據在mounted中獲取焦點 Vue生命周期 思考:什么時候可以發送初始化渲染請求?(越早越好)什么時候可以開始操作dom?(至少dom得渲染出…

Web 架構之多租戶(SaaS)系統設計要點

文章目錄 一、多租戶系統概述定義應用場景 二、設計要點1. 數據隔離獨立數據庫共享數據庫,獨立 Schema共享數據庫,共享 Schema數據訪問控制 2. 資源分配計算資源存儲資源 3. 租戶管理租戶注冊與注銷租戶信息管理 4. 安全與合規身份驗證與授權數據加密 三…

【Clickhouse系列】索引

目錄 1. 主鍵索引 (Primary Key Index) - 核心是稀疏索引 2. 跳數索引 (Data Skipping Indexes) - 二級索引 3. 關鍵總結與最佳實踐: ClickHouse的索引設計哲學與其他傳統OLTP數據庫(如MySQL)有顯著不同,它更側重于高效掃描大數…

445場周賽

第一題:檢查元素頻次是否為質數 給你一個整數數組 nums。 如果數組中任一元素的 頻次 是 質數,返回 true;否則,返回 false。 元素 x 的 頻次 是它在數組中出現的次數。 質數是一個大于 1 的自然數,并且只有兩個因數…

【SQL語法匯總】

讀音:MySQL —— 賣舌口 MySQL 實際上是DBMS軟件系統, 并非數據庫。通過系統管理維護數據庫,DBMS相當于用戶和數據庫之間的橋梁。 MySQL是一種關系型數據庫, 類似excel,用行和列的關系組織數據數據。 操作關系型數據庫的DBMS系統大多數用SQL來管理數據。 SQL是編程語言…