螞蟻金服開放平臺
注冊開發(fā)者,創(chuàng)建應(yīng)用
審核的時候我是寫項(xiàng)目上線(服務(wù)器)的網(wǎng)關(guān)和回調(diào)地址辽幌,審核通過后改本地測試網(wǎng)關(guān)和地址。
網(wǎng)關(guān)是(ip)地址+項(xiàng)目名稱+gateway.do
創(chuàng)建應(yīng)用.png
配置一些固定的東西:這里需要注意的一個應(yīng)用公鑰和支付寶公鑰,在創(chuàng)建應(yīng)用的時候配置應(yīng)用公鑰會相應(yīng)產(chǎn)生一個支付寶公鑰墙歪。我們需要填寫的是支付寶公鑰和應(yīng)用私鑰
/**個人回調(diào)地址*/
public static final String REDIRECT_URI = "";
/**支付寶網(wǎng)關(guān)(固定)*/
public static final String URL = "https://openapi.alipay.com/gateway.do";
/**APPID 即創(chuàng)建應(yīng)用后生成*/
public static final String APP_ID = "";
/**開發(fā)者私鑰,由開發(fā)者自己生成*/
public static final String APP_PRIVATE_KEY = "";
/**參數(shù)返回格式贝奇,只支持json*/
public static final String FORMAT = "json";
/**編碼集虹菲,支持GBK/UTF-8*/
public static final String CHARSET = "UTF-8";
/**支付寶公鑰,由支付寶生成*/
public static final String ALIPAY_PUBLIC_KEY = "";
/**商戶生成簽名字符串所使用的簽名算法類型掉瞳,目前支持RSA2和RSA毕源,推薦使用RSA2*/
public static final String SIGN_TYPE = "RSA2";
/**
* 接口權(quán)限值,目前只支持auth_user和auth_base兩個值-->>
* auth_base:以auth_base為scope發(fā)起的網(wǎng)頁授權(quán)陕习,是用來獲取進(jìn)入頁面的用戶的userId的霎褐,并且是靜默授權(quán)并自動跳轉(zhuǎn)到回調(diào)頁的。用戶感知的就是直接進(jìn)入了回調(diào)頁(通常是業(yè)務(wù)頁面)该镣。
* auth_user:以auth_user為scope發(fā)起的網(wǎng)頁授權(quán)冻璃,是用來獲取用戶的基本信息的(比如頭像、昵稱等)损合。但這種授權(quán)需要用戶手動同意省艳,用戶同意后,就可在授權(quán)后獲取到該用戶的基本信息嫁审。若想獲取用戶信息跋炕,scope的值中需要有該值存在,如scope=auth_user,auth_base律适。
*/
public static final String SCOPE = "auth_user";
<!-- alipay sdk -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>${alipay-sdk.version}</version>
</dependency>
首先是一個授權(quán)登錄辐烂,這里你只能獲取userId和其他的一些信息,并不能獲取詳細(xì)的用戶名稱頭像等信息擦耀,主要區(qū)別是請求的地址不同棉圈。
stringBuilder
.append("https://openauth.alipay.com/oauth2/appToAppAuth.htm?app_id="+AlipayConstant.APP_ID)
.append("&redirect_uri="+AlipayConstant.REDIRECT_URI);
回調(diào):
public Result alipayBusinessLogin(HttpServletRequest request) throws AlipayApiException {
String appId = request.getParameter("app_id");
String source = request.getParameter("source");
String appAuthCode = request.getParameter("app_auth_code");
// 使用app_auth_code換取app_auth_token
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConstant.URL, // 支付寶網(wǎng)關(guān)(固定)
AlipayConstant.APP_ID, // APPID 即創(chuàng)建應(yīng)用后生成
AlipayConstant.APP_PRIVATE_KEY, // 開發(fā)者私鑰,由開發(fā)者自己生成
AlipayConstant.FORMAT, // 參數(shù)返回格式眷蜓,只支持json
AlipayConstant.CHARSET, // 編碼集分瘾,支持GBK/UTF-8
AlipayConstant.ALIPAY_PUBLIC_KEY, // 支付寶公鑰,由支付寶生成
AlipayConstant.SIGN_TYPE); // 商戶生成簽名字符串所使用的簽名算法類型吁系,目前支持RSA2和RSA德召,推薦使用RSA2
AlipayOpenAuthTokenAppRequest aoataRequest = new AlipayOpenAuthTokenAppRequest();
// 設(shè)置請求參數(shù) 使用app_auth_code換取app_auth_token
aoataRequest.setBizContent("{\"grant_type\":\"authorization_code\",\"code\":\"" + appAuthCode + "\"}");
// 發(fā)送請求得到響應(yīng)
AlipayOpenAuthTokenAppResponse aoataResponse = alipayClient.execute(aoataRequest);
if (!aoataResponse.isSuccess()) {
throw new RuntimeException("獲取app_auth_token失敗汽纤!" + aoataResponse.getSubMsg());
}
// 根據(jù)appAuthToken換取用戶信息
AlipayOpenAuthTokenAppQueryRequest aoataqRequest = new AlipayOpenAuthTokenAppQueryRequest();
aoataqRequest.setBizContent("{\"app_auth_token\":\"" + aoataResponse.getAppAuthToken() + "\"}");
AlipayOpenAuthTokenAppQueryResponse appQueryResponse = alipayClient.execute(aoataqRequest);
if (!appQueryResponse.isSuccess()) {
throw new RuntimeException("獲取用戶授權(quán)信息失斏细凇!" + appQueryResponse.getSubMsg());
}
// 用戶授權(quán)成功 獲取授權(quán)信息
String userId = appQueryResponse.getUserId();
String appID = appQueryResponse.getAuthAppId();
String body = appQueryResponse.getBody();
System.out.println(userId);
System.out.println(appID);
System.out.println(body);
return null;
}
下面授權(quán)能獲取用戶詳細(xì)信息蕴坪,名稱頭像等:
官方文檔
第一步:URL拼接與scope詳解
url拼接規(guī)則:https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=APPID&scope=SCOPE&redirect_uri=ENCODED_URL
stringBuilder
.append("https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id="+AlipayConstant.APP_ID)
.append("&scope="+AlipayConstant.SCOPE)//接口權(quán)限值肴掷,目前只支持auth_user和auth_base兩個值
.append("&redirect_uri="+AlipayConstant.REDIRECT_URI);
回調(diào):
// 第二步:獲取auth_code
String auth_code = request.getParameter("auth_code");
// 第三步:使用auth_code換取接口access_token及用戶userId
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConstant.URL, // 支付寶網(wǎng)關(guān)(固定)
AlipayConstant.APP_ID, // APPID 即創(chuàng)建應(yīng)用后生成
AlipayConstant.APP_PRIVATE_KEY, // 開發(fā)者私鑰敬锐,由開發(fā)者自己生成
AlipayConstant.FORMAT, // 參數(shù)返回格式,只支持json
AlipayConstant.CHARSET, // 編碼集呆瞻,支持GBK/UTF-8
AlipayConstant.ALIPAY_PUBLIC_KEY, // 支付寶公鑰台夺,由支付寶生成
AlipayConstant.SIGN_TYPE); // 商戶生成簽名字符串所使用的簽名算法類型,目前支持RSA2和RSA痴脾,推薦使用RSA2
AlipaySystemOauthTokenRequest asotRequest = new AlipaySystemOauthTokenRequest();
asotRequest.setCode(auth_code);
asotRequest.setGrantType("authorization_code");
AlipaySystemOauthTokenResponse asotResponse = alipayClient.execute(asotRequest);
String accessToken = asotResponse.getAccessToken();
//String asotUserId = asotResponse.getUserId();跟下面的userAuthsId是一樣的
// 第四步:調(diào)用接口獲取用戶信息
AlipayUserInfoShareRequest requestUser = new AlipayUserInfoShareRequest();
AlipayUserInfoShareResponse userinfoShareResponse = alipayClient.execute(requestUser,
asotResponse.getAccessToken());
String nickname = userinfoShareResponse.getNickName();
String avatar = userinfoShareResponse.getAvatar();
String userAuthsId = userinfoShareResponse.getUserId();
String email = userinfoShareResponse.getEmail();