Java接入支付寶授權(quán)第三方登錄的完整步驟
開發(fā)前準備
支付寶沙箱環(huán)境申請使用
!!!重點 授權(quán)回調(diào)地址必須要寫全路徑也就是controller最終路徑(下面有具體細節(jié))
RSA2的密鑰生成: 支付寶提供生成密鑰地址.
獲取用戶授權(quán)
生成喚起支付寶授權(quán)連接
用到appid+回調(diào)路徑 回調(diào)路徑=在上面配置的全路徑 具體路徑:
https://openauth.alipay.com/oauth2/publicAppAuthorize.htm? app_id=2016####&scope=auth_user&edirect_uri=http://ip | 域名 + 接口地址
也可以使用自定義參數(shù)的連接:
https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=2016#### &state=自定義參數(shù)(多個用逗號拼接)&scope=auth_user&edirect_uri=http://ip | 域名 + 接口地址
具體怎么用??? 在線生成二維碼用支付寶沙箱app掃碼
回調(diào)地址接收支付寶參數(shù)
構(gòu)建請求支付寶客戶端
yml:
# 支付寶配置 ali: appId: 2016#### # 自己的私鑰 merchantPrivateKey: 連接生成的私鑰 # 支付寶公鑰 alipayPublicKey: 鏈接生成的公鑰配置后支付寶給到的支付寶公鑰 # 簽名方式 signType: RSA2 # 字符編碼格式 charset: UTF-8 # 字符編碼格式 format: json # 支付寶網(wǎng)關(guān) https://openapi.alipay.com/gateway.do 是正式的 gatewayUrl: https://openapidev.alipay.com/gateway.do #dev是沙箱
Property:
import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * 支付寶配置 */ @Data @Component @ConfigurationProperties(prefix = "ali") public class AliPayProperty { /** * 支付寶APPID */ public String appId; /** * 商戶私鑰,您的PKCS8格式RSA2私鑰 */ public String merchantPrivateKey ; /** * 支付寶公鑰,查看地址:https://openhome.alipay.com 對應APPID下的支付寶公鑰。 */ public String alipayPublicKey; /** * 接口格式規(guī)范 */ public String format; /** * 簽名方式 */ public String signType; /** * 字符編碼格式 */ public String charset; /** * 支付寶網(wǎng)關(guān) https://openapi.alipay.com/gateway.do 這是正式地址 */ public String gatewayUrl; /** * 支付寶客戶端 * @return */ public AlipayClient getAlipayClient(){ AlipayClient alipayClient = new DefaultAlipayClient( this.gatewayUrl, this.appId, this.merchantPrivateKey, this.format, this.charset, this.alipayPublicKey, this.signType); return alipayClient; } }
業(yè)務流程代碼
controller:
@GetMapping(value = "/loginCallBack") public String loginCallBack(HttpServletRequest request){ return aliPayService.loginCallBack(request); }
service:
public String loginCallBack(HttpServletRequest request){ //獲取用戶掃碼授權(quán)的參數(shù) Map<String,String> map = this.getAliPayParam(request); //獲取用戶掃碼后的code String code = map.get("auth_code"); //構(gòu)建阿里客戶端 AlipayClient alipayClient = aliPayProperty.getAlipayClient(); //獲取阿里用戶token AlipaySystemOauthTokenResponse aliUserToken = this.getAliUserToken(code, alipayClient,0); //獲取用戶信息 AlipayUserInfoShareResponse infoShareResponse = this.getUserInfo(alipayClient, aliUserToken, 0); //?。?!沙箱環(huán)境用戶沒有這些基本信息但是可以看到支付寶接口是成功的 return "SUECCSS"; }
封裝接收參數(shù)方法:
public Map<String,String> getAliPayParam(HttpServletRequest request) { Map<String,String> map = new HashMap(); Map<String, String[]> requestParams = request.getParameterMap(); for (Iterator<String> 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)亂碼時使用 // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); map.put(name, valueStr); log.info("接受支付寶回調(diào)參數(shù):{}",map); } return map; }
獲取token方法:
private AlipaySystemOauthTokenResponse getAliUserToken(String code, AlipayClient alipayClient,int number) throws AlipayApiException { AlipaySystemOauthTokenRequest alipaySystemOauthTokenRequest = new AlipaySystemOauthTokenRequest(); alipaySystemOauthTokenRequest.setGrantType("authorization_code"); alipaySystemOauthTokenRequest.setCode(code); AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(alipaySystemOauthTokenRequest); log.info("獲得用戶+++++++++++++++token:{}+++++++++++++++",oauthTokenResponse.getAccessToken()); log.info("獲得用戶+++++++++++++++uuid:{}+++++++++++++++",oauthTokenResponse.getUserId()); if(oauthTokenResponse.isSuccess()){ log.info("成功"); } else { log.info("***********失敗,自旋開始第:{}次",number); number += 1; if(number < 3){ log.info("獲取token失敗,嘗試:*******{}*******",number); return this.getAliUserToken(apiPayLoginReq, alipayClient, number); } } return oauthTokenResponse; }
獲取用戶支付寶信息方法:
private AlipayUserInfoShareResponse getUserInfo(AlipayClient alipayClient,AlipaySystemOauthTokenResponse aliUserToken,int number) throws AlipayApiException { AlipayUserInfoShareRequest alipayUserInfoShareRequest = new AlipayUserInfoShareRequest(); AlipayUserInfoShareResponse infoShareResponse = alipayClient.execute(alipayUserInfoShareRequest,aliUserToken.getAccessToken()); log.info("----------------獲得支付寶用戶詳情:{}",infoShareResponse.getBody()); UserInfoReq userInfoReq = new UserInfoReq(); if(infoShareResponse.isSuccess()){ //用戶授權(quán)成功 log.info("----------------獲得支付寶用戶基本而信息:{}",userInfoReq); log.info("成功"); } else { log.info("***********失敗,自旋開始第:{}次",number); number += 1; if(number < 3){ log.info("調(diào)用用戶詳情失敗,嘗試:*******{}*******",number); return this.getUserInfo(alipayClient,aliUserToken,number); } return infoShareResponse ; } }
串業(yè)務
用戶掃碼后后會跳到你配置的回調(diào)地址上?。。〉且驗榇a中返回是success,用戶收到的只是個字符串。所以此處因該是配置支付寶去回調(diào)前端地址 然后參數(shù)讓前端原封不動傳向后端 后端解析成功后,前端引導用戶進行下一步操作
總結(jié)
到此這篇關(guān)于Java接入支付寶授權(quán)第三方登錄的文章就介紹到這了,更多相關(guān)Java接入支付寶授權(quán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
編寫調(diào)用新浪微博API的Java程序來發(fā)送微博
這篇文章主要介紹了編寫調(diào)用新浪微博API的Java程序來發(fā)送微博的方法,只是展示了一個基本的程序框架而非一個完整的圖形化軟件:)需要的朋友可以參考下2015-11-11Eclipse新建項目不可選擇Java Project問題解決方案
這篇文章主要介紹了Eclipse新建項目不可選擇Java Project問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07SpringBoot+ruoyi框架文件上傳和下載的實現(xiàn)
文件的上傳和下載功能,是項目開發(fā)過程中比較常見的業(yè)務需求,本文主要介紹了SpringBoot+ruoyi框架文件上傳和文件下載的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-09-09SpringBoot整合Mybatis-plus案例及用法實例
mybatis-plus是一個 Mybatis 的增強工具,在 Mybatis 的基礎(chǔ)上只做增強不做改變,為簡化開發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合Mybatis-plus案例及用法實例的相關(guān)資料,需要的朋友可以參考下2022-11-11