支付宝小程序---Java后台自动登陆功能业务逻辑实现

时间:2024-04-12 09:30:49

前提需要去支付宝开发者平台申请私钥 公钥,APPID等,这些就不一一细说了。

 

1 . 集成支付宝开发所需的SDK  maven地址  

https://search.maven.org/search?q=g:com.alipay.sdk%20AND%20a:alipay-sdk-java&core=gav 

2. 登陆需要接收一个autoCode ,即授权码,这个授权码是客户端用户请求来的,然后我们只需要向前端人员获取即可。

3.获取到授权码之后,我们就需要调用Alipay支付接口

服务端接口文档URL

https://docs.open.alipay.com/api_1

示例代码

  AlipayClient alipayClient = new DefaultAlipayClient(LoginUrl, appId, privateKey, "json", "GBK", alipayPublicKey, "RSA2");
        AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
        request.setGrantType("authorization_code");
        request.setCode(authCode);
        // request.setRefreshToken("201208134b203fe6c11548bcabd8da5bb087a83b");

        AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
        String accessToken  = response.getAccessToken();
        if (response.isSuccess()) {
            System.out.println("调用成功");
            System.out.println("支付宝用户唯一id:" + response.getUserId());
            System.out.println("token令牌:" + response.getAccessToken());   //访问令牌。通过该令牌调用需要授权类接口

这里我只设置了

grant_type 和 code 可根据自己需求来

这是官方文档,说的很详细

支付宝小程序---Java后台自动登陆功能业务逻辑实现

当请求成功之后,我们就可以获取token,和用户的ID了。我们拿着token可以请求另外一个接口,然后获取到用户信息。

支付宝小程序---Java后台自动登陆功能业务逻辑实现

获取用户信息API文档

支付宝小程序---Java后台自动登陆功能业务逻辑实现

当请求成功之后我们可以获取到用户的头像,用户的昵称,和用户ID。这个用户ID也就是我们的支付宝账号在阿里巴巴那边存储的一个唯一标识。

4 .当我们取到这些用户信息后,还需要进一步操作,因为第一次登陆的时候,数据库中肯定是没有信息的,所以当用户登录成功之后,如果数据库中有用户的信息,那么我们需要将用户的信息做一次更新,因为我们取的信息都是从支付宝中取到的,并不是用户和我们直接交互。

打个比方:比如说用户更改了他的支付宝用户名或者头像,那我们如果不做更新的话,可想而知,根本没有同步信息。

所以数据库中有用户信息就更新一下 ,若没有用户信息,我们就把取到的用户信息插入到数据库中。用户第一次登陆的时候我们需要先根据用户ID到数据库中查询一遍。

5. 最后给前端返回  用户昵称,用会ID,和头像。这个也根据自己的业务需求。

具体逻辑如下

 AlipayClient alipayClient = new DefaultAlipayClient(LoginUrl, appId, privateKey, "json", "GBK", alipayPublicKey, "RSA2");
        AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
        request.setGrantType("authorization_code");
        request.setCode(authCode);
        // request.setRefreshToken("201208134b203fe6c11548bcabd8da5bb087a83b");

        AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
        String accessToken  = response.getAccessToken();
        if (response.isSuccess()) {
            System.out.println("调用成功");
            System.out.println("支付宝用户唯一id:" + response.getUserId());
            System.out.println("token令牌:" + response.getAccessToken());   //访问令牌。通过该令牌调用需要授权类接口


            //根据token调用支付宝API取出用户列表信息
            AlipayClient alipayClient2 = new DefaultAlipayClient(getUserMesUrl,appId,privateKey,"json","GBK",alipayPublicKey,"RSA2");
            AlipayUserInfoShareRequest request2 = new AlipayUserInfoShareRequest();
            AlipayUserInfoShareResponse response2 = alipayClient2.execute(request2,accessToken);
            if(response.isSuccess()){
                System.out.println("调用成功");
                System.out.println("头像地址:"+response2.getAvatar());
                System.out.println("用户昵称:"+response2.getNickName());
                System.out.println("用户ID:"+response2.getUserId());

                //支付宝唯一用户ID
                String userId = response2.getUserId();
                UserExample example = new UserExample();
                example.createCriteria().andAlipayUserIdEqualTo(userId);
                List<User> userList = userMapper.selectByExample(example);

                SimpleDateFormat format =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

                if (userList.size()>0 && userList != null){
                    //如果存在用户信息,则更新用户信息,如果用户在支付宝中更改了信息,可以达到同步。
                    User user = userList.get(0);
                    user.setImgUrl(response2.getAvatar());
                    user.setUname(response2.getNickName());
                    user.setLastLoginTime(format.format(new Date()));
                    userMapper.updateByPrimaryKey(user);
                }else{
                    //如果没有用户信息,则新插入
                    User user = new User();
                    user.setUname(response2.getNickName());
                    user.setImgUrl(response2.getAvatar());
                    user.setAlipayUserId(response2.getUserId());
                    user.setLastLoginTime(format.format(new Date()));
//                    user.setPhone(response2.getPhone());
                    user.setToken(accessToken);
                    userMapper.insert(user);
                }

                //返回信息
                UserVo userVo = new UserVo();
                userVo.setImgUrl(response2.getAvatar());
                userVo.setUname(response2.getNickName());
                userVo.setAlipayUserId(response2.getUserId());
                return ReturnResult.build(200,"success",userVo);

            } else {
                System.out.println("调用失败,没有用户信息");
            }
            return ReturnResult.build(200, "success", ParamEnum.lOGIN_SUCCES.getMsg());
        } else {
            System.out.println("调用失败");
            return ReturnResult.build(200, "fail", ParamEnum.lOGIN_FAIL.getMsg());
        }

看完的话,帮忙点个赞呗