Java接入支付寶授權(quán)第三方登錄的完整步驟
開(kāi)發(fā)前準(zhǔn)備
支付寶沙箱環(huán)境申請(qǐng)使用


!!!重點(diǎn) 授權(quán)回調(diào)地址必須要寫全路徑也就是controller最終路徑(下面有具體細(xì)節(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ù)(多個(gè)用逗號(hào)拼接)&scope=auth_user&edirect_uri=http://ip | 域名 + 接口地址
具體怎么用??? 在線生成二維碼用支付寶沙箱app掃碼
回調(diào)地址接收支付寶參數(shù)
構(gòu)建請(qǐng)求支付寶客戶端
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 對(duì)應(yīng)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è)務(wù)流程代碼
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);
//?。。∩诚洵h(huán)境用戶沒(méi)有這些基本信息但是可以看到支付寶接口是成功的
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)亂碼時(shí)使用
// 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("***********失敗,自旋開(kāi)始第:{}次",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("***********失敗,自旋開(kāi)始第:{}次",number);
number += 1;
if(number < 3){
log.info("調(diào)用用戶詳情失敗,嘗試:*******{}*******",number);
return this.getUserInfo(alipayClient,aliUserToken,number);
}
return infoShareResponse ;
}
}
串業(yè)務(wù)
用戶掃碼后后會(huì)跳到你配置的回調(diào)地址上?。。〉且?yàn)榇a中返回是success,用戶收到的只是個(gè)字符串。所以此處因該是配置支付寶去回調(diào)前端地址 然后參數(shù)讓前端原封不動(dòng)傳向后端 后端解析成功后,前端引導(dǎo)用戶進(jìn)行下一步操作
總結(jié)
到此這篇關(guān)于Java接入支付寶授權(quán)第三方登錄的文章就介紹到這了,更多相關(guān)Java接入支付寶授權(quán)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Java在netty中實(shí)現(xiàn)線程和CPU綁定
這篇文章主要介紹了基于Java在netty中實(shí)現(xiàn)線程和CPU綁定,文章圍繞主題的相關(guān)內(nèi)容展開(kāi)詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05
編寫調(diào)用新浪微博API的Java程序來(lái)發(fā)送微博
這篇文章主要介紹了編寫調(diào)用新浪微博API的Java程序來(lái)發(fā)送微博的方法,只是展示了一個(gè)基本的程序框架而非一個(gè)完整的圖形化軟件:)需要的朋友可以參考下2015-11-11
Eclipse新建項(xiàng)目不可選擇Java Project問(wèn)題解決方案
這篇文章主要介紹了Eclipse新建項(xiàng)目不可選擇Java Project問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
SpringBoot+ruoyi框架文件上傳和下載的實(shí)現(xiàn)
文件的上傳和下載功能,是項(xiàng)目開(kāi)發(fā)過(guò)程中比較常見(jiàn)的業(yè)務(wù)需求,本文主要介紹了SpringBoot+ruoyi框架文件上傳和文件下載的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
SpringBoot整合Mybatis-plus案例及用法實(shí)例
mybatis-plus是一個(gè) Mybatis 的增強(qiáng)工具,在 Mybatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開(kāi)發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合Mybatis-plus案例及用法實(shí)例的相關(guān)資料,需要的朋友可以參考下2022-11-11

