温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

支付宝如何实现第三方授权登录功能

发布时间:2020-11-11 16:31:27 来源:亿速云 阅读:241 作者:Leah 栏目:编程语言

支付宝如何实现第三方授权登录功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

对于第三方登录,我们常见了,很多应用可以进行第三方登录,我常用的有:QQ、微信、新浪、支付宝等等,今天我们就一起来简单学习一下支付宝第三方授权登录。

打开支付宝开发平台,注册成为开发者,点击开发者中心,在我的应用中创建一个应用:

支付宝如何实现第三方授权登录功能

点击功能信息,添加我们需要的功能:

支付宝如何实现第三方授权登录功能

到这我们还不能进行接口调试,因为我们的应用没有上线,APPID是无效的,这里阿里给了我们一个解决方案,就是通过沙箱模式进行接口调试,下面我们来配一下我们的沙箱模式:

支付宝如何实现第三方授权登录功能

配置过RAS2就可以不用配置RAS1了,公钥和私钥的生成规则,查看支付宝文档,我这里是使用支付宝提供的秘钥生成工具生成的,创建完成后,我们下载的文件夹下会生成三个文件:rsa_private_key.pem(秘钥)、rsa_private_key_pkcs8.pem(java专用秘钥)、rsa_public_key.pem(公钥),我们把生成的公钥上传到沙箱环境下RAS2下,点击查看支付宝公钥,将公钥保存,接下来开发使用。应用网关和授权回调地址,这里因为是本地调试,暂时写为图上内容即可。

做好这些准备工作我们就可以开始进行我们的具体功能实现了,首先我打开支付宝开发平台开发文档,点击基础能力->第三方应用授权,阅读一遍内容,我回到文档的第三步:

支付宝如何实现第三方授权登录功能

注意这里的app_id要填写沙箱应用的ID,不然是无法完成调用支付登录页面的。

<a href="https://openauth.alipaydev.com/oauth3/appToAppAuth.htm&#63;app_id=沙箱环境下的应用ID&redirect_uri=http://127.0.0.1:8080/alipayTest/return_url.jsp" >支付宝第三方登录</a><br/>

下面我们看一下我们的return_url.jsp的业务处理:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<%@ page import="java.util.Map"%>
<%@ page import="com.alipay.api.*"%>
<%@ page import="com.alipay.api.request.*"%>
<%@ page import="com.alipay.api.response.*"%>
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>支付宝页面跳转同步通知页面</title>
 </head>
 <body>
<%
 //获取支付宝GET过来反馈信息
 Map<String,String> params = new HashMap<String,String>();
 Map requestParams = request.getParameterMap();
 for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
  String name = (String) iter.next();
  String[] values = (String[]) requestParams.get(name);
  String valueStr = "";
  for (int i = 0; i < values.length; i++) {
   valueStr = (i == values.length - 1) &#63; valueStr + values[i]
     : valueStr + values[i] + ",";
  }
  //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
  valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
  params.put(name, valueStr);
 }
 //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
 //支付宝用户号
 String app_id = new String(request.getParameter("app_id").getBytes("ISO-8859-1"),"UTF-8");
 out.write(app_id + "\n");
 //获取第三方登录授权
 String alipay_app_auth = new String(request.getParameter("source").getBytes("ISO-8859-1"),"UTF-8");
 out.write(alipay_app_auth + "\n");
 //第三方授权code
 String app_auth_code = new String(request.getParameter("app_auth_code").getBytes("ISO-8859-1"),"UTF-8");//获的第三方登录用户授权app_auth_code
 out.write(app_auth_code + "\n");
 String privateKey = "生成的秘钥";
 String publicKey = "支付宝公钥";
 //使用auth_code换取接口access_token及用户userId
  //AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","应用APPID",privateKey,"json","UTF-8",publicKey,"RSA2");//正常环境下的网关
  AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipaydev.com/gateway.do","沙箱环境下的应用APPID",privateKey,"json","UTF-8",publicKey,"RSA2");//沙箱下的网关
 AlipayOpenAuthTokenAppRequest requestLogin1 = new AlipayOpenAuthTokenAppRequest();
 requestLogin1.setBizContent("{" +
  "\"grant_type\":\"authorization_code\"," +
  "\"code\":\""+ app_auth_code +"\"" +
  "}");
 //第三方授权
 AlipayOpenAuthTokenAppResponse responseToken = alipayClient.execute(requestLogin1);
 if(responseToken.isSuccess()){
  out.write("<br/>调用成功" + "\n");
  out.write(responseToken.getAuthAppId() + "\n");
  out.write(responseToken.getAppAuthToken() + "\n");
  out.write(responseToken.getUserId() + "\n");
 } else {
  out.write("调用失败" + "\n");
 }
%>
 </body>
</html>

到这里我们的支付宝第三方登录授权就为大家介绍完毕,不过需要指出的是,支付宝第三方授权登录,要求使用者不能通过该方式进行用户导流,也就是说第三方登录成功后,不能出现引导用户完善基本信息的内容,只能使用支付的用户ID进行用户身份标示。

看完上面的第三授权登录,一定要很多小朋友感觉不过瘾,第三方登录我们只能拿到用的支付宝ID,如果我们需要获取的用户信息包含用户ID、昵称、性别、省份、城市、用户头像、用户类型、用户状态、是否实名认证、是否是学生等信息,这是我们就需要获得一个用户授权,通过用户授权,我们可以获得用户在支付宝上面的信息。下面我们开始具体的功能实现:

首先我们看一下支付宝开发文档,基础功能->获取会员信息->快速接入,我们看第四步下的第一小步,查看沙箱环境下URL拼接:

<a href="https://openauth.alipaydev.com/oauth3/publicAppAuthorize.htm&#63;app_id=沙箱环境下的APPID&scope=auth_user&redirect_uri=http://127.0.0.1:8080/alipayTest/return_url.jsp" >用户授权</a><br/>

这里需要注意的是关于scope的说明:

  • auth_base:以auth_base为scope发起的网页授权,是用来获取进入页面的用户的userId的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(通常是业务页面)。
  • auth_user:以auth_user为scope发起的网页授权,是用来获取用户的基本信息的(比如头像、昵称等)。但这种授权需要用户手动同意,用户同意后,就可在授权后获取到该用户的基本信息。

接下来我们看一下return_url.jsp文件:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<%@ page import="java.util.Map"%>
<%@ page import="com.alipay.api.*"%>
<%@ page import="com.alipay.api.request.*"%>
<%@ page import="com.alipay.api.response.*"%>
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>支付宝页面跳转同步通知页面</title>
 </head>
 <body>
<%
 //获取支付宝GET过来反馈信息
 Map<String,String> params = new HashMap<String,String>();
 Map requestParams = request.getParameterMap();
 for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
  String name = (String) iter.next();
  String[] values = (String[]) requestParams.get(name);
  String valueStr = "";
  for (int i = 0; i < values.length; i++) {
   valueStr = (i == values.length - 1) &#63; valueStr + values[i]
     : valueStr + values[i] + ",";
  }
  //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
  valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
  params.put(name, valueStr);
 }
 //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
 //支付宝用户号
 String app_id = new String(request.getParameter("app_id").getBytes("ISO-8859-1"),"UTF-8");
 out.write(app_id + "\n");
 //获取用户信息授权
 String auth_user = new String(request.getParameter("scope").getBytes("ISO-8859-1"),"UTF-8");
 out.write(auth_user + "\n");
 //获的第三方登录用户授权auth_code
 String auth_code = new String(request.getParameter("auth_code").getBytes("ISO-8859-1"),"UTF-8");
 out.write(auth_code + "\n");
 String privateKey = "私钥";
 String publicKey = "支付宝公钥";
 //使用auth_code换取接口access_token及用户userId
  //AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","应用APPID",privateKey,"json","UTF-8",publicKey,"RSA2");//正常环境下的网关
  AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipaydev.com/gateway.do","沙箱环境先的应用APPID",privateKey,"json","UTF-8",publicKey,"RSA2");//沙箱下的网关
 //获取用户信息授权
  AlipaySystemOauthTokenRequest requestLogin2 = new AlipaySystemOauthTokenRequest();
  requestLogin2.setCode(auth_code);
  requestLogin2.setGrantType("authorization_code");
  try {
 AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(requestLogin2);
 out.write("<br/>AccessToken:"+oauthTokenResponse.getAccessToken() + "\n");
  //调用接口获取用户信息
 AlipayClient alipayClientUser = new DefaultAlipayClient("https://openapi.alipaydev.com/gateway.do", "2016073100131450", privateKey, "json", "UTF-8", publicKey, "RSA2"); 
 AlipayUserInfoShareRequest requestUser = new AlipayUserInfoShareRequest();
 try {
  AlipayUserInfoShareResponse userinfoShareResponse = alipayClient.execute(requestUser, oauthTokenResponse.getAccessToken());
  out.write("<br/>UserId:" + userinfoShareResponse.getUserId() + "\n");//用户支付宝ID
  out.write("UserType:" + userinfoShareResponse.getUserType() + "\n");//用户类型
  out.write("UserStatus:" + userinfoShareResponse.getUserStatus() + "\n");//用户账户动态
  out.write("Email:" + userinfoShareResponse.getEmail() + "\n");//用户Email地址
  out.write("IsCertified:" + userinfoShareResponse.getIsCertified() + "\n");//用户是否进行身份认证
  out.write("IsStudentCertified:" + userinfoShareResponse.getIsStudentCertified() + "\n");//用户是否进行学生认证
 } catch (AlipayApiException e) {
  //处理异常
  e.printStackTrace();
 }
 } catch (AlipayApiException e) {
  //处理异常
  e.printStackTrace();
 }
%>
 </body>
</html>

到这里我们通过沙箱模式进行支付宝第三方登录与获取用户授权的内容就和大家分享完毕,小伙伴快去试一试吧。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI