微信應用架構!!-----微信應用能力篇


管理配置篇如下管理配置篇

微信公衆號

微信公衆號的用戶綁定系統實現

微信公衆號最重要的一個功能就是模板消息推送,但是我微信公衆號有幾個前置條件需要滿足

  1. 有能推送模板消息的公衆號
  2. 有符合合條件的模板
  3. 接收消息人的openid
    其中前兩個點應該是必須要完成的流程 =,所以我們先針對第三點討論具體的實現方式。

多種情況

我們通常會遇到如下兩種情況
(1)不需要與系統用戶進行綁定
(2)需要與系統已有賬號進行關聯綁定
第一種情況不需要我們進行特殊處理只需要根據簡單的把微信用戶信息進行儲存即可,而第二種情況我們需要把微信openid和用戶進行綁定。這裏我們提供2種綁定方式。

數據庫er圖

在這裏插入圖片描述
簡單的通過三張表即能把用戶綁定起來

  1. eagle_user 用戶表 主要儲存用戶的實體信息。
  2. eagle_user_oauth 外部用戶表 主要儲存第三方用戶對接系統時的用戶信息 包括一些配置的 其中third_id儲存open_id。
  3. eagle_user_link 儲存用戶和用戶之間的綁定關係。用戶綁定的實現邏輯既是完善這種表

二維碼綁定

基本思路和流程圖

二維碼綁定的基本邏輯思路,即當用戶已經在系統登錄的情況下,根據當前登錄的用戶信息生成關於本身用戶的公衆號二維碼。二維碼中包含着用戶信息。下圖爲我們系統二維碼綁定的邏輯
在這裏插入圖片描述

實現細節

  1. 生成二維碼
    推薦使用QR_STR_SCENE爲臨時的字符串參數值 這個類型能生成大量的二維碼 雖然不是永久有效但是緩存個一天左右的時間還是沒有問題 當然了用永久二維碼也是可以的但是一個公衆號只有10w個.
    由於二維碼中的內容有長度限制,所以儘量以固定的分隔符進行分開,按照順序進行排列好。這樣在解析的時候纔好把信息解析出來 注 我是以weixin_app_id_scene_user_id 這樣的字符串進行保存的
  2. 搭建接收微信消息的服務器
    通過接收到的消息經過解析之後的內容,做針對的處理
  3. 接收信息
    (1)如果用戶未關注公衆號
    如果用戶未關注過公衆號,用戶掃描二維碼會先去到公衆號展示頁,當用戶點擊其中“關注公衆號”按鈕,微信服務器會通過http請求把該用戶的關注信息傳遞過來 需要關注 EventKey 該字段標識該次請求有場景值帶過來,具體信息爲qrscene_{weixin_app_id}{scene}{user_id} 可以從其中的第一參數判斷用戶是通過掃描二維碼過來的 然後根據第三個參數來判斷改二維碼的具體功能。
    (2)如果用戶已經關注公衆號
    如果用戶關注過公衆號,用戶掃描二維碼會直接去到對話頁,這時候服務器會接收到掃描二維碼的消息,Event字段爲SCAN EventKey爲{weixin_app_id}{scene}{user_id} 這時候通過判斷第二個參數來判斷改二維碼的具體功能
  4. 綁定用戶
    然後通過FromUserName該字段獲取用戶的openid 然後通過該openid創建用戶和用戶第三方配置信息,之後再把二維碼中的用戶信息和該open_id創建的用戶綁定起來這

賬號密碼綁定

基本思路和流程圖

賬號密碼相對思路相對簡單點,提供一個類似登錄頁面的頁面,讓用戶在該頁面輸入賬號密碼。當通過驗證之後把用戶進行綁定即可。如果爲我們公司的綁定流程圖
在這裏插入圖片描述

實現細節

1.推送引導消息
當用戶第一次關注公衆號的時候可以直接給用戶推送相關的綁定的用戶消息,讓用戶直接綁定。
2.提供綁定用戶的菜單項
給微信公衆號的菜單裏添加一項綁定用戶的選項,當用戶點擊菜單的時候,先去騰訊請求相關的微信用戶信息,然後拿掉用戶的openid回跳到相關的綁定頁面。
3.綁定用戶
當用戶通過系統的賬號密碼驗證之後,把通過驗證的用戶和openid生成的用戶綁定在一起。

用戶解綁

用戶綁定完就要有解綁邏輯,該處只討論微信公衆號的解綁邏輯,關於用戶的統一解綁邏輯會在後面進行詳細的解釋

微信公衆號取消關注

基本思路

當用戶取消關注公衆號時,應該爲該用戶進行接觸綁定操作。當用戶點擊取消關注時,微信服務器會發送取消關注消息通知咱們的服務器,這時候能拿到用戶的openid和用戶當前公衆號信息。這時在eagle_user_link裏刪除兩個用戶之間的綁定關係

實現細節

1.接收取消關注消息
當服務器發送Event字段爲unsubscribe的消息時說明用戶取消關注了公衆號,這時通過用戶的openid和公衆號信息確定具體的用戶和公衆號進行解綁操作即可。

統一用戶微信管理

微信應用賬號統一管理中會進行相關的說明

微信公衆號應用oauth鑑權登錄管理

當微信用戶和系統用戶綁定完成之後,既能直接通過微信的oauth鑑權系統直接進行單點登錄,跳過每個需要登錄態的登錄操作。

實現思路

當用戶通過菜單或者模板消息接收到我們推送的網頁地址時,我們都需要給這個地址加加工,讓我們進行跳轉的時候,知道我們是微信跳轉過來,然後去微信那邊獲取用戶的open_id,然後通過open_id和用戶的綁定關係找到具體的用戶,然後進行登錄操作

實現細節

1.加工url
當發送消息或者生成菜單時,通過統一的方法把相關的url進行參數的加工,主要添加如下參數 redirect_domain=offiaccount&app_name=微信應用app_name redirect_domain標識當前url是通過微信應用來的 app_name 標識微信應用是那個應用
2.發送驗證請求
在用戶點擊相關的連接的同時,會先檢測當前用戶是否登錄,如果未登錄過,會根據當前請求的具體的地址組裝一個微信用戶的鑑權地址,然後把頁面跳轉到微信的統一驗證地址,當微信驗證地址驗證完畢之後會會把頁面跳轉到相應的頁面。
3.獲取用戶信息並登陸
微信驗證完之後會在頁面上帶入code參數,這時通過code再次請求微信的獲取用戶信息的接口,這時即可獲取微信用戶的openid,這時通過openid獲取對應綁定的用戶即可完成登陸流程。
4.多次回跳的具體的流程圖
在這裏插入圖片描述

微信公衆號消息模板消息推送

在有了以上綁定關係之後,既可以完成微信公衆號的模板消息推送了。這個功能很重要也很實用。

管理模板

如果我們要發送模板消息,那我們必不可少的需要一個消息模板。

  1. 尋找模板:由於每個公衆號的模板有數量限制(數量限制爲25個)所以建議大家針對公司的實際情況,儘量尋找公用的幾個模板或者申請公用的模板,模板應儘量通用,然後給到產品的同學,讓產品就從這幾個模板中挑他想要的模板,如果實在沒有去申請,也儘量申請較通用的模板。
  2. 模板庫:建議建立自己系統的模板庫,所有的模板都需要從模板庫出,不管管理的微信公衆號有多少,發送的消息只能從模板庫裏找。所有的綁定模板邏輯和接觸綁定邏輯都是系統出發,不從微信公衆號出發。
  3. 綁定模板:當找到模板之後需要把模板和公衆號綁定起來,從微信官方獲取的模板id不是你真正能使用的模板id,而是需要你請求綁定接口重新獲取的模板id。這個模板id只在當前公衆號下有效,其他的公衆號的同一個模板生成的模板id不同。

生成消息包體

有了模板了我們就要生成相應消息的包體了.

 'template_id' => 5, //模板庫生成的id該id無論在那個平臺上應該保持一隻
 'url' =>M('EagleWeixin')->createOffiaccountMsgUrlParam('/manage/ClientApp/versionRecord', array('client_version_id'=>$app_record_info['id']), $fuid),//通過統一的方法給該消息的跳轉地址加上各種需要的參數 比如redirect_domain信息
  'template_info' => array(//模板消內容 具體格式跟模板相關
                    'first' => array(
                        'value' => '版本發佈消息通知',
                        'color' => '#173177'
                    ),
                    'keyword1' => array(
                        'value' => "客戶端:{$app_record_info['platform']}",
                    ),
                    'keyword2' => array(
                        'value' => "版本:{$app_record_info['version']}",
                    ),
                    'keyword3' => array(
                        'value' => '知慧研發部+運營部'
                    ),
                    'keyword4' => array(
                        'value' => date('Y-m-d H:i:s', $app_record_info['online_time']),
                    ),
                    'remark' => array(
                        'value' => $app_record_info['description']
                    )
                )

發送消息

  1. 確定用戶 當端上發起發送消息的請求時,後端通過本次消息的相關接收人信息,在系統中確定該消息應該通過那個公衆號發送消息,然後通過eagle_user_oauth表進行相關用戶openid的確認。
  2. 確定公衆號 確定完用戶之後通過用戶的所有信息確定用戶的該消息需要那個公衆號來發送。
  3. 確定模板 通過公衆號和模板之間的綁定關係確定該公衆號能否發送該消息。
  4. 添加發送日誌 把本次消息的發送記錄記錄在表中日誌表中 其中msgid爲微信發送本次消息的回執id

接收消息回執

1.接收回執 當消息發送完畢之後,微信把消息回執發送到你的服務器的消息接口中。
2.處理回執 當消息接口中接口 Event字段爲TEMPLATESENDJOBFINISH時,說明消息是發送模板消息的回執消息。這時候根據消息體中的 MsgID字段把消息日誌中的對應消息的字段更新成相應的狀態,並把消息回執記入進消息日誌系統

微信小程序

小程序消息模板推送

由於小程序的各種推送限制,只有當用戶發起支付操作或者訂閱操作時,服務器才能給用戶推送相應的消息 。這就導致我們想完成正常的消息閉環限制就比較大。所以我們通過公衆號的模板消息完成消息推送的消息閉環。

綁定小程序和公衆號

  1. 在微信的開放平臺把小程序和公衆號綁定在一起,這樣才能在公衆號中接收到該該小程序的消息通知。
  2. 在系統中把小程序和公衆號進行賬號的關聯綁定,這樣我們才能知道推送該消息的時候需要使用那個公衆號進行相關推送。

生成相應的消息包體

1.跟公衆號的包體就多了 但是針對pagepath參數需要做下特殊的處理(具體會和小程序外部消息傳遞建議一起進行說明)

           "miniprogram":{ //小程序的相關配置的信息
             "appid":"xiaochengxuappid12345",
             "pagepath":"index?foo=bar"
           },    

小程序登錄系統搭建維護及優化建議

官方登錄流程和時序圖

官方流程

  1. 由端上發起登錄請求,微信服務器會生成一個一次性的code
  2. 端上把code傳到登錄服務器上,然後服務器通過code和app_id和appscert獲取用戶的openid信息
  3. 服務器通過該openid獲取儲存在服務器上的用戶(如果沒有則創建該微信用戶)
  4. 登錄之後把相關的登錄態返回給端上,端上把登錄態進行保存,即完成了小程序的登錄流程。
    在這裏插入圖片描述

流程優化

針對官方流程如果每次我們都這麼做那我們每次登錄需要做好多無用的工作,我們提出如下幾點優化建議 (建議都是經過實踐,並且我們系統一直都是用的這種方式)

  1. 減少獲取openid的次數 openid爲一個用戶針對一個微信應用唯一固定的的信息,這說明用戶的openid在不換用戶微信登錄賬號的情況下openid是不變的,所以我們把openid進行端上緩存,當進行用戶登錄態續費的時候就不需要再次請求騰訊的接口了。
  2. 不使用數據庫進行app_id和appscert的儲存 當我們獲取用戶的openid需要使用到該程序對應的appid和appscert,這時候我們的數據庫中其實儲存了該小程序的appid和appscert,但是由於每次都需要從數據庫或者緩存中獲取還是會減低速度,那我們直接在登錄的方法來手寫配置文件,key用app_name然後直接寫死appid和appscert
  3. 端上直接請求騰訊的接口:由咱們上訴的流程發現,整個登錄流程咱們只需要在獲取用戶的openid即可登錄。那我們能不能把獲取用戶openid的流程放到端上來做那。答案是能的,但是需要使用自己的服務轉一下。首先我們明確一點,微信的api接口地址https://api.weixin.qq.com是不能加入到小程序的可信域名裏的。那我們就用我們的域名把他的域名包裝一下,然後直接用nginx把請求轉發走,這樣就能直接在nginx就把請求截斷了,這樣就能保證後端的接口在大壓力的情況下不出現崩潰的情況。
    (1) 端上把這個小程序的配置信息寫死的本地文件。
    (2)端上調用登錄之後,直接請求微信的獲取用戶openid的接口,但是域名使用我們自己的域名。
    (3)nginx配置如下
location ^~ /interface/User/getMiniProgramUserOpenid {
        proxy_pass https://api.weixin.qq.com/sns/jscode2session;
    }

(4)在後端代碼上實現如上接口的功能,保證nginx轉發不了的時候,服務不至於癱瘓,接口返回應該保持和騰訊返回一致。
(5)端上獲取到用戶的openid之後,通過登錄接口把openid直接傳遞過來。
(6)接口根據具體的openid完成之後的登錄流程

小程序外部消息傳遞建議

小程序是比較開放的應用,他可以通過小程序二維碼,小程序碼,微信公衆號模板消息等,引導用戶跳轉指定的頁面,以此來完成需求的閉環,或者推廣需求。由於很多應用的指定頁面需要登錄才能查看,這時如果你直接跳轉到指定頁面又想完成登錄閉環的話,你需要各各頁面埋點,並且針對不同的頁面格式化不同的參數。現在我們針對這個功能提出一個標準化的建議,所有的外部消息全部使用統一的格式,跳轉的首頁,然後經由首頁進行跳轉頁面的跳轉這也是爲啥我們在管理配置篇裏對於小程序的配置要加入一條首頁地址的原因小程序配置詳解

小程序碼的生成

小程序碼的辨識度高,安全性好,是我們進行線下推廣的有力武器。但是我們不能隨便的使用小程序碼進行頁面的跳轉和參數的傳遞,要不端上會罵孃的。由於小程序的長參數小程序有數量限制,所以我們儘量使用短參數二維碼(只能傳遞32個字符)儘量精簡我們的參數。
我們提供如下的格式進行參考 {type}_{param} type標識類型 param標識參數

  1. 約定type 跟端上約定好type對應的跳轉地址,比如識別出的小程序中的參數爲1_2,這時候端上應該針對一個type參數進行相應的處理,比如需要記錄type=1的時候小程序需要跳轉的頁面。和需不需要登錄狀態和對應參數的格式化。
  2. 判斷登錄 如果跳轉的地址需要登錄,但是用戶未進行登錄,則需要先跳轉到登錄頁面進行登錄,之後在跳轉到具體的頁面
  3. 格式化參數 由於長度限制我們只能把參數儘可能的縮短優化,但是每個type對應的參數都是不同的,所以每個type都要有不同的格式化方式,但是記住我們的參數是按順序進行排列的所以一定要把重要的參數放在前邊。以便後續加參數減參數方便。

公衆號消息傳遞

小程序完成消息閉環通常都需要使用公衆號的模板消息。這個時候也我們遵循小程序的參數傳遞方式保證端上的處理方式統一,公衆號的模板消息也是以小程序首頁+{type}_{param}參數的形式進行傳遞,具體端上的處理方式都統一成小程序碼的跳轉規則即可。

企業微信

企業微信下應用管理

本身在企業微信和企業微信下的自建應用應該屬於包含關係,但是我提出的思路是把企業微信下自建應用,變成系統自建應用,所有的企業微信都只能綁定系統的企業微信下應用,其他的應用不支持直接管理和綁定。

企業微信下應用消息推送

企業微信推送也是完成消息閉環的一個重要環節,不同於公衆號的模板消息。企業微信消息時直接針對企業微信下應用進行的消息推送的
前置條件

  1. 消息類型
  2. 發送的包體整理
  3. 消息回執服務器搭建

消息類型

企業微信提供多種的消息類型,對於我們通常的消息閉環,我們使用最多的應該是如下幾種類型

  1. 文本消息 功能主要爲一些簡單的提醒(例如日程提醒) 如下爲效果圖。
    在這裏插入圖片描述
  2. 文本卡片消息 針對較定製化的消息,但是該消息必須跳轉頁面(即必須帶跳轉地址進行查看詳情,中間內容的字數不超過512個字節)(例:作業通知需要查看具體詳情的消息) 效果圖如下
    在這裏插入圖片描述
  3. markdown消息: 針對高度定製化消息的一種消息模式,這種消息下用戶可以使用markdown的形式進行消息的內容的編寫和展示。效果圖如下
    在這裏插入圖片描述
  4. 任務卡片消息: 主要針對一些流程審批任務類消息,快速方便的進行操作。(例如審批流中的審批消息)(選填url,可以配置url進行詳情的查看)效果圖如下
    在這裏插入圖片描述

消息包體的整理

1.整理消息包體:針對不同的包體存在不同格式化包體的方式,具體的格式可以參照官方文檔,把官方文檔提供的字段一一進行賦值即可
消息包體
我們系統的整理包體的格式如下圖
在這裏插入圖片描述

    protected $work_msg_example = array(
         'text' => array( //文本消息 詳見 https://work.weixin.qq.com/api/doc/90000/90135/90236#%E6%96%87%E6%9C%AC%E6%B6%88%E6%81%AFQ
            'msg_type' => 'text',//消息類型
            'work_weixin_app_id' => 1,//要發送的企業微信下應用id 在eagle_weixin_app下的type=4的應用
            'content' => '王靖明發送的文本消息',//發送的消息內容 針對文本消息字段 消息內容,最長不超過2048個字節,
        ),
        'textcard' => array( //文本卡片消息 詳見 https://work.weixin.qq.com/api/doc/90000/90135/90236#%E6%96%87%E6%9C%AC%E5%8D%A1%E7%89%87%E6%B6%88%E6%81%AF
            'msg_type' => 'textcard',//消息類型
            'work_weixin_app_id' => 1,//要發送的企業微信下應用id 在eagle_weixin_app下的type=4的應用
            'title' => '卡片標題',//標題,不超過128個字節,超過會自動截斷(支持id轉譯)
            'description' => '卡片簡介',//描述,不超過512個字節,超過會自動截斷(支持id轉譯)
            'url' => '跳轉url',//必傳
            'btntxt' => '更多',//按鈕文字。 默認爲“詳情”, 不超過4個文字,超過自動截斷
        ),
        'taskcard' => array( //任務卡片消息暫不支持 詳見 https://work.weixin.qq.com/api/doc/90000/90135/90236#%E4%BB%BB%E5%8A%A1%E5%8D%A1%E7%89%87%E6%B6%88%E6%81%AF
            'msg_type' => 'taskcard',//消息類型
            'work_weixin_app_id' => 1,//要發送的企業微信下應用id 在eagle_weixin_app下的type=4的應用
            'title' => '卡片標題',//標題,不超過128個字節,超過會自動截斷(支持id轉譯)
            'description' => '卡片簡介',//描述,不超過512個字節,超過會自動截斷(支持id轉譯)
            'url' => 'http://www.baidu.com',// 可不傳不進行跳轉點擊後跳轉的鏈接。最長2048字節,請確保包含了協議頭(http/https)
            'task_id' => '任務id 主要用來識別處理之後的消息歸屬 暫可定義爲domain_domain_id',//任務id,同一個應用發送的任務卡片消息的任務id不能重複,只能由數字、字母和“_-@.”組成,最長支持128字節
            'btn' => array(array(//按鈕列表,按鈕個數爲爲1~2個。
                'key' => 'key',//按鈕key值,用戶點擊後,會產生任務卡片回調事件,回調事件會帶上該key值,只能由數字、字母和“_-@.”組成,最長支持128字節 通過該值確定用戶點擊了什麼鍵
                'name' => '',//按鈕名稱
                'replace_name' => '已批准',//點擊按鈕後顯示的名稱,默認爲“已處理”
                'color' => '按鈕顏色',//按鈕字體顏色,可選“red”或者“blue”,默認爲“blue”
                'is_bold' => true//按鈕字體是否加粗,默認false
            )),
        ),
        'markdown' => array( //詳見 https://work.weixin.qq.com/api/doc/90000/90135/90236#markdown%E6%B6%88%E6%81%AF
            'msg_type' => 'markdown',//消息類型
            'work_weixin_app_id' => 1,//要發送的企業微信下應用id 在eagle_weixin_app下的type=4的應用
            'content' => 'markdown語法 目前僅支持markdown語法的子集',//發送的消息內容 針對文本消息字段 消息內容,最長不超過2048個字節
        )
    );
  1. 找到統一的用戶:發送消息通常都是用系統用戶的唯一標識來確定用戶的,這時我們根據企業微信的系統的登錄方式(或者可以說是企業微信的userId和系統的用戶之間的關係)找到我們要發送消息的用戶的在企業微信中的userId(使用企業微信配置中的login_type字段進行確定的)
  2. 消息回執服務器的搭建: 在上述的四種消息中針對第四種消息我們需要搭建一個消息回執服務器以此來接收用戶點擊的具體按鈕是那個。(具體的搭建還未完成 暫不進行相關討論 等我把相關設計完善再來更新該處實現 現在遇到的問題的是 1.如何保證taskid的不重複 具體的taskid的設計應該會遵循微信小程序消息跳轉的參數拼接規則 但是暫時還沒想好怎麼統一taskid2. 當接收到回執消息時如果跟各個應用進行相關的通信和交互 3.當發生錯誤時如果提醒用戶 4.更新狀態的及時性)

企業微信下應用

企業微信下應用oauth鑑權登錄管理

企業微信下應用大多是h5頁面做的,那我們如何使用企業微信的oauht鑑權系統來完成我們自己的單點登錄

實現思路

根據企業微信下應用配置的首頁地址進行加工,加入企業微信的相關信息,讓系統知道該url是從企業微信中來的,然後去企業微信微信那邊獲取用戶的UserId,通過UserId和企業微信配置的登錄方式,在系統中找到系統用戶然後登錄,回跳到相應的應用首頁去。

具體細節

1.加工url 通過企業微信下應用配置的首頁地址,加入redirect_domain、app_name、second_name參數來完善相關的功能
2.發送驗證請求
在用戶點擊相關的連接的同時,會先檢測當前用戶是否登錄,如果未登錄過,會根據當前請求的具體的地址組裝一個微信用戶的鑑權地址,然後把頁面跳轉到微信的統一驗證地址,當微信驗證地址驗證完畢之後會會把頁面跳轉到相應的頁面。
3.獲取用戶信息並登陸
微信驗證完之後會在頁面上帶入code參數,這時通過code再次請求微信的獲取用戶信息的接口,這時即可獲取微信用戶的UserId,這時通過UserId和對應企業微信的登錄方式獲取對應綁定的用戶即可完成登陸的流程。具體流程圖如下,跟微信公衆號的登錄流程類似
在這裏插入圖片描述

整體微信系統的一些功能

微信應用賬號管理

系統提供了微信公衆號和微信小程序的用戶綁定邏輯,這時我們應該給用戶提供一個統一管理自己綁定信息的地方。包括綁定錯了之後如何解綁和微信應用的一些授權邏輯,這時候我們的在eagle_user_oauth表中埋的點就能完善的解決這個問題了。
1.找到用戶綁定的所有信息:通過eagle_user_link表中找到當前用戶綁定的所有的用戶,然後查出所有用戶在eagle_user_oauth中記錄所對應的小程序和微信公衆號的信息。
2.提供查看和解除綁定的邏輯:當用戶查看到自己的綁定關係綁錯了 這時候可以提供用戶手動解除綁定的邏輯。這時候刪除用戶的eagle_user_link表中的記錄和eagle_user_oauth中的記錄即可。
3.添加綁定: 由於添加綁定並不是在該頁面進行的,所有不要在該頁面完成綁定的邏輯。

微信鑑權驗證相關建議

微信應用:微信公衆號、微信小程序、企業微信下應用有一些功能都需要進行域名的所有權驗證。比如js_sdk的使用,業務域名的使用。他們都有一個特點就是需要把文件上傳服務器的根目錄下,並且能訪問到。但是這樣會造成我們根目錄下文件很亂、很多的問題。我們通過觀察發現如下規律當應用的主體不發生改變的情況下,文件的名稱和文件的內容不會發生改變
我們提出如下的建議

  1. 在系統的微信應用管理頁面提供通用的驗證的功能 檢測該主體是否上傳過驗證文件,上傳過不需要再次上傳,未上傳則需再次上傳。
  2. 當用戶去上傳文件之後,把文件統一的移動到特定的目錄下。
  3. 配置nginx規則 如果尋找以txt結尾的文件404之後去另一個文件夾再次尋找
    這樣我們就把微信相關的鑑權文件全都放在了一個統一的文件夾下不會再放在相關根目錄下來了
    針對該問題的具體詳細介紹和配置文檔我會新起一個博客進行說明 敬請期待 寫完之後會貼過來的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章