您的位置 首页 > 数码极客

【企业支付宝登录】如何使用支付宝账号授权登录网站

在本周的项目开发中,使用支付宝授权登录(点击登录)我们的网站在周末进行总结。

0.整体思维

为了防止大家的朋友们困惑,我先说一下整个执行过程。用户点击我们网站上的“支付宝授权登录”按钮,请求跳转到Java背景,完成跳转到支付宝前的字符串补丁(包括回调地址、appid、scope、state),在后台处理该地址后,前端通过window . HREF=“URL”进行支付宝这个回调地址是我们自己写的,是支付宝调用的,应该在支付宝上。我根据alipayuserid检查自己的库,查看用户是否存在,如果有说明已经绑定到我们平台的用户系统,就重定向到成功页面,否则重定向到用户信息绑定页面来补充信息。

需要明白的是我们平台也有自己的用户系统,必须将从支付宝拿过来的alipayuser_id与我们平台的用户系统进行绑定,否则区分不出哪个是哪个用户,绑定就是在这个完善用户信息页面进行的。

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

上面只说了思路,下面说具体的操作流程。既然需要调用支付宝的接口,那就要开通蚂蚁金服的服务,点此开通 ,需要营业执照或者身份证信息,审核通过后创建应用,并在功能选项中选择要使用的服务,比如我这里使用“获取会员信息”,点击“继续添加"可以添加其他的,如下图:

点击概览下面的应用信息,配置回调地址和公钥,密钥,如下图:

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

2.代码开发

代码开发不太难,有点绕的是怎么传参。我是通过state传递的。从官方文档中可以看到:state参数不是必须参数,属于商户自定义参数,用户授权后,重定向到redirecturi时会原样回传给商户,而且最大长度只能是100,最好是做到既不可预测,又可以证明客户端和当前第三方网站的登录认证状态存在关联,那我们就可以通过state参数进行传递,比如我这里通过10,2_201这种形式拼接的,前面的数代表操作类型,比如我这里1代表登录,2代表修改支付宝账号,0代表无上级id,大于0表示那就是上级id,然后拿到传递过来的参数之后使用split参数进行分割、解析、判断不同情况,部分示例代码如下:

/** * @Description 登录接口 * @Author 刘俊重 */ @NoLOGIN @requestMapping("/supplierLogin") public R supplierLogin(@RequestBody Map<String, Object> map) throws Exception { //获取核心企业id,0表示不是通过核心企业邀请链接登录 Object coreId = map.get("coreId"); if (null == coreId || coreId == "") { coreId = 0; } String s = DbEnum.CallBack.Ty;_"+coreId; logger.info(">>>>>>>>>>>>>>>>>>>>s"+s); /***重定向至支付宝授权登录页*/ String encode = URLEncoder.encode;UTF-8"); return R.ok().put("visitUrl", Sy;?app_id=" + Sy + "&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 = reque("auth_code"); String state = reque("state"); /***我们需要的参数,拿到之后以下划线分割*/ if(null==state || state==""){ return R.error("获取支付宝授权失败"); } AlipaySystemOauthTokenResponse authToken = getAuthToken(authCode); if (null == authToken) { return R.error("获取支付宝授权失败"); } String userId = au(); String accessToken = au(); String[] split = ("_"); String type = split[0]; i(type)){ String coreId = split[1]; //登录 /***根据支付宝用户id查询供应商是否存在*/ Map<String, Object> map = new HashMap<String, Object>(); map.put("alipayUserId", userId); SuppliersInfo suppliersInfo = (map); if (null == suppliersInfo) { if("0".equals(coreId)){ //说明没有注册而且没有带核心企业id,跳转至错误提示页面 re + "/#/error?userId=" + userId + "&coreId=" + coreId); return R.ok(); } //根据上级id查询是否确实存在,避免乱注册 Map<String, Object> param = new HashMap<String, Object>(); ("finmallId", coreId); CoreCorpInfo coreCorpInfo = coreCor(param); if (null == coreCorpInfo) { re + "/#/error?userId=" + userId + "&coreId=" + coreId); return R.ok(); } logger.info(">>>>>>>>>>>>>>>>完善信息地址"+Sy + "/#/fillCompMess?userId=" + userId + "&coreId=" + coreId); //信息不存在,说明没有注册,去完善信息页 re + "/#/fillCompMess?userId=" + userId + "&coreId=" + coreId); return R.ok(); } String auditState = (); if (auditState)) { logger.info(">>>>>>>>>>>>>>>>待审核地址"+Sy + "/#/waitExam?userId=" + userId + "&coreId=" + coreId); //待审核,进待审核提示页 re + "/#/waitExam?userId=" + userId + "&coreId=" + coreId); return R.ok(); } else if (auditState)) { logger.info(">>>>>>>>>>>>>>>>审核拒绝地址"+Sy + "/#/refuse?userId=" + userId + "&coreId=" + coreId); //审核拒绝,进审核拒绝提示页 re + "/#/refuse?userId=" + userId + "&coreId=" + coreId); return R.ok(); } else if (auditState)) { //审核通过,把用户信息放session中 String token = TokenU(); cac).put(token, suppliersInfo); //往cookie中添加token CookieU(request, response, CookieName.SCM_TOKEN, token); logger.info(">>>>>>>>>>>>>>>>审核通过地址"+Sy + "/#/alipay?userId=" + userId + "&coreId=" + coreId + "&token=" + token); re + "/#/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 DefaultAlipayClien, Sy, Sy, "json", CHARSET_UTF8, Sy, "RSA2"); AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest(); reque(authCode); reque("authorization_code"); AlipaySystemOauthTokenResponse oauthTokenResponse = null; try { oauthTokenResponse = ali(request); Sy()); } catch (AlipayApiException e) { //处理异常 e.printStackTrace(); } return oauthTokenResponse; }

到这里已经可以获取到alipayuserid供我们使用了,如果还想获取其它信息,可以使用accessToken换取用户信息,文档中有,这里不再赘述。

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

支付宝的回调地址只能填写一个,如果项目已经上线了,那总不能一会把回调地址配置成生产的,一会配置成测试的吧,好在支付宝提供了一套供测试使用的沙箱环境,沙箱环境的文档地址如下: ,也可以看我下面说的这些: 首先进入如下地址: 配置沙箱环境,包括沙箱的网关,授权url,appid,公钥,密钥,均跟生产的都不同,需要重新配置,其中授权url如下: 。沙箱环境使用正常的支付宝账号也无法登录,必须要使用沙箱环境分配的账号,可以在下面地址中找到沙箱测试账号: ,以上便是支付宝授权登录网站的开发流程。

关于作者: admin

无忧经验小编鲁达,内容侵删请Email至wohenlihai#qq.com(#改为@)

热门推荐