微信小程序获取openID及unionID
发布于 3 年前 作者 daiguiying 5215 次浏览 来自 分享

公众号openID和小程序openID说明

为了识别用户,每个用户针对每个公众号或小程序等应用会产生一个安全的OpenID

  • 在小程序中,openID是小程序的普通用户的一个唯一的标识,只针对当前的小程序有效
  • 同理在公众号中openID是公众号的普通用户的一个唯一的标识,只针对当前的公众号有效

冷知识:公众号包含服务号和订阅号。我们常开发的是服务号

同一个微信用户在小程序和公众号上的openid是不同的

UnionID 机制说明

微信的unionid机制说明:

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

简而言之,unionid是用来说明多个应用下用户身份一致性的问题。相比较而言,由于在同一个应用下每个用户的openid是唯一的,因此openid也是也可以用来标记用户身份,但是仅限于在同一个应用中。对于不同的应用,每个用户的openid是不一样的,要想在不同应用间识别用户的唯一性只可以用unionid。下面来举一个例子来说明,例如:

小耿开发者账号下有公众号A和小程序B,对于访问公众号A和小程序B的用户小龙有openidA与openidB(openidA!=openidB),openidA在公众号A应用中是唯一的,可以说明小龙的身份;openidB在小程序B中是唯一的,也可以说明小龙的身份。假如,我们现在要确定公众号A的用户小龙与小程序B的用户小龙是否为同一个用户小龙,我们根据openid能确定吗?很显然,不可以。此时用户的unionid就可以解决这个问题,即unionid是用来确定不同应用下用户的唯一性。

如何获取?

公众号获取openID

参考文档:(建议放到后端处理https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

http://note.youdao.com/noteshare?id=c391f6f88ae92c485b95f386309079b2&sub=0A4A104759AE4D5992457DC02E9FC194


小程序获取openID

1、需要在微信小程序调用登录开放接口 wx.login() 获取用户登陆凭证code。

wx.login()接口说明: > https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html

2、向服务器发送请求,并将code一起发送过去。

3、接下来,在服务端调用auth.code2Session接口

接口说明 :https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html

4、接口返回openid



UnionID获取途径

公众号获取unionID

可以直接通过 openID 获取到该用户 UnionID(建议放到后端处理)

https://developers.weixin.qq.com/doc/offiaccount/User_Management/Get_users_basic_information_UnionID.html#UinonId


小程序获取unionID

微信官方给出的途径:

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

1、以前是调用接口 wx.getUserInfo,目前为通过button获取:

<button type='primary' open-type="getUserInfo" lang="zh_CN" bindgetuserinfo="bindGetUserInfo">
授权登录

</button>,从解密数据中获取 UnionID。注意本事件会触发用户授权,请妥善处理用户拒绝授权后的情况。> 2、如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过 wx.login + code2Session 获取到该用户 UnionID,无须用户再次授权。> 3、如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用。开发者也可以直接通过 wx.login + code2Session 获取到该用户 UnionID ,无须用户再次授权。> 4、用户在小程序(暂不支持小游戏)中支付完成后,开发者可以直接通过getPaidUnionId接口获取该用户的 UnionID,无需用户授权。注意:本接口仅在用户支付完成后的5分钟内有效,请开发者妥善处理。> 5、小程序端调用云函数时,如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号,可在云函数中通过 cloud.getWXContext 获取 UnionID。> 6、小程序端调用云函数时,如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用,也可在云函数中通过 cloud.getWXContext 获取 UnionID。


大多数情况下均可以通过前三种方法获取到。途径2和3说明只要你曾经关注过该公众号就可以获取到unionid,不论现在是否还关注公众号。


在项目中采取下列方法来获取unionid第一种方法举例:

微信授权的话,得给用户制造一个自己手动触发授权的环境

登陆按钮这块的open-type需要是getUserInfo

<button type='primary' open-type="getUserInfo" lang="zh_CN" bindgetuserinfo="bindGetUserInfo">
        登录
</button>

到这儿的时候一定要梳理清晰你要的是哪些数据,还有这些数据要通过哪种方式去获得和需要的参数

  • 用户授权后,需要知道用户是否授权成功,通过wx.getSetting查看是否成功
  • 成功的话,通过wx.login获取用户的code,因为获取openid和unionid需要用code
  • 然后最后就是通过微信的auth.code2Session获取我们最终想要的

获取openid和unionid、session_key

/**
  * [@name](/user/name)      获取用户信息
  * [@date](/user/date)      
  */
  bindGetUserInfo(e) {
    // 获取用户授权
    wx.getSetting({
      success: (res) => {
      //判断是否授权成功
        if (res.authSetting['scope.userInfo']) {
              wx.login({
                success: (rest) => {
                //用户的code
                  let userCode = rest.code
                  // 该流程放到后端处理===
                  // https://api.weixin.qq.com 不是合法域名,正式环境无法访问 =============
                  wx.request({
                    // 自行补上自己的 APPID 和 SECRET
                   url:`https://api.weixin.qq.com/sns/jscode2session?appid=自己的appid&secret=密钥&js_code=${userCode}&grant_type=authorization_code`,
                    success: res => {
                      // 获取到用户的 openid
                      console.log("用户的openid:" + res.data.openid);
                      console.log("用户的unionid:" + res.data.unionid);
                      console.log("用户的session_key:" + res.session_key);
                    },
                    fail(e){
                      wx.showToast({
                        title: '获取失败',
                        icon: 'none'
                      });
                    },
                  });
                }
              })
        } else {
          wx.showToast({
            title: '请确认授权',
            icon: 'none'
          });
        }
      }
    });
  },


tips:获取unionid的话是需要微信开放平台绑定小程序的,不然是不可能获取到的

查找 APPID 和 SECRET

微信公众平台->开发->开发管理->开发设置


auth.code2Session

比较简单,大家可以自行查看 link


参考文章:

openid:

https://developers.weixin.qq.com/community/develop/article/doc/000c80906b4210625f3bde3775bc13

https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

unionid:

https://www.jianshu.com/p/46efa68d9033

https://www.jianshu.com/p/03810ae56c4f

2 回复

为啥现在bindgetuserinfn方法只能获取到{nickName"微信用户"gender0language""city""province"", …}的一个对象了??

回到顶部