微信多个小程序共用账户体系注册流程 # 背景 原先有一个小程序一致在跑,突然有一天想再测试一个小程序,用于服务,此时需要将两个小程序的账户体系打通。 已知A小程序的用户体系中有A小程序的openid。 | A小程序OPENID | B小程序OPENID | UNIONID | | ------------ | ------------ | ------------ | | 11111 | NULL | NULL | # 处理 openid是针对每个小程序唯一,不是针对同个公众号下不同小程序唯一。 此时我需要拿到unionid,同个公众号下不同小程序下unionid是唯一的。 ## 获取UNIONID 按微信的文档,前端调起login接口返回信息。 后端获取数据 ~~~ $appId = Config::get('app_birth_id'); $appSecret = Config::get('app_birth_secret'); $param = $this->param; $rule = [ 'code|code' => 'require', 'encryptedData|参数' => 'require', 'iv|参数iv' => 'require', ]; $validate = Validate::make($rule); if (!$validate->check($param)) { return $this->err($validate->getError()); } //这里是将encryptedData,iv解码 $oauth = new weappOAuth($appId, $appSecret); $oauth->getSessionKey($param['code']); $openId = $oauth->getOpenId(); $unionId = $oauth->getUnionId(); $userinfo = $oauth->getUserInfo($param['encryptedData'], $param['iv']); if (empty($userinfo) || empty($openId)) { return $this->err('解析错误!'); } ~~~ userinfo内的信息就包含了用户所有的信息,并且会额外返回unionid。 但是并没有。 **两个小程序都在一个公众号下,但是没返回UNIONID。** **其实是因为没有在微信开放平台注册账号(认证还要花300,垃圾微信),并且将两个小程序绑在一起**。 ## 判断逻辑 有了UNIONID,但是原先的小程序并没有填充UNIONID,除非用户每次都去A小程序登录一下,重新补填上UNIONID,不然我还是无法判断用户账户唯一。 经过多次思考。 最终还是要使用手机号唯一来进行判断。 判断流程图如下:  当用户账户A有UNIONID时,B只要绑定即可。 但是当账户A没有UNIONID,则进入绑定手机界面, 用户输入的手机如果有账户且未绑定小程序B,则还是进行绑定, 如果有账户并且小程B也已经绑定,则提示手机号已经注册, 如果没有账户,则进行新增账户操作。 PS:原先一直考虑能根据openid在用户不操作的前提下去交互UIONID,但是微信没有此功能,此路不通。 至此,折腾了一周的多个小程序绑定同一账户体系的问题解决。 /撒花。