受欢迎的博客标签

UnionID 机制说明
如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。

UnionID获取途径
绑定了开发者帐号的小程序,可以通过下面 4 种途径获取 UnionID。


小程序端调用云函数时,如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号,可在云函数中通过 cloud.getWXContext 获取 UnionID
小程序端调用云函数时,如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用,也可在云函数中通过 cloud.getWXContext 获取 UnionID。

原文:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/union-id.html

 

1.正常的方式,这些信息不需要用户授权即可获取,获取unionid

step 1:

使用云函数只能获取的用户的openid 和 appid两项信息,结构如下:

云函数[login] user event:
 {
   userInfo: 
   { 
     appId: 'wxf7058cc***',
     openId: 'oQuJV43etcpx6W5gZBLv**' 
   } 
 }

 

step 2.用户图像和昵称授权代码

如果要获取用户的图像等信息,必须要用户显式授权后才可获取到

下面的代码用来显示图像或提示信息,让用户点击(图像或提示文字),以便弹出授权窗口,让用户进行选择授权或拒绝授权。

 <view class='info'>
      <label>
      
        <image class='avatar' src='{{avatarUrl|| defaultAvatarUrl}}'></image>
        <view class='text'>
          <view class='name'>{{userInfo.nickName || '登录/注册'}}</view>
          <view>{{userInfo.jobTitle || '添加职位'}} @ {{userInfo.company || '添加公司'}}</view>
        </view>
        <button open-type='getUserInfo' bindgetuserinfo='onGetUserInfo'></button>
      </label>
    </view>

用户选择授权或拒绝后,立即调用下面的代码。下面这段代码用来判断用户是否授权了。

//用户点击图标后,会弹出“微信授权” 窗口
// 用户点击“允许”,允许开发者获得用户的公开信息(昵称、头像等)
  onGetUserInfo: function (e) {
    if (!this.logged && e.detail.userInfo) {
      this.setData({
        logged: true,
        avatarUrl: e.detail.userInfo.avatarUrl,
        userInfo: e.detail.userInfo
      })
    }
  },

step 3: 后台判断用户是否授权的代码

这段代码用来在任何时候判断用户是否已授权,上面那个是有弹窗后的立马判断。

/**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {


    // 使用 wx.getSetting 获取用户当前的用户信息授权状态。获取用户图像和昵称信息。
    wx.getSetting({
      success: res => {
        if (res.authSetting['scope.userInfo']) {
          // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
          console.log('已经授权')
          wx.getUserInfo({
            success: res => {
              
              this.setData({
                avatarUrl: res.userInfo.avatarUrl,
                userInfo: res.userInfo
              })

              // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
              // 所以此处加入 callback 以防止这种情况
              if (this.userInfoReadyCallback) {
                this.userInfoReadyCallback(res)
              }


            }
          })
        }
        else {
          console.log('page/my/my|res.authSetting:', '小程序AspNetCore自定义:检测到当前用户未授权获取图像和昵称') 
          
          wx.showToast({
            title: "提示:您未授权本程序获取您的图像和昵称。如果您愿意,请点击图像授权(这不是必须的,不授权程序可以正常工作)",
            duration: 5000,
            icon: "none"
          })
        }

      }
    })

  },

2.open-data头像、昵称获取方式

如果只是为了展示用户名和头像可以用open-data组件,wx.getUserInfo还是可以使用,只是第一次授权必须要经过button组件而已。

<view class="userinfo">
  <view class="userinfo-avatar">
    <open-data  type="userAvatarUrl"></open-data>
  </view>
    <open-data type="userNickName"></open-data>
</view
.userinfo {
  position: relative;
  width: 750rpx;
  height: 320rpx;
  color: #fff;
  display: flex;
  flex-direction: column;
  align-items: center;
}
 
.userinfo-avatar {
  overflow:hidden;
  display: block;
  width: 160rpx;
  height: 160rpx;
  margin: 20rpx;
  margin-top: 50rpx;
  border-radius: 50%;
  border: 2px solid #fff;
  box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.2);
}
 
.userinfo text {
  /* color: #fff; */
  font-size: 14px;
  background-color: #c0c0c0;
  border-radius:40%;
}

接口还是有的,通过login拿到code,去后台通过restful api可以拿到openid和unoinid.用户使用button(小程序)或UserInfoButton(小游戏)组件,在用户点击后弹窗请求获取用户基本信息。我的建议是能不用getUserInfo的地方尽量不用,可以用open-data替代,从而不需要授权。例如获取头像,昵称等信息,如果后台不需要存储这些数据,就使用open-data(如果应用不需要展示其他好友的头像、昵称,后台就可以不存储这些数  据)。

 同时,为了区分用户,只需通过wx.login()来获取openId,作为用户ID给后台存储就行了(需要用到Unionid的除外),这种情况也不需要授权。

常见问题

1.本地云函数被删除后,提示找不到云函数

解决办法:同步云函数列表

2.页面加载后仍未获取到openId

原因:app.js里的onLaunch(异步)方法调用得到数据的速度比页面Page中的onLoad慢,导致在加载index.wxml时openid总是为空

解决办法:采用Promise

 

目录:

画图Canvas:https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.setTextAlign.html

 

小程序分享及用户信息授权等接口能力10月10调整

https://mp.weixin.qq.com/cgi-bin/announce?action=getannouncement&announce_id=11536230584k14IW&version=&lang=zh_CN&token=1525354655