今年大四畢業,由於新冠肺炎疫情的原因,開學和畢業答辯的時間都進行了推遲,因此有較多的時間對畢設項目做修改和調整,便在項目中接入微信和支付寶的第三方登錄。在此需要說明,微信和支付寶的開發者平臺大體一致,但是接入功能審覈條件不盡相同。對於微信開發者而言,申請第三方登錄不但要求你要有自己的域名,還要填寫《微信開放平臺網站信息登記表》並蓋章等,條件相對苛刻。對於支付寶開發者而言,申請第三方登錄僅需要有個人服務器即可。對於“一窮二白”開發者,什麼都沒有的話問題也不大,通過修改HOST和配置Nginx等,也可以借別人的賬號,達到移花接木的效果。
先講一下大致的接入流程,然後再講具體的操作。
- 先註冊支付寶開發者平臺用戶,然後創建申請“網頁&移動應用”。
- 在註冊成功後,你可以拿到 app_id,redirect_uri,private_key,public_key 等。
- 編寫支付寶回調地址功能。
該博客針對接入支付寶第三方登錄功能的實現需要你具有SpringMVC的基礎,如果你的是web.xml之類的老項目可以參考其他博客。本人就是因爲在百度的時候發現都是老項目的接入,所以在此討論一下新項目的接入方法。同時也要求你有一個雲服務器,如果沒有,可以私信我,討論一下“移花接木大法”心得。以下鏈接是支付寶的官方接入教程,流程圖如下:
支付寶官方接入教程說明:https://opendocs.alipay.com/open/263/105809
一,註冊支付寶開發者平臺用戶
1. 通過如下鏈接,支付寶掃碼登錄後填寫相關個人信息,然後即可註冊成功,再次點擊如下鏈接即可跳轉到開發者中心控制檯。
https://openhome.alipay.com/platform/developerIndex.htm
2. 點擊創建應用 ---> 創建網頁&移動應用 ---> 選擇自定義接入類型 。然後填寫應用的相關信息即可。需要注意應用頭像必須是類似與商務logo的,我嘗試過很多次審覈均不通過,最終網站找了個類似商務logo才行。其次是 “網址url” 這裏填寫你項目連接,比如我的服務器IP:123.456.789.012,項目端口:8080,項目登錄頁是 /project/login。即我填寫的 網址url 是:http://123.456.789.012:8080/project/zfbLogin。這個網址URL是當用戶點擊確定登錄的時候,支付寶的回調地址。
3. 設置接口加簽方式,根據提示下載“支付寶密鑰生成器”生成公鑰字符。點擊確定跳出來的東西中,保存支付寶公鑰,後續也能看到。
二、設置訪問鏈接
用戶點擊支付寶登錄的時候實際上一個a標籤跳轉鏈接,HTML代碼如下,注意,http://123.456.789.012:8080/project/zfbLogin,回調地址的“/”和“:”需要用轉義字符代替。
<a href="https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=12345678998745&scope=auth_user&redirect_uri=http%3a%2f%2f123.456.789.012%3a8686%2fproject%2fzfbLogin">支付寶登錄</a>
三、完成回調接口功能
在開發之前,需要確定你有如下參數
1. 支付寶三方登錄網關(ZFB_SERVER_URL),頁面可以看到,大家都是一樣的爲 https://openapi.alipay.com/gateway.do
2. 支付寶APP_ID(ZFB_APP_ID),即APP_ID。
3. 應用授權私鑰(應用授權私鑰),即 支付寶密鑰生成器 生成的應用私鑰
4. 支付寶登錄公鑰(ZFB_PUBLIC_KEY),即 上面第一節第3點中,點擊確定跳出來的支付寶公鑰
接口相關代碼如下:
@RequestMapping("zfbLogin")
public String zfbLogin(){
// 獲取AuthCode 等,具體可以獲取哪些數據參考支付寶官方接口文檔,這裏只需要使用auth_code
String authCode = request.getParameter("auth_code");
log.info("authCode ==> "+authCode);
if(StringUtils.isNotEmpty(authCode)){
try{
// 這些參數均被抽取出來,參數說明見博客
AlipayClient alipayClient = new DefaultAlipayClient(ZFB_SERVER_URL, ZFB_APP_ID, ZFB_PRIVATE_KEY, "json", "UTF-8", ZFB_PUBLIC_KEY, "RSA2");
// 通過authCode獲取accessToken
AlipaySystemOauthTokenRequest oauthTokenRequest = new AlipaySystemOauthTokenRequest();
oauthTokenRequest.setCode(authCode);
oauthTokenRequest.setGrantType("authorization_code");
AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(oauthTokenRequest);
String accessToken = oauthTokenResponse.getAccessToken();
log.info("accessToken ==> "+accessToken);
if(StringUtils.isNotEmpty(accessToken)){
// 根據accessToken獲取用戶信息
AlipayUserInfoShareResponse userInfoResponse = alipayClient.execute(new AlipayUserInfoShareRequest(), accessToken);
if (userInfoResponse.isSuccess()){
log.info("zfbUser ==> "+JSONObject.toJSONString(userInfoResponse));
// userInfoResponse 中有哪些用戶信息參考支付寶官方接口文檔,這裏演示如下幾個
Map userInfo = new HashMap(6);
userInfo.put("nickname", userInfoResponse.getNickName());
userInfo.put("imgUrl", userInfoResponse.getAvatar());
userInfo.put("uuid", userInfoResponse.getUserId());
// 接下來你可以通過免密登錄或者獲取密碼自動登錄等方式,做登錄操作獲取進入首頁即可
return "index";
}else{
log.warn("無法獲取用戶信息");
}
}else{
log.error("接入支付寶登錄認證出現錯誤,無法獲取到accessToken.");
}
}catch (Exception e){
log.error("獲取支付寶用戶信息失敗");
e.printStackTrace();
}
}else{
log.error("接入支付寶登錄回調方法錯誤,無法獲取到Token.");
}
return "login";
}
至此,功能基本完成。當你掃碼點擊確定之後,支付寶會觸發回調接口做登錄操作,你需要將項目部署到服務器上。