第三方登录之接入支付宝
第三方登录admin 发布于:2019-01-09 16:33:00
阅读:loading
基本上所有的使用第三方账号登录都主要分为两个部分:
第一:在其开发者中心(或开放平台)创建工程,并配置工程相关信息;
第二:选择登录接入的方式(下载开发相关资源),并将登录代码集成至具体的开发应用中;
可能你还没有使用支付宝登录过第三方系统吧,涉及到个人的金融信息也是一个较为敏感的事情,况且是在素不相识互联网的另一端上,但是支付宝这种知名的大企业,在安全性方面的实力值得你放心授权,本站作为一名个人开发者,只记录有昵称、头像、ID而已,其它的关于性别、出生年月、城市之类的一律飘过了,更多的也无法获取到(更多的需要签约)。
-------------------------------------------------分割线----------------------------------------------
<!-- alipay -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.4.49.ALL</version>
</dependency>
#接入Alipay支付宝登录
alipay.connect.appId=2015XXXXXXXXXX
alipay.connect.toAuth=https://openauth.alipay.com/oauth2/publicAppAuthorize.htm
alipay.connect.callback=http://www.chendd.cn/XXXXXXXXXXXXXXXXXXXX
alipay.connect.authAddress=https://openapi.alipay.com/gateway.do
alipay.connect.app_private_key=MIIEvgIBXXXXXXXXXXXXXXXXXXXXXXXXXX
alipay.connect.alipay_public_key=MIIBIjXXXXXXXXXXXXXXXXXXXXXXXXXX
(1)、callback不多解释了,是本站的授权回调地址;
(2)、app_private_key是根据创建应用时要求使用它提供的软件生存的私钥和公钥,其中这里填的是私钥;
(3)、alipay_public_key需要注意,看参数定义并不是为app_public_key而是alipay_public_key,指的是由阿里给你的app生存的公钥,与上一步骤中的私钥是两个东西,如上图中的标红框内查看支付宝公钥处显示的内容;
(4)、上图中的查看应用公钥为步骤2中的生成的公钥,等于说在支付宝的应用后台只需要设置公钥即可,私钥设置在自己的配置文件中,作为内部的解析使用,并不往支付宝接口中传递;
(5)、toAuth参数为去授权页面,除此之外还有一些别的地址,这里使用这个地址需要与scope参数对应;
@Controller
@Scope("prototype")
@RequestMapping("/alipay-login")
public class AlipayLoginController extends ThirdLoginConnectController { private String appId = connectProps.getProperty("alipay.connect.appId");
private String toAuth = connectProps.getProperty("alipay.connect.toAuth");
private String callback = connectProps.getProperty("alipay.connect.callback");
private String authAddress = connectProps.getProperty("alipay.connect.authAddress");
private String appPrivateKey = connectProps.getProperty("alipay.connect.app_private_key");
private String alipayPublicKey = connectProps.getProperty("alipay.connect.alipay_public_key");
@ModelAttribute
public void initAlipayProps() throws UnsupportedEncodingException {
toAuth += "?app_id=" + appId + "&scope=auth_user&redirect_uri=" + URLEncoder.encode(callback, "utf-8");
}
@RequestMapping("/alipayConnect")
public void alipayConnect() throws Exception {
//跳转至登录授权页面
response.sendRedirect(toAuth);
}
@RequestMapping("/alipayCallback")
public void alipayCallback() throws Exception {
Map<String , Object> params = CommonUtils.getParameterMap(request);
System.out.println(params);
AlipayClient alipayClient = new DefaultAlipayClient(authAddress, appId, appPrivateKey , "json",
"UTF-8", alipayPublicKey, "RSA2");
String authCode = (String) params.get("auth_code");
//获取Token
AlipaySystemOauthTokenRequest oauthTokenRequest = new AlipaySystemOauthTokenRequest();
oauthTokenRequest.setCode(authCode);
oauthTokenRequest.setGrantType("authorization_code");
AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(oauthTokenRequest);
String accessToken = oauthTokenResponse.getAccessToken();
if(StringUtils.isEmpty(accessToken)) {
throw new Exception("接入支付宝登录认证出现错误,无法获取到accessToken");
}
//获取用户信息
AlipayUserInfoShareRequest userInfoRequest = new AlipayUserInfoShareRequest();
AlipayUserInfoShareResponse userInfoResponse = alipayClient.execute(userInfoRequest , accessToken);
if(userInfoResponse.isSuccess()) {
System.out.println(String.format("用户头像地址:%s,id:%s,uname:%s" , userInfoResponse.getUserId() ,
userInfoResponse.getNickName() , userInfoResponse.getAvatar()));
//此处省略重定向
} else {
throw new Exception("接入支付宝登录授权出现错误,没有用户信息");
}
}
}
(1)、强烈要求参考上述的参数说明处;
(2)、根据示例代码来传递指定的参数:
(3)、授权后的毁掉地址需要使用URLEncode进行编码,将特殊字符进行转码;
(4)、有些在开发环境接入时使用的是alipaydev的沙箱环境时,我建议是通过修改host文件将本地IP映射为实际域名去测试;
(5)、解释一下Alipay给出的代码示例中的参数解释,代码参考如下:
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipaydev.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2");
APP_ID、APP_PRIVATE_KEY、ALIPAY_PUBLIC_KEY 这3个参数特别要注意,至于详细介绍参见上文给出的解释,这些都是踩过的坑;
点赞