白鷺引擎開發微信小遊戲進階教程文檔 原

注意:
•    因爲小遊戲特殊機制,涉及到的小遊戲接口主要邏輯都需要寫在小遊戲邏輯代碼內,但是可以通過 Egret 代碼來調用
•    後續版本 Egret 將會提供調用小遊戲接口模板,屆時大家可以參照模板編寫代碼。
文件系統
文件系統有兩類文件:代碼包文件和本地文件。
代碼包文件
代碼包文件指的是在項目目錄中添加的文件。由於代碼包文件大小限制,代碼包文件適用於放置首次加載時需要的文件,對於內容較大或需要動態替換的文件,不推薦用添加到代碼包中,推薦在小程序啓動之後再用下載接口下載到本地。
訪問代碼包文件
代碼包文件的訪問方式是從項目根目錄開始寫文件路徑。
 
修改代碼包文件
代碼包內的文件無法在運行後動態修改或刪除,修改代碼包文件需要重新發布版本。
本地文件
本地文件指的是小程序被用戶添加到手機後,會有一塊獨立的文件存儲區域,以用戶維度隔離。即同一臺手機,每個微信用戶不能訪問到其他登錄用戶的文件,同一個用戶不同 appId 之間的文件也不能互相訪問。
 
本地文件的文件路徑均爲以下格式:

1.    {{協議名}}://文件路徑
其中,協議名在 iOS/Android 客戶端爲 “wxfile”,在開發者工具上爲 “http”,開發者無需關注這個差異,也不應在代碼中去硬編碼完整文件路徑。

本地臨時文件
本地臨時文件只能通過調用特定接口產生,不能直接寫入內容。本地臨時文件產生後,僅在當前生命週期內有效,重啓之後即不可用。因此,不可把本地臨時文件路徑存儲起來下次使用。如果需要下次在使用,可通過 saveFile 或 copyFile 接口把本地臨時文件轉換成本地存儲文件或本地用戶文件。
示例

1.    wx.chooseImage({
2.        success(res) {
3.            const tempFilePaths = res.tempFilePaths // tempFilePaths 的每一項是一個本地臨時文件路徑
4.        }
5.    })


本地緩存文件
本地存儲文件只能通過調用特定接口產生,不能直接寫入內容。本地緩存文件產生後,重啓之後仍可用。本地緩存文件只能通過 saveFile 接口將本地臨時文件保存獲得。
示例

1.    wx.saveFile({
2.        tempFilePath: '', // 傳入一個本地臨時文件路徑
3.        success(res) {
4.            console.log(res.savedFilePath) // res.savedFilePath 爲一個本地緩存文件路徑
5.        }
6.    })


本地緩存文件是最初的設計,1.7.0 版本開始,提供了功能更完整的本地用戶文件,可以完全覆蓋本地緩存文件的功能,如果不需要兼容低於 1.7.0 版本,可以不使用本地緩存文件。

本地用戶文件
本地用戶文件是從 1.7.0 版本開始新增的概念。我們提供了一個用戶文件目錄給開發者,開發者對這個目錄有完全自由的讀寫權限。通過 wx.env.USER_DATA_PATH 可以獲取到這個目錄的路徑。
示例

1.	// 在本地用戶文件目錄下創建一個文件 a.txt,寫入內容 "hello, world"
2.	const fs = wx.getFileSystemManager()
3.	fs.writeFileSync(`${wx.env.USER_DATA_PATH}/hello.txt`, 'hello, world', 'utf8')


讀寫權限
 
用戶登陸簽名
小程序的一部分後臺(HTTP)接口要求驗證用戶登錄態。開發者在調用時需提供以session_key爲密鑰生成的簽名。其中session_key是指通過wx.login 獲得的登錄態。
簽名算法
目前支持的簽名算法是 hmac_sha256。 對於POST請求,開發者生成簽名的算法是:

1.	signature = hmac_sha256( post_data, session_key )

其中post_data爲本次POST請求的數據包。特別地,對於GET請求,post_data等於長度爲0的字符串。

1.    signature = hmac_sha256( "", session_key )

簽名示例
例如開發者需要請求的HTTP(POST)接口,其中請求包爲一個json字符串。

1.curl-d'{"foo":"bar"}''https://api.weixin.qq.com/some_api?access_token=xxx&openid=xxx&signature=???&sig_method=hmac_sha256'


開發者需要計算出signature參數。假設用戶當前有效的session_key 爲 :
1.    'o0q0otL8aEzpcZL/FT9WsQ=='

則開發者生成簽名應該是
1.    hmac_sha256('{"foo":"bar"}', 'o0q0otL8aEzpcZL/FT9WsQ==') = 654571f79995b2ce1e149e53c0a33dc39c0a74090db514261454e8dbe432aa0b

開發者服務器發起的HTTP請求
1.    curl -d '{"foo":"bar"}' 'https://api.weixin.qq.com/some_api?access_token=xxx&openid=xxx&signature=654571f79995b2ce1e149e53c0a33dc39c0a74090db514261454e8dbe432aa0b&sig_method=hmac_sha256'
session_key 合法性校驗

我們提供接口供開發者校驗服務器所保存的登錄態session_key是否合法。 爲了保持session_key私密性,我們提供的校驗接口本身不直接明文session_key,而是通過校驗登錄態簽名完成。
接口地址
請求方法:GET
1.    https://api.weixin.qq.com/wxa/checksession?access\_token=ACCESS\_TOKEN&signature=SIGNATURE&openid=OPENID&sig\_method=SIG\_METHOD

調用示例
1.    curl -G 'https://api.weixin.qq.com/wxa/checksession?access_token=OsAoOMw4niuuVbfSxxxxxxxxxxxxxxxxxxx&signature=fefce01bfba4670c85b228e6ca2b493c90971e7c442f54fc448662eb7cd72509&openid=oGZUI0egBJY1zhBYw2KhdUfwVJJE&sig_method=hmac_sha256'

參數說明
 
返回結果

正確時的返回JSON數據包如下:
1.    {"errcode":0,"errmsg":"ok"}

錯誤時的返回JSON數據包如下(示例爲簽名錯誤):
1.    {"errcode":87009,"errmsg":"invalid signature"}

小遊戲轉發
用戶在使用小遊戲過程中,可轉發消息給其他用戶或羣聊。

轉發菜單
點擊右上角按鈕,會彈出菜單,菜單中的“轉發”選項默認不展示。通過 wx.showShareMenu 和 wx.hideShareMenu 可動態顯示、隱藏這個選項。

被動轉發
用戶點擊右上角菜單中的“轉發”選項後,會觸發轉發事件,如果小遊戲通過 wx.onShareAppMessage 監聽了這個事件,可通過返回自定義轉發參數來修改轉發卡片的內容,否則使用默認內容。
示例

1.    wx.onShareAppMessage(() => {
2.        // 用戶點擊了“轉發”按鈕
3.        return {
4.            title: '轉發標題'
5.        }
6.    })

主動轉發接口
遊戲內可通過 wx.shareAppMessage接口直接調起轉發界面,與被動轉發類似,可以自定義轉發卡片內容。
示例

1.    wx.shareAppMessage({
2.        title: '轉發標題'
3.    })

withShareTicket 模式
通過 wx.updateShareMenu 接口可修改轉發屬性。如果設置 withShareTicket 爲 true ,會有以下效果
•    選擇聯繫人的時候只能選擇一個目標,不能多選
•    消息被轉發出去之後,在會話窗口中無法被長按二次轉發
•    消息轉發的目標如果是一個羣聊,則
o    會在轉發成功的時候獲得一個 shareTicket
o    每次用戶從這個消息卡片進入的時候,也會獲得一個 shareTicket,通過調用 wx.getShareInfo 接口傳入 shareTicket 可以獲取羣相關信息
示例

1.    // 設置 withShareTicket: true
2.    wx.updateShareMenu({
3.        withShareTicket: true
4.    })

獲取更多轉發信息
通常開發者希望轉發出去的小程序被二次打開的時候能夠獲取到一些信息,例如羣的標識。現在通過調用 wx.showShareMenu 並且設置 withShareTicket 爲 true ,當用戶將小程序轉發到任一羣聊之後,可以獲取到此次轉發的 shareTicket,此轉發卡片在羣聊中被其他用戶打開時,可以通過 getLaunchOptionsSync() 獲取到另一個 shareTicket。這兩步獲取到的 shareTicket 均可通過 wx.getShareInfo() 接口可以獲取到相同的轉發信息。

用戶數據的簽名驗證和加解密

數據簽名校驗
爲了確保開放接口返回用戶數據的安全性,微信會對明文數據進行簽名。開發者可以根據業務需要對數據包進行簽名校驗,確保數據的完整性。
簽名校驗算法涉及用戶的session_key,通過 wx.login 登錄流程獲取用戶session_key,並自行維護與應用自身登錄態的對應關係。
通過調用接口(如 wx.getUserInfo)獲取數據時,接口會同時返回 rawData、signature,其中 signature = sha1( rawData + session_key )
開發者將 signature、rawData 發送到開發者服務器進行校驗。服務器利用用戶對應的 session_key 使用相同的算法計算出簽名 signature2 ,比對 signature 與 signature2 即可校驗數據的完整性。
如wx.getUserInfo的數據校驗:
接口返回的rawData:

1.    {
2.    "nickName": "Band",
3.    "gender": 1,
4.    "language": "zh_CN",
5.    "city": "Guangzhou",
6.    "province": "Guangdong",
7.    "country": "CN",
8.    "avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"
9.    }

用戶的 session-key:
1.    HyVFkGl5F5OQWJZZaNzBBg==
所以,用於簽名的字符串爲:
1.    {"nickName":"Band","gender":1,"language":"zh_CN","city":"Guangzhou","province":"Guangdong","country":"CN","avatarUrl":"http://wx.qlogo.cn/mmopen/vi_32/1vZvI39NWFQ9XM4LtQpFrQJ1xlgZxx3w7bQxKARol6503Iuswjjn6nIGBiaycAjAtpujxyzYsrztuuICqIM5ibXQ/0"}HyVFkGl5F5OQWJZZaNzBBg==
使用sha1得到的結果爲
1.    75e81ceda165f4ffa64f4068af58c64b8f54b88c
加密數據解密算法
接口如果涉及敏感數據(如wx.getUserInfo當中的 openId 和unionId ),接口的明文內容將不包含這些敏感數據。開發者如需要獲取敏感數據,需要對接口返回的加密數據( encryptedData )進行對稱解密。 解密算法如下:
•    對稱解密使用的算法爲 AES-128-CBC,數據採用PKCS#7填充。
•    對稱解密的目標密文爲 Base64_Decode(encryptedData)。
•    對稱解密祕鑰 aeskey = Base64_Decode(session_key), aeskey 是16字節。
•    對稱解密算法初始向量 爲Base64_Decode(iv),其中iv由數據接口返回。
另外,爲了應用能校驗數據的有效性,我們會在敏感數據加上數據水印( watermark )
watermark參數說明:
 
如接口wx.getUserInfo敏感數據當中的watermark:

1.    {
2.        "openId": "OPENID",
3.        "nickName": "NICKNAME",
4.        "gender": GENDER,
5.        "city": "CITY",
6.        "province": "PROVINCE",
7.        "country": "COUNTRY",
8.        "avatarUrl": "AVATARURL",
9.        "unionId": "UNIONID",
10.        "watermark":
11.        {
12.            "appid":"APPID",
13.            "timestamp":TIMESTAMP
14.        }
15.    }

注:此前提供的加密數據(encryptData)以及對應的加密算法將被棄用,請開發者不要再依賴舊邏輯。
多線程 Worker
對於遊戲來說,每幀 16ms 是極其寶貴的,如果有一些可以異步處理的任務,可以放置於 Worker 中運行,待運行結束後,再把結果返回到主線程。Worker 運行於一個單獨的全局上下文與線程中,不能直接調用主線程的方法,Worker 也不具備渲染的能力。 Worker 與主線程之間的數據傳輸,雙方使用 postMessage 來發送數據,onMessage 來接收數據,傳輸的數據並不是直接共享,而是被複制的。
配置 Worker 信息
在 game.json 中可配置 Worker 代碼放置的目錄,目錄下的代碼將被打包成一個文件:
配置示例:

1.    {
2.    "workers": "workers"
3.    }

添加 Worker 代碼文件
根據步驟 1 中的配置,在代碼目錄下新建以下兩個入口文件:
1.    workers/request/index.js
2.    workers/request/utils.js
3.    workers/response/index.js

添加後,目錄結構如下:
1.    ├── game.js
2.    ├── game.json
3.    ├── project.config.json
4.    └── workers
5.        ├── request
6.        │   ├── index.js
7.        │   └── utils.js
8.        └── response
9.            └── index.js

編寫 Worker 代碼
在 workers/request/index.js 編寫 Worker 響應代碼

1.    const utils = require('./utils')
2.    
3.    worker.onMessage(function (res) {
4.    console.log(res)
5.    })

在主線程中初始化 Worker
在主線程的代碼 game.js 中初始化 Worker
1.    const worker = wx.createWorker('workers/request/index.js') // 文件名指定 worker 的入口文件路徑,絕對路徑

主線程向 Worker 發送消息
1.    worker.postMessage({
2.    msg: 'hello worker'
3.    })

worker 對象的其它接口請看 worker接口說明

Tips
•    Worker 最大併發數量限制爲 1 個,創建下一個前請用 Worker.terminate 結束當前 Worker
•    Worker 內代碼只能 require 指定 Worker 路徑內的文件,無法引用其它路徑
•    Worker 的入口文件由 wx.createWorker 時指定,開發者可動態指定 Worker 入口文件
•    Worker 內不支持 wx 系列的 API
•    Workers 之間不支持發送消息

小結
目前文檔的版本和微信小遊戲官方版本一致,後續 Egret 會針對小遊戲的 API 特性進行引擎方面的適配優化,以方便開發者更好、更方便的調用小遊戲的接口。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章