支付宝获取用户信息

场景:支付宝APP中扫码进入H5页面,用户授权登陆,获取用户支付宝用户的UID,头像,昵称。
支付宝官方文档链接:
https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.xZbtJT&treeId=284&articleId=106001&docType=1

先上效果

image.png

第一步:创建应用

想要调用该接口,需要先在开放平台管理中心的应用详情中开通获取用户信息的功能

image.png

第二步:配置密钥

开发者调用接口前需要先生成RSA密钥,RSA密钥包含应用私钥(APP_PRIVATE_KEY)、应用公钥(APP_PUBLIC_KEY)。生成密钥后在开放平台管理中心进行密钥配置,配置完成后可以获取支付宝公钥(ALIPAY_PUBLIC_KEY)。

第三步:搭建和配置开发环境

  1. 下载服务端SDK
  2. 接口调用配置
AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, 
FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);

第四步:调用接口获取用户信息

申请获取用户信息功能时默认可获取的用户信息包含用户ID、昵称、性别、省份、城市、用户头像、用户类型、用户状态、是否实名认证、是否是学生等信息。

授权流程

image.png

如上图所示,对于开发者而言,需要完成以下工作:

按照规则拼接授权页面的链接,并且引导用户跳转至该链接;
用户在授权页面上确认授权后,将跳转到开发者指定的回调页,并且带上auth_code;
开发者通过auth_code换取access_token及用户的userId;
如果需要除userId以外的其他信息,则使用access_token调用用户信息共享接口获取。

第一步:URL拼接与scope详解
url拼接规则:https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=APPID&scope=SCOPE&redirect_uri=ENCODED_URL

关于redirect_uri的说明:
接口会校验授权链接中配置的redirect_uri与应用中配置的授权链接是否一致。详细说明: 如果开发者在应用中配置的授权链接是:https://auth.example.com/authCallBack,则redirect_uri内容为https://auth.example.com/authCallBack的encode形式https%3A%2F%2Fauth.example.com%2FauthCallBack。授权回调地址对应的域名(auth.example.com)下的页面http://auth.example.com/authCallBackhttps://auth.example.com/authRedirecthttps://auth.example.com/都可以进行OAuth2.0授权。但与(auth.example.com)关联的二三级域名,如:http://www.example.com/http://example.com/无法进行OAuth2.0授权。

关于scope的说明:

auth_base:以auth_base为scope发起的网页授权,是用来获取进入页面的用户的userId的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(通常是业务页面)。
auth_user:以auth_user为scope发起的网页授权,是用来获取用户的基本信息的(比如头像、昵称等)。但这种授权需要用户手动同意,用户同意后,就可在授权后获取到该用户的基本信息。若想获取用户信息,scope的值中需要有该值存在,如scope=auth_user,auth_base。

H5授权页面示例:

image.png

第二步:获取auth_code

当用户授权成功后,会跳转至开发者定义的回调页面,支付宝会在回调页面请求中加入参数,包括auth_code、app_id、scope等,需要注意的是支付宝仅保证auth_code、app_id以及scope参数的有效性。支付宝请求开发者回调页面示例如下:

http://example.com/doc/toAuthPage.html?app_id=app_id&source=alipay_wallet&scope=auth_user
&auth_code=ca34ea491e7146cc87d25fca24c4cD11

第三步:使用auth_code换取接口access_token及用户userId

接口名称:alipay.system.oauth.token

换取授权访问令牌,开发者可通过获取到的auth_code换取access_token和用户userId。auth_code作为换取access_token的票据,每次用户授权完成,回调地址中的auth_code将不一样,auth_code只能使用一次,一天未被使用自动过期。

接口请求示例

REQUEST URL: https://openapi.alipay.com/gateway.do
REQUEST METHOD: POST
CONTENT:
    app_id=“app_id”
    method=alipay.system.oauth.token
    charset=GBK
    sign_type=RSA2
    timestamp=2014-01-01 08:08:08
    sign=“sign”
    version=1.0
    grant_type=authorization_code
    code=4b203fe6c11548bcabd8da5bb087a83b
    refresh_token=201208134b203fe6c11548bcabd8da5bb087a83b

接口调用示例

p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #454545}span.s1 {color: #e4af09}span.s2 {font: 12.0px 'PingFang SC'}

AlipayClient alipayClient = **new** DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2"); 
AlipaySystemOauthTokenRequest request = **new** AlipaySystemOauthTokenRequest();
request.setCode("2e4248c2f50b4653bf18ecee3466UC18");
request.setGrantType("authorization_code");
**try** {
    AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(request);
    System.out.println(oauthTokenResponse.getAccessToken());
} **catch** (AlipayApiException e) {
    //处理异常
    e.printStackTrace();
}

同步响应结果示例

{
    "alipay_system_oauth_token_response": {
        "access_token": "publicpBa869cad0990e4e17a57ecf7c5469a4b2",
        "user_id": "user_id",
        "alipay_user_id": "20881007434917916336963360919773",
        "expires_in": 300,
        "re_expires_in": 300,
        "refresh_token": "publicpB0ff17e364f0743c79b0b0d7f55e20bfc"
    },
    "sign": "sign"
}

第四步:调用接口获取用户信息

如果scope=auth_base,在第三步就可以获取到用户的userId,无需走第四步。如果scope=auth_user,才需要走第四步,通过access_token调用用户信息共享接口获取用户信息。

接口名称:alipay.user.info.share
接口请求示例

REQUEST URL: https://openapi.alipay.com/gateway.do
REQUEST METHOD: POST
CONTENT:
    app_id=app_id
    method=alipay.user.info.share
    charset=GBK
    sign_type=RSA2
    timestamp=2014-01-01 08:08:08
    sign=sign
    version=1.0
    grant_type=authorization_code
    code=4b203fe6c11548bcabd8da5bb087a83b
    auth_token=201208134b203fe6c11548bcabd8da5bb087a83b

接口调用示例

p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #454545}span.s1 {color: #e4af09}span.s2 {font: 12.0px 'PingFang SC'}

AlipayClient alipayClient = **new** DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2"); 
AlipayUserInfoShareRequest request = **new** AlipayUserInfoShareRequest();
String access_token = "composeBcd261a4867d94837a701f92816f18X18";
**try** {
    AlipayUserInfoShareResponse userinfoShareResponse = alipayClient.execute(request, access_token);
    System.out.println(userinfoShareResponse.getBody());
} **catch** (AlipayApiException e) {
    //处理异常
    e.printStackTrace();
}

同步响应结果示例

{
    "alipay_user_info_share_response": {
        "avatar": "https:\/\/tfsimg.alipay.com\/images\/partner\/T1k0xiXXRnXXXXXXXX",
        "nick_name": "张三",
        "city": "杭州",
        "province": "浙江省",
        "gender" : "M",
        "user_type_value": "2",
        "is_licence_auth": "F",
        "is_certified": "T",
        "is_certify_grade_a": "T",
        "is_student_certified": "F",
        "is_bank_auth": "T",
        "is_mobile_auth": "T",
        "alipay_user_id": "2088102015433735",
        "user_id": "20881007434917916336963360919773",
        "user_status": "T",
        "is_id_auth": "T"
    },
    "sign": "jhoSkfE7BTIbwEx0L8/H0GU0Z2DOZYIJlrUMyJL8wwwInVeXfz+CWqx0V2b3FvhMQSrb74dkzDQpGXGdZQZMldGe4+FSEQU1V3tWijpO9ZisNJnEpF+U2lQ7IUMLsgjjx9a0IdMwvXlqz1HPrmFZQjG2dvlFyXhi07HcEnVOJZw="
}

java调用代码:

/**
 * 支付宝支付授权获取Code
 *
 * @return
 * @throws IOException
 */
@RequestMapping(value = "/V6/AliPayAuthorize", method = RequestMethod.GET)
@ResponseStatus(value = HttpStatus.OK)
@ResponseBody
public void aliPayAuthorize(String auth_code) throws IOException { // String url

    ResponseEntity responseEntity = new ResponseEntity();


    // 通过code获取AccessToken
    AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",
        AlipayConfig.webapp_id, AlipayConfig.private_webapp_key,
        "json","UTF-8", AlipayConfig.ali_public_webapp_key,"RSA2");

    //获取用户信息授权
    AlipaySystemOauthTokenRequest requestLogin2 = new AlipaySystemOauthTokenRequest();
    requestLogin2.setCode(auth_code);
    requestLogin2.setGrantType("authorization_code");
    try {
        AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(requestLogin2);
        String accessToken = oauthTokenResponse.getAccessToken();
        String userId = oauthTokenResponse.getUserId();
        System.out.print("====================userId:"+userId);
        System.out.print("====================accessToken:"+accessToken);

        //调用接口获取用户信息
        AlipayUserInfoShareRequest requestUser = new AlipayUserInfoShareRequest();
        try {
            AlipayUserInfoShareResponse userinfoShareResponse = alipayClient.execute(requestUser, oauthTokenResponse.getAccessToken());
            if(userinfoShareResponse.isSuccess()){
                System.out.print(userinfoShareResponse.getBody());
                System.out.println("调用成功");
                System.out.print("UserId:" + userinfoShareResponse.getUserId() + "\n");//用户支付宝ID
                System.out.print("NickName:" + userinfoShareResponse.getNickName() + "\n");//用户支付宝昵称
                System.out.print("UserType:" + userinfoShareResponse.getUserType() + "\n");//用户类型
                System.out.print("UserStatus:" + userinfoShareResponse.getUserStatus() + "\n");//用户账户动态
                System.out.print("Email:" + userinfoShareResponse.getEmail() + "\n");//用户Email地址
                System.out.print("IsCertified:" + userinfoShareResponse.getIsCertified() + "\n");//用户是否进行身份认证
                System.out.print("IsStudentCertified:" + userinfoShareResponse.getIsStudentCertified() + "\n");//用户是否进行学生认证
            } else {
                System.out.println("调用失败");
            }

        } catch (AlipayApiException e) {
            //处理异常
            e.printStackTrace();
        }
    } catch (AlipayApiException e) {
        //处理异常
        e.printStackTrace();
    }


    RequestContext.setResponseEntity(responseEntity);

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容