实现支付宝网站登录

news2024/9/22 9:48:09

不推荐使用沙箱环境,因为问题太多,如果使用沙箱环境请注意一下几点

  1. alipay.user.info.auth(用户登录授权接口)的 return_url 必传,建议检查是否设置 return_url。return_url 与应用中的授权回调地址一致。
  2. 再换沙箱环境时,除了支付宝网关 https://openapi.alipay.com/gateway.do 需要切换成 https://openapi.alipaydev.com/gateway.do 之外,还需要将 https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=商户的APPID&scope=auth_user&redirect_uri=ENCODED_URL&state=init 切换成 https://openauth.alipaydev.com/oauth2/publicAppAuthorize.htm?app_id=商户的APPID&scope=auth_user&redirect_uri=ENCODED_URL&state=init。

实现效果

在这里插入图片描述

支付宝接入准备

申请正式的支付宝网页应用:详情参考支付宝官方文档

  1. 登录支付宝开放平台

  2. 创建网页移动应用,选择网页应用
    在这里插入图片描述

  3. 完善开发设置,这里获取公钥私钥信息,详情参考支付宝官方文档
    在这里插入图片描述

  4. appId获取如图值
    在这里插入图片描述

  5. 其他详情参考支付宝官方文档

导入依赖

<!-- alipay -->
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>3.1.0</version>
</dependency>
<!-- fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.48</version>
</dependency>

主要代码

登录逻辑

  1. 前台页面根据app_id(应用id),scope(接口权限值),redirect_uri(授权回调地址,后台的登录接口),state(商户自定义参数,只允许base64字符(长度小于等于100)拼接支付宝登录页面
  2. 然后用户授权登录,支付宝会回调redirect_uri地址
  3. 后台服务接受参数:auth_code,app_id,state,然后使用auth_code在AlipaySystemOauthTokenRequest()换取access_token及用户userId
  4. 在根据access_token去AlipayUserInfoShareRequest()获取用户个人信息
  5. 登录结束

注意事项

以下xxx,aaa,bbb,ccc,ddd皆为变量**
前端拼接参数格式:https://xxxapp_id=aaa&scope=bbb&redirect_uri=ccc&state=ddd

  1. xxx:https://openauth.alipaydev.com/oauth2/publicAppAuthorize.htm时沙箱环境
    xxx:https://openauth.alipay.com/oauth2/publicAppAuthorize.htm是正式环境
  2. aaa:正常获取值即可
  3. bbb: auth_base(以auth_base为scope发起的网页授权,用于获取进入页面的用户的 userId,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(通常是业务页面))
    auth_user(以auth_user为scope发起的网页授权,是用来获取用户的基本信息的(比如头像、昵称等)。但这种授权需要用户手动同意,用户同意后,就可在授权后获取到该用户的基本信息)
  4. ccc:回调页面,这里回调地址需要在支付宝开发平台中找到开发设置目录下授权回调地址,并保持一致。
  5. ddd:自定义参数
在这里插入代码片/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author 
 * @since 2021-05-18
 */
@RestController
@CrossOrigin
@RequestMapping("/userInfo")
public class UserInfoController {

    //支付宝网关  dev是测试支付宝网关
    public static String URL = "https://openapi.alipay.com/gateway.do";
    public static String URLDEV = "https://openapi.alipaydev.com/gateway.do";

    //私钥  dev是测试私钥
    private String privateKey="自备参数";
    private String privateKeyDev="自备参数";

    //公钥  dev是测试公钥
    private String publicKey="自备参数";
    private String publicKeyDev="自备参数";
     /**
     * 支付宝登录
     * 主要流程:
     * 1.前台页面根据app_id(应用id),scope(接口权限值),redirect_uri(授权回调地址,后台的登录接口),state(商户自定义参数,只允许base64字符(长度小于等于100)拼接支付宝登录页面
     * 2.然后用户授权登录,支付宝会回调redirect_uri地址
     * 3.后台服务接受参数:auth_code,app_id,state,然后使用auth_code在AlipaySystemOauthTokenRequest()换取access_token及用户userId
     * 4.在根据access_token去AlipayUserInfoShareRequest()获取用户个人信息
     * 5.登录结束
     * 注意事项:
     * 一下xxx,aaa,bbb,ccc,ddd皆为变量
     * 1.前端拼接参数格式:https://xxx?app_id=aaa&scope=bbb&redirect_uri=ccc&state=ddd
     * xxx:https://openauth.alipaydev.com/oauth2/publicAppAuthorize.htm时沙箱环境
     * xxx:https://openauth.alipay.com/oauth2/publicAppAuthorize.htm是正式环境
     * aaa:正常获取值即可
     * bbb:
     * auth_base(以auth_base为scope发起的网页授权,用于获取进入页面的用户的 userId,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(通常是业务页面))
     * auth_user(以auth_user为scope发起的网页授权,是用来获取用户的基本信息的(比如头像、昵称等)。但这种授权需要用户手动同意,用户同意后,就可在授权后获取到该用户的基本信息)
     * ccc:回调页面,这里回调地址需要在支付宝开发平台中找到开发设置目录下授权回调地址,并保持一致。
     * ddd:自定义参数
     *
     * @return
     * @Param: [appAuthCode 支付宝权限code]
     * https://openauth.alipaydev.com/oauth2/publicAppAuthorize.htm?app_id=aaa&scope=auth_user&redirect_uri=http://azhwbz.natappfree.cc/userInfo/alilogin&state=123
     * https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=aaa&scope=auth_user&redirect_uri=http://azhwbz.natappfree.cc/userInfo/alilogin&state=456
     */
    @GetMapping("/alilogin")
    public String alilogin(@RequestParam("auth_code") String appAuthCode, @RequestParam("app_id") String appId,
            @RequestParam("state") String state, HttpServletResponse httpServletResponse) throws AlipayApiException {
        System.out.println("登录app_id----------------------------->" + appId);
        System.out.println("登录auth_code----------------------------->" + appAuthCode);
        System.out.println("登录state----------------------------->" + state);
        //STEP 使用 auth_code 换取 access_token 及用户 userId
        System.out.println("使用 auth_code 换取 access_token 及用户 userId");
        AlipayClient alipayClient = new DefaultAlipayClient(URL, appId, privateKey, "json", "utf-8", publicKey, "RSA2");
        AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
        request.setCode(appAuthCode);
        request.setGrantType("authorization_code");
        request.setRefreshToken("201208134b203fe6c11548bcabd8da5bb087a83b");
        AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
        System.out.println(response.getBody());
        if (response.isSuccess()) {
            System.out.println("调用成功");
        } else {
            System.out.println("调用失败");
        }
        String accessToken = response.getAccessToken();
        System.out.println("accessToken="+response.getAccessToken());
        System.out.println("accessToken="+response.getUserId());
        AlipayClient alipayClient1 = new DefaultAlipayClient(URL, appId, privateKey, "json", "utf-8", publicKey, "RSA2");
        AlipayUserInfoShareRequest request1 = new AlipayUserInfoShareRequest();
        AlipayUserUserinfoShareRequest request2=new AlipayUserUserinfoShareRequest();

        AlipayUserInfoShareResponse response1 = alipayClient1.execute(request1,accessToken);
        System.out.println(response1.getBody());
        if(response1.isSuccess()){
            System.out.println("调用成功");
        } else {
            System.out.println("调用失败");
        }
        String email = response1.getEmail();
        String gender = response1.getGender();
        String userId = response1.getUserId();
        String userName = response1.getUserName();
        String avatar = response1.getAvatar();
        String nickName = response1.getNickName();
        String mobile= response1.getMobile();
        String phone = response1.getPhone();
        String taobaoId = response1.getTaobaoId();
        String countryCode = response1.getCountryCode();
        String province = response1.getProvince();
        String city = response1.getCity();
        String area = response1.getArea();
        String address = response1.getAddress();
        String info="用户名:"+nickName+",性别:"+gender+",手机号:"+mobile+",电话号:"+phone+
                ",真实姓名:"+userName+",支付宝id:"+userId+",邮件:"+email+",头像:"+avatar+",淘宝号:"+taobaoId
                +",国家:"+countryCode+",省:"+province+",市:"+city+",县:"+area+",地址:"+address;
        System.out.println(info);
        //此处写登录的实际业务逻辑,如新增/更新用户信息,返回自定义token值
        return info;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/196407.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图解最常用的 10 个机器学习算法

在机器学习领域&#xff0c;有种说法叫做“世上没有免费的午餐”&#xff0c;简而言之&#xff0c;它是指没有任何一种算法能在每个问题上都能有最好的效果&#xff0c;这个理论在监督学习方面体现得尤为重要。 举个例子来说&#xff0c;你不能说神经网络永远比决策树好&#…

5.4 单管放大电路的频率响应

一、单管共射放大电路的频率响应 考虑到耦合电容和结电容的影响&#xff0c;图5.4.1(a)所示电路的等效电路如图(b)所示。在分析放大电路的频率响应时&#xff0c;为了方便起见&#xff0c;一般将输入信号的频率范围分为中频、低频和高频三个频段。在中频段&#xff0c;极间电容…

Win10系统打开控制面板出现闪退怎么回事?

Win10系统打开控制面板出现闪退怎么回事&#xff1f;有用户开启自己电脑的控制面板时&#xff0c;突然间页面初选了闪退的情况&#xff0c;导致无法进行相关设置的操作。那么我们怎么去进行控制面板闪退问题的解决呢&#xff1f;一起来看看以下的解决方法吧。 解决方法 1、更换…

Python | 文件操作和异常处理

博主简介&#x1f647;&#xff1a;&#x1f393;本科大二学生&#x1f393;&#xff0c;立志成为一名全栈开发工程师&#x1f38f;&#x1f38f;分类专栏&#x1f4d8;&#xff1a;Python从入门到精通&#x1f33b;&#x1f33b; 知识目录一、文件操作1.1 打开和关闭文件1.2 读…

如何使用TCPA300电流放大器和电流探头进行电流测试

为了进行正确电流测试&#xff0c;工程师需要在使用前对电流探头进行消磁和校零调节&#xff0c;消磁可以消除电流探头的寄生磁场&#xff0c;否则会产生零点的漂移和测量误差&#xff0c;每次进行消磁后&#xff0c;都需要调节探头的零点&#xff0c;消除存在的偏移。电流探头…

垃圾桶溢出识别系统 opencv

垃圾桶溢出识别系统通过Opencvyolo网络模型深度学习技术&#xff0c;对垃圾桶垃圾溢出行为现象进行识别&#xff0c;监测到垃圾桶存在垃圾溢出时&#xff0c;立即抓拍存档 告警及时清理。OpenCV基于C实现&#xff0c;同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是…

JGroups介绍及入门实战

我们在开发集群系统的过程中&#xff0c;往往需要在多个进程间同步很多状态&#xff0c;比如每个服务器进程的负载状况、数据队列长度等等……。还有一些情况&#xff0c;我们需要把不同的进程分类&#xff0c;然后分发不同的通知消息&#xff0c;最常见的是发出一些运维命令&a…

「YGG Japan」宣布已完成约 295 万美元的新股权私募

ForN&#xff08;总部位于东京都港区&#xff1b;CEO 藤原哲哉&#xff1b;以下简称 “ForN” &#xff09;今天宣布&#xff0c;与 ForN 合作的区块链游戏平台 YGG Japan 已完成价值约 295 万美元的私募轮融资&#xff0c;投资方共有 18 家公司。加上本轮融资&#xff0c;YGG …

多种汉语方言语音落地应用,微软智能语音解锁更多交互场景

多年来&#xff0c;微软持续探索 AI 语音合成与识别技术&#xff0c;获得了大量成果&#xff1a;Azure Neural TTS&#xff08;text-to-speech&#xff0c;语音合成&#xff09;与 STT&#xff08;speech-to-text&#xff0c;语音识别&#xff09;支持的语言区域达到 140 余个&…

GItOps - k8s的微服务实战1 - 构建业务镜像

概述 在学习了容器化、docker和k8s的 Ingress-Nginx 、server 和pod 知识后&#xff0c;开启了 k8s的微服务实战第三篇&#xff0c;在搭建环境废了一点周折&#xff0c;这次实战的目的是集成在gitlab里&#xff0c;实现自动打包、发布的功能。 Mac M2芯 搭建k8s(minikube)超详…

puzzle(0332)色块拼图、物换星移、移星掠形

目录 一&#xff0c;纯色块拼图——旋转 二&#xff0c;物换星移 三&#xff0c;六边形纯色块拼图——旋转 四&#xff0c;纯色块拼图——轮换 五&#xff0c;移星掠形 练习模式 策略 比赛模式 一&#xff0c;纯色块拼图——旋转 这种纯粹就是数字拼图——旋转的简化版…

Web3中文|逆流前行:日本开始拥抱Web3

在最近的一次东京之行中&#xff0c;我发现交谈过的人似乎都没有因FTX崩溃&#xff08;或之前加密领域的一系列负面事件&#xff09;感到特别担忧。 众议院议员、日本现今执政党自民党的Web3项目团队成员Masaaki Taira表示&#xff0c;FTX的垮台“对政策制定没有影响”。 尽管…

DC/DC电源模块直流升压线性可调正负输出5v12v24v转0-±50v/±110v/±200v/±250v/±360v/±500v

特点● 效率高达70%以上● 1*2英寸标准封装● 正负电压输出● 价格低● 电压控制,输出电压随控制电压线性变化● 工作温度: -40℃~85℃● 阻燃封装&#xff0c;满足UL94-V0 要求● 温度特性好● 可直接焊在PCB 上应用GRA 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电…

CentOS 7 部署Nginx和前端框架

参考&#xff1a; Centos 7下安装配置Nginx-阿里云开发者社区 (aliyun.com) 阿里P8架构大牛整理的Nginx 从入门到实践&#xff0c;万字详解 安装nginx之后&#xff0c;处理 conf.d下无default.conf文件 1. CentOS 7 下安装配置 Nginx 一、配置 EPEL 源 sudo yum install -y e…

jquery方法学习及案例

JQ框架入手须知封装方法学习及应用插件&#xff08;白嫖超好用&#xff09;总结案例推荐网课链接入手须知 1.进官网点3.6版本 2.复制全部代码 3.建立文档名为jquery.min.js&#xff0c;粘贴代码 &#xff08;用的时候同cssjs引入&#xff09; 封装方法学习及应用 介绍联系…

Authing,助力先进制造 10 万亿产值之路

工信部表示&#xff0c;截止今年 9 月&#xff0c;一批有竞争力的先进制造业集群正在形成。重点培育的 25 个先进制造业集群&#xff0c;其主导产业产值近 10 万亿元&#xff0c;其中的 17 个集群产值同比增速超过两位数。 Authing 深耕芯片、机器人、航空航天、医药医械等先进…

多品类多SKU存储的四向穿梭车|海格里斯HEGERLS超高RGV四向穿梭车供应

近年来&#xff0c;随着电商、快递的快速发展&#xff0c;物流行业也迎来了智能化、数字化转型。伴随上下游产业链条的智能化升级&#xff0c;物流机器人产品开始被普及、应用。在仓储物流领域&#xff0c;AGV&#xff08;自动引导车&#xff09;、AMR&#xff08;自主移动机器…

2.编写第一个网页

第一个网页 ● 首先建立一个文件夹 ● 之后建立一个文件 ● 文件名称以.html结尾 ● 输入一个&#xff01;&#xff0c;回车&#xff0c;就会生成一个html框架 ● 其他的部分不用看&#xff0c;稍后会介绍&#xff0c;看这个标签&#xff0c;英文的意思就是标题&#xff…

编写一个简版的数据库维护框架03-父窗口界面

框架的主要内容就是创建一个父类Form&#xff0c;实现基本逻辑。使用时&#xff0c;这些逻辑就无需用户实现。用户只需按照规则&#xff0c;设计好界面即可。 一、简版界面 界面如下&#xff1a; 界面分为两大部分&#xff0c;查询定位和数据维护 查询定位 查询定位将根据…

非极大值抑制NMS与柔性非极大抑制Soft-NMS的python实现

非极大值抑制NMS的python实现 什么是非极大值抑制 非极大值抑制的主要目的是为了消除多余的框&#xff0c;找到最佳的物体检测的位置。 比如我们想要检测手的时候, RCNN网络在训练之后会给出许多个预测框(比图上的更多), 我们先通过他们的置信度筛选出一批不符合的框, 剩下如图…