支付寶開發(fā)平臺(tái)之第三方授權(quán)登錄與獲取用戶信息
對(duì)于第三方登錄,我們常見了,很多應(yīng)用可以進(jìn)行第三方登錄,我常用的有:QQ、微信、新浪、支付寶等等,今天我們就一起來(lái)簡(jiǎn)單學(xué)習(xí)一下支付寶第三方授權(quán)登錄。
打開支付寶開發(fā)平臺(tái),注冊(cè)成為開發(fā)者,點(diǎn)擊開發(fā)者中心,在我的應(yīng)用中創(chuàng)建一個(gè)應(yīng)用:
點(diǎn)擊功能信息,添加我們需要的功能:
到這我們還不能進(jìn)行接口調(diào)試,因?yàn)槲覀兊膽?yīng)用沒(méi)有上線,APPID是無(wú)效的,這里阿里給了我們一個(gè)解決方案,就是通過(guò)沙箱模式進(jìn)行接口調(diào)試,下面我們來(lái)配一下我們的沙箱模式:
配置過(guò)RAS2就可以不用配置RAS1了,公鑰和私鑰的生成規(guī)則,查看支付寶文檔,我這里是使用支付寶提供的秘鑰生成工具生成的,創(chuàng)建完成后,我們下載的文件夾下會(huì)生成三個(gè)文件:rsa_private_key.pem(秘鑰)、rsa_private_key_pkcs8.pem(java專用秘鑰)、rsa_public_key.pem(公鑰),我們把生成的公鑰上傳到沙箱環(huán)境下RAS2下,點(diǎn)擊查看支付寶公鑰,將公鑰保存,接下來(lái)開發(fā)使用。應(yīng)用網(wǎng)關(guān)和授權(quán)回調(diào)地址,這里因?yàn)槭潜镜卣{(diào)試,暫時(shí)寫為圖上內(nèi)容即可。
做好這些準(zhǔn)備工作我們就可以開始進(jìn)行我們的具體功能實(shí)現(xiàn)了,首先我打開支付寶開發(fā)平臺(tái)開發(fā)文檔,點(diǎn)擊基礎(chǔ)能力->第三方應(yīng)用授權(quán),閱讀一遍內(nèi)容,我回到文檔的第三步:
注意這里的app_id要填寫沙箱應(yīng)用的ID,不然是無(wú)法完成調(diào)用支付登錄頁(yè)面的。
<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>支付寶頁(yè)面跳轉(zhuǎn)同步通知頁(yè)面</title> </head> <body> <% //獲取支付寶GET過(guò)來(lái)反饋信息 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)亂碼時(shí)使用。如果mysign和sign不相等也可以使用這段代碼轉(zhuǎn)化 valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); params.put(name, valueStr); } //獲取支付寶的通知返回參數(shù),可參考技術(shù)文檔中頁(yè)面跳轉(zhuǎn)同步通知參數(shù)列表(以下僅供參考)// //支付寶用戶號(hào) 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)就為大家介紹完畢,不過(guò)需要指出的是,支付寶第三方授權(quán)登錄,要求使用者不能通過(guò)該方式進(jìn)行用戶導(dǎo)流,也就是說(shuō)第三方登錄成功后,不能出現(xiàn)引導(dǎo)用戶完善基本信息的內(nèi)容,只能使用支付的用戶ID進(jìn)行用戶身份標(biāo)示。
看完上面的第三授權(quán)登錄,一定要很多小朋友感覺(jué)不過(guò)癮,第三方登錄我們只能拿到用的支付寶ID,如果我們需要獲取的用戶信息包含用戶ID、昵稱、性別、省份、城市、用戶頭像、用戶類型、用戶狀態(tài)、是否實(shí)名認(rèn)證、是否是學(xué)生等信息,這是我們就需要獲得一個(gè)用戶授權(quán),通過(guò)用戶授權(quán),我們可以獲得用戶在支付寶上面的信息。下面我們開始具體的功能實(shí)現(xiàn):
首先我們看一下支付寶開發(fā)文檔,基礎(chǔ)功能->獲取會(huì)員信息->快速接入,我們看第四步下的第一小步,查看沙箱環(huán)境下URL拼接:
<a >用戶授權(quán)</a><br/>
這里需要注意的是關(guān)于scope的說(shuō)明:
- auth_base:以auth_base為scope發(fā)起的網(wǎng)頁(yè)授權(quán),是用來(lái)獲取進(jìn)入頁(yè)面的用戶的userId的,并且是靜默授權(quán)并自動(dòng)跳轉(zhuǎn)到回調(diào)頁(yè)的。用戶感知的就是直接進(jìn)入了回調(diào)頁(yè)(通常是業(yè)務(wù)頁(yè)面)。
- auth_user:以auth_user為scope發(fā)起的網(wǎng)頁(yè)授權(quán),是用來(lái)獲取用戶的基本信息的(比如頭像、昵稱等)。但這種授權(quán)需要用戶手動(dòng)同意,用戶同意后,就可在授權(quán)后獲取到該用戶的基本信息。
接下來(lái)我們看一下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>支付寶頁(yè)面跳轉(zhuǎn)同步通知頁(yè)面</title> </head> <body> <% //獲取支付寶GET過(guò)來(lái)反饋信息 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)亂碼時(shí)使用。如果mysign和sign不相等也可以使用這段代碼轉(zhuǎn)化 valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); params.put(name, valueStr); } //獲取支付寶的通知返回參數(shù),可參考技術(shù)文檔中頁(yè)面跳轉(zhuǎn)同步通知參數(shù)列表(以下僅供參考)// //支付寶用戶號(hào) 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");//用戶賬戶動(dòng)態(tài) out.write("Email:" + userinfoShareResponse.getEmail() + "\n");//用戶Email地址 out.write("IsCertified:" + userinfoShareResponse.getIsCertified() + "\n");//用戶是否進(jìn)行身份認(rèn)證 out.write("IsStudentCertified:" + userinfoShareResponse.getIsStudentCertified() + "\n");//用戶是否進(jìn)行學(xué)生認(rèn)證 } catch (AlipayApiException e) { //處理異常 e.printStackTrace(); } } catch (AlipayApiException e) { //處理異常 e.printStackTrace(); } %> </body> </html>
到這里我們通過(guò)沙箱模式進(jìn)行支付寶第三方登錄與獲取用戶授權(quán)的內(nèi)容就和大家分享完畢,小伙伴快去試一試吧。
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
java導(dǎo)出大批量(百萬(wàn)以上)數(shù)據(jù)的excel文件
這篇文章主要為大家詳細(xì) 介紹了java導(dǎo)出大批量即百萬(wàn)以上數(shù)據(jù)的excel文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04JavaMail整合Spring實(shí)現(xiàn)郵件發(fā)送功能
這篇文章主要為大家詳細(xì)介紹了JavaMail整合Spring實(shí)現(xiàn)郵件發(fā)送功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08Spring Mybatis Mapper模糊查詢的幾種方法
在Spring結(jié)合Mybatis進(jìn)行開發(fā)時(shí),實(shí)現(xiàn)模糊查詢是一個(gè)常見需求,在Mybatis中,LIKE查詢可以通過(guò)多種方式實(shí)現(xiàn),本文給大家介紹了Spring Mybatis Mapper模糊查詢的幾種方法,需要的朋友可以參考下2024-03-03JMeter中的后端監(jiān)聽器的實(shí)現(xiàn)
本文主要介紹了JMeter中的后端監(jiān)聽器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09由@NotNull注解引出的關(guān)于Java空指針的控制
這是一些很容易學(xué)會(huì)的簡(jiǎn)單技術(shù),但是對(duì)于代碼質(zhì)量和健壯性來(lái)說(shuō)確實(shí)很重要。以我的經(jīng)驗(yàn),僅是第一個(gè)小技巧就已經(jīng)對(duì)改進(jìn)代碼質(zhì)量具有很大的作用了2016-09-09java nio中的ByteBuffer擴(kuò)展問(wèn)題
這篇文章主要介紹了java nio中的ByteBuffer擴(kuò)展問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08java、python、JavaScript以及jquery循環(huán)語(yǔ)句的區(qū)別
本篇文章主要介紹java、python、JavaScript以及jquery的循環(huán)語(yǔ)句的區(qū)別,這里整理了它們循環(huán)語(yǔ)句語(yǔ)法跟示例,以便大家閱讀,更好的區(qū)分它們的不同2016-07-07