蚂蚁金服开放平台
注册开发者,创建应用
审核的时候我是写项目上线(服务器)的网关和回调地址,审核通过后改本地测试网关和地址。
网关是(ip)地址+项目名称+gateway.do
配置一些固定的东西:这里需要注意的一个应用公钥和支付宝公钥,在创建应用的时候配置应用公钥会相应产生一个支付宝公钥。我们需要填写的是支付宝公钥和应用私钥
/**个人回调地址*/
public static final String REDIRECT_URI = "";
/**支付宝网关(固定)*/
public static final String URL = "https://openapi.alipay.com/gateway.do";
/**APPID 即创建应用后生成*/
public static final String APP_ID = "";
/**开发者私钥,由开发者自己生成*/
public static final String APP_PRIVATE_KEY = "";
/**参数返回格式,只支持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";
/**
* 接口权限值,目前只支持auth_user和auth_base两个值-->>
* auth_base:以auth_base为scope发起的网页授权,是用来获取进入页面的用户的userId的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(通常是业务页面)。
* auth_user:以auth_user为scope发起的网页授权,是用来获取用户的基本信息的(比如头像、昵称等)。但这种授权需要用户手动同意,用户同意后,就可在授权后获取到该用户的基本信息。若想获取用户信息,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>
首先是一个授权登录,这里你只能获取userId和其他的一些信息,并不能获取详细的用户名称头像等信息,主要区别是请求的地址不同。
stringBuilder
.append("https://openauth.alipay.com/oauth2/appToAppAuth.htm?app_id="+AlipayConstant.APP_ID)
.append("&redirect_uri="+AlipayConstant.REDIRECT_URI);
回调:
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, // 支付宝网关(固定)
AlipayConstant.APP_ID, // APPID 即创建应用后生成
AlipayConstant.APP_PRIVATE_KEY, // 开发者私钥,由开发者自己生成
AlipayConstant.FORMAT, // 参数返回格式,只支持json
AlipayConstant.CHARSET, // 编码集,支持GBK/UTF-8
AlipayConstant.ALIPAY_PUBLIC_KEY, // 支付宝公钥,由支付宝生成
AlipayConstant.SIGN_TYPE); // 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
AlipayOpenAuthTokenAppRequest aoataRequest = new AlipayOpenAuthTokenAppRequest();
// 设置请求参数 使用app_auth_code换取app_auth_token
aoataRequest.setBizContent("{\"grant_type\":\"authorization_code\",\"code\":\"" + appAuthCode + "\"}");
// 发送请求得到响应
AlipayOpenAuthTokenAppResponse aoataResponse = alipayClient.execute(aoataRequest);
if (!aoataResponse.isSuccess()) {
throw new RuntimeException("获取app_auth_token失败!" + aoataResponse.getSubMsg());
}
// 根据appAuthToken换取用户信息
AlipayOpenAuthTokenAppQueryRequest aoataqRequest = new AlipayOpenAuthTokenAppQueryRequest();
aoataqRequest.setBizContent("{\"app_auth_token\":\"" + aoataResponse.getAppAuthToken() + "\"}");
AlipayOpenAuthTokenAppQueryResponse appQueryResponse = alipayClient.execute(aoataqRequest);
if (!appQueryResponse.isSuccess()) {
throw new RuntimeException("获取用户授权信息失败!" + appQueryResponse.getSubMsg());
}
// 用户授权成功 获取授权信息
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;
}
下面授权能获取用户详细信息,名称头像等:
官方文档
第一步:URL拼接与scope详解
url拼接规则: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)//接口权限值,目前只支持auth_user和auth_base两个值
.append("&redirect_uri="+AlipayConstant.REDIRECT_URI);
回调:
// 第二步:获取auth_code
String auth_code = request.getParameter("auth_code");
// 第三步:使用auth_code换取接口access_token及用户userId
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConstant.URL, // 支付宝网关(固定)
AlipayConstant.APP_ID, // APPID 即创建应用后生成
AlipayConstant.APP_PRIVATE_KEY, // 开发者私钥,由开发者自己生成
AlipayConstant.FORMAT, // 参数返回格式,只支持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是一样的
// 第四步:调用接口获取用户信息
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();