热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

小程序登录之支付宝授权

众所周知,微信小程序是可以通过微信本身授权后再登录,平台可以拿到微信用的的账号相关信息,然后保存到数据库中,那么同理在支付宝小程序开发过程中,登录功能的设计也可以如此

小程序登录 之 支付宝授权

上图是官方提供的时序图,具体看一下流程:

  1. 在小程序端获取 auth_code,目的是获取用户授权码

  2. 把第一步获取的授权码 auth_code 传到咱们自己的后台,也就是说后台需要编写一个接口,方便小程序端的传入

    小程序登录 之 支付宝授权
        var me = this;
        my.getAuthCode({
          scopes: 'auth_user', // 主动授权(弹框):auth_user,静默授权(不弹框):auth_base
          success: (res) => {
            if (res.authCode) {
              // console.log(app.serverUrl + '/login/' + res.authCode);
              // 调用自己的服务端接口,让服务端进行后端的授权认证
              my.httpRequest({
                url: app.serverUrl + '/login/' + res.authCode,
                method: 'POST',
                header:{
                  'content-type': 'application/json'
                },
                dataType: 'json',
                success: (res) => {
                  // 授权成功并且服务器端登录成功
                  console.log(res);
                  me.setData({
                    userInfo: res.data.data
                  });
                }
              });
            }
          },
        });
    小程序登录 之 支付宝授权

     

  3. 后台拿到这个 auth_code 之后,需要调用支付宝的授权平台,从而获取用户的唯一 token 以及 支付宝的userid,都是唯一的,调用的接口为 [alipay.system.oauth.token]

  4. 获取到userid后,判断一下这个userid是否在我们自己的数据库中存在,如果存在,直接获取信息,并且直接返回用户对象到前台;如果不存在,则需要从支付宝授权平台再一次去获取支付宝用户的信息。

  5. ​调用 [alipay.user.info.share],获取用户信息,这个用户对象里包含了大量的用户真实信息,具体参考如下

小程序登录 之 支付宝授权
@Autowired
    private UserService userService;

    @ApiOperation(value = "统一登录接口", notes = "支付宝小程序唤起登录后调用", httpMethod = "POST")
    @PostMapping("/login/{authCode}")
    public IMoocJSONResult items(
            @ApiParam(name = "authCode", 
            value = "授权码", 
            required = true, 
            example = "授权码") @PathVariable String authCode) throws Exception {

        // 1. 服务端获取access_token、user_id
        AlipaySystemOauthTokenResponse respOnse= getAccessToken(authCode);
        if (response.isSuccess()) {
            System.out.println("获取access_token - 调用成功");
            /**
             *  获取到用户信息后保存到数据
             *  1. 如果数据库不存在对用的 alipayUserId, 则注册
             *  2. 如果存在,则获取数据库中的信息再返回
             */
            String accessToken = response.getAccessToken();
            String alipayUserId = response.getUserId();
            System.out.println("accessToken:" + accessToken);
            System.out.println("alipayUserId:" + alipayUserId);
            
            // 2. 查询该用户是否存在
            Users userInfo = userService.queryUserIsExist(alipayUserId);
            if (userInfo != null) {
                // 如果用户存在,直接返回给前端,表示登录成功
                return IMoocJSONResult.ok(userInfo);
            } else {
                // 如果用户不存在,则通过支付宝api获取用户的信息后,再注册用户到自己平台数据库
                // 获取会员信息
                AlipayUserInfoShareResponse aliUserInfo = getAliUserInfo(accessToken);
                if (aliUserInfo != null) {
                     Users newUser = new Users();
                     newUser.setAlipayUserId(alipayUserId);
                     newUser.setNickname(aliUserInfo.getNickName());
                     newUser.setRegistTime(new Date());
                     newUser.setIsCertified(aliUserInfo.getIsCertified().equals("T") ? 1 : 0);
                     newUser.setFaceImage(aliUserInfo.getAvatar());
                     userService.createUser(newUser);
                     return IMoocJSONResult.ok(newUser);
                }
            }
        } else {
            System.out.println("获取access_token - 调用失败");
        }
        return IMoocJSONResult.ok();
    }
    
    // 服务端获取access_token、user_id
    private AlipaySystemOauthTokenResponse getAccessToken(String authCode) throws Exception {
        AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", 
                APPID,                    // 1. 填入appid
                PRIVATE_KEY,            // 2. 填入私钥 
                "json", 
                "GBK", 
                ALIPAY_PUBLIC_KEY,         // 3. 填入公钥
                "RSA2");
        AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
        request.setGrantType("authorization_code");
        request.setCode(authCode);        // 4. 填入前端传入的授权码authCode
        request.setRefreshToken("201208134b203fe6c11548bcabd8da5bb087a83b");    // 0. 不用管
        AlipaySystemOauthTokenResponse respOnse= alipayClient.execute(request);

        return response;
    }
        
    // 获取支付宝用户信息
    private AlipayUserInfoShareResponse getAliUserInfo (String accessToken) throws Exception {
        AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",
                APPID,                    // 1. 填入appid
                PRIVATE_KEY,            // 2. 填入私钥 
                "json", 
                "GBK", 
                ALIPAY_PUBLIC_KEY,         // 3. 填入公钥
                "RSA2");
        AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest();
        AlipayUserInfoShareResponse respOnse= alipayClient.execute(request, accessToken);
        if(response.isSuccess()){
            System.out.println("获取会员信息 - 调用成功");
            return response;
        }

        return null;
    }
小程序登录 之 支付宝授权

拿到的支付宝用户信息如图:

小程序登录 之 支付宝授权

最终页面的展示效果为:

小程序登录 之 支付宝授权

 


推荐阅读
  • 图像因存在错误而无法显示 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 本文探讨了在设置了HTTP客户端超时时间后,向HTTP服务器发送请求时出现两个请求的情况。其中一个请求正常,另一个请求无法获取请求参数。文章分析了可能导致此问题的原因,并提供了解决方案。 ... [详细]
author-avatar
开开2502936987
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有