SpringBoot項目接入支付寶第三方登錄

今年大四畢業,由於新冠肺炎疫情的原因,開學和畢業答辯的時間都進行了推遲,因此有較多的時間對畢設項目做修改和調整,便在項目中接入微信和支付寶的第三方登錄。在此需要說明,微信和支付寶的開發者平臺大體一致,但是接入功能審覈條件不盡相同。對於微信開發者而言,申請第三方登錄不但要求你要有自己的域名,還要填寫《微信開放平臺網站信息登記表》並蓋章等,條件相對苛刻。對於支付寶開發者而言,申請第三方登錄僅需要有個人服務器即可。對於“一窮二白”開發者,什麼都沒有的話問題也不大,通過修改HOST和配置Nginx等,也可以借別人的賬號,達到移花接木的效果。

先講一下大致的接入流程,然後再講具體的操作。

  1. 先註冊支付寶開發者平臺用戶,然後創建申請“網頁&移動應用”。
  2. 在註冊成功後,你可以拿到 app_id,redirect_uri,private_key,public_key 等。
  3. 編寫支付寶回調地址功能。

該博客針對接入支付寶第三方登錄功能的實現需要你具有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";
}

至此,功能基本完成。當你掃碼點擊確定之後,支付寶會觸發回調接口做登錄操作,你需要將項目部署到服務器上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章