第三方登录之接入支付宝

第三方登录
placeholder image
admin 发布于:2019-01-09 16:33:00
阅读:loading

基本介绍

基本上所有的使用第三方账号登录都主要分为两个部分:

第一:在其开发者中心(或开放平台)创建工程,并配置工程相关信息;

第二:选择登录接入的方式(下载开发相关资源),并将登录代码集成至具体的开发应用中;

可能你还没有使用支付宝登录过第三方系统吧,涉及到个人的金融信息也是一个较为敏感的事情,况且是在素不相识互联网的另一端上,但是支付宝这种知名的大企业,在安全性方面的实力值得你放心授权,本站作为一名个人开发者,只记录有昵称、头像、ID而已,其它的关于性别、出生年月、城市之类的一律飘过了,更多的也无法获取到(更多的需要签约)。

image.png

-------------------------------------------------分割线----------------------------------------------

image.png

maven坐标

   <!-- 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代码

@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(authAddressappIdappPrivateKey , "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("用户头像地址:%sid%suname%s" , userInfoResponse.getUserId() ,

                   userInfoResponse.getNickName() , userInfoResponse.getAvatar()));

         //此处省略重定向

      } else {

         throw new Exception("接入支付宝登录授权出现错误,没有用户信息");

      }

     

   }

 }

运行效果

image.png

image.png

小技巧

(1)、强烈要求参考上述的参数说明处;

(2)、根据示例代码来传递指定的参数:

(3)、授权后的毁掉地址需要使用URLEncode进行编码,将特殊字符进行转码;

(4)、有些在开发环境接入时使用的是alipaydev的沙箱环境时,我建议是通过修改host文件将本地IP映射为实际域名去测试;

(5)、解释一下Alipay给出的代码示例中的参数解释,代码参考如下:

AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipaydev.com/gateway.do"APP_IDAPP_PRIVATE_KEY"json"CHARSETALIPAY_PUBLIC_KEY"RSA2"); 

    APP_ID、APP_PRIVATE_KEY、ALIPAY_PUBLIC_KEY 这3个参数特别要注意,至于详细介绍参见上文给出的解释,这些都是踩过的坑;


 点赞


 发表评论

当前回复:作者

 评论列表


留言区