微信小程序> unionid,微信小程序unionid登录解决方案

unionid,微信小程序unionid登录解决方案

浏览量:944 时间: 来源:LeanCloud_通讯
第三方登录模块使开发者能快捷灵活的拥有自己的用户系统,是LeanCloud最受欢迎的功能之一。随着第三方平台的演化,特别是微信小程序的流行,LeanCloud第三方登录模块也一直在改进:
v2.0:增加微信小程序一键登录功能。支持开发者不写任何后端代码实现微信小程序用户系统与LeanCloud用户系统的关联。
v3.6:增加unionid登录接口。支持开发者使用unionid关联一个微信开发者帐号下的多个应用从而共享一套LeanCloud用户系统。
这里的版本指开始支持该功能的JavaScriptSDK版本。
这两个功能各自都非常简单可靠,但是其中重叠的部分需求却是一个难题:「如何在小程序中支持unionid登录,既能得到unionid登录机制的灵活性,又保留一键登录功能的便利性」。
在最近发布的JavaScriptSDKv3.13中包含了微信小程序unionid登录支持。我们根据不同的需求设计了不同的解决方案。
一键登录
LeanCloud的用户系统支持一键使用微信用户身份登录。要使用一键登录功能,需要先设置小程序的AppID与AppSecret:
登录微信公众平台,在设置开发设置中获得AppID与AppSecret。
前往LeanCloud控制台组件社交,保存「微信小程序」的AppID与AppSecret。
这样你就可以在应用中使用AV.User.loginWithWeapp()方法来使用当前用户身份登录了。
AV.User.loginWithWeapp().then(user={this.globalData.user=user;}).catch(console.error);
使用一键登录方式登录时,LeanCloud会将该用户的小程序openid与session_key等信息保存在对应的user.authData.lc_weapp属性中,你可以在控制台的_User表中看到:
{"authData":{"lc_weapp":{"session_key":"2zIDoEEUhkb0B5pUTzsLVg==","expires_in":7200,"openid":"obznq0GuHPxdRYaaDkPOHk785DuA"}}}
如果用户是第一次使用此应用,调用登录API会创建一个新的用户,你可以在控制台存储中的_User表中看到该用户的信息,如果用户曾经使用该方式登录过此应用(存在对应openid的用户),再次调用登录API会返回同一个用户。
用户的登录状态会保存在客户端中,可以使用AV.User.current()方法来获取当前登录的用户,下面的例子展示了如何为登录用户保存额外的信息:
//假设已经通过AV.User.loginWithWeapp()登录//获得当前登录用户constuser=AV.User.current();//调用小程序API,得到用户信息wx.getUserInfo({success:({userInfo})={//更新当前用户的信息user.set(userInfo).save().then(user={//成功,此时可在控制台中看到更新后的用户信息this.globalData.user=user;}).catch(console.error);}});
authData默认只有对应用户可见,开发者可以使用masterKey在云引擎中获取该用户的openid与session_key进行支付、推送等操作。详情的示例请参考支付。
小程序的登录态(session_key)存在有效期,可以通过wx.checkSession()方法检测当前用户登录态是否有效,失效后可以通过调用AV.User.loginWithWeapp()重新登录。
使用unionid
微信开放平台使用unionid来区分用户的唯一性,也就是说同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid都是同一个,而openid会是多个。如果你想要实现多个小程序之间,或者小程序与使用微信开放平台登录的应用之间共享用户系统的话,则需要使用unionid登录。
要在小程序中使用unionid登录,请先确认已经在微信开放平台绑定了该小程序。
在小程序中有很多途径可以获取到unionid。不同的unionid获取方式,接入LeanCloud用户系统的方式也有所不同。
一键登录时静默获取unionid
当满足以下条件时,一键登录APIAV.User.loginWithWeapp()能静默地获取到用户的unionid并用unionid+openid进行匹配登录。
微信开放平台帐号下存在同主体的公众号,并且该用户已经关注了该公众号。
微信开放平台帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用。
要启用这种方式,需要在一键登录时指定参数preferUnionId为true:
AV.User.loginWithWeapp({preferUnionId:true,});
使用unionid登录后,用户的authData中会增加_weixin_unionid一项(与lc_weapp平级):
{"authData":{"lc_weapp":{"session_key":"2zIDoEEUhkb0B5pUTzsLVg==","expires_in":7200,"openid":"obznq0GuHPxdRYaaDkPOHk785DuA","unionid":"ox7NLs5BlEqPS4glxqhn5kkO0UUo"},"_weixin_unionid":{"uid":"ox7NLs5BlEqPS4glxqhn5kkO0UUo"}}}
用unionid+openid登录时,会按照下面的步骤进行用户匹配:
如果已经存在对应unionid(authData._weixin_unionid.uid)的用户,则会直接作为这个用户登录,并将所有信息(openid、session_key、unionid等)更新到该用户的authData.lc_ewapp中。
如果不存在匹配unionid的用户,但存在匹配openid(authData.lc_weapp.openid)的用户,则会直接作为这个用户登录,并将所有信息(session_key、unionid等)更新到该用户的authData.lc_ewapp中,同时将unionid保存到authData._weixin_unionid.uid中。
如果不存在匹配unionid的用户,也不存在匹配openid的用户,则创建一个新用户,将所有信息(session_key、unionid等)更新到该用户的authData.lc_ewapp中,同时将unionid保存到authData._weixin_unionid.uid中。
不管匹配的过程是如何的,最终登录用户的authData都会是上面这种结构。
LeanTodoDemo便是使用这种方式登录的,如果你已经关注了其关联的公众号(搜索AVOSCloud,或通过小程序关于页面的相关公众号链接访问),那么你在登录后会在LeanTodoDemo的设置-用户页面看到当前用户的authData中已经绑定了unionid。
需要注意的是:
如果用户不符合上述静默获取unionid的条件,那么就算指定了preferUnionId也不会使用unionid登录。
如果用户符合上述静默获取unionid的条件,但没有指定preferUnionId,那么该次登录不会使用unionid登录,但仍然会将获取到的unionid作为一般字段写入该用户的authData.lc_weapp中。此时用户的authData会是这样的:
{"authData":{"lc_weapp":{"session_key":"2zIDoEEUhkb0B5pUTzsLVg==","expires_in":7200,"openid":"obznq0GuHPxdRYaaDkPOHk785DuA","unionid":"ox7NLs5BlEqPS4glxqhn5kkO0UUo"}}}
通过其他方式获取unionid后登录
如果开发者自行获得了用户的unionid(例如通过解密wx.getUserInfo获取到的用户信息),可以在小程序中调用AV.User.loginWithWeappWithUnionId()投入unionid完成登录授权:
AV.User.loginWithWeappWithUnionId(unionid,{asMainAccount:true}).then(console.log,console.error);
通过其他方式获取unionid与openid后登录
如果开发者希望更灵活的控制小程序的登录流程,也可以自行在服务端实现unionid与openid的获取,然后调用通用的第三方unionid登录接口指定平台为lc_weapp来登录:
constunionid='';constauthData={openid:'',session_key:''};constplatform='lc_weapp';AV.User.loginWithAuthDataAndUnionId(authData,platform,unionid,{asMainAccount:true}).then(console.log,console.error);
相对上面提到的一些Weapp相关的登录API,loginWithAuthDataAndUnionId是更加底层的第三方登录接口,不依赖小程序运行环境,因此这种方式也提供了更高的灵活度:
可以在服务端获取到unionid与openid等信息后返回给小程序客户端,在客户端调用AV.User.loginWithAuthDataAndUnionId来登录。
也可以在服务端获取到unionid与openid等信息后直接调用AV.User.loginWithAuthDataAndUnionId登录,成功后得到登录用户的sessionToken后返回给客户端,客户端再使用该sessionToken直接登录。
关联第二个小程序
这种用法的另一种常见场景是关联同一个开发者帐号下的第二个小程序。
因为一个LeanCloud应用默认关联一个微信小程序(对应的平台名称是lc_weapp),使用小程序系列API的时候也都是默认关联到authData.lc_weapp字段上。如果想要接入第二个小程序,则需要自行获取到unionid与openid,然后将其作为一个新的第三方平台登录。这里同样需要用到AV.User.loginWithAuthDataAndUnionId方法,但与关联内置的小程序平台(lc_weapp)有一些不同:
需要指定一个新的platform
需要将openid保存为uid(内置的微信平台做了特殊处理可以直接用openid而这里是作为通用第三方OAuth平台保存因此需要使用标准的uid字段)。
这里我们以新的平台weapp2为例:
constunionid='';constopenid='';constauthData={uid:openid,session_key:''};constplatform='weapp2';AV.User.loginWithAuthDataAndUnionId(authData,platform,unionid,{asMainAccount:true}).then(console.log,console.error);
取unionid后与现有用户关联
如果一个用户已经登录,现在通过某种方式获取到了其unionid(一个常见的使用场景是用户完成了支付操作后在服务端通过getPaidUnionId得到了unionid)希望与之关联,可以在小程序中使用AV.User#associateWithWeappWithUnionId():
constuser=AV.User.current();//获取当前登录用户user.associateWithWeappWithUnionId(unionid,{asMainAccount:true}).then(console.log,console.error);
启用其他登录方式
上述的登录API对接的是小程序的用户系统,所以使用这些API创建的用户无法直接在小程序之外的平台上登录。如果需要使用LeanCloud用户系统提供的其他登录方式,如用手机号验证码登录、邮箱密码登录等,在小程序登录后设置对应的用户属性即可:
//小程序登录AV.User.loginWithWeapp().then(user={//设置并保存手机号user.setMobilePhoneNumber('13000000000');returnuser.save();}).then(user={//发送验证短信returnAV.User.requestMobilePhoneVerify(user.getMobilePhoneNumber());}).then({//用户填写收到短信验证码后再调用AV.User.verifyMobilePhone(code)完成手机号的绑定//成功后用户的mobilePhoneVerified字段会被置为true//此后用户便可以使用手机号加动态验证码登录了}).catch(console.error);
验证手机号码功能要求在控制台存储设置用户账号启用「用户注册时,向注册手机号码发送验证短信」。
绑定现有用户
如果你的应用已经在使用LeanCloud的用户系统,或者用户已经通过其他方式注册了你的应用(比如在Web端通过用户名密码注册),可以通过在小程序中调用AV.User#associateWithWeapp()来关联已有的账户:
//首先,使用用户名与密码登录一个已经存在的用户AV.User.logIn('username','password').then(user={//将当前的微信用户与当前登录用户关联returnuser.associateWithWeapp();}).catch(console.error);
《在微信小程序与小游戏中使用LeanCloud》完整内容请点击左下角阅读原文。
end
LeanCloud,领先的BaaS提供商,为移动开发提供强有力的后端支持。更多内容请关注「LeanCloud通讯」

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎