Java支付寶授權(quán)第三方登陸

螞蟻金服開放平臺
注冊開發(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";

pom的配置:SDK下載地址

<!-- 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();
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颤介,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赞赖,更是在濱河造成了極大的恐慌滚朵,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件前域,死亡現(xiàn)場離奇詭異辕近,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)话侄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門亏推,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人年堆,你說我怎么就攤上這事吞杭。” “怎么了变丧?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵芽狗,是天一觀的道長。 經(jīng)常有香客問我痒蓬,道長童擎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任攻晒,我火速辦了婚禮顾复,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鲁捏。我一直安慰自己芯砸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布给梅。 她就那樣靜靜地躺著假丧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪动羽。 梳的紋絲不亂的頭發(fā)上包帚,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機(jī)與錄音运吓,去河邊找鬼渴邦。 笑死疯趟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的几莽。 我是一名探鬼主播迅办,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼章蚣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起姨夹,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纤垂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后磷账,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體峭沦,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年逃糟,在試婚紗的時候發(fā)現(xiàn)自己被綠了吼鱼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡绰咽,死狀恐怖菇肃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情取募,我是刑警寧澤琐谤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站玩敏,受9級特大地震影響斗忌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旺聚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一织阳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧砰粹,春花似錦唧躲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至厘贼,卻和暖如春界酒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嘴秸。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工毁欣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庇谆,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓凭疮,卻偏偏與公主長得像饭耳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子执解,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容