Java接入支付寶授權(quán)第三方登錄的完整步驟
開發(fā)前準(zhǔn)備
支付寶沙箱環(huá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ù)(多個用逗號拼接)&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 對應(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)境用戶沒有這些基本信息但是可以看到支付寶接口是成功的
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è)務(wù)
用戶掃碼后后會跳到你配置的回調(diào)地址上?。?!但是因為代碼中返回是success,用戶收到的只是個字符串。所以此處因該是配置支付寶去回調(diào)前端地址 然后參數(shù)讓前端原封不動傳向后端 后端解析成功后,前端引導(dǎo)用戶進(jìn)行下一步操作
總結(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-11
Eclipse新建項目不可選擇Java Project問題解決方案
這篇文章主要介紹了Eclipse新建項目不可選擇Java Project問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07
SpringBoot+ruoyi框架文件上傳和下載的實現(xiàn)
文件的上傳和下載功能,是項目開發(fā)過程中比較常見的業(yè)務(wù)需求,本文主要介紹了SpringBoot+ruoyi框架文件上傳和文件下載的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-09-09
SpringBoot整合Mybatis-plus案例及用法實例
mybatis-plus是一個 Mybatis 的增強(qiáng)工具,在 Mybatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合Mybatis-plus案例及用法實例的相關(guān)資料,需要的朋友可以參考下2022-11-11

