程序访问登录网站-如何使用支付宝账号授权登录网站

本周,我们在项目开发中使用支付授权登录(一键登录)到我们的网站。 我总结一下假期期间的情况:

0.总体思路

为了避免混乱,我先说一下整体的执行流程:用户点击我们网站上的一个“支付授权登录”按钮,向java后台请求,完成字符串拼接(包括弹跳地址、appid、scope)在跳转到支付宝之前。 ,state),后台处理完成后会将此地址返回给后端。 后端会通过window.href="url"跳转到支付宝登录页面。 用户输入密码或扫码,支付宝将判断是否正确。 支付宝用户ID和访问令牌跳转到我写的反弹地址(这个反弹地址是我们自己写的,是支付宝调用的,需要在支付宝页面配置,下面会讲到)。 我根据支付宝用户ID查看自己的库,看到该用户是否存在? 如果存在,则说明已绑定到我们平台的用户系统,并重定向至成功页面。 否则,重定向到绑定的用户信息页面创建信息。 需要了解的是,我们的平台也有自己的用户体系。 从支付宝获取的alipayuser_id必须与我们平台的用户系统绑定。 否则,我们无法区分哪个用户是哪个。 绑定是在该用户信息页面完成的。 。

程序访问登录网站-如何使用支付宝账号授权登录网站

1. 打开蚂蚁金服开发服务并完成配置。

只讲了思路,下面介绍具体的操作流程。 由于需要调用支付宝的socket,因此需要激活蚂蚁金服的服务。 单击此处激活。 您需要营业执照或身份证信息。 通过初审后,创建一个应用程序,在功能选项中选择你要使用的服务,比如这里。 使用“获取会员信息”,点击“继续添加”即可添加其他,如右图:

程序访问登录网站-如何使用支付宝账号授权登录网站

点击概览下的应用信息,配置弹跳地址、私钥、秘钥程序访问登录网站,如右图:

下载支付宝SDK的jar后,已经集成了一个非常简单的调用方法。 参考文档如下:#s3

2. 代码开发

代码开发并不算太难。 有点棘手的是如何传递参数。 我通过状态传递它。 从官方文档可以看出:state参数不是必填参数,是商家定义的参数。 用户授权后,会原样重定向到redirecturi时返回给商家,但是最大宽度只能是100。最好能做到两者不可预测,并且可以证明两者之间存在相关性客户端及当前第三方网站的登录认证状态。 然后我们可以通过state参数来传递它。 比如我这里是通过10、2_201拼接的。 上面的数字代表操作类型,比如我的例子中,1代表登录,2代表更改支付宝账号,0代表无上级id,小于0代表有上级id。 接收到传递的参数后,使用split参数进行分割、解析、判断情况。 部分示例代码如下所示:

 /** * @Description 登录接口 * @Author 刘俊重 */ @NoLogin @RequestMapping("/supplierLogin") public R supplierLogin(@RequestBody Map map) throws Exception { //获取核心企业id,0表示不是通过核心企业邀请链接登录 Object coreId = map.get("coreId"); if (null == coreId || coreId == "") { coreId = 0; } String s = DbEnum.CallBack.Type.LOGIN+"_"+coreId; logger.info(">>>>>>>>>>>>>>>>>>>>s"+s); /***重定向至支付宝授权登录页*/ String encode = URLEncoder.encode(SystemVar.REDIRECT_URL,"UTF-8"); return R.ok().put("visitUrl", SystemVar.ALIPAY_URL+"?app_id=" + SystemVar.APP_ID + "&scope=auth_user&redirect_uri=" + encode + "&state=" + s); }

程序访问登录网站-如何使用支付宝账号授权登录网站

反弹函数的部分代码如下:

/** * @Description 支付宝登录成功之后的回调函数,供支付宝调用 * @Author 刘俊重 */ @NoLogin @RequestMapping("/callBackLogin") @ResponseBody public R callBackLogin(HttpServletRequest request, HttpServletResponse response) throws Exception { String authCode = request.getParameter("auth_code"); String state = request.getParameter("state"); /***我们需要的参数,拿到之后以下划线分割*/ if(null==state || state==""){ return R.error("获取支付宝授权失败"); } AlipaySystemOauthTokenResponse authToken = getAuthToken(authCode); if (null == authToken) { return R.error("获取支付宝授权失败"); } String userId = authToken.getUserId(); String accessToken = authToken.getAccessToken(); String[] split = state.split("_"); String type = split[0]; if(DbEnum.CallBack.Type.LOGIN.equals(type)){ String coreId = split[1]; //登录 /***根据支付宝用户id查询供应商是否存在*/ Map map = new HashMap(); map.put("alipayUserId", userId); SuppliersInfo suppliersInfo = suppliersInfoService.look(map); if (null == suppliersInfo) { if("0".equals(coreId)){ //说明没有注册而且没有带核心企业id,跳转至错误提示页面 response.sendRedirect(SystemVar.WEBSITE + "/#/error?userId=" + userId + "&coreId=" + coreId); return R.ok(); } //根据上级id查询是否确实存在,避免乱注册 Map param = new HashMap(); param.put("finmallId", coreId); CoreCorpInfo coreCorpInfo = coreCorpInfoService.look(param); if (null == coreCorpInfo) { response.sendRedirect(SystemVar.WEBSITE + "/#/error?userId=" + userId + "&coreId=" + coreId); return R.ok(); } logger.info(">>>>>>>>>>>>>>>>完善信息地址"+SystemVar.WEBSITE + "/#/fillCompMess?userId=" + userId + "&coreId=" + coreId); //信息不存在,说明没有注册,去完善信息页 response.sendRedirect(SystemVar.WEBSITE + "/#/fillCompMess?userId=" + userId + "&coreId=" + coreId); return R.ok(); } String auditState = suppliersInfo.getAuditState(); if (SuppliersInfo.AuditState.WAIT.equals(auditState)) { logger.info(">>>>>>>>>>>>>>>>待审核地址"+SystemVar.WEBSITE + "/#/waitExam?userId=" + userId + "&coreId=" + coreId); //待审核,进待审核提示页 response.sendRedirect(SystemVar.WEBSITE + "/#/waitExam?userId=" + userId + "&coreId=" + coreId); return R.ok(); } else if (SuppliersInfo.AuditState.UNPASSED.equals(auditState)) { logger.info(">>>>>>>>>>>>>>>>审核拒绝地址"+SystemVar.WEBSITE + "/#/refuse?userId=" + userId + "&coreId=" + coreId); //审核拒绝,进审核拒绝提示页 response.sendRedirect(SystemVar.WEBSITE + "/#/refuse?userId=" + userId + "&coreId=" + coreId); return R.ok(); } else if (SuppliersInfo.AuditState.PASSED.equals(auditState)) { //审核通过,把用户信息放session中 String token = TokenUtils.getToken(); cacheManager.getCache(SysCache.SESSION_CACHE_NAME).put(token, suppliersInfo); //往cookie中添加token CookieUtils.setCookie(request, response, CookieName.SCM_TOKEN, token); logger.info(">>>>>>>>>>>>>>>>审核通过地址"+SystemVar.WEBSITE + "/#/alipay?userId=" + userId + "&coreId=" + coreId + "&token=" + token); response.sendRedirect(SystemVar.WEBSITE + "/#/alipay?userId=" + userId + "&coreId=" + coreId + "&token=" + token); return R.ok(); } } return null; }

支付宝中获取authToken的方式如下(支付宝中也有例子):

程序访问登录网站-如何使用支付宝账号授权登录网站

 /** * @Description 获取支付宝authToken * @Author 刘俊重 * @Date 2017/11/27 */ private AlipaySystemOauthTokenResponse getAuthToken(String authCode) { AlipayClient alipayClient = new DefaultAlipayClient(SystemVar.ALIPAY_GATEWAY, SystemVar.APP_ID, SystemVar.PRIVATE_KEY, "json", CHARSET_UTF8, SystemVar.ALIPAY_PUBLIC_KEY, "RSA2"); AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest(); request.setCode(authCode); request.setGrantType("authorization_code"); AlipaySystemOauthTokenResponse oauthTokenResponse = null; try { oauthTokenResponse = alipayClient.execute(request); System.out.println(oauthTokenResponse.getAccessToken()); } catch (AlipayApiException e) { //处理异常 e.printStackTrace(); } return oauthTokenResponse; }

至此,我们已经获得了alipayuserid供我们使用。 如果我们还想获取其他信息,可以使用accessToken来换取用户信息。 文档中已经包含此内容,此处不再重复。

3.如何配置支付宝沙箱测试

支付宝只能填写一个退回地址。 如果项目已经启动,则无法同时配置生产和测试的退回地址。 幸运的是,支付宝提供了沙盒环境进行测试。 ,沙箱环境的文档地址如下:,你也可以阅读我下面提到的:首先去下面的地址:配置沙箱环境程序访问登录网站,包括沙箱的网段、授权url、appid、私钥、密钥,均与生产的不同,需要重新配置。 授权url如下: 即使您在沙盒环境中使用普通的支付宝账户也无法登录,必须使用沙盒环境分配的账户。 您可以在以下地址找到沙箱测试账号: 以上是支付宝授权登录网站的开发流程。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 网站程序 程序访问登录网站-如何使用支付宝账号授权登录网站 https://www.wkzy.net/game/196720.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务