diff --git a/smart-switch-ruoyi/smart-switch-common/pom.xml b/smart-switch-ruoyi/smart-switch-common/pom.xml
index e6bcb592..35fb64e5 100644
--- a/smart-switch-ruoyi/smart-switch-common/pom.xml
+++ b/smart-switch-ruoyi/smart-switch-common/pom.xml
@@ -16,6 +16,12 @@
     </description>
 
     <dependencies>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>2.0.53</version>
+        </dependency>
+
         <!--hutool-->
         <dependency>
             <groupId>cn.hutool</groupId>
diff --git a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/auth/ali/AliAuthService.java b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/auth/ali/AliAuthService.java
index 7e331d64..59c517de 100644
--- a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/auth/ali/AliAuthService.java
+++ b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/auth/ali/AliAuthService.java
@@ -1,8 +1,21 @@
 package com.ruoyi.common.auth.ali;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.TypeReference;
+import com.alibaba.fastjson.parser.Feature;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.AlipayConfig;
+import com.alipay.api.internal.util.AlipayEncrypt;
+import com.alipay.api.internal.util.AlipaySignature;
+import com.alipay.api.request.AlipaySystemOauthTokenRequest;
+import com.alipay.api.response.AlipaySystemOauthTokenResponse;
+import com.ruoyi.common.exception.ServiceException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Map;
+
 /**
  * 支付宝认证服务
  * @author wjh
@@ -11,12 +24,94 @@ import org.springframework.stereotype.Service;
 @Service
 public class AliAuthService {
 
+    @Autowired
+    private AlipayClient alipayClient;
+
     @Autowired
     private AliConfig aliConfig;
 
 
     public String getOpenId(String loginCode) {
-        // TODO
+        // 构造请求参数以调用接口
+        AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
+        // 设置授权码
+        request.setCode(loginCode);
+        // 设置授权方式
+        request.setGrantType("authorization_code");
+
+        try {
+            AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
+            System.out.println(response.getBody());
+
+            if (response.isSuccess()) {
+                return response.getUserId();
+            } else {
+                System.out.println("调用失败");
+                // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接
+                // String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
+                // System.out.println(diagnosisUrl);
+            }
+        } catch (Exception e) {
+            throw new ServiceException(e.getMessage());
+        }
+
         return null;
     }
+
+    /**
+     * 通过密文获取到手机号
+     */
+    public String getPhoneNumber(String response) {
+        // TODO 获取手机号实现
+        return this.decrypt(response);
+    }
+
+    /**
+     * 解密
+     * @param response 前端响应(密文)
+     */
+    private String decrypt(String response) {
+
+        //1. 获取验签和解密所需要的参数
+        Map<String, String> openapiResult = JSON.parseObject(response,new TypeReference<Map<String, String>>() {}, Feature.OrderedField);
+
+        String signType = "RSA2";
+        String charset = "UTF-8";
+        String encryptType = "AES";
+        String sign = openapiResult.get("sign");
+        String content = openapiResult.get("response");
+        //判断是否为加密内容
+        boolean isDataEncrypted = !content.startsWith("{");
+        boolean signCheckPass = false;
+        //2. 验签
+        String signContent = content;
+        // 你的小程序对应的支付宝公钥(为扩展考虑建议用appId+signType做密钥存储隔离)
+        String signVeriKey = aliConfig.getAlipayPublicKey();
+        // 你的小程序对应的加解密密钥(为扩展考虑建议用appId+encryptType做密钥存储隔离)
+        String decryptKey = aliConfig.getPrivateKey();//如果是加密的报文则需要在密文的前后添加双引号
+        if (isDataEncrypted) {
+            signContent = "\"" + signContent + "\"";
+        } try {
+            signCheckPass = AlipaySignature.rsaCheck(signContent, sign, signVeriKey, charset, signType);
+        } catch (AlipayApiException e) {
+            // 验签异常, 日志
+        } if (!signCheckPass) {
+            //验签不通过(异常或者报文被篡改),终止流程(不需要做解密)
+            throw new ServiceException("验签失败");
+        }
+        //3. 解密
+        String plainData = null;
+        if (isDataEncrypted) {
+            try {
+                plainData = AlipayEncrypt.decryptContent(content, encryptType, decryptKey, charset);
+            } catch (AlipayApiException e) {
+                //解密异常, 记录日志
+                throw new ServiceException("解密异常");
+            }
+        } else {
+            plainData = content;
+        }
+
+        return plainData;
+    }
 }
diff --git a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/auth/ali/AliConfig.java b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/auth/ali/AliConfig.java
index cd46b4e4..38e8e775 100644
--- a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/auth/ali/AliConfig.java
+++ b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/auth/ali/AliConfig.java
@@ -1,6 +1,7 @@
 package com.ruoyi.common.auth.ali;
 
 import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
 import com.alipay.api.AlipayConfig;
 import com.alipay.api.DefaultAlipayClient;
 import lombok.Data;
@@ -16,18 +17,36 @@ import org.springframework.stereotype.Component;
 @Data
 public class AliConfig {
 
-//    @Value("${ali.appId}")
-//    private String appId;
-//
-//    @Value("${ali.privateKey}")
-//    private String privateKey;
-//
-//    @Bean
-//    public AlipayConfig alipayConfig() {
-//        AlipayConfig config = new AlipayConfig();
-//        config.setAppId(appId);
-//        config.setPrivateKey(privateKey);
-//
-//        return config;
-//    }
+    // 应用ID
+    @Value("${ali.appId}")
+    private String appId;
+
+    // 应用私钥
+    @Value("${ali.privateKey}")
+    private String privateKey;
+
+    // 应用公钥
+    @Value("${ali.publicKey}")
+    private String publicKey;
+
+    // 支付宝公钥
+    @Value("${ali.alipayPublicKey}")
+    private String alipayPublicKey;
+
+    private AlipayConfig getAlipayConfig() {
+        AlipayConfig alipayConfig = new AlipayConfig();
+        alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
+        alipayConfig.setAppId(appId);
+        alipayConfig.setPrivateKey(privateKey);
+        alipayConfig.setAlipayPublicKey(alipayPublicKey);
+        alipayConfig.setFormat("json");
+        alipayConfig.setCharset("UTF-8");
+        alipayConfig.setSignType("RSA2");
+        return alipayConfig;
+    }
+
+    @Bean
+    public AlipayClient alipayClient() throws AlipayApiException {
+        return new DefaultAlipayClient(getAlipayConfig());
+    }
 }
diff --git a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/Constants.java b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/Constants.java
index bba5e6bb..1352833c 100644
--- a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/Constants.java
+++ b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/Constants.java
@@ -172,11 +172,21 @@ public class Constants
      */
     public static final String CUSTOM_LOGIN_WX = "wx_login";
 
+    /**
+     * 支付宝登录
+     */
+    public static final String CUSTOM_LOGIN_ALI = "ali_login";
+
     /**
      * 登录用户为微信
      */
     public static final String USER_TYPE_WX = "USER_TYPE_WX";
 
+    /**
+     * 登录用户为支付宝
+     */
+    public static final String USER_TYPE_ALI = "USER_TYPE_ALI";
+
     /**
      * 登录用户为APP账密登录
      */
diff --git a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/core/domain/entity/SmUser.java b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/core/domain/entity/SmUser.java
index 807b008a..39103629 100644
--- a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/core/domain/entity/SmUser.java
+++ b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/core/domain/entity/SmUser.java
@@ -244,4 +244,7 @@ public class SmUser extends BaseEntity
 
     @ApiModelProperty("代理商是否允许商户开关设备")
     private Boolean agentAllowMchSwitch;
+
+    @ApiModelProperty("支付宝openId")
+    private String aliOpenId;
 }
diff --git a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/core/domain/model/AliLoginBody.java b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/core/domain/model/AliLoginBody.java
index d7834f59..12cb4724 100644
--- a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/core/domain/model/AliLoginBody.java
+++ b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/core/domain/model/AliLoginBody.java
@@ -16,8 +16,8 @@ import javax.validation.constraints.NotNull;
 @ApiModel
 public class AliLoginBody {
 
-//    @ApiModelProperty("用于获取手机号的授权码,首次登录必填")
-//    private String mobileCode;
+    @ApiModelProperty("获取手机号的密文")
+    private String mobileCiphertext;
 
     @NotBlank(message = "登录授权码不允许为空")
     @ApiModelProperty("my.getAuthCode获取的登录授权码,用于获取openId,必填")
diff --git a/smart-switch-ruoyi/smart-switch-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/smart-switch-ruoyi/smart-switch-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
index 2c03767d..8971c044 100644
--- a/smart-switch-ruoyi/smart-switch-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
+++ b/smart-switch-ruoyi/smart-switch-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -7,6 +7,7 @@ import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
 import com.alibaba.fastjson2.JSONObject;
 import com.ruoyi.common.auth.ali.AliAuthService;
 import com.ruoyi.common.core.domain.entity.SmUser;
+import com.ruoyi.common.core.domain.model.AliLoginBody;
 import com.ruoyi.common.core.domain.model.WxLoginBody;
 import com.ruoyi.common.enums.UserStatus;
 import com.ruoyi.common.enums.UserType;
@@ -270,7 +271,7 @@ public class SysLoginService
         // 通过openId查询用户
         String openId = wxAuthService.getOpenId(body.getLoginCode());
         ServiceUtil.assertion(openId == null, "获取微信openId失败");
-        SmUser user = smUserService.selectSmUserByWxOpenId(openId);
+        SmUserVO user = smUserService.selectSmUserByWxOpenId(openId);
 
         // 若用户不存在,则使用openId进行注册
         if (user == null || Objects.equals(user.getDelFlag(), UserStatus.DELETED.getCode())) {
@@ -281,7 +282,7 @@ public class SysLoginService
                 mobile = wxAuthService.getWxPhoneNumber(body.getMobileCode());
             }
             // 用户注册
-            user = registerWx(openId, mobile);
+            user = smUserService.registerWx(openId, mobile);
         }
         ServiceUtil.assertion(user == null, "用户不存在");
 
@@ -308,34 +309,6 @@ public class SysLoginService
         return tokenService.createToken(loginUser);
     }
 
-    /**
-     * 注册微信用户
-     * @param openId 微信OpenId
-     */
-    private SmUserVO registerWx(String openId, String mobile) {
-        if (StringUtils.isBlank(openId)) {
-            return null;
-        }
-
-        String name = "微信" + openId.substring(openId.length() - 4);
-
-        // 添加用户
-        SmUserVO newUser = new SmUserVO();
-        newUser.setUserName(name);
-        newUser.setWxOpenId(openId);
-        newUser.setPhonenumber(mobile);
-        newUser.setType(UserType.USER.getType());
-        smUserService.insertSmUser(newUser);
-
-        // 添加微信账户
-//        Account accountData = new Account();
-//        accountData.setUserId(newUser.getUserId());
-//        accountData.setAccountNo(newUser.getWxOpenId());
-//        accountData.setAccountType(AccountType.WECHAT.getType());
-//        accountService.insertSmAccount(accountData);
-
-        return newUser;
-    }
 
     public String userLogin(String username, String password, String code, String uuid) {
         // 验证码校验
@@ -344,7 +317,7 @@ public class SysLoginService
         return this.appLogin(username, password);
     }
 
-    public String aliLogin(WxLoginBody body) {
+    public String aliLogin(AliLoginBody body) {
         // 通过支付宝openId查询用户
         String openId = aliAuthService.getOpenId(body.getLoginCode());
         ServiceUtil.assertion(openId == null, "获取支付宝openId失败");
@@ -353,24 +326,23 @@ public class SysLoginService
 
         // 若用户不存在,则使用openId进行注册
         if (user == null || Objects.equals(user.getDelFlag(), UserStatus.DELETED.getCode())) {
-            // 获取手机号
             boolean loginWithPhone = sysConfigService.getBoolean(ConfigKey.ARRIVAL_DELAY);
             String mobile = null;
-            if (loginWithPhone && StringUtils.hasText(body.getMobileCode())) {
-                mobile = wxAuthService.getWxPhoneNumber(body.getMobileCode());
+            if (loginWithPhone && StringUtils.hasText(body.getMobileCiphertext())) {
+                mobile = aliAuthService.getPhoneNumber(body.getMobileCiphertext());
             }
             // 用户注册
-            user = registerWx(openId, mobile);
+            user = smUserService.registerAli(openId, mobile);
         }
         ServiceUtil.assertion(user == null, "用户不存在");
 
         Authentication authentication = null;
         try {
-            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getUserId(), Constants.CUSTOM_LOGIN_WX);
+            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getUserId(), Constants.CUSTOM_LOGIN_ALI);
             // 用户名和密码等信息保存在一个上下文中,只要是同一线程等会就能拿到用户名和密码,也就是能在loadUserByUsername(String username)方法中进行密码验证等
             AuthenticationContextHolder.setContext(authenticationToken);
             // 把用户登录类型放在上下文中的details属性中,在UserDetailsServiceImpl.loadUserByUsername中获取
-            authenticationToken.setDetails(Constants.USER_TYPE_WX);
+            authenticationToken.setDetails(Constants.USER_TYPE_ALI);
             // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
             authentication = authenticationManager.authenticate(authenticationToken);
         }
diff --git a/smart-switch-ruoyi/smart-switch-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java b/smart-switch-ruoyi/smart-switch-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
index ee621ba3..9c136929 100644
--- a/smart-switch-ruoyi/smart-switch-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
+++ b/smart-switch-ruoyi/smart-switch-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
@@ -58,7 +58,7 @@ public class UserDetailsServiceImpl implements UserDetailsService
                 this.checkUser(user, username);
                 passwordService.validate(user);
                 return createLoginUser(user);
-            } else if(Constants.USER_TYPE_WX.equals(userType)) {
+            } else if(Constants.USER_TYPE_WX.equals(userType) || Constants.USER_TYPE_ALI.equals(userType) ) {
                 // app 用户微信登录
                 SmUser user = smUserService.selectSmUserByUserId(Long.parseLong(username));
                 this.checkUser(user, username);
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/SmUserQuery.java b/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/SmUserQuery.java
index 77066933..f83de936 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/SmUserQuery.java
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/SmUserQuery.java
@@ -37,4 +37,7 @@ public class SmUserQuery extends SmUser {
 
     @ApiModelProperty("实名或用户名")
     private String realOrUserName;
+
+    @ApiModelProperty("精准支付宝OpenId")
+    private String eqAliOpenId;
 }
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/user/mapper/SmUserMapper.xml b/smart-switch-service/src/main/java/com/ruoyi/ss/user/mapper/SmUserMapper.xml
index 4d11b443..5f4ca4db 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/ss/user/mapper/SmUserMapper.xml
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/user/mapper/SmUserMapper.xml
@@ -60,6 +60,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             su.show_bill_mobile_price,
             su.agent_device_service,
             su.agent_allow_mch_switch,
+            su.ali_open_id,
             if(su.is_real, su.real_name, su.user_name) as real_or_user_name,
             (select sum(stb.money) from sm_transaction_bill stb where stb.user_id = su.user_id and stb.type = '1' and stb.status = '2') as recharge_amount,
             (select sum(stb.arrival_amount) from sm_transaction_bill stb where stb.user_id = su.user_id and stb.type = '2' and stb.status = '14') as with_drawl_amount,
@@ -91,6 +92,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="readMchLicence != null "> and read_mch_licence = #{readMchLicence}</if>
         <if test="showBillMobile != null "> and show_bill_mobile = #{showBillMobile}</if>
         <if test="excludeUserId != null">and su.user_id != #{excludeUserId}</if>
+        <if test="aliOpenId != null and aliOpenId != ''">and su.ali_open_id like concat('%', #{aliOpenId}, '%')</if>
+        <if test="eqAliOpenId != null and eqAliOpenId != ''">and su.ali_open_id = #{eqAliOpenId}</if>
         <if test="agentAllowMchSwitch != null">and su.agent_allow_mch_switch != #{agentAllowMchSwitch}</if>
         <if test="realOrUserName != null and realOrUserName != ''">and if(su.is_real, su.real_name, su.user_name) like concat('%', #{realOrUserName}, '%')</if>
         <if test="tenantDeviceId != null">
@@ -201,6 +204,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="showBillMobilePrice != null">show_bill_mobile_price,</if>
             <if test="agentDeviceService != null">agent_device_service,</if>
             <if test="agentAllowMchSwitch != null">agent_allow_mch_switch,</if>
+            <if test="aliOpenId != null">ali_open_id,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="userName != null and userName != ''">#{userName},</if>
@@ -249,6 +253,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="showBillMobilePrice != null">#{showBillMobilePrice},</if>
             <if test="agentDeviceService != null">#{agentDeviceService},</if>
             <if test="agentAllowMchSwitch != null">#{agentAllowMchSwitch},</if>
+            <if test="aliOpenId != null">#{aliOpenId},</if>
          </trim>
     </insert>
 
@@ -313,6 +318,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="showBillMobilePrice != null">show_bill_mobile_price = #{showBillMobilePrice},</if>
             <if test="agentDeviceService != null">agent_device_service = #{agentDeviceService},</if>
             <if test="agentAllowMchSwitch != null">agent_allow_mch_switch = #{agentAllowMchSwitch},</if>
+            <if test="aliOpenId != null">ali_open_id = #{aliOpenId},</if>
         </trim>
         where user_id = #{userId}
     </update>
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/ISmUserService.java b/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/ISmUserService.java
index 6c5a4372..9759a267 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/ISmUserService.java
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/ISmUserService.java
@@ -268,4 +268,18 @@ public interface ISmUserService
      * @return
      */
     SmUserVO selectSmUserByAliOpenId(String openId);
+
+    /**
+     * 注册支付宝账号
+     */
+    SmUserVO registerAli(String openId, String mobile);
+
+    /**
+     * 注册微信账号
+     * @param openId
+     * @param mobile
+     * @return
+     */
+    SmUserVO registerWx(String openId, String mobile);
+
 }
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/impl/SmUserServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/impl/SmUserServiceImpl.java
index dd937189..5b10fb23 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/impl/SmUserServiceImpl.java
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/user/service/impl/SmUserServiceImpl.java
@@ -1,5 +1,6 @@
 package com.ruoyi.ss.user.service.impl;
 
+import com.github.pagehelper.PageHelper;
 import com.ruoyi.common.auth.wx.WxAuthService;
 import com.ruoyi.common.constant.CacheConstants;
 import com.ruoyi.common.core.domain.entity.SmUser;
@@ -633,8 +634,58 @@ public class SmUserServiceImpl implements ISmUserService
      */
     @Override
     public SmUserVO selectSmUserByAliOpenId(String openId) {
-        // TODO
-        return null;
+        if (StringUtils.isBlank(openId)) {
+            return null;
+        }
+        SmUserQuery query = new SmUserQuery();
+        query.setEqAliOpenId(openId);
+        return this.selectOne(query);
+    }
+
+    @Override
+    public SmUserVO registerAli(String openId, String mobile) {
+        if (StringUtils.isBlank(openId)) {
+            return null;
+        }
+
+        String name = "支付宝" + openId.substring(openId.length() - 4);
+
+        // 添加用户
+        SmUserVO data = new SmUserVO();
+        data.setUserName(name);
+        data.setAliOpenId(openId);
+        data.setPhonenumber(mobile);
+        data.setType(UserType.USER.getType());
+        int insert = this.insertSmUser(data);
+        ServiceUtil.assertion(insert != 1, "注册支付宝用户失败");
+
+        return this.selectSmUserByUserId(data.getUserId());
+    }
+
+    @Override
+    public SmUserVO registerWx(String openId, String mobile) {
+        if (StringUtils.isBlank(openId)) {
+            return null;
+        }
+
+        String name = "微信" + openId.substring(openId.length() - 4);
+
+        // 添加用户
+        SmUserVO data = new SmUserVO();
+        data.setUserName(name);
+        data.setWxOpenId(openId);
+        data.setPhonenumber(mobile);
+        data.setType(UserType.USER.getType());
+        int insert = this.insertSmUser(data);
+        ServiceUtil.assertion(insert != 1, "注册微信用户失败");
+
+        return this.selectSmUserByUserId(data.getUserId());
+    }
+
+    private SmUserVO selectOne(SmUserQuery query) {
+        PageHelper.startPage(1, 1);
+        List<SmUserVO> list = this.selectSmUserList(query);
+        return CollectionUtils.getFirst(list);
     }
 
     private int selectCountByPhone(String phone) {
diff --git a/smart-switch-web/src/main/java/com/ruoyi/web/controller/app/AppAuthController.java b/smart-switch-web/src/main/java/com/ruoyi/web/controller/app/AppAuthController.java
index 92f7381e..d24d908a 100644
--- a/smart-switch-web/src/main/java/com/ruoyi/web/controller/app/AppAuthController.java
+++ b/smart-switch-web/src/main/java/com/ruoyi/web/controller/app/AppAuthController.java
@@ -4,6 +4,7 @@ import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.model.AliLoginBody;
 import com.ruoyi.common.core.domain.model.LoginBody;
 import com.ruoyi.common.core.domain.model.WxLoginBody;
 import com.ruoyi.common.enums.BusinessType;
@@ -65,7 +66,7 @@ public class AppAuthController extends BaseController {
     @Log(title = "支付宝授权登录", businessType = BusinessType.OTHER)
     @ApiOperation("支付宝授权登录")
     @PostMapping("/aliLogin")
-    public AjaxResult aliLogin(@RequestBody @Validated WxLoginBody body)
+    public AjaxResult aliLogin(@RequestBody @Validated AliLoginBody body)
     {
         AjaxResult ajax = AjaxResult.success();
         // 生成令牌
diff --git a/smart-switch-web/src/main/resources/application-dev.yml b/smart-switch-web/src/main/resources/application-dev.yml
index 013ef4d0..2d3bd212 100644
--- a/smart-switch-web/src/main/resources/application-dev.yml
+++ b/smart-switch-web/src/main/resources/application-dev.yml
@@ -138,5 +138,11 @@ liveness:
 
 # 支付宝小程序
 ali:
+  # 应用ID
   appId: 2021004193649611
-  privateKey: D:\project\smart-switch\alipayPublicKey_RSA2.txt
+  # 应用私钥
+  privateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCLmoyeJgMCIh5xeYOzg1mnRTTPplkBTJAeXozAV/dTCu6vaKNPPRXjDwYILFzpYGAVhe9NNw6mcVq9WU4WEh4k05unDQIFNg0gXFQ9RNmcrV7uokVYAbTpPzmJHHF0oNXddsj9J37fFymP9GJCVuVGEkTHGP2DA6Odgq0xuHPiqQeyDzSldzpSwiRiYW71U534aJGz1MZQx3aI8KlANr2Z0c4WPdmYKmd0x137zHFU5yclsginrZL2tE34nBS5OJHqZQ/WLZIKhv8nGSvcILHhxktU6ggNhhGyf2OdlO9dr0z1exIZPrTMtAUQTEh/X/KqV8DgwNMFtNtT2LC47F+pAgMBAAECggEAAoSRELEi0MEIx4cnhu9RiKDI6Q3ZARr+Zm3SIA32GftSfrtmZqF1aZj1xOP38QWZ9glqXXwmuX3F4zBfJirBfGyMnCCx7qIg7np70ncRba/6zFcE5Sdyudo4EW7/5NiZwtrHmTlDIobqavw/YW7rx63Aq86Zk+lW5BpdQU5QWMAot4aFEPq91eo10a7EVigZKs9vkxKuW7OX/mI/BixkK9YBuq1xS6lefKjQfPPMPCRis3QQtkJWOw2myKXn7qcmCsecQwc3XdrV+6iFpYLOR2V4V3ALVFrDuGFb/2PBThWTiijPAypxQdb/Onu86Z3ObWDXYnPNspBODVxCWBWM2QKBgQDqJ31c37ZXUIfavFMBKp86evF9J+6cjGUOoU4iOd7NWW5QkLvNGAjw138ZQo7OKZ26LtzM2+4bbRVgNjdkVmj4ebdF0kijs7ruF+UhFneodFbwGCBXkMc3yLDLlYjZdeI9B/npGrwFuZAnmM1z+La6z0TlZoQnWe+WED5EUiKbJwKBgQCYoNOOPjb2ysXS/CEM/wX4TUDZ9Ykn85wVLOOhW17LYiMLBJq+uZj8BdN/rzdQ4YO4XqBaDA/t7GhiphaYAfsyy7f1oGEp4jtsyHz21uOPOz4ITnbJ9SUPz5VVmFgsCBjyh6KxckiMXEovcoV1Xqd535BPSQg5q1Y/RbOcaIswrwKBgBtqHjJWeunEIvPIIsu7KsNVC5sEptorUdWhqx00u1I9iz3hhCtiCgHwqQ/TDBc1JiNbQzy07y7E2cDW+CtGNqoIzh1dnmWUMGmZ4Ji8IaxWWqtnl7nI2Jo+Y/yh+FDFjYRpv6e8GpFtBWStbjiKwRIkHEPjecuFqxhdtHyZRTX3AoGAYbogm6SUdwMxFb4gv3yPawS0MJs6Hh2q5BghDJE/qkSFIanqF5MpNL3aRZiAd8ZeG/BjBiVREcvcrsWgE+a43DZ67MirTjEwUaAx+69ud6i8OH9dKkVQXMZS3UK1ukPZDXnxn2MItu7lBWpzr8pSvAN9GHcv0BU4HT1ZGx4JebsCgYEAjIbfv7CwfTwyRbevwVscmjEnvH1r336rU3GfC1C8tvPHVdjzVOEezRHwliT/uPLcUWmTLVtwnEGCcwqoz8PUpgvWeriHXlEqBX3pPixYa2kMLm+5se4qDO32QG1EQXeLPs5UWgqfItgqNEsdeFdsE27LEIqjmRzHoPTEKaylUVs=
+  # 应用公钥
+  publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAi5qMniYDAiIecXmDs4NZp0U0z6ZZAUyQHl6MwFf3Uwrur2ijTz0V4w8GCCxc6WBgFYXvTTcOpnFavVlOFhIeJNObpw0CBTYNIFxUPUTZnK1e7qJFWAG06T85iRxxdKDV3XbI/Sd+3xcpj/RiQlblRhJExxj9gwOjnYKtMbhz4qkHsg80pXc6UsIkYmFu9VOd+GiRs9TGUMd2iPCpQDa9mdHOFj3ZmCpndMdd+8xxVOcnJbIIp62S9rRN+JwUuTiR6mUP1i2SCob/Jxkr3CCx4cZLVOoIDYYRsn9jnZTvXa9M9XsSGT60zLQFEExIf1/yqlfA4MDTBbTbU9iwuOxfqQIDAQAB
+  # 支付宝公钥
+  alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAi1vuaEyUkCgagVodfOJp/rk1gwVzs8f/QzEXAEUwZZne+VE8be0rUv9SLY0uOjixanw0yhG9LinHJlePCvuK0Y31Cxx0BXgOt27nGTSqm4oINFYd5WL1vNMPzPE2gat+7ohO3h6FRlmsxsq9W5ZRkko+04Be4lEGZ+Ter/b2v3m4I3CzX6kr42e39QlDRUpD9l9ixpkmfEatdDf01Xp++Tvr/3EZcYoG3oPGztI7B8Kw8KV/6he3ZBlGROWz8ywZSBtR294Y1PRDv+3QXC3nr7J6OrTbnvj+MAtKmwjdkFHiFVr3gfenzeI87LnXrDPahda7Mn6ToQ1NU9tsWCcJgQIDAQAB