目錄標題
- 授權手機號
- 新舊版本核心差異對比
- 強制使用新版的情況
- 代碼實現方案
- 特殊處理邏輯
- 企業賬號要求
- 最佳實踐建議
- 授權頭像和昵稱
- 新舊版本核心差異對比
- 強制使用新版的情況
- 代碼實現方案
- 最佳實踐建議
- 注意事項
授權手機號
新舊版本核心差異對比
觸發方式
舊版(2023年前)通過 <button open-type="getPhoneNumber">
觸發,新版(2023年后)沿用相同方式但要求企業資質。
數據返回
舊版返回 encryptedData
和 iv
需后端解密,新版直接返回 code
供后端換取手機號。
費用
舊版免費,新版每次調用需支付 0.03 元起。
兼容性
舊版僅支持基礎庫版本低于 2.21.2,新版強制要求基礎庫版本 ≥ 2.21.2。
強制使用新版的情況
新注冊小程序
無論基礎庫版本如何,必須使用新版接口。
已過審小程序
若更新代碼需適配新版接口,否則無法通過審核。
安全要求
新版需完成企業認證并開通微信支付。
代碼實現方案
版本檢測與兼容處理
const systemInfo = getCompatSystemInfo();
const isNewVersion = compareVersion(systemInfo.SDKVersion, '2.21.2') >= 0;
utils.js
/*** 獲取兼容性系統信息* @returns {Object} 包含SDKVersion/windowWidth/system等字段的對象*/
export const getCompatSystemInfo = () =>{// 優先嘗試新API組合 (2.20.1+)if (uni.getDeviceInfo && uni.getWindowInfo) {const deviceInfo = uni.getDeviceInfo();const windowInfo = uni.getWindowInfo();return {SDKVersion: uni.getAppBaseInfo().SDKVersion,windowWidth: windowInfo.windowWidth,windowHeight: windowInfo.windowHeight,system: deviceInfo.system,platform: deviceInfo.platform};}// 降級使用舊APIconst legacyInfo = uni.getSystemInfoSync();return {SDKVersion: legacyInfo.SDKVersion,windowWidth: legacyInfo.windowWidth,windowHeight: legacyInfo.windowHeight,system: legacyInfo.system,platform: legacyInfo.platform};
}
/*** 比較兩個版本號字符串的大小* @param {string} v1 - 版本號1 (格式如"1.2.3")* @param {string} v2 - 版本號2 (格式如"1.2.4")* @returns {number} * 1: v1 > v2* -1: v1 < v2* 0: v1 == v2*/
export const compareVersion = (v1, v2) => {// 將版本號字符串拆分為數字數組(如"1.2.3" → [1,2,3])const v1Arr = v1.split('.').map(Number);const v2Arr = v2.split('.').map(Number);// 比較最多3位版本號(支持4位可修改循環條件)for (let i = 0; i < 3; i++) {// 如果當前位v1大于v2,直接返回1if (v1Arr[i] > v2Arr[i]) return 1;// 如果當前位v1小于v2,直接返回-1if (v1Arr[i] < v2Arr[i]) return -1;}// 所有位都相同則返回0return 0;
}
<button open-type="getPhoneNumber" @getphonenumber="registerUser">授權手機號一鍵登錄
</button>
舊版實現代碼
getPhoneNumber(e) {if (!isNewVersion && e.detail.encryptedData) {uni.login({success: (res) => {uni.request({url: 'YOUR_API',data: {code: res.code, iv: e.detail.iv,encryptedData: e.detail.encryptedData}})}})}
}
新版實現代碼
getPhoneNumber(e) {if (isNewVersion && e.detail.code) {uni.login({success: (res) => {uni.request({url: 'YOUR_API',data: {wx_code: res.code,phone_code: e.detail.code}})}})}
}
if (e.detail?.errMsg !== "getPhoneNumber:ok") {console.log("授權失敗")return;
}
特殊處理邏輯
降級方案
通過 wx.canIUse()
檢測接口可用性,確保兼容性。
錯誤處理
需捕獲 getPhoneNumber
的 fail
回調,處理授權失敗情況。
UI適配
建議使用條件渲染展示不同按鈕文案,提升用戶體驗。
企業賬號要求
舊版
僅需完成企業認證即可使用。
新版
需額外完成微信支付認證并開通相應權限。
測試號
提供 1000 次免費調用額度供開發測試使用。
最佳實踐建議
新項目
必須使用新版接口,并提前規劃調用預算。
存量項目
建議逐步遷移至新版接口,過渡期做好雙版本兼容。
個人開發者
無法使用手機號授權功能,需升級為企業主體。
授權頭像和昵稱
新舊版本核心差異對比
微信小程序獲取用戶頭像和昵稱的新舊版本在API接口、觸發條件、數據返回等方面存在顯著差異:
舊版實現方式(2022年前)
- 使用
wx.getUserInfo
或wx.getUserProfile
接口 - 需要用戶主動授權彈窗
- 直接返回包含用戶信息的對象
- 對基礎庫版本無特殊要求
新版實現方式(2022年后)
- 使用
chooseAvatar
按鈕和nickname
輸入框 - 必須通過按鈕點擊觸發
- 頭像返回臨時路徑,昵稱需安全檢測
- 要求基礎庫版本≥2.21.2
強制使用新版的情況
- 新注冊的小程序必須使用新版接口
- 已過審的小程序在更新代碼時必須適配新版
- 頭像內容需通過微信安全檢測
代碼實現方案
新版標準實現
chooseAvatar
接口返回的是臨時文件路徑。為了確保頭像能夠長期存儲和展示,需要通過uni.uploadFile
將該路徑上傳至服務器,并保存服務器返回的永久URL。
<!-- 頭像獲取 -->
<button open-type="chooseAvatar" @chooseavatar="onChooseAvatar">選擇頭像
</button><!-- 昵稱獲取 -->
<input type="nickname" @blur="onNicknameBlur" />
export default {methods: {onChooseAvatar(e) {this.avatarUrl = e.detail.avatarUrlthis.uploadAvatar()},onNicknameBlur(e) {this.nickName = e.detail.value}}
}
舊版兼容方案
如果不滿足上述提及的使用舊版本的要求,以下代碼獲取得到的個人信息數據是默認數據,不是用戶真實的頭像和昵稱。(加密的數據中存放的也是默認數據。)
<button v-if="showLegacy" open-type="getUserInfo" @getuserinfo="getLegacyInfo">授權獲取信息
</button>
export default {data() {return {showLegacy: false}},mounted() {this.checkSDKVersion()},methods: {checkSDKVersion() {const { SDKVersion } = uni.getSystemInfoSync()this.showLegacy = this.compareVersion(SDKVersion, '2.21.2') < 0},compareVersion(v1, v2) {// 版本比較邏輯},getLegacyInfo(e) {console.log(e.detail.userInfo)}}
}
最佳實踐建議
- 新項目必須使用新版方案
- 存量項目建議通過條件編譯實現多版本共存
注意事項
- 開發者工具與真機表現可能存在差異,需進行真機測試
- 頭像臨時路徑需在24小時內上傳到服務器
- 需提供用戶拒絕授權時的備選方案