Uni-App - 实战《悦读》之多应用、多平台统一登录关系

多平台统一登录之 unionID

通过获取用户基本信息接口,开发者可通过OpenID来获取用户基本信息,而如果开发者拥有多个应用,可使用以下办法通过UnionID机制来在多个应用进行用户帐号互通。
只要是同一个微信开放平台帐号下的公众号,用户的UnionID是唯一的。

换句话说,同一用户,对同一个微信开放平台帐号下的不同应用,UnionID是相同的。
此前的OpenID机制,每个微信号对应每个应用有唯一的OpenID,所以不同应用之间是不能共享用户的,现在有了UnionID就可以了。

APP端获取 unionID

使用 uni.login 即可。

小程序端获取 unionID

步骤:

1、配置小程序 appid (此appid 在微信开放平台已经绑定);
2、使用 uni.login 登录时会获取 code,用 code 换取 seesion_key;
3、在获取用户信息函数中获取到加密信息;
4、利用 seesion_key 及加密信息在服务端解密获取 unionID

php 后端注意事项

需要开启 php_openssl 扩展

前端实现过程代码

export default {
    data() {
        return {
            
        };
    },
    
    methods:{
        // #ifdef MP-WEIXIN
        getUserInfo : (info) => {
            //加密数据
            var encryptedData = info.mp.detail.encryptedData;
            var iv            = info.mp.detail.iv;
            info              = info.mp.detail.userInfo;
            //info
            //userInfo {"nickName":"深海","gender":1,...avatarUrl":"https://7tdPvkPaJlkaLFFbLAffGVApluZdanLkDVplNlAhq1EJA/132"}
            //与服务器交互进行解密
            uni.request({
                url: _self.apiServer+'member&m=wxaes',
                method: 'POST',
                header: {'content-type' : "application/x-www-form-urlencoded"},
                data: {
                    session_key   : session_key,
                    encryptedData : encryptedData,
                    iv            : iv
                },
                success: res => {
                    console.log(res);
                    //此处可以成功获取 unionId 利用 unionId 完成登录即可
                },
                fail: () => {},
                complete: () => {}
            });
        }
    },
    onLoad:function(options){
            _self = this;
            pageOptions = options;
            // #ifdef MP-WEIXIN
            // 调用 微信 login 获取 code
        uni.login({
                    success: (res) => {
                        uni.request({
                            url:_self.apiServer+'member&m=codeToSession&code='+res.code,
                            success: (sessions) => {
                                session_key = sessions.data.session_key;
                            }
                        }
                    }
                });
            }
        });
        // #endif
}

php 后端代码

<?php
namespace hsC;
class member{
        //......
    public function wxaes(){
        if(empty($_POST['session_key']) || empty($_POST['encryptedData']) || empty($_POST['iv'])){exit(jsonCode('error', 'data error'));}
        include HS_TOOLS.'WXBizDataCrypt.php';
        $pc = new \WXBizDataCrypt(HS_APPID, $_POST['session_key']);
        $data = '';
        $errCode = $pc->decryptData($_POST['encryptedData'], $_POST['iv'], $data);
        if ($errCode == 0) {
            exit($data);
        } else {
            exit(jsonCode('error', $errCode));
        }
    }
}

猜你喜欢

转载自blog.csdn.net/Dream_Weave/article/details/87879738