Pārlūkot izejas kodu

添加绑定公众号

liu 2 gadi atpakaļ
vecāks
revīzija
8dfc5c3118

+ 28 - 130
.idea/workspace.xml

@@ -1,17 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="ChangeListManager">
-    <list default="true" id="36922be1-416a-4a25-9739-9814e01883a6" name="Default Changelist" comment="">
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/template/common/utils/TimeExchange.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/template/common/utils/TimeExchange.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/template/controller/SmartAttendanceController.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/template/controller/SmartAttendanceController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/template/services/SmartAttendanceService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/template/services/SmartAttendanceService.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/template/services/SmartUserService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/template/services/SmartUserService.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/template/services/impl/SmartAttendanceServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/template/services/impl/SmartAttendanceServiceImpl.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/template/services/impl/SmartUserServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/template/services/impl/SmartUserServiceImpl.java" afterDir="false" />
-    </list>
-    <ignored path="$PROJECT_DIR$/classes/" />
-    <ignored path="$PROJECT_DIR$/target/" />
-    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
+    <list default="true" id="36922be1-416a-4a25-9739-9814e01883a6" name="Default Changelist" comment="" />
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
     <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
@@ -21,100 +11,6 @@
     <option name="testRunner" value="GRADLE" />
     <option name="delegatedBuild" value="true" />
   </component>
-  <component name="FileEditorManager">
-    <leaf>
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/main/java/com/template/controller/SmartAttendanceController.java">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="327">
-              <caret line="155" column="13" lean-forward="true" selection-start-line="155" selection-start-column="13" selection-end-line="155" selection-end-column="13" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/src/main/java/com/template/controller/ScheduleController.java">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="1031">
-              <caret line="176" column="75" selection-start-line="176" selection-start-column="66" selection-end-line="176" selection-end-column="75" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/main/java/com/template/model/pojo/SmartAttendance.java">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="264">
-              <caret line="49" column="26" selection-start-line="49" selection-start-column="19" selection-end-line="49" selection-end-column="26" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/main/java/com/template/services/SmartUserService.java">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="425">
-              <caret line="71" column="62" selection-start-line="71" selection-start-column="62" selection-end-line="71" selection-end-column="62" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/main/java/com/template/services/impl/SmartUserServiceImpl.java">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="218">
-              <caret line="156" column="47" selection-start-line="156" selection-start-column="27" selection-end-line="156" selection-end-column="47" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/main/java/com/template/controller/SmartApplyController.java">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="310">
-              <caret line="38" column="4" selection-start-line="38" selection-start-column="4" selection-end-line="38" selection-end-column="14" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/main/java/com/template/api/SmartAttendanceControllerAPI.java">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="333">
-              <caret line="38" column="43" selection-start-line="38" selection-start-column="26" selection-end-line="38" selection-end-column="43" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/main/java/com/template/services/impl/SmartAttendanceServiceImpl.java">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="631">
-              <caret line="53" column="40" selection-start-line="53" selection-start-column="19" selection-end-line="53" selection-end-column="40" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/main/java/com/template/services/SmartAttendanceService.java">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="391">
-              <caret line="21" column="69" lean-forward="true" selection-start-line="21" selection-start-column="69" selection-end-line="21" selection-end-column="69" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/main/java/com/template/services/impl/SmartVisitorServiceImpl.java">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="295">
-              <caret line="67" column="8" lean-forward="true" selection-start-line="67" selection-start-column="8" selection-end-line="68" selection-end-column="22" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-    </leaf>
-  </component>
   <component name="FindInProjectRecents">
     <findStrings>
       <find>getDate</find>
@@ -171,6 +67,7 @@
     <option name="width" value="1936" />
     <option name="height" value="1048" />
   </component>
+  <component name="ProjectId" id="2bUCcpLSt0RtgnSW1oHNqhKVmxW" />
   <component name="ProjectView">
     <navigator proportions="" version="1">
       <foldersAlwaysOnTop value="true" />
@@ -273,33 +170,19 @@
       </pane>
     </panes>
   </component>
-  <component name="PropertiesComponent">
-    <property name="RequestMappingsPanelOrder0" value="0" />
-    <property name="RequestMappingsPanelOrder1" value="1" />
-    <property name="RequestMappingsPanelWidth0" value="75" />
-    <property name="RequestMappingsPanelWidth1" value="75" />
-    <property name="WebServerToolWindowFactoryState" value="false" />
-    <property name="aspect.path.notification.shown" value="true" />
-    <property name="last_opened_file_path" value="$PROJECT_DIR$" />
-    <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
-    <property name="nodejs_npm_path_reset_for_default_project" value="true" />
-    <property name="settings.editor.selected.configurable" value="MavenSettings" />
+  <component name="ProjectViewState">
+    <option name="showExcludedFiles" value="false" />
+    <option name="showLibraryContents" value="true" />
   </component>
+  <component name="PropertiesComponent"><![CDATA[{
+  "keyToString": {
+    "WebServerToolWindowFactoryState": "false",
+    "spring.configuration.checksum": "e47aab31ad1364ed6c9b0acc24afdcf3"
+  }
+}]]></component>
   <component name="RebelAgentSelection">
     <selection>jr</selection>
   </component>
-  <component name="RunDashboard">
-    <option name="ruleStates">
-      <list>
-        <RuleState>
-          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
-        </RuleState>
-        <RuleState>
-          <option name="name" value="StatusDashboardGroupingRule" />
-        </RuleState>
-      </list>
-    </option>
-  </component>
   <component name="RunManager">
     <configuration name="MybatisPlusApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
       <module name="mybatis_plus" />
@@ -309,6 +192,10 @@
       </method>
     </configuration>
   </component>
+  <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
+  <component name="SshConsoleOptionsProvider">
+    <option name="myEncoding" value="UTF-8" />
+  </component>
   <component name="SvnConfiguration">
     <configuration />
   </component>
@@ -320,6 +207,7 @@
       <option name="presentableId" value="Default" />
       <updated>1706250884671</updated>
       <workItem from="1706250887209" duration="5674000" />
+      <workItem from="1706260354151" duration="17000" />
     </task>
     <servers />
   </component>
@@ -369,7 +257,18 @@
     </layout>
   </component>
   <component name="TypeScriptGeneratedFilesManager">
-    <option name="version" value="1" />
+    <option name="version" value="3" />
+  </component>
+  <component name="Vcs.Log.Tabs.Properties">
+    <option name="TAB_STATES">
+      <map>
+        <entry key="MAIN">
+          <value>
+            <State />
+          </value>
+        </entry>
+      </map>
+    </option>
   </component>
   <component name="XDebuggerManager">
     <breakpoint-manager>
@@ -377,7 +276,6 @@
         <line-breakpoint enabled="true" type="java-line">
           <url>file://$PROJECT_DIR$/src/main/java/com/template/controller/SmartAttendanceController.java</url>
           <line>70</line>
-          <properties />
           <option name="timeStamp" value="1" />
         </line-breakpoint>
       </breakpoints>

+ 7 - 0
src/main/java/com/template/api/SmartCodeOpenIdControllerAPI.java

@@ -0,0 +1,7 @@
+package com.template.api;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@RequestMapping("/api/smart-code-open-id")
+public interface SmartCodeOpenIdControllerAPI {
+}

+ 26 - 0
src/main/java/com/template/api/WxGzhControllerAPI.java

@@ -0,0 +1,26 @@
+package com.template.api;
+
+import com.template.model.result.CommonResult;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@RequestMapping("/api/wxGzh")
+public interface WxGzhControllerAPI {
+
+    @GetMapping(value = "getWxGzhOpenid")
+    @ApiOperation(value = "通过微信公众号的code获取openid", notes = "通过微信公众号的code获取openid", httpMethod = "GET")
+    CommonResult getWxGzhOpenid(@RequestParam String code) throws Exception;
+
+
+    @GetMapping(value = "/vertifyMessage")
+    @ApiOperation(value = "通过手机号绑定公众号openId", notes = "通过手机号绑定公众号openId", httpMethod = "GET")
+    CommonResult vertifyMessage(@RequestParam String phone,@RequestParam String code,@RequestParam String wxGzhCode);
+
+
+    @GetMapping(value = "/unbinding")
+    @ApiOperation(value = "通过手机号解绑", notes = "通过手机号解绑", httpMethod = "GET")
+    CommonResult unbinding(@RequestParam String phone);
+}

+ 21 - 0
src/main/java/com/template/controller/SmartCodeOpenIdController.java

@@ -0,0 +1,21 @@
+package com.template.controller;
+
+
+import com.template.api.SmartCodeOpenIdControllerAPI;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author ceshi
+ * @since 2024-01-26
+ */
+@RestController
+public class SmartCodeOpenIdController implements SmartCodeOpenIdControllerAPI {
+
+}
+

+ 148 - 0
src/main/java/com/template/controller/WxGzhController.java

@@ -0,0 +1,148 @@
+package com.template.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import com.template.annotation.PassToken;
+import com.template.api.WxGzhControllerAPI;
+import com.template.common.utils.*;
+import com.template.model.pojo.SmartCodeOpenId;
+import com.template.model.pojo.SmartUser;
+import com.template.model.pojo.SmsCode;
+import com.template.model.result.CommonResult;
+import com.template.model.weixin.HttpParame;
+import com.template.services.SmartCodeOpenIdService;
+import com.template.services.SmartUserService;
+import com.template.services.SmsCodeService;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+
+@RestController
+public class WxGzhController implements WxGzhControllerAPI {
+
+//    公众号的唯一标识
+    private static String appid="wxa46ef222053a1047";
+//    公众号的appsecret
+    private static String secret="16f74a1265c314fd79fdf90670173467";
+
+    @Autowired
+    SmartUserService smartUserService;
+
+    @Autowired
+    SmartCodeOpenIdService smartCodeOpenIdService;
+
+    @Autowired
+    SmsCodeService smsCodeService;
+
+    @Override
+    @PassToken
+    public CommonResult getWxGzhOpenid(String code) throws Exception {
+
+        String url="https://api.weixin.qq.com/sns/oauth2/access_token?appid="+appid+"&secret="+secret+"&code="+code+"&grant_type=authorization_code";
+        System.out.println("url = " + url);
+
+        String s = HttpsClient.httpsRequestReturnString(url, "GET", "");
+
+        JSONObject jsonObject = JSONObject.parseObject(s);
+
+        if (!jsonObject.containsKey("openid")) {
+            return CommonResult.fail("code有误");
+        }
+        String openid = jsonObject.getString("openid");
+
+//        判断openid是否已经存在
+        LambdaQueryWrapper<SmartUser> wrapper=new LambdaQueryWrapper<>();
+        wrapper.eq(SmartUser::getGzhOpenId,openid);
+        SmartUser smartUser = smartUserService.getOne(wrapper);
+        JSONObject jsonObject1 = new JSONObject();
+
+        if (ObjectUtils.isNotEmpty(smartUser)) {
+            jsonObject1.put("phone",smartUser.getPhone());
+            return CommonResult.ok(jsonObject1);
+        }
+        SmartCodeOpenId smartCodeOpenId = new SmartCodeOpenId();
+        smartCodeOpenId.setCode(code);
+        smartCodeOpenId.setOpenId(openid);
+
+        smartCodeOpenIdService.save(smartCodeOpenId);
+
+        System.out.println("openid = " + openid);
+
+        jsonObject1.put("phone","");
+        return CommonResult.ok(jsonObject1);
+    }
+
+    @Override
+    @PassToken
+    public CommonResult vertifyMessage(String phone, String code,String wxGzhCode) {
+        QueryWrapper<SmsCode> queryWrapper1 = new QueryWrapper<>();
+        queryWrapper1.eq("deleted", 0);
+        queryWrapper1.eq("is_verify", 0);
+        queryWrapper1.eq("phone_number", phone);
+        queryWrapper1.eq("code", code);
+        queryWrapper1.ge("expiration_time", new Date());
+        List<SmsCode> listc = smsCodeService.getSmsCodeByKey(queryWrapper1);
+        if (listc.isEmpty()) {
+            return CommonResult.ok("验证码已失效");
+        }
+
+        for (SmsCode smsCode : listc) {
+            smsCode.setIsVerify("1");
+            smsCodeService.updateSmsCode(smsCode);
+        }
+
+
+        QueryWrapper<SmartUser> queryWrapper2 = new QueryWrapper<>();
+        queryWrapper2.eq("deleted", 0);
+        queryWrapper2.eq("phone", phone);
+        SmartUser user = smartUserService.getOne(queryWrapper2);
+        if (ObjectUtils.isEmpty(user)) {
+            return CommonResult.fail("该用户不存在");
+        }
+
+        LambdaQueryWrapper<SmartCodeOpenId> wrapperCode=new LambdaQueryWrapper<>();
+        wrapperCode.eq(SmartCodeOpenId::getCode,wxGzhCode);
+        SmartCodeOpenId smartCodeOpenId = smartCodeOpenIdService.getOne(wrapperCode);
+
+        if (ObjectUtils.isNotEmpty(smartCodeOpenId)) {
+            user.setGzhOpenId(smartCodeOpenId.getOpenId());
+            smartUserService.updateSmartUser(user);
+        }
+
+        return CommonResult.ok();
+    }
+
+    @Override
+    public CommonResult unbinding(String phone) {
+        QueryWrapper<SmartUser> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("deleted", 0);
+        queryWrapper.eq("phone", phone);
+        SmartUser user = smartUserService.getOne(queryWrapper);
+        if (ObjectUtils.isEmpty(user)) {
+            return CommonResult.fail("该用户不存在");
+        }
+        user.setGzhOpenId("");
+
+        smartUserService.updateById(user);
+
+        return CommonResult.ok();
+    }
+
+
+}

+ 18 - 0
src/main/java/com/template/mapper/SmartCodeOpenIdMapper.java

@@ -0,0 +1,18 @@
+package com.template.mapper;
+
+import com.template.model.pojo.SmartCodeOpenId;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author ceshi
+ * @since 2024-01-26
+ */
+@Mapper
+public interface SmartCodeOpenIdMapper extends BaseMapper<SmartCodeOpenId> {
+
+}

+ 64 - 0
src/main/java/com/template/model/pojo/SmartCodeOpenId.java

@@ -0,0 +1,64 @@
+package com.template.model.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.Version;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author ceshi
+ * @since 2024-01-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="SmartCodeOpenId对象", description="")
+public class SmartCodeOpenId implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "微信公众号的code")
+    private String code;
+
+    @ApiModelProperty(value = "微信公众号code所对应的openId")
+    private String openId;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+
+    @ApiModelProperty(value = "创建人员")
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    @ApiModelProperty(value = "更新人员")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateUser;
+
+    @ApiModelProperty(value = "逻辑删除 未删除:0;删除:1")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleted;
+
+
+}

+ 16 - 0
src/main/java/com/template/services/SmartCodeOpenIdService.java

@@ -0,0 +1,16 @@
+package com.template.services;
+
+import com.template.model.pojo.SmartCodeOpenId;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author ceshi
+ * @since 2024-01-26
+ */
+public interface SmartCodeOpenIdService extends IService<SmartCodeOpenId> {
+
+}

+ 20 - 0
src/main/java/com/template/services/impl/SmartCodeOpenIdServiceImpl.java

@@ -0,0 +1,20 @@
+package com.template.services.impl;
+
+import com.template.model.pojo.SmartCodeOpenId;
+import com.template.mapper.SmartCodeOpenIdMapper;
+import com.template.services.SmartCodeOpenIdService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author ceshi
+ * @since 2024-01-26
+ */
+@Service
+public class SmartCodeOpenIdServiceImpl extends ServiceImpl<SmartCodeOpenIdMapper, SmartCodeOpenId> implements SmartCodeOpenIdService {
+
+}