审核的时候我是写项目上线(服务器)的网关和回调地址,审核通过后改本地测试网关和地址。

网关是(ip)地址+项目名称+gateway.do

Java调用支付宝身份认证接口_ java支付宝授权登录_开发者


配置一些固定的东西:这里需要注意的一个应用公钥和支付宝公钥,在创建应用的时候配置应用公钥会相应产生一个支付宝公钥。我们需要填写的是支付宝公钥和应用私钥

/**个人回调地址*/
	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";

pom的配置:SDK下载地址

<!-- 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();