Selaa lähdekoodia

```
feat(portal-service): 更新微信授权回调地址并新增公众号服务器验证接口

- 修改 UserGatewayImpl 中的微信授权回调地址,从 "/wx/callback" 更新为 "/portal-service-server/wap/wechat/callback"
- 在 WechatController 中新增 /serverCheck 接口用于微信公众号服务器校验
- 引入 SHA1 加密工具方法支持微信签名验证- 调整授权成功后的跳转逻辑,使用 callbackUrl 拼接欢迎页面地址
```

chejianzheng 1 kuukausi sitten
vanhempi
commit
400823944a

+ 49 - 0
portal-service-application/src/main/java/com/hfln/portal/application/controller/wap/WechatController.java

@@ -12,8 +12,12 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.io.PrintWriter;
+import java.security.MessageDigest;
+import java.util.Arrays;
 
 @RestController
 @CatchAndLog
@@ -25,6 +29,8 @@ public class WechatController {
     @Autowired
     private UserGateway userGateway;
 
+    private final static String TOKEN = "lnServer";
+
     @GetMapping("/authUrl")
     @Operation(summary = "自动跳转微信授权")
     public ApiResult<Void> authUrl(HttpServletResponse response) throws IOException {
@@ -44,4 +50,47 @@ public class WechatController {
         response.sendRedirect(welcomeUrl);
         return ApiResult.success();
     }
+
+    @GetMapping("/serverCheck")
+    @Operation(summary = "公众号发信息接口")
+    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
+        String signature = request.getParameter("signature");
+        String timestamp = request.getParameter("timestamp");
+        String nonce = request.getParameter("nonce");
+        String echostr = request.getParameter("echostr");
+
+        String signatureCheck = getSHA1(TOKEN, timestamp, nonce);
+        if (signatureCheck != null && signatureCheck.equals(signature)) {
+            PrintWriter out = response.getWriter();
+            out.print(echostr);
+            out.flush();
+            out.close();
+        }
+    }
+
+    public String getSHA1(String token, String timestamp, String nonce) {
+        try {
+            String[] array = new String[]{token, timestamp, nonce};
+            Arrays.sort(array);
+            StringBuilder sb = new StringBuilder();
+            for (String s : array) {
+                sb.append(s);
+            }
+            MessageDigest md = MessageDigest.getInstance("SHA-1");
+            md.update(sb.toString().getBytes());
+            byte[] digest = md.digest();
+            StringBuilder hexstr = new StringBuilder();
+            for (byte b : digest) {
+                String shaHex = Integer.toHexString(b & 0xFF);
+                if (shaHex.length() < 2) {
+                    hexstr.append(0);
+                }
+                hexstr.append(shaHex);
+            }
+            return hexstr.toString();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
 }

+ 2 - 2
portal-service-infrastructure/src/main/java/com/hfln/portal/infrastructure/gateway/impl/UserGatewayImpl.java

@@ -301,7 +301,7 @@ public class UserGatewayImpl implements UserGateway {
 
     @Override
     public String authUrl() {
-        String redirectUrl = callbackUrl + "/wx/callback"; // 微信后台配置的回调地址
+        String redirectUrl = callbackUrl + "/portal-service-server/wap/wechat/callback"; // 微信后台配置的回调地址
         return wxMpService.getOAuth2Service()
                 .buildAuthorizationUrl(redirectUrl, "snsapi_userinfo", "state123");
     }
@@ -333,7 +333,7 @@ public class UserGatewayImpl implements UserGateway {
             wxRelationService.save(wxRelation);
 
             // 授权成功,跳转欢迎页面(带参数)
-            return "/welcome.html?nickname=" + userInfo.getNickname()
+            return callbackUrl + "/welcome.html?nickname=" + userInfo.getNickname()
                     + "&avatar=" + userInfo.getHeadImgUrl();
         } catch (Exception e) {
             log.error("公众号绑定异常", e);