• 支付宝小程序授权/获取用户信息


    支付宝小程序授权/获取用户信息

    目录:

    获取支付宝小程序授权token

    前提准备工作:

    • 支付宝小程序sdk等相关依赖。
    • 创建支付宝小程序,并按照相关流程配置好。注意:必须是企业支付宝账号才可以获取用户信息权限

    1、依赖

    
            <dependency>
                <groupId>com.alipay.sdkgroupId>
                <artifactId>alipay-sdk-javaartifactId>
                <version>4.22.113.ALLversion>
            dependency>
    
            
            <dependency>
                <groupId>org.bouncycastlegroupId>
                <artifactId>bcprov-jdk15onartifactId>
                <version>1.62version>
            dependency>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2、相关流程配置

    https://open.alipay.com/develop/manage

    微信小程序可以通过微信授权之后再登录,平台可以拿到微信用户的相关信息。同理支付宝小程序也可以。

    流程:

    • 先调用接口/方法 获取授权token
    • 再通过 接口/方法 获取用户信息

    在这里插入图片描述

    1、获取支付宝小程序授权token

    这里相当于调用 alipay.system.oauth.token接口

    	// 服务端获取access_token、user_id
        private AlipaySystemOauthTokenResponse getAccessToken(String authCode) throws Exception {
    
            String code = JSON.parseObject(authCode).getString("authCode");
    
            // 1. 填入appid
            String APPID = "2021002147669716";
            // 2. 填入应用私钥
            String PRIVATE_KEY = "应用私钥";
            // 3. 填入支付宝公钥
            String ALIPAY_PUBLIC_KEY = "支付宝公钥";
            
            AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",
                    APPID,
                    PRIVATE_KEY,
                    "json",
                    "GBK",
                    ALIPAY_PUBLIC_KEY,
                    "RSA2");
            AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
            
            //授权方式:authorization_code,表示换取使用用户授权码code换取授权令牌access_token。
            request.setGrantType("authorization_code");
            // 4. 填入前端传入的授权码authCode
            //授权码,用户对应用授权后得到。本参数在 grant_type 为 authorization_code 时必填
            request.setCode(code);
            AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
    
            if(response.isSuccess()){
                System.out.println("调用成功");
            } else {
                System.out.println("调用失败");
            }
            return response;
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    在这里插入图片描述

    2、获得授权用户的基本信息

    我们再调用接口 alipay.user.info.auth

    	// 获取支付宝用户信息
        private AlipayUserInfoShareResponse getAliUserInfo (String accessToken) throws Exception {
    
    		// 1. 填入appid
            String APPID = "2021002147669716";
            // 2. 填入应用私钥
            String PRIVATE_KEY = "应用私钥";
            // 3. 填入支付宝公钥
            String ALIPAY_PUBLIC_KEY = "支付宝公钥";
    
            AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",
                    APPID ,
                    PRIVATE_KEY,
                    "json",
                    "GBK",
                    ALIPAY_PUBLIC_KEY,
                    "RSA2");
            AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest();
    
            AlipayUserInfoShareResponse response = alipayClient.execute(request, accessToken);
            if(response.isSuccess()){
                System.out.println("获取会员信息 - 调用成功");
                return response;
            }
            return null;
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    遇到的问题:

    【支付宝小程序】-【获得支付宝用户详情】-【响应code:20001】-【错误信息:无效的访问令牌】

    解决:

    在这里插入图片描述

    在这里插入图片描述

    解析支付宝小程序接口响应加密数据

    解析接口响应加密数据流程:

    1. 获取验签和解密所需要的参数
    2. 验签
    3. 解密

    在这里插入图片描述

    1、解析接口响应加密数据

    	/**
         * 解密数据
         * @return
         */
        @ApiOperation(value = "解密数据")
        @PostMapping("/findPhone")
        public String findPhone(@RequestBody String jsonStr) throws Exception {
    
            //小程序前端提交的加密数据
            String response = JSON.parseObject(jsonStr).getString("response");
    
            //1. 获取验签和解密所需要的参数
            Map<String, String> openapiResult = JSON.parseObject(response,
                    new TypeReference<Map<String, String>>() {
                    }, Feature.OrderedField);
            String signType = "RSA2";
            String charset = "UTF-8";
            String encryptType = "AES";
            String sign = openapiResult.get("sign");
            String content = openapiResult.get("response");
    
            //如果密文的
            boolean isDataEncrypted = !content.startsWith("{");
            boolean signCheckPass = false;
    
            //2. 验签
            String signContent = content;
            //你的小程序对应的支付宝公钥(为扩展考虑建议用appId+signType做密钥存储隔离)
            String signVeriKey = "";
            //你的小程序对应的加解密密钥(为扩展考虑建议用appId+encryptType做密钥存储隔离)
            String decryptKey = "";
    
            //如果是加密的报文则需要在密文的前后添加双引号
            if (isDataEncrypted) {
                signContent = "\"" + signContent + "\"";
            }
            try {
                signCheckPass = AlipaySignature.rsaCheck(signContent, sign, signVeriKey, charset, signType);
            } catch (AlipayApiException e) {
                //验签异常, 日志
            }
            if(!signCheckPass) {
                //验签不通过(异常或者报文被篡改),终止流程(不需要做解密)
                throw new Exception("验签失败");
            }
    
            //3. 解密
            String plainData = null;
            if (isDataEncrypted) {
                try {
                    plainData = AlipayEncrypt.decryptContent(content, encryptType, decryptKey, charset);
                } catch (AlipayApiException e) {
                    //解密异常, 记录日志
                    throw new Exception("解密异常");
                }
            } else {
                plainData = content;
            }
            return plainData;
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    在这里插入图片描述

  • 相关阅读:
    scss 使用变量名注意事项
    光波导k域布局可视化(“神奇的圆环”)
    服务链路追踪 —— SpringCloud Sleuth
    体系结构26_输入输出系统(3)
    【云原生】设备入云之FlexManager数据通道的具体部署
    GO语言里的Log4j
    力扣174. 寻找二叉搜索树中的目标节点(java,二叉搜索树的性质的运用)
    Redis 群集模式
    为什么数组它的顺序读写会比较方便?
    【SQL性能优化】索引的原理:我们为什么用B+树来做索引?
  • 原文地址:https://blog.csdn.net/dearand/article/details/126016564