微信小程式開發常用功能

獲取用戶資訊

調用 wx.getUserProfile 方法獲取用戶基本資訊。頁面產生點擊事件(例如 buttonbindtap 的回調中)後才可調用,每次請求都會彈出授權窗口,用戶同意後返回 userInfo

具體參數如下:

屬性 類型 默認值 必填 說明
lang string en 顯示用戶資訊的語言
desc string 聲明獲取用戶個人資訊後的用途,不超過30個字元
success function 介面調用成功的回調函數
fail function 介面調用失敗的回調函數
complete function 介面調用結束的回調函數(調用成功、失敗都會執行)

示例程式碼

wx.getUserProfile({
    desc: '用於完善用戶基本資料', // 聲明獲取用戶個人資訊後的用途,不超過30個字元
    success: (res) => {
        console.log(res.userInfo));
    }
})

獲取到的返回值

{
  "nickName": "秋梓", // 微信昵稱
  "gender": 0,
  "language": "zh_CN",
  "city": "",
  "province": "",
  "country": "",
  "avatarUrl": "//thirdwx.qlogo.cn/mmopen/vi_32/qrSYVbDbBhunywgP5HTx4mhT8HVNzhmlibd8pfYo4guPJ5w/132" // 頭像
}

獲取手機號

目前該介面針對非個人開發者,且完成了認證的小程式開放(不包含海外主體)。需謹慎使用,若用戶舉報較多或被發現在不必要場景下使用,微信有權永久回收該小程式的該介面許可權。

使用方法

需要將 button 組件 open-type 的值設置為 getPhoneNumber,當用戶點擊並同意之後,可以通過 bindgetphonenumber 事件回調獲取到動態令牌code,然後把code傳到開發者後台,並在開發者後台調用微信後台提供的 phonenumber.getPhoneNumber 介面,消費code來換取用戶手機號。每個code有效期為5分鐘,且只能消費一次。

註:getPhoneNumber 返回的 codewx.login 返回的 code 作用是不一樣的,不能混用。

程式碼示例

<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>
Page({
  getPhoneNumber (e) {
    console.log(e.detail.code)
  }
})

返回參數說明

參數 類型 說明 最低版本
code String 動態令牌。可通過動態令牌換取用戶手機號。使用方法詳情 phonenumber.getPhoneNumber 介面

然後通過 code 換取用戶手機號。 每個code只能使用一次,code的有效期為5min

調用如下介面

POST //api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=ACCESS_TOKEN

請求參數

屬性 類型 默認值 必填 說明
access_token / cloudbase_access_token string 介面調用憑證
code string 手機號獲取憑證

返回的 JSON 數據包

屬性 類型 說明
errcode number 錯誤碼
errmsg string 錯誤提示資訊
phone_info Object 用戶手機號資訊

返回結果示例

{
    "errcode":0,
    "errmsg":"ok",
    "phone_info": {
        "phoneNumber":"xxxxxx",
        "purePhoneNumber": "xxxxxx",
        "countryCode": 86,
        "watermark": {
            "timestamp": 1637744274,
            "appid": "xxxx"
        }
    }
}

實現微信支付

喚起微信支付的核心方法調用 wx.requestPayment 方法,該方法具體參數如下

屬性 類型 默認值 必填 說明
timeStamp string 時間戳,從 1970 年 1 月 1 日 00:00:00 至今的秒數,即當前的時間
nonceStr string 隨機字元串,長度為32個字元以下
package string 統一下單介面返回的 prepay_id 參數值,提交格式如:prepay_id=***
signType string MD5 僅在 v2 版本介面適用 簽名演算法,應與後台下單時的值一致
HMAC-SHA256 僅在 v2 版本介面適用
RSA 僅在 v3 版本介面適用
paySign string 簽名,具體見微信支付文檔
success function 介面調用成功的回調函數
fail function 介面調用失敗的回調函數
complete function 介面調用結束的回調函數(調用成功、失敗都會執行)
/**
 * 微信支付方法
 * @param {string} oderId 訂單id
 * @param {string} total 訂單金額
 * @param {stromg} openId 登陸人openid
 */
function weixinPayFun(data) {
  wx.showLoading({
    mask: true
  })
  const http = new Http()
  return new Promise((resolve, reject) => {
    // 請求支付介面
    http.post(`${env.fayongApi}/app/shopping/order/pay`, data).then(res => {
      // 獲取支付簽名資訊
      let payInfo = res.data
      // 調起微信支付
      wx.requestPayment({
        "timeStamp": payInfo.timeStamp + '',
        "nonceStr": payInfo.nonceStr,
        "package": payInfo.package,
        "signType": "RSA",
        "paySign": payInfo.paySign,
        "success": function (res) {
          console.log(res, 'success');
          // 支付成功
          resolve(res)
        },
        "fail": function (err) {
          // 支付失敗
          reject(err)
        },
        "complete": function (res) {
          wx.hideLoading()
        }
      })
    })
  })
}

添加分享功能

在需要分享的分享的頁面中添加 onShareAppMessage 事件函數,此事件處理函數需要 return 一個 Object,用於自定義轉發內容,只有定義了此事件處理函數,右上角菜單才會顯示「轉發」按鈕

onShareAppMessage 方法具體參數如下

欄位 說明 默認值 最低版本
title 轉發標題 當前小程式名稱
path 轉發路徑 當前頁面 path ,必須是以 / 開頭的完整路徑
imageUrl 自定義圖片路徑,可以是本地文件路徑、程式碼包文件路徑或者網路圖片路徑。支援PNG及JPG。顯示圖片長寬比是 5:4。 使用默認截圖 1.5.0
promise 如果該參數存在,則以 resolve 結果為準,如果三秒內不 resolve,分享會使用上面傳入的默認參數 2.12.0

靜態分享

示例程式碼

Page({
    // 分享
    onShareAppMessage() {
        return {
            title: "樂福健康", // 分享標題
            path: "pages/newhome/index", // 分享地址路徑
        }
    }
})

添加完成後點擊右上角膠囊按鈕會分享圖標會亮起

微信截圖_20220211101117.png

微信截圖_20220211101242.png

帶參分享

上面的分享是不帶參數的,我們可以直接在路徑中動態添加參數,分享後用戶點擊時會觸發 onLoad 函數獲取路徑中的參數值

// 分享
onShareAppMessage() {
    const that = this;
    return {
        title: that.data.goodInfo.goodName, // 動態獲取商品名稱
        path: "pages/component/orderparticulars/orderparticulars?id=" + that.data.productId, // 動態傳遞當前商品id
        imageUrl: that.data.background[0] // 獲取商品封面圖
    }
}

動態獲取分享圖片和標題後我們每次分享時會出現不同內容

微信截圖_20220211102921.png

微信截圖_20220211103007.png

全局分享

除此之外我們也可以添加全局分享功能

首先要在每個頁面中添加 onShareAppMessage 函數,函數體內容可以為空,如果函數體內容為空,則會使用我們在 app.js 中定義的默認分享方法,如果該函數返回了一個 object 則使用我們自定義的分享功能

在需要被分享的頁面添加如下程式碼

Page({
    /**
     * 用戶點擊右上角分享
     */
    onShareAppMessage: function () {
		// 函數體內容為空即可
    }
})

接著在 app.js 中添加重寫分享方法

//重寫分享方法
overShare: function () {
    //間接實現全局設置分享內容
    wx.onAppRoute(function () {
        //獲取載入的頁面
        let pages = getCurrentPages(),
            //獲取當前頁面的對象
            view = pages[pages.length - 1],
            data;
        if (view) {
            data = view.data;
            // 判斷是否需要重寫分享方法
            if (!data.isOverShare) {
                data.isOverShare = true;
                view.onShareAppMessage = function () {
                    //重寫分享配置
                    return {
                        title: '分享標題',
                        path: "/pages/index/index"    //分享頁面地址
                    };
                }
            }
        }
    })
},

然後在 onLaunch 函數中調用該方法

onLaunch() {
    this.overShare()
}

分享按鈕

在開發中我們也會碰到點擊分享按鈕實現分享功能,實現程式碼如下

首先在 html 中添加 button 按鈕。其中 open-typ 要等於 share,表示點擊這個按鈕註定觸發分享函數

<!-- 分享按鈕 -->
<van-button type="primary" icon="share" round class="search" open-type="share" size="small">
    分享
</van-button>

之後要確保我們在 js 中添加了 onShareAppMessage 函數

效果如下:

search.gif

獲取用戶收貨地址

獲取用戶收貨地址。調起用戶編輯收貨地址原生介面,並在編輯完成後返回用戶選擇的地址。

wx.chooseAddress({
    success(res) {
        console.log(res.userName)
        console.log(res.postalCode)
        console.log(res.provinceName)
        console.log(res.cityName)
        console.log(res.countyName)
        console.log(res.detailInfo)
        console.log(res.nationalCode)
        console.log(res.telNumber)
    }
})

參數說明

屬性 類型 說明
userName string 收貨人姓名
postalCode string 郵編
provinceName string 國標收貨地址第一級地址
cityName string 國標收貨地址第二級地址
countyName string 國標收貨地址第三級地址
streetName string 國標收貨地址第四級地址
detailInfo string 詳細收貨地址資訊(包括街道地址)
detailInfoNew string 新選擇器詳細收貨地址資訊
nationalCode string 收貨地址國家碼
telNumber string 收貨人手機號碼
errMsg string 錯誤資訊

預覽圖片

調用方法:wx.previewImage(Object object)

在新頁面中全螢幕預覽圖片。預覽的過程中用戶可以進行保存圖片、發送給朋友等操作。

屬性 類型 默認值 必填 說明 最低版本
urls Array. 需要預覽的圖片鏈接列表。2.2.3 起支援雲文件ID。
showmenu boolean true 是否顯示長按菜單。 支援識別的碼:小程式碼 僅小程式支援識別的碼:微信個人碼、微信群碼、企業微信個人碼、 企業微信群碼與企業微信互通群碼; 2.13.0
current string urls 的第一張 當前顯示圖片的鏈接
referrerPolicy string no-referrer origin: 發送完整的referrer; no-referrer: 不發送。格式固定為 //servicewechat.com/{appid}/{version}/page-frame.html,其中 {appid} 為小程式的 appid,{version} 為小程式的版本號,版本號為 0 表示為開發版、體驗版以及審核版本,版本號為 devtools 表示為開發者工具,其餘為正式版本; 2.13.0
success function 介面調用成功的回調函數
fail function 介面調用失敗的回調函數
complete function 介面調用結束的回調函數(調用成功、失敗都會執行)

示例程式碼

wx.previewImage({
  current: '', // 當前顯示圖片的http鏈接
  urls: [] // 需要預覽的圖片http鏈接列表
})

頁面跳轉

跳轉普通頁面

wx.navigateTo({
    url: '',
})

保留當前頁面,跳轉到應用內的某個頁面。但是不能跳到 tabbar 頁面。使用 wx.navigateBack 可以返回到原頁面。小程式中頁面棧最多十層

跳轉tabBar 頁面

跳轉到 tabBar 頁面,並關閉其他所有非 tabBar 頁面

wx.switchTab({
  url: '/index'
})

自定義組件

在小程式中的組件和普通頁面的 js 結構有很大差異,結構如下

// pages/TestComponent/test.js
Component({
    /**
     * 組件的屬性列表
     */
    properties: {
        userName:""
    },

    /**
     * 組件的初始數據
     */
    data: {

    },

    /**
     * 組件的方法列表
     */
    methods: {
        // 獲取父組件傳遞過來的參數
        getPropName(){
            console.log(this.data.userName);
        }
    }
})

其中我們在 properties 對象中定義組件組件的屬性列表

然後再組件中添加觸發 getPropName 的方法

<button bind:tap="getPropName">獲取名稱</button>

在我們需要引入這個組件的頁面去聲明這個組件的名稱和地址,找到後綴為 json 的文件,添加如下程式碼

{
  "usingComponents": {
    "test-component":"../TestComponent/test"
  }
}

之後我們在頁面中像使用普通標籤一樣使用這個組件,並且給組件傳遞數據

<test-component userName="張三"></test-component>

傳遞數據後我們即可實現點擊組件中的按鈕獲取父組件傳遞過來的值

定義全局組件

我們定義完組件後想要在全局使用,我們可以將這個組件定義為全局組件

首先找到項目中的 app.json 文件,找到 usingComponents 添加組件地址

{
    ......省略其他程式碼
    "usingComponents": {
        "test-component":"./pages/TestComponent/test"
    }
}

聲明完成後我們即可在全局像使用標籤的方式使用該組件

設置默認頂部導航欄樣式

app.json 中添加如下程式碼

{
    "window": {
        "backgroundTextStyle": "light",
        "navigationBarBackgroundColor": "#22a381",
        "navigationBarTitleText": "樂福健康",
        "navigationBarTextStyle": "white"
    }
}

全部參數列表

屬性 類型 默認值 描述 最低版本
navigationBarBackgroundColor HexColor #000000 導航欄背景顏色,如 #000000
navigationBarTextStyle string white 導航欄標題顏色,僅支援 black / white
navigationBarTitleText string 導航欄標題文字內容
navigationStyle string default 導航欄樣式,僅支援以下值: default 默認樣式 custom 自定義導航欄,只保留右上角膠囊按鈕。 iOS/Android 微信客戶端 7.0.0,Windows 微信客戶端不支援
backgroundColor HexColor #ffffff 窗口的背景色
backgroundTextStyle string dark 下拉 loading 的樣式,僅支援 dark / light
backgroundColorTop string #ffffff 頂部窗口的背景色,僅 iOS 支援 微信客戶端 6.5.16
backgroundColorBottom string #ffffff 底部窗口的背景色,僅 iOS 支援 微信客戶端 6.5.16
enablePullDownRefresh boolean false 是否開啟當前頁面下拉刷新。 詳見 Page.onPullDownRefresh
onReachBottomDistance number 50 頁面上拉觸底事件觸發時距頁面底部距離,單位為px。 詳見 Page.onReachBottom
pageOrientation string portrait 螢幕旋轉設置,支援 auto / portrait / landscape 詳見 響應顯示區域變化 2.4.0 (auto) / 2.5.0 (landscape)
disableScroll boolean false 設置為 true 則頁面整體不能上下滾動。 只在頁面配置中有效,無法在 app.json 中設置
usingComponents Object 頁面自定義組件配置 1.6.3
initialRenderingCache string 頁面初始渲染快取配置,支援 static / dynamic 2.11.1
style string default 啟用新版的組件樣式 2.10.2
singlePage Object 單頁模式相關配置 2.12.0
restartStrategy string homePage 重新啟動策略配置 2.8.0

效果

微信截圖_20220211112417.png

取消頂部默認的導航欄

找到頁面 json 文件添加 "navigationStyle":"custom",即可去掉默認導航欄

{
  "usingComponents": {
      
  },
  "navigationStyle":"custom"
}

添加自定義樣式後可以達到如下效果

微信截圖_20220211112537.png

Tags: