zhangqin 1 тиждень тому
батько
коміт
ab89a90915

+ 69 - 43
fs-ad-new-api/src/main/java/com/fs/app/controller/WeChatController.java

@@ -1,5 +1,6 @@
 package com.fs.app.controller;
 
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
 import cn.hutool.json.JSONUtil;
@@ -8,10 +9,11 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.fs.app.facade.CallbackProcessingFacadeService;
 import com.fs.common.constant.SystemConstant;
 import com.fs.common.result.Result;
+import com.fs.course.domain.FsCoursePlaySourceConfig;
+import com.fs.course.service.IFsCoursePlaySourceConfigService;
 import com.fs.newAdv.domain.AdvMiniConfig;
 import com.fs.newAdv.dto.req.updateNickNameReq;
 import com.fs.newAdv.service.IAdvMiniConfigService;
-import com.fs.wx.miniapp.config.WxMaProperties;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -35,59 +37,83 @@ public class WeChatController {
     private CallbackProcessingFacadeService facadeService;
 
     @Autowired
-    private WxMaProperties properties;
-
-    @Autowired
-    private IAdvMiniConfigService advMiniConfigService;
+    private IFsCoursePlaySourceConfigService fsCoursePlaySourceConfigService;
 
     @GetMapping("/getSchemeUrl")
-    public Result<String> getSchemeUrl(@RequestParam(value = "traceId") String traceId) {
-        List<AdvMiniConfig> list = advMiniConfigService.list(new LambdaQueryWrapper<AdvMiniConfig>()
-                .eq(AdvMiniConfig::getStatus, 1));
-        for (AdvMiniConfig advMiniConfig : list) {
+    public Result<String> getSchemeUrl(@RequestParam("traceId") String traceId) {
+        // 查询投放小程序
+        List<FsCoursePlaySourceConfig> list = fsCoursePlaySourceConfigService.selectByType(3);
+        log.info("投放小程序列表:{}", list);
+        for (FsCoursePlaySourceConfig config : list) {
             try {
-                String access_token = advMiniConfig.getAccessToken();
-                // 判断token是否过期
-                if (LocalDateTime.now().plusMinutes(10).isAfter(advMiniConfig.getExpiresIn())) {
-                    // 提前10分钟刷新Token
-                    HttpResponse execute2 = HttpRequest.get("https://api.weixin.qq.com/cgi-bin/token")
-                            .form("grant_type", "client_credential")
-                            .form("appid", advMiniConfig.getAppId())
-                            .form("secret", advMiniConfig.getAppSecret())
-                            .timeout(SystemConstant.API_TIMEOUT)
-                            .execute();
-                    JSONObject obj = JSONObject.parseObject(execute2.body());
-                    access_token = obj.getString("access_token");
-                    log.info("getSchemeUrl:{}", obj);
-                    advMiniConfig.setAccessToken(access_token);
-                    advMiniConfig.setExpiresIn(LocalDateTime.now().plusSeconds(obj.getInteger("expires_in")));
-                    advMiniConfigService.updateById(advMiniConfig);
+                // 根据token获取微信scheme
+                String accessToken = config.getToken();
+                JSONObject result = generateScheme(accessToken, traceId);
+
+                // token 失效,可能被其他地方刷新
+                if (result.getInteger("errcode") != null && result.getInteger("errcode") == 40001) {
+                    accessToken = refreshToken(config);
+                    result = generateScheme(accessToken, traceId);
+                }
+                String openlink = result.getString("openlink");
+                if (StrUtil.isEmpty(openlink)) {
+                    // 更换小程序
+                    log.info("小程序码生成失败:{}", config);
+                    continue;
                 }
-                Map<String, Object> map = new HashMap<>();
-                Map<String, Object> map2 = new HashMap<>();
-                map2.put("path", "/pages_ad/index");
-                map2.put("query", "traceId=" + traceId);
-                map2.put("env_version", "trial");
-                map.put("jump_wxa", map2);
-                map.put("is_expire", false);
-                HttpResponse execute = HttpRequest.post("https://api.weixin.qq.com/wxa/generatescheme?access_token=" + access_token)
-                        .header("Content-Type", "application/json")
-                        .body(JSONUtil.toJsonStr(map))
-                        .timeout(SystemConstant.API_TIMEOUT)
-                        .execute();
-                log.info("getSchemeUrl:{}", execute.body());
-                JSONObject jsonObject = JSONObject.parseObject(execute.body());
-                //response.addHeader("Access-Control-Allow-Origin", "*");
-                return Result.success(jsonObject.getString("openlink"));
-            }catch (Exception e){
-                log.error("getSchemeUrl error:{}",advMiniConfig.getAppId(), e);
+                return Result.success(openlink);
+            } catch (Exception e) {
+                log.error("getSchemeUrl error, appId={}", config.getAppid(), e);
             }
         }
         return Result.success("");
     }
 
+    /**
+     * 刷新 access_token
+     */
+    private String refreshToken(FsCoursePlaySourceConfig config) {
+        HttpResponse response = HttpRequest.get("https://api.weixin.qq.com/cgi-bin/token")
+                .form("grant_type", "client_credential")
+                .form("appid", config.getAppid())
+                .form("secret", config.getSecret())
+                .timeout(SystemConstant.API_TIMEOUT)
+                .execute();
+
+        JSONObject obj = JSONObject.parseObject(response.body());
+        String accessToken = obj.getString("access_token");
+        config.setToken(accessToken);
+        fsCoursePlaySourceConfigService.updateById(config);
+        log.info("refreshToken:{}", obj);
+        return accessToken;
+    }
+
+    /**
+     * 生成 scheme
+     */
+    private JSONObject generateScheme(String accessToken, String traceId) {
+        Map<String, Object> body = new HashMap<>();
+        body.put("is_expire", false);
+        body.put("jump_wxa", new HashMap<String, Object>() {{
+            put("path", "/pages_ad/index");
+            put("query", "traceId=" + traceId);
+            put("env_version", "trial");
+        }});
+
+        HttpResponse response = HttpRequest.post(
+                        "https://api.weixin.qq.com/wxa/generatescheme?access_token=" + accessToken)
+                .header("Content-Type", "application/json")
+                .body(JSONUtil.toJsonStr(body))
+                .timeout(SystemConstant.API_TIMEOUT)
+                .execute();
+
+        log.info("generateScheme:{}", response.body());
+        return JSONObject.parseObject(response.body());
+    }
+
     /**
      * 更新用户昵称
+     *
      * @return
      */
     @PostMapping("/updateNickName")

+ 1 - 1
fs-service/src/main/java/com/fs/course/domain/FsCoursePlaySourceConfig.java

@@ -58,7 +58,7 @@ public class FsCoursePlaySourceConfig {
     private String msgDataFormat;
 
     /**
-     * 类型 1小程序 2公众号
+     * 类型 1小程序 2公众号 3投放小程序
      */
     private Integer type;
 

+ 7 - 0
fs-service/src/main/java/com/fs/course/service/IFsCoursePlaySourceConfigService.java

@@ -22,4 +22,11 @@ public interface IFsCoursePlaySourceConfigService extends IService<FsCoursePlayS
      * @return
      */
     FsCoursePlaySourceConfig selectCoursePlaySourceConfigByAppId(String appId);
+
+    /**
+     * 根据type查询小程序配置
+     * @param type
+     * @return
+     */
+    List<FsCoursePlaySourceConfig> selectByType(Integer type);
 }

+ 8 - 1
fs-service/src/main/java/com/fs/course/service/impl/FsCoursePlaySourceConfigServiceImpl.java

@@ -1,5 +1,6 @@
 package com.fs.course.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.course.domain.FsCoursePlaySourceConfig;
@@ -9,7 +10,6 @@ import com.fs.course.vo.FsCoursePlaySourceConfigVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -35,4 +35,11 @@ public class FsCoursePlaySourceConfigServiceImpl extends ServiceImpl<FsCoursePla
     public FsCoursePlaySourceConfig selectCoursePlaySourceConfigByAppId(String appId) {
         return baseMapper.selectCoursePlaySourceConfigByAppId(appId);
     }
+
+    @Override
+    public List<FsCoursePlaySourceConfig> selectByType(Integer type) {
+        return this.list(new LambdaQueryWrapper<FsCoursePlaySourceConfig>()
+                .eq(FsCoursePlaySourceConfig::getIsDel, 0)
+                .eq(FsCoursePlaySourceConfig::getType, 3));
+    }
 }

+ 1 - 1
fs-service/src/main/java/com/fs/newAdv/integration/adapter/BaiduAdapter.java

@@ -41,7 +41,7 @@ public class BaiduAdapter implements IAdvertiserAdapter {
                     Instant.ofEpochMilli(Long.parseLong(rawData.get("ts"))),
                     ZoneId.systemDefault()));
         } catch (Exception e) {
-            log.error("时间转换异常", e);
+            log.error("时间转换异常");
         }
         return lead;
     }

+ 1 - 1
fs-service/src/main/java/com/fs/newAdv/integration/adapter/TencentAdapter.java

@@ -48,7 +48,7 @@ public class TencentAdapter implements IAdvertiserAdapter {
                     Instant.ofEpochMilli(Long.parseLong(rawData.get("click_time"))),
                     ZoneId.systemDefault()));
         } catch (Exception e) {
-            log.error("时间转换异常", e);
+            log.error("时间转换异常");
         }
         return lead;
     }

+ 1 - 1
fs-service/src/main/java/com/fs/newAdv/integration/adapter/VIVOAdapter.java

@@ -41,7 +41,7 @@ public class VIVOAdapter implements IAdvertiserAdapter {
                     Instant.ofEpochMilli(Long.parseLong(rawData.get("ts"))),
                     ZoneId.systemDefault()));
         } catch (Exception e) {
-            log.error("时间转换异常", e);
+            log.error("时间转换异常");
         }
         return lead;
     }