小程序的雲開發功能
雲開發功能是為小程序開發者提供的完整的原生雲端支持和微信服務支持,使得開發者無需自己搭建服務器即可使用雲端能力,使用平台提供的API即可進行核心業務開發。
雲開發提供的幾大基礎能力
小程序支持了雲開發之后,就可以自動的獲取雲端的存儲區,雲端的數據庫,以及運行雲端代碼的能力
在雲開發能力的支持下,雲端運行的代碼 (雲函數)使用微信私有協議天然鑒權,開發者只需 編寫自身業務邏輯代碼即可。
獲取OpenID的步驟
定義雲函數login
獲取微信調用上下文(包括 OPENID、APPID、 及 UNIONID)並返回這些信息。
部署雲函數login
調用雲函數login
實例:
app.json
{ "pages": [ "pages/index/index" ], "window": { "backgroundTextStyle": "light", "navigationBarBackgroundColor": "#fff", "navigationBarTitleText": "雲開發", "navigationBarTextStyle": "black" }, "sitemapLocation": "sitemap.json" }
//app.js App({ onLaunch: function () { if (!wx.cloud) { console.error('請使用 2.2.3 或以上的基礎庫以使用雲能力') } else { wx.cloud.init({ // 此處請填入環境 ID, 環境 ID 可打開雲控制台查看 env: '你的雲環境ID', traceUser: true, }) } this.globalData = {} } })
小程序開發中使用雲開發功能,需要在app.js文件中 啟動函數onLaunch中先檢查雲環境是否可用,可以使用雲開發功能的話需要初始化雲環境,init接口中需要指明雲開發環境的id,如果只有一個雲開發環境的話,就不需要特意指明了
<!--pages/index/index.wxml--> <view class='box'> <view class='title'>獲取OpenID</view> <block wx:if="{{!hasUserInfo}}"><!--條件渲染的結構塊,block組件,沒有獲取用戶的信息,會顯示一個button組件或者是一個test組件--> <button wx:if="{{canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 獲取頭像昵稱 </button><!--canIUse為true顯示button組件,false顯示test組件,canIUse變量的意思當前的小程序是否支持使用open-type為getUserInfo屬性值的按鈕組件,當前小程序版本支持的話,就會顯示button組件--> <text wx:else> 請升級微信版本,使用1.3.0或以上的基礎庫以支持open-type按鈕獲取用戶公開信息! </text> </block> <view wx:else class='userinfo'> <image bindtap='getDetail' class='userinfo-avatar' src='{{userInfo.avatarUrl}}' mode='cover'></image><!--綁定了用戶頭像image組件,它的單擊事件函數是getDetail--> <text class='userinfo-nickname'>{{userInfo.nickName}}</text> </view> <view class='user-openid'> <text>{{openID}}</text> </view> <view class='user-detail' wx:if='{{hasUserInfo}}'> <text>{{detail}}</text> </view> </view>
/* pages/index/index.wxss */ page{ font-size: 14px; } .userinfo { display: flex; flex-direction: column; align-items: center; } .userinfo-avatar { width: 128rpx; height: 128rpx; margin: 20rpx; border-radius: 50%; } .userinfo-nickname { color: #aaa; } .user-openid { margin: 60rpx 30rpx; color:blue; } .user-detail{ margin: 60rpx 30rpx; text-align: left; color: black }
// pages/index/index.js Page({ /** * 頁面的初始數據 */ data: { userInfo: {}, // 用戶公開信息 hasUserInfo: false, // 是否獲取了用戶公開信息 canIUse: wx.canIUse('button.open-type.getUserInfo'), // 是否支持使用getUserInfo按鈕 openID: '', // 用戶身份ID信息 detail: '點擊頭像顯示你的詳細信息', // 用戶詳細信息 }, /** * 生命周期函數--監聽頁面加載 */ onLoad: function(options) { wx.getSetting({ // 調用接口獲取用戶的當前設置 success: res => { // 調用成功時的回調函數 if (res.authSetting['scope.userInfo']) { // 如果已經授權,可以直接調用 getUserInfo 獲取頭像昵稱,不會彈框 wx.getUserInfo({ // 調用接口獲取用戶公開信息 success: res => { // 調用成功時的回調函數 this.setData({ // 設置頁面綁定數據 userInfo: res.userInfo, hasUserInfo: true }) } }) } } }) this.getOpenID() // 調用getOpenID函數 }, getUserInfo: function (e) { // 定義getUserInfo按鈕的單擊事件函數 console.log(e) if (e.detail.userInfo){ // 如果返回參數中包含userInfo數據,則已經獲取了用戶公開信息 this.setData({ // 設置頁面綁定數據 userInfo: e.detail.userInfo, hasUserInfo: true }) }else{ // 否則就顯示模態對話框,提示授權失敗信息 wx.showModal({ title: e.detail.errMsg, content: '小程序需要用戶授權獲取公開信息才可以繼續。', }) } }, // 定義獲取用戶OpenID的函數 getOpenID: function() { var that = this; wx.showLoading({ // 顯示加載提示框 title: '獲取openID。。。', }) wx.cloud.callFunction({ // 調用雲函數 name: 'login', // 函數名稱 data: {}, // 函數參數 complete: res => { // 調用完成時的回調函數 wx.hideLoading() // 隱藏加載提示框 }, success: res => { // 調用成功時的回調函數 console.log('[雲函數] [login] user openid: ', res.result.openid) that.setData({ // 設置頁面綁定數據 openID: '[雲函數]獲取openID成功:' + res.result.openid, }) }, fail: err => { // 調用失敗時的回調函數 console.error('[雲函數] [login] 調用失敗', err) that.setData({ // 設置頁面綁定數據 openID: '[雲函數]獲取openID失敗' + err }) } }) }, // 定義獲取用戶詳細信息的函數 getDetail: function() { var userInf = this.data.userInfo; var gender = (userInf.gender == 1) ? "男" : (userInf.gender == 2) ? "女" : "未知"; var detailStr = "性別:" + gender; detailStr = detailStr + "\n國家:" + userInf.country; detailStr = detailStr + "\n省份:" + userInf.province; detailStr = detailStr + "\n城市:" + userInf.city; this.setData({ // 設置頁面綁定數據 detail: detailStr }) } })
js文件里定義page對象時,定義了一些頁面的變量,定義了監聽頁面加載的onload函數,以及其他一些用到的事件函數
{ "miniprogramRoot": "miniprogram/", "cloudfunctionRoot": "cloudfunctions/", "setting": { "urlCheck": true, "es6": true, "enhance": true, "postcss": true, "preloadBackgroundData": false, "minified": true, "newFeature": true, "coverView": true, "nodeModules": false, "autoAudits": false, "showShadowRootInWxmlPanel": true, "scopeDataCheck": false, "uglifyFileName": false, "checkInvalidKey": true, "checkSiteMap": true, "uploadWithSourceMap": true, "compileHotReLoad": false, "lazyloadPlaceholderEnable": false, "useMultiFrameRuntime": true, "useApiHook": true, "useApiHostProcess": false, "babelSetting": { "ignore": [], "disablePlugins": [], "outputPath": "" }, "enableEngineNative": false, "useIsolateContext": false, "userConfirmedBundleSwitch": false, "packNpmManually": false, "packNpmRelationList": [], "minifyWXSS": true, "showES6CompileOption": false }, "appid": "wx6b706fbbff7d6d0a", "projectname": "EX601-GetOpenID", "libVersion": "2.6.6", "simulatorType": "wechat", "simulatorPluginLibVersion": {}, "cloudfunctionTemplateRoot": "cloudfunctionTemplate", "condition": { "search": { "list": [] }, "conversation": { "list": [] }, "plugin": { "list": [] }, "game": { "list": [] }, "miniprogram": { "list": [] } } }
// 雲函數模板 // 部署:在 cloud-functions/login 文件夾右擊選擇 “上傳並部署” const cloud = require('wx-server-sdk') // 引用雲開發支持庫 cloud.init() // 初始化雲開發環境 /** * 這個示例將經自動鑒權過的小程序用戶 openid 返回給小程序端 * * event 參數包含小程序端調用傳入的 data * */ exports.main = async (event, context) => { // 開放雲函數接口,供小程序端調用 console.log(event) console.log(context) // 可執行其他自定義邏輯 // console.log 的內容可以在雲開發雲函數調用日志查看 // 獲取 WX Context (微信調用上下文),包括 OPENID、APPID、及 UNIONID(需滿足 UNIONID 獲取條件) const wxContext = await cloud.getWXContext() return { // 返回數據 event, openid: wxContext.OPENID, appid: wxContext.APPID, unionid: wxContext.UNIONID, } }
2、安裝wx-server-sdk依賴。
在cmd中首先通過cd 雲函數路徑的命令,定位到雲函數目錄,這里要定位到某個具體的雲函數文件夾內,如login函數則要定位到login文件夾內。然后再執行npm install --save wx-server-sdk命令,安裝wx-server-sdk依賴。對於每一個你創建雲函數都要安裝該依賴。
如果在執行安裝命令后出現類似錯誤提示:rollbackFailedOptional: verb npm-session ****************,這是由於npm官方庫是國外的網站,在訪問時可能由於網絡原因導致異常。
解決方案:執行npm config set registry "http://registry.npm.taobao.org"命令,將官方庫替換為淘寶庫即可。
執行命令后可能會出現以下警告:
npm WARN **** No description
npm WARN **** No repository field
直接忽略即可,並不會影響后續的雲函數功能。成功安裝依賴后,相應的雲函數文件夾將生成一個package-lock.json文件。
3、上傳雲函數:在相應的雲函數文件夾上右鍵,選擇“上傳並部署:所有文件”。