支付寶開發(fā)平臺之第三方授權(quán)登錄與獲取用戶信息
對于第三方登錄,我們常見了,很多應(yīng)用可以進行第三方登錄,我常用的有:QQ、微信、新浪、支付寶等等,今天我們就一起來簡單學(xué)習(xí)一下支付寶第三方授權(quán)登錄。
打開支付寶開發(fā)平臺,注冊成為開發(fā)者,點擊開發(fā)者中心,在我的應(yīng)用中創(chuàng)建一個應(yīng)用:

點擊功能信息,添加我們需要的功能:

到這我們還不能進行接口調(diào)試,因為我們的應(yīng)用沒有上線,APPID是無效的,這里阿里給了我們一個解決方案,就是通過沙箱模式進行接口調(diào)試,下面我們來配一下我們的沙箱模式:

配置過RAS2就可以不用配置RAS1了,公鑰和私鑰的生成規(guī)則,查看支付寶文檔,我這里是使用支付寶提供的秘鑰生成工具生成的,創(chuàng)建完成后,我們下載的文件夾下會生成三個文件:rsa_private_key.pem(秘鑰)、rsa_private_key_pkcs8.pem(java專用秘鑰)、rsa_public_key.pem(公鑰),我們把生成的公鑰上傳到沙箱環(huán)境下RAS2下,點擊查看支付寶公鑰,將公鑰保存,接下來開發(fā)使用。應(yīng)用網(wǎng)關(guān)和授權(quán)回調(diào)地址,這里因為是本地調(diào)試,暫時寫為圖上內(nèi)容即可。
做好這些準備工作我們就可以開始進行我們的具體功能實現(xiàn)了,首先我打開支付寶開發(fā)平臺開發(fā)文檔,點擊基礎(chǔ)能力->第三方應(yīng)用授權(quán),閱讀一遍內(nèi)容,我回到文檔的第三步:

注意這里的app_id要填寫沙箱應(yīng)用的ID,不然是無法完成調(diào)用支付登錄頁面的。
<a >支付寶第三方登錄</a><br/>
下面我們看一下我們的return_url.jsp的業(yè)務(wù)處理:
<%@ 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>支付寶頁面跳轉(zhuǎn)同步通知頁面</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) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//亂碼解決,這段代碼在出現(xiàn)亂碼時使用。如果mysign和sign不相等也可以使用這段代碼轉(zhuǎn)化
valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
//獲取支付寶的通知返回參數(shù),可參考技術(shù)文檔中頁面跳轉(zhuǎn)同步通知參數(shù)列表(以下僅供參考)//
//支付寶用戶號
String app_id = new String(request.getParameter("app_id").getBytes("ISO-8859-1"),"UTF-8");
out.write(app_id + "\n");
//獲取第三方登錄授權(quán)
String alipay_app_auth = new String(request.getParameter("source").getBytes("ISO-8859-1"),"UTF-8");
out.write(alipay_app_auth + "\n");
//第三方授權(quán)code
String app_auth_code = new String(request.getParameter("app_auth_code").getBytes("ISO-8859-1"),"UTF-8");//獲的第三方登錄用戶授權(quán)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","應(yīng)用APPID",privateKey,"json","UTF-8",publicKey,"RSA2");//正常環(huán)境下的網(wǎng)關(guān)
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipaydev.com/gateway.do","沙箱環(huán)境下的應(yīng)用APPID",privateKey,"json","UTF-8",publicKey,"RSA2");//沙箱下的網(wǎng)關(guān)
AlipayOpenAuthTokenAppRequest requestLogin1 = new AlipayOpenAuthTokenAppRequest();
requestLogin1.setBizContent("{" +
"\"grant_type\":\"authorization_code\"," +
"\"code\":\""+ app_auth_code +"\"" +
"}");
//第三方授權(quán)
AlipayOpenAuthTokenAppResponse responseToken = alipayClient.execute(requestLogin1);
if(responseToken.isSuccess()){
out.write("<br/>調(diào)用成功" + "\n");
out.write(responseToken.getAuthAppId() + "\n");
out.write(responseToken.getAppAuthToken() + "\n");
out.write(responseToken.getUserId() + "\n");
} else {
out.write("調(diào)用失敗" + "\n");
}
%>
</body>
</html>
到這里我們的支付寶第三方登錄授權(quán)就為大家介紹完畢,不過需要指出的是,支付寶第三方授權(quán)登錄,要求使用者不能通過該方式進行用戶導(dǎo)流,也就是說第三方登錄成功后,不能出現(xiàn)引導(dǎo)用戶完善基本信息的內(nèi)容,只能使用支付的用戶ID進行用戶身份標示。
看完上面的第三授權(quán)登錄,一定要很多小朋友感覺不過癮,第三方登錄我們只能拿到用的支付寶ID,如果我們需要獲取的用戶信息包含用戶ID、昵稱、性別、省份、城市、用戶頭像、用戶類型、用戶狀態(tài)、是否實名認證、是否是學(xué)生等信息,這是我們就需要獲得一個用戶授權(quán),通過用戶授權(quán),我們可以獲得用戶在支付寶上面的信息。下面我們開始具體的功能實現(xiàn):
首先我們看一下支付寶開發(fā)文檔,基礎(chǔ)功能->獲取會員信息->快速接入,我們看第四步下的第一小步,查看沙箱環(huán)境下URL拼接:
<a >用戶授權(quán)</a><br/>
這里需要注意的是關(guān)于scope的說明:
- auth_base:以auth_base為scope發(fā)起的網(wǎng)頁授權(quán),是用來獲取進入頁面的用戶的userId的,并且是靜默授權(quán)并自動跳轉(zhuǎn)到回調(diào)頁的。用戶感知的就是直接進入了回調(diào)頁(通常是業(yè)務(wù)頁面)。
- auth_user:以auth_user為scope發(fā)起的網(wǎng)頁授權(quán),是用來獲取用戶的基本信息的(比如頭像、昵稱等)。但這種授權(quán)需要用戶手動同意,用戶同意后,就可在授權(quán)后獲取到該用戶的基本信息。
接下來我們看一下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>支付寶頁面跳轉(zhuǎn)同步通知頁面</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) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//亂碼解決,這段代碼在出現(xiàn)亂碼時使用。如果mysign和sign不相等也可以使用這段代碼轉(zhuǎn)化
valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
//獲取支付寶的通知返回參數(shù),可參考技術(shù)文檔中頁面跳轉(zhuǎn)同步通知參數(shù)列表(以下僅供參考)//
//支付寶用戶號
String app_id = new String(request.getParameter("app_id").getBytes("ISO-8859-1"),"UTF-8");
out.write(app_id + "\n");
//獲取用戶信息授權(quán)
String auth_user = new String(request.getParameter("scope").getBytes("ISO-8859-1"),"UTF-8");
out.write(auth_user + "\n");
//獲的第三方登錄用戶授權(quá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","應(yīng)用APPID",privateKey,"json","UTF-8",publicKey,"RSA2");//正常環(huán)境下的網(wǎng)關(guān)
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipaydev.com/gateway.do","沙箱環(huán)境先的應(yīng)用APPID",privateKey,"json","UTF-8",publicKey,"RSA2");//沙箱下的網(wǎng)關(guān)
//獲取用戶信息授權(quán)
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");
//調(diào)用接口獲取用戶信息
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");//用戶賬戶動態(tài)
out.write("Email:" + userinfoShareResponse.getEmail() + "\n");//用戶Email地址
out.write("IsCertified:" + userinfoShareResponse.getIsCertified() + "\n");//用戶是否進行身份認證
out.write("IsStudentCertified:" + userinfoShareResponse.getIsStudentCertified() + "\n");//用戶是否進行學(xué)生認證
} catch (AlipayApiException e) {
//處理異常
e.printStackTrace();
}
} catch (AlipayApiException e) {
//處理異常
e.printStackTrace();
}
%>
</body>
</html>
到這里我們通過沙箱模式進行支付寶第三方登錄與獲取用戶授權(quán)的內(nèi)容就和大家分享完畢,小伙伴快去試一試吧。
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
相關(guān)文章
Spring Boot應(yīng)用啟動時自動執(zhí)行代碼的五種方式(常見方法)
Spring Boot為開發(fā)者提供了多種方式在應(yīng)用啟動時執(zhí)行自定義代碼,這些方式包括注解、接口實現(xiàn)和事件監(jiān)聽器,本文我們將探討一些常見的方法,以及如何利用它們在應(yīng)用啟動時執(zhí)行初始化邏輯,感興趣的朋友一起看看吧2024-04-04
Java那些鮮為人知的關(guān)鍵字volatile詳析
這篇文章主要給大家介紹了關(guān)于Java那些鮮為人知的關(guān)鍵字volatile的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
java 字符串轉(zhuǎn)化為字符數(shù)組的3種實現(xiàn)案例
這篇文章主要介紹了java 字符串轉(zhuǎn)化為字符數(shù)組的3種實現(xiàn)案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
SpringMVC自定義消息轉(zhuǎn)換器的使用其實很簡單
這篇文章主要介紹了SpringMVC自定義消息轉(zhuǎn)換器的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
Springboot整合mybatis開啟二級緩存的實現(xiàn)示例
在一級緩存中,是查詢兩次數(shù)據(jù)庫的,顯然這是一種浪費,既然SQL查詢相同,就沒有必要再次查庫了,直接利用緩存數(shù)據(jù)即可,這種思想就是MyBatis二級緩存的初衷,本文就詳細的介紹了Springboot整合mybatis開啟二級緩存,感興趣的可以了解一下2022-05-05
如何在Spring WebFlux的任何地方獲取Request對象
這篇文章主要介紹了如何在Spring WebFlux的任何地方獲取Request對象,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2021-01-01

