

<button bindtap='login' loading="{{isLoading}}">Authorized login</button>
import Config from './utils/configData';const app = getsuperapp();Page({data: {isLoading: false,},login: function () {this.setData({isLoading: true})wx.login({success: (res) => {console.log('wx.login success===', res)if (res.code) {wx.request({url: `${Config.BASEURL}/getUserInfo`,method: "POST",data: {appid: Config.APPID,code: res.code},success: (res) => {this.setData({isLoading: false})console.log('wx.request success===', res)const { code = -1, data = {} } = res?.data || {};if (code === 200) {wx.showToast({title: 'Logged in successfully',icon: 'success',duration: 500})// Or store via wx.setStorageapp.globalData.userInfo = {avatarUrl: data.avatarUrl,account: data.account,nickName: data.userName,id: data.id,token: data.token,phoneNumber: data.phone,emailAddress: data.email}setTimeout(() => {wx.navigateBack({delta: 1})}, 500)} else {const msg = res?.data?.data?.msg || '/getUserInfo request fail'const errcode = res?.data?.data?.errcode || codeconsole.log('/getUserInfo request fail', res)wx.showModal({title: 'Login failed',confirmText: 'Confirm',content: `/getUserInfo fail:${msg}[code:${errcode}]`,showCancel: false})}},fail: (err) => {this.setData({isLoading: false})console.log('wx.request fail', err)wx.showModal({title: 'Login failed',confirmText: 'Confirm',content: err.errMsg,showCancel: false})},})} else {this.setData({isLoading: false})console.log('wx.login does not return code', res)wx.showModal({title: 'Login failed',confirmText: 'Confirm',content: res.errMsg,showCancel: false})}},fail: (err) => {this.setData({isLoading: false})console.log('wx.login fail===', err)wx.showModal({title: 'Login failed',confirmText: 'Confirm',content: err.errMsg,showCancel: false})}})}})
open-type的值设置为getPhoneNumber,当用户点击并同意之后,通过bindgetphonenumber事件获取回调信息。将回调信息中的动态令牌 code 通过自定义接口(例如示例代码中的/getUserPhone)传到小程序后端服务,并在小程序后端服务调用平台OpenServer提供的 getuserphonenumber 接口,消费 code 来换取用户手机号。
open-type的值设置为getEmailAddress,当用户点击并同意之后,通过bindGetEmailAddress事件获取回调信息,将回调信息中的动态令牌 code 通过自定义接口(例如示例代码中的/getUserEmailDirect)传到小程序后端服务,并在小程序后端服务调用平台OpenServer提供的 getemailaddress 接口,消费 code 来换取用户邮箱地址。
<view><buttonopen-type="getPhoneNumber"bindtap="clickGetPhoneNumber"bindgetphonenumber="handleGetPhoneNumber">Get Phone Number</button><buttonopen-type="getEmailAddress"bindtap="clickGetEmailAddress"bindgetemailaddress="handleGetEmailAddress">Get Email Address</button></view>
import Config from './utils/configData';var app = getsuperapp();Page({data: {phoneNumber: '',emailAddress: '',},clickGetEmailAddress() {wx.showLoading();},clickGetPhoneNumber() {wx.showLoading();},handleGetPhoneNumber(e) {console.log('getPhoneNumber success===', e.detail)const { code, errMsg } = e.detailif (code) {wx.request({url: `${Config.BASEURL}/getUserPhone`,method: "POST",data: {appid: Config.APPID,code,token: app.globalData.userInfo.token // Login state},success: (res) => {wx.hideLoading()console.log('getPhoneNumber request success===', res)const { code = -1, data = {}, msg } = res?.data || {};if (code === 200) {this.setData({phoneNumber: data?.phoneNumber})} else {const msg = res?.data?.data?.msg || res?.data || '/getPhoneNumber request fail'const errcode = res?.data?.data?.errcode || codeconsole.log('/getPhoneNumber request fail', res)wx.showModal({title: 'Failed to retrieve phone number',confirmText: 'Confirm',content: `/getPhoneNumber fail:${msg}[code:${errcode}]`,showCancel: false})}},fail: (err) => {wx.hideLoading()console.log('wx.request fail', err)wx.showModal({title: 'wx.request fail',confirmText: 'Confirm',content: err.errMsg,showCancel: false})},})} else {wx.hideLoading()console.log('getPhoneNumber does not return code', e.detail)wx.showModal({title: 'getPhoneNumber fail',confirmText: 'Confirm',content: errMsg,showCancel: false})}},handleGetEmailAddress(e) {console.log('getEmailAddress success===', e.detail)const { code, errMsg } = e.detailif (code) {wx.request({url: `${Config.BASEURL}/getUserEmailDirect`,method: "POST",data: {appid: Config.APPID,code},success: (res) => {wx.hideLoading()console.log('getEmailAddress request success===', res)const { code = -1, data = {}, msg } = res?.data || {};if (code === 200) {this.setData({emailAddress: data?.emailAddress})} else {const msg = res?.data?.data?.msg || res?.data || '/getEmailAddress request fail'const errcode = res?.data?.data?.errcode || codeconsole.log('/getEmailAddress request fail', res)wx.showModal({title: 'Failed to retrieve email address',confirmText: 'Confirm',content: `/getEmailAddress fail:${msg}[code:${errcode}]`,showCancel: false})}},fail: (err) => {wx.hideLoading()console.log('wx.request fail', err)wx.showModal({title: 'wx.request fail',confirmText: 'Confirm',content: err.errMsg,showCancel: false})},})} else {wx.hideLoading()console.log('getEmailAddress does not return code', e.detail)wx.showModal({title: 'getEmailAddress fail',confirmText: 'Confirm',content: errMsg,showCancel: false})}}})
chooseAvatar,当用户选择需要使用的头像之后,可以通过bindchooseavatar事件回调获取到头像信息的临时路径。
nickname,当用户在此 input 进行输入时,键盘上方会展示宿主APP昵称,用户点击昵称后可以自动填充到 input 输入框中,通过 input 的bindchange事件可以获取到最新的 value 值。
<view class="userInfo-container"><view class="settingItem"><text class="caption">Profile Picture</text><view class="avatar-empty"></view><button class="headerButton" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar"><image src="{{userHead}}" class="userHead" mode="aspectFill" /></button></view><view class="settingItem"><text class="caption">Nickname</text><inputvalue="{{nickName}}"type="nickname"class="value"placeholder="Please enter a nickname"bindchange="nickNameChange" /></view></view>
import Config from './utils/configData';var app = getsuperapp();Page({data: {userHead: '',userHeadBase64: '',nickName: '',},onChooseAvatar(e) {console.log('onChooseAvatar===', e)const { avatarUrl } = e.detailif(avatarUrl.includes('/tmp')) {const fs = wx.getFileSystemManager();fs.readFile({filePath: avatarUrl,encoding: 'base64',success: (data) => {this.setData({userHeadBase64: 'data:image/png;base64,' + data.data,userHead: 'data:image/png;base64,' + data.data})},fail: (err) => {console.error('readFile error===', err);}});}if(avatarUrl) {this.setData({userHead: avatarUrl,})}},nickNameChange(e) {console.log('nickNameChange===', e.detail.value)this.setData({nickName: e.detail.value})}})
Page {width: 100%;min-height: 100vh;background: #f2f2f2;display: flex;flex-direction: column;}.userInfo-container {display: flex;flex-direction: column;}.settingItem {display: flex;width: 100%;box-sizing: border-box;flex-direction: row;background: white;border-bottom: #dedede solid 1px;padding: 26rpx;align-items: center;}.avatar-empty {flex: 1;}.headerButton {padding: 15rpx;width: 46px !important;height: 46px !important;border-radius: 8px;}.userHead {width: 100%;height: 100%;pointer-events: none;}.settingItem .caption, .settingItem .value {font-size: 30rpx;color: #333;}.settingItem .value {flex: 1;text-align: right;}
GET https://xxx.xxx.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
文档反馈