diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/alipayUtil/AlipayUtil.java b/src/main/java/com/chaozhanggui/system/cashierservice/alipayUtil/AlipayUtil.java index 1cf36e5..925bda9 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/alipayUtil/AlipayUtil.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/alipayUtil/AlipayUtil.java @@ -1,9 +1,13 @@ package com.chaozhanggui.system.cashierservice.alipayUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.AlipayConfig; import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.internal.util.AlipayEncrypt; import com.alipay.api.request.AlipaySystemOauthTokenRequest; import com.alipay.api.response.AlipaySystemOauthTokenResponse; import lombok.SneakyThrows; @@ -42,6 +46,11 @@ public class AlipayUtil { */ @Value("${alipay.sdk.config.alipayPublicKey}") private String alipayPublicKey; + /** + * 支付宝公钥 + */ + @Value("${alipay.sdk.config.encryptKey}") + private String encryptKey; /** * 创建支付宝客户端 @@ -90,4 +99,36 @@ public class AlipayUtil { return response.getOpenId(); } + /** + * 获取支付宝用户的手机号码 + * @param encryptedData 密文 + * @return mobile + */ + public String getMobile(String encryptedData) throws Exception{ + if(StrUtil.isEmpty(encryptedData)){ + throw new AlipayApiException("加密数据不能为空"); + } + try { + log.info("解密前的数据,返回结果:{}", encryptedData); + String resp = AlipayEncrypt.decryptContent(encryptedData, "AES", encryptKey, "UTF-8"); + log.info("解密后的数据,返回结果:{}", resp); + boolean isJson = JSONUtil.isJson(resp); + if(!isJson){ + throw new AlipayApiException("解密后的数据不是json格式"); + } + JSONObject jsonObject = JSONUtil.parseObj(resp); + String code = jsonObject.getStr("code"); + String msg = jsonObject.getStr("msg"); + String mobile = jsonObject.getStr("mobile"); + if("10000".equals(code)){ + return mobile; + }else{ + throw new AlipayApiException(code,msg); + } + }catch (AlipayApiException e){ + log.error("获取支付宝用户的手机号码失败,错误码:{},错误信息:{}", e.getErrCode(), e.getErrMsg()); + throw e; + } + } + } diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/controller/LoginContoller.java b/src/main/java/com/chaozhanggui/system/cashierservice/controller/LoginContoller.java index a44af8e..680fa69 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/controller/LoginContoller.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/controller/LoginContoller.java @@ -111,12 +111,13 @@ public class LoginContoller { // 1.接收小程序发送的code // 2.开发者服务器 登录凭证校验接口 appi + appsecret + code JSONObject wxResp = WechatUtil.getSessionKeyOrOpenId(code, customAppId, customSecrete); - Integer errCode = wxResp.getInteger("errcode"); + //Integer errCode = wxResp.getInteger("errcode"); log.info("微信获取openid响应报文:{}", wxResp.toJSONString()); boolean hasOpenId = wxResp.containsKey("openid"); if (!hasOpenId) { return Result.fail("登录失败:" + wxResp.getString("errmsg")); } + String a = "{\"width\":\"58\",\"printerNum\":\"1\",\"categoryList\":[{\"id\":30,\"name\":\"奶茶\",\"shortName\":null,\"tree\":null,\"pid\":null,\"pic\":null,\"merchantId\":null,\"shopId\":null,\"style\":null,\"isShow\":null,\"detail\":null,\"sort\":null,\"keyWord\":null,\"createdAt\":null,\"updatedAt\":null},{\"id\":35,\"name\":\"酒水饮料\",\"shortName\":null,\"tree\":null,\"pid\":null,\"pic\":null,\"merchantId\":null,\"shopId\":null,\"style\":null,\"isShow\":null,\"detail\":null,\"sort\":null,\"keyWord\":null,\"createdAt\":null,\"updatedAt\":null},{\"id\":65,\"name\":\"火锅\",\"shortName\":null,\"tree\":null,\"pid\":null,\"pic\":null,\"merchantId\":null,\"shopId\":null,\"style\":null,\"isShow\":null,\"detail\":null,\"sort\":null,\"keyWord\":null,\"createdAt\":null,\"updatedAt\":null},{\"id\":95,\"name\":\"串串\",\"shortName\":null,\"tree\":null,\"pid\":null,\"pic\":null,\"merchantId\":null,\"shopId\":null,\"style\":null,\"isShow\":null,\"detail\":null,\"sort\":null,\"keyWord\":null,\"createdAt\":null,\"updatedAt\":null},{\"id\":96,\"name\":\"烧烤\",\"shortName\":null,\"tree\":null,\"pid\":null,\"pic\":null,\"merchantId\":null,\"shopId\":null,\"style\":null,\"isShow\":null,\"detail\":null,\"sort\":null,\"keyWord\":null,\"createdAt\":null,\"updatedAt\":null}],\"model\":\"normal\",\"feet\":\"0\",\"autoCut\":\"1\"}"; // 3.接收微信接口服务 获取返回的参数 String openid = wxResp.getString("openid"); return loginService.wxCustomLogin(openid, "", "", "", IpUtil.getIpAddr(request)); @@ -182,8 +183,23 @@ public class LoginContoller { if (ObjectUtil.isNull(map) || ObjectUtil.isEmpty(map) || !map.containsKey("code") || ObjectUtil.isEmpty(map.get("code"))) { Result.fail("code不能为空"); } - String code = map.get("code").toString(); + // 三方登录来源 wechat、alipay + String source = map.getOrDefault("source",AuthSource.WECHAT.getValue()); + String code = map.get("code"); + if (AuthSource.ALIPAY.getValue().equals(source)) { + try { + String mobile = alipayUtil.getMobile(code); + return Result.success(CodeEnum.SUCCESS, mobile); + }catch (AlipayApiException e){ + log.error("获取手机号失败:",e); + return Result.fail("获取手机号失败:"+e.getErrMsg()); + }catch (Exception e){ + e.printStackTrace(); + log.error("登录手机号失败:",e); + return Result.fail("获取手机号失败:未知错误"); + } + } String encryptedData = map.get("encryptedData"); String ivStr = map.get("iv"); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index f02cf71..85cb678 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -31,6 +31,7 @@ alipay: appId: 2021004145625815 privateKey: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCAjDBuS8K/IJb9ui+KuNm/sTUdEiaji4BNpZ92avO1N5JpNlGmac6ec4p3tNFT950sBLcQkClcUpQxUHQzAT6DYNNXOKyvfI/EmcqwCw6PaMNLs/8cV//J2WWZBUhLaOsjKurpm9/3W5MnTh4BGxIfBoeBMA8f8K3BgKdmyKtvIEV2h2cyjsMskdn+g6oNZcmWcms0pvpPHyH46mRaGFhpp0v19wX3WsamGldh1L2VntmaDN3C2XbSrXv90XYp5bEUqwTbLwXpMAlzTibF56d/iqv9oYi8cpAKougUFLOymnbutLNs2tLrEDSFwHcmG2/wbZHybZyYcIgFgv4arf+tAgMBAAECggEAf7hKKlw1y6Z6vvAtalxNZUuRZSfyog3p1bwYWxTavZPQcZ7Zs0lvVDmiO1u5m/7q96BbryY9IhCeUv0H5uF2lhwu/3s9AEL3qTPQkeb6eXxyhhX6A9RfPdM1Qbtg4CQHdHKg4qjP9znSVHwmDZ0y/QaEvdPdQzPjv92u9c2tn4N4x6XyBYcU5gzxiJNnIugCmBgcJo/3H2fgV+XXEhORPvy5of9b4oATHEaLS/8dAS2wuOjhzaGS4MXp3VkXn3XaYjwSzaL03qYWA+xm+aO5sJv8bmqZW7sNVck5o3sPo7cQ4VkBFVzyrRdmJcxcSRJ9MsB9JsrhoKI8pgaXrVie4QKBgQDU2vai0lpBIK/0jzRpPNoqdT8lnafnnWni8nU4kfAh+gCLi+HBPhQRT0kv4unQc2q2/gALE7sgZVO00JGY5a3R0orsojPoUSZlpypGW7GGqKy576NHn0nw4o/PdfysT92VWgt1hlfTf6qfCDhfE9APU+RGvlSWXcT8nxVel3iUaQKBgQCamoJN6+4v+chJvL2nqV8NVVRLp0vDIHxs1QOtKwUodx8Qp1D6CJYtavCXn8aNUFVNQJPJ7TQPpJjXP2rI4SN01weDwx+I+wh8PBGHV6/234R+6TvFgY1PrYgCdfNP4i/E7B4uyEhAxdU73PB8qkqRAeJGok05p7oG71KCOBiYpQKBgEZfGflcuDAeAW5GRhqg3rP4zWa/R7qgZVh9tll8jjp9b96y4XFE99d9MgId8BVVgyt6sEL5Q/2C4ni+F9TH4n6jMADp42VkJuCmsqhOOlP9whU67+2G8Sgtj0QUivPg964f9ffl8XVgGOW5DwIIB9p5btggptCLscufQK5kP545AoGADBvf6tR4wl8w9b2HqTMV08iEIqzGvVC1Dh0c/Zop/EJgN4CzUfIMOSBwGaAVAApzs+pD6QPgGP2OTwWTioo/qa4R05sbxDHNN1XJFa2jhZV6HiqMWOrNs5jm1zJ/zRjtHuJTdtyO9CvKiLbESy9XScY4/8lEfSiK5HIoJzTXkFUCgYAkYkvkW6psJpWj05XWq44UN0n6QOU/Igl35Um/iuOMVhsTmIt09STQVTuzJzfH82+sCqoRsD1blE5unKNUC1DK77aNKTv3Z0dxN9R7FAyfZRiYQXTrbBPBqWjay6FCNxn8e8UsJN4Z6FIV2LGlQI114krSap1MALKLVvnld0NaUQ== alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiQkrz+emAuS1mB3KKDOMmAZRd/BlPbh7fAIHAqAj1+QCZNcV3o2BTLIIqnuKpSlFXDG3uDzp2VsBxcizXuBbFyPGylnD9CgCj5abyh3+FIHPAZ2IM3TtpqImZ0TSPGXrMli4Nir7MvZktgccCqQKCC4o6iaDGz+UwWwJUIPna8fm2tiTZ+KH150CZbKVj4ZGNpBh5XSV/1dRgyQIV9D/EwSbkZ0n6VgKQLJBi0C2UE3QB17aL1Ir6+gDXIDbknN8O7GUD3aMGdThYdSRUb5wp9CZ5qfV7vCS/CgaRo38nhH3NOzkTL+7v0m1ZDHPmqEkn9VzZN6sCQdL7PoAOjHOCwIDAQAB + encryptKey: Hp1TbhOqevbHCA5ji/VlqQ== decorator: datasource: p6spy: