Browse Source

1.对接Taku 应用管理
2.对接Taku 广告位管理
3.对接Taku 广告平台管理
4.风控管理校验用户
5.模拟微信登录,缺appid secret等审核

marxjaw 5 tháng trước cách đây
mục cha
commit
30a2e55727
55 tập tin đã thay đổi với 974 bổ sung275 xóa
  1. 1 5
      yt-advertise/advertise-service/pom.xml
  2. 41 0
      yt-advertise/advertise-service/src/main/java/com/ytpm/controller/AdvertiseController.java
  3. 20 0
      yt-advertise/advertise-service/src/main/java/com/ytpm/enums/AdPlatformTypeEnum.java
  4. 3 0
      yt-advertise/advertise-service/src/main/java/com/ytpm/enums/AndroidFirstCategoryEnum.java
  5. 3 0
      yt-advertise/advertise-service/src/main/java/com/ytpm/enums/AndroidSecondCategoryEnum.java
  6. 17 0
      yt-advertise/advertise-service/src/main/java/com/ytpm/enums/OpenReportEnum.java
  7. 36 1
      yt-advertise/advertise-service/src/main/java/com/ytpm/service/TakuApiService.java
  8. 107 3
      yt-advertise/advertise-service/src/main/java/com/ytpm/service/impl/TakuApiServiceImpl.java
  9. 63 19
      yt-advertise/advertise-service/src/main/java/com/ytpm/util/TakuRequestUtil.java
  10. 31 0
      yt-agent/agent-service/src/main/java/com/ytpm/controller/AgentChannelController.java
  11. 2 2
      yt-agent/agent-service/src/main/java/com/ytpm/controller/AppController.java
  12. 1 1
      yt-agent/agent-service/src/main/java/com/ytpm/dao/AgentAppMapper.java
  13. 9 0
      yt-agent/agent-service/src/main/java/com/ytpm/dao/ChannelMapper.java
  14. 17 0
      yt-agent/agent-service/src/main/java/com/ytpm/service/ChannelService.java
  15. 2 2
      yt-agent/agent-service/src/main/java/com/ytpm/service/impl/AgentAppServiceImpl.java
  16. 42 0
      yt-agent/agent-service/src/main/java/com/ytpm/service/impl/ChannelServiceImpl.java
  17. 20 4
      yt-agent/agent-service/src/main/resources/mapper/AgentAppMapper.xml
  18. 48 0
      yt-agent/agent-service/src/main/resources/mapper/ChannelMapper.xml
  19. 3 8
      yt-app/app-service/pom.xml
  20. 1 1
      yt-app/app-service/src/main/java/com/ytpm/AppApplication.java
  21. 0 104
      yt-app/app-service/src/main/java/com/ytpm/config/CustomUserAuthenticationConverter.java
  22. 0 72
      yt-app/app-service/src/main/java/com/ytpm/config/ResourceServerConfig.java
  23. 51 10
      yt-app/app-service/src/main/java/com/ytpm/controller/WxController.java
  24. 12 0
      yt-app/app-service/src/main/java/com/ytpm/dao/LoginRecordMapper.java
  25. 0 40
      yt-app/app-service/src/main/java/com/ytpm/handle/AppAuthExceptionEntryPoint.java
  26. 31 0
      yt-app/app-service/src/main/resources/mapper/LoginRecordMapper.xml
  27. 4 0
      yt-app/pom.xml
  28. 3 1
      yt-common/src/main/java/com/ytpm/advertise/param/AddAppParam.java
  29. 17 0
      yt-common/src/main/java/com/ytpm/advertise/param/AddPlacementParam.java
  30. 16 0
      yt-common/src/main/java/com/ytpm/advertise/param/AppAuthContent.java
  31. 30 0
      yt-common/src/main/java/com/ytpm/advertise/param/AuthContent.java
  32. 27 0
      yt-common/src/main/java/com/ytpm/advertise/param/Network.java
  33. 15 0
      yt-common/src/main/java/com/ytpm/advertise/param/NetworkAppInfo.java
  34. 18 0
      yt-common/src/main/java/com/ytpm/advertise/param/PlacementListParam.java
  35. 27 0
      yt-common/src/main/java/com/ytpm/advertise/param/PlacementParam.java
  36. 13 0
      yt-common/src/main/java/com/ytpm/advertise/param/RewardS2S.java
  37. 19 0
      yt-common/src/main/java/com/ytpm/advertise/view/AddAppResponse.java
  38. 25 0
      yt-common/src/main/java/com/ytpm/advertise/view/AddPlacementResponse.java
  39. 35 0
      yt-common/src/main/java/com/ytpm/advertise/view/AppV1View.java
  40. 13 0
      yt-common/src/main/java/com/ytpm/advertise/view/ResponseErrors.java
  41. 1 0
      yt-common/src/main/java/com/ytpm/agent/model/YtChannel.java
  42. 30 0
      yt-common/src/main/java/com/ytpm/agent/param/ChannelParam.java
  43. 24 0
      yt-common/src/main/java/com/ytpm/app/param/WxLoginParam.java
  44. 15 0
      yt-common/src/main/java/com/ytpm/app/view/WxDefaultConfig.java
  45. 13 0
      yt-common/src/main/java/com/ytpm/app/view/WxLoginResult.java
  46. 18 0
      yt-common/src/main/java/com/ytpm/app/view/WxUserInfo.java
  47. 4 0
      yt-common/src/main/java/com/ytpm/general/RepMessage.java
  48. 4 0
      yt-common/src/main/java/com/ytpm/util/HttpClientUtil.java
  49. 3 0
      yt-risk/risk-feign/src/main/java/com/ytpm/feign/RiskFeign.java
  50. 1 1
      yt-risk/risk-manage/src/main/java/com/ytpm/config/ResourceServerConfig.java
  51. 9 0
      yt-risk/risk-manage/src/main/java/com/ytpm/controller/RiskManageController.java
  52. 5 0
      yt-risk/risk-manage/src/main/java/com/ytpm/dao/RiskUserMapper.java
  53. 5 0
      yt-risk/risk-manage/src/main/java/com/ytpm/service/RiskService.java
  54. 16 1
      yt-risk/risk-manage/src/main/java/com/ytpm/service/impl/RiskServiceImpl.java
  55. 3 0
      yt-risk/risk-manage/src/main/resources/mapper/RiskUserMapper.xml

+ 1 - 5
yt-advertise/advertise-service/pom.xml

@@ -22,10 +22,6 @@
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-oauth2</artifactId>
-        </dependency>
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
@@ -54,7 +50,7 @@
         </dependency>
     </dependencies>
     <build>
-        <finalName>app-service</finalName>
+        <finalName>advertise-service</finalName>
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>

+ 41 - 0
yt-advertise/advertise-service/src/main/java/com/ytpm/controller/AdvertiseController.java

@@ -0,0 +1,41 @@
+package com.ytpm.controller;
+
+import com.ytpm.advertise.view.AppV1View;
+import com.ytpm.agent.param.ChannelParam;
+import com.ytpm.general.Result;
+import com.ytpm.general.ResultTable;
+import com.ytpm.service.TakuApiService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+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.RestController;
+
+@Api("Taku广告聚合管理模块")
+@RestController
+@RequestMapping("/advertise")
+public class AdvertiseController {
+
+    @Autowired
+    private TakuApiService takuApiService;
+
+    /**
+     * Taku应用关联广告平台
+     */
+    @ApiOperation("Taku应用关联广告平台")
+    @PostMapping("/relativePlatform")
+    public Result<?> relativePlatform(ChannelParam channelParam) {
+        return takuApiService.relativePlatform(channelParam);
+    }
+
+    /**
+     * 查询应用列表
+     */
+    @ApiOperation("查询应用列表")
+    @GetMapping("/getAppList")
+    public ResultTable<AppV1View> getAppList() {
+        return takuApiService.getAppList();
+    }
+}

+ 20 - 0
yt-advertise/advertise-service/src/main/java/com/ytpm/enums/AdPlatformTypeEnum.java

@@ -0,0 +1,20 @@
+package com.ytpm.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum AdPlatformTypeEnum {
+    CSJ(15,"穿山甲"),
+    TENCENT(8,"腾讯广告"),
+    BAIDU(22,"百度联盟"),
+    KUAISHOU(28,"快手"),
+    Sigmob(29,"Sigmob"),
+    ;
+    private int code;
+    private String desc;
+
+    AdPlatformTypeEnum(int code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+}

+ 3 - 0
yt-advertise/advertise-service/src/main/java/com/ytpm/enums/AndroidFirstCategoryEnum.java

@@ -1,5 +1,8 @@
 package com.ytpm.enums;
 
+import lombok.Getter;
+
+@Getter
 public enum AndroidFirstCategoryEnum {
     APP(1,"App"),
     GAME(2,"Game"),

+ 3 - 0
yt-advertise/advertise-service/src/main/java/com/ytpm/enums/AndroidSecondCategoryEnum.java

@@ -1,5 +1,8 @@
 package com.ytpm.enums;
 
+import lombok.Getter;
+
+@Getter
 public enum AndroidSecondCategoryEnum {
     Daydream("Daydream",1,"Daydream"),
     Android("Wear",1,"Android Wear"),

+ 17 - 0
yt-advertise/advertise-service/src/main/java/com/ytpm/enums/OpenReportEnum.java

@@ -0,0 +1,17 @@
+package com.ytpm.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum OpenReportEnum {
+    FALSE(1,"不开通"),
+    TRUE(2,"开通"),
+    ;
+    private int code;
+    private String desc;
+
+    OpenReportEnum(int code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+}

+ 36 - 1
yt-advertise/advertise-service/src/main/java/com/ytpm/service/TakuApiService.java

@@ -1,7 +1,15 @@
 package com.ytpm.service;
 
+import com.ytpm.advertise.param.AddPlacementParam;
+import com.ytpm.advertise.param.Network;
+import com.ytpm.advertise.view.AddPlacementResponse;
+import com.ytpm.advertise.view.AppV1View;
+import com.ytpm.agent.param.ChannelParam;
 import com.ytpm.general.Result;
-import com.ytpm.param.AddAppParam;
+import com.ytpm.general.ResultTable;
+import com.ytpm.advertise.param.AddAppParam;
+
+import java.util.List;
 
 public interface TakuApiService {
     /**
@@ -9,4 +17,31 @@ public interface TakuApiService {
      * @return
      */
    Result<?> addApps(AddAppParam param);
+    /**
+     * Taku应用关联广告平台
+     */
+    Result<?> relativePlatform(ChannelParam channelParam);
+    /**
+     * 获取广告平台信息
+     */
+    ResultTable<Network> getNetworks();
+
+    /**
+     * 查询应用列表
+     */
+    ResultTable<AppV1View> getAppList();
+    /**
+     * 新增广告位
+     */
+    ResultTable<AddPlacementResponse> addPlacements(AddPlacementParam param);
+
+    /**
+     * 获取广告位列表
+     */
+    ResultTable<?> getPlacementList(AddPlacementParam param);
+
+    /**
+     * 删除广告位
+     */
+    Result<?> delPlacement(List<String> placementIds);
 }

+ 107 - 3
yt-advertise/advertise-service/src/main/java/com/ytpm/service/impl/TakuApiServiceImpl.java

@@ -1,19 +1,123 @@
 package com.ytpm.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.github.pagehelper.PageInfo;
+import com.ytpm.advertise.param.AddPlacementParam;
+import com.ytpm.advertise.param.AppAuthContent;
+import com.ytpm.advertise.param.AuthContent;
+import com.ytpm.advertise.param.Network;
+import com.ytpm.advertise.param.NetworkAppInfo;
+import com.ytpm.advertise.view.AddPlacementResponse;
+import com.ytpm.advertise.view.AppV1View;
+import com.ytpm.agent.param.ChannelParam;
+import com.ytpm.enums.OpenReportEnum;
+import com.ytpm.general.RepMessage;
 import com.ytpm.general.Result;
-import com.ytpm.param.AddAppParam;
+import com.ytpm.general.ResultTable;
+import com.ytpm.advertise.param.AddAppParam;
 import com.ytpm.service.TakuApiService;
+import com.ytpm.util.TakuRequestUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
 import org.springframework.stereotype.Service;
 
+import java.util.Collections;
+import java.util.List;
+
+@Slf4j(topic = "Taku API 服务")
 @Service
 public class TakuApiServiceImpl implements TakuApiService {
 
+    private final static String API_VERSION_V1 = "/v1";
+    private final static String API_VERSION_V3 = "/v3";
     /**
-     * 新增应用
+     * 新增或修改应用
      */
     @Override
     public Result<?> addApps(AddAppParam param) {
+        JSONObject object = new JSONObject();
+        object.put("items",Collections.singletonList(param));
+        String res = TakuRequestUtil.doRequest(HttpGet.METHOD_NAME, API_VERSION_V3+"/apps", object.toJSONString());
+        return Result.resultOk(RepMessage.SAVE_SUCCESS,res);
+    }
+
+    /**
+     * Taku应用关联广告平台
+     */
+    @Override
+    public Result<?> relativePlatform(ChannelParam channelParam) {
+        Network network = new Network();
+        network.setNw_firm_id(channelParam.getAdPlatformType());
+        network.setIs_open_report(OpenReportEnum.TRUE.getCode());
+        //设置广告平台API认证信息  目前只有优量汇
+        AuthContent authContent = new AuthContent();
+        authContent.setAccount_id("902040320340");
+        authContent.setSecret_key("vSMkNOUWea13A>MN=1J0F0N&jb984kv9");
+        network.setAuth_content(authContent);
+        //设置Taku应用ID
+        NetworkAppInfo networkAppInfo = new NetworkAppInfo();
+        networkAppInfo.setApp_id("a1ghj1ek3bd7kp");
+        //设置广告平台应用信息
+        AppAuthContent appAuthContent = new AppAuthContent();
+        appAuthContent.setApp_id("1210935703");
+        networkAppInfo.setApp_auth_content(appAuthContent);
+        network.setNetwork_app_info(Collections.singletonList(networkAppInfo));
+        String res = TakuRequestUtil.doRequest(HttpPost.METHOD_NAME, API_VERSION_V1+"/set_networks", JSONObject.toJSONString(network));
+        Network result = JSONObject.parseObject(res, Network.class);
+        return Result.resultOk(RepMessage.RELATIVE_SUCCESS,result);
+    }
+
+    /**
+     * 获取广告平台维度信息
+     */
+    @Override
+    public ResultTable<Network> getNetworks() {
+        // 这个接口虽然没有参数但是要设置为 " ", 如果reqBody设置为NULL会报601
+        String res = TakuRequestUtil.doRequest(HttpGet.METHOD_NAME, API_VERSION_V1+"/networks", "");
+        return ResultTable.resultTableOk(new PageInfo<>(JSON.parseArray(res, Network.class)));
+    }
+
+    /**
+     * 查询应用列表
+     */
+    @Override
+    public ResultTable<AppV1View> getAppList() {
+        String res = TakuRequestUtil.doRequest(HttpGet.METHOD_NAME, API_VERSION_V1+"/apps", null);
+        List<AppV1View> v1View = JSONArray.parseArray(res, AppV1View.class);
+        return ResultTable.resultTableOk(new PageInfo<>(v1View));
+    }
+
+    /**
+     * 新增或修改广告位
+     */
+    @Override
+    public ResultTable<AddPlacementResponse> addPlacements(AddPlacementParam param) {
+        String res = TakuRequestUtil.doRequest(HttpGet.METHOD_NAME, API_VERSION_V1+"/deal_placement", JSON.toJSONString(param));
+        List<AddPlacementResponse> placements = JSONArray.parseArray(res, AddPlacementResponse.class);
+        return ResultTable.resultTableOk(new PageInfo<>(placements));
+    }
 
-        return null;
+    /**
+     * 获取广告位列表
+     */
+    @Override
+    public ResultTable<?> getPlacementList(AddPlacementParam param) {
+        String res = TakuRequestUtil.doRequest(HttpGet.METHOD_NAME, API_VERSION_V1+"/placements", JSON.toJSONString(param));
+        List<AddPlacementResponse> placements = JSONArray.parseArray(res, AddPlacementResponse.class);
+        return ResultTable.resultTableOk(new PageInfo<>(placements));
+    }
+
+    /**
+     * 删除广告位
+     */
+    @Override
+    public Result<?> delPlacement(List<String> placementIds) {
+        JSONObject object = new JSONObject();
+        object.put("placement_ids",placementIds);
+        TakuRequestUtil.doRequest(HttpGet.METHOD_NAME, API_VERSION_V1+"/del_placements", object.toJSONString());
+        return Result.resultOk(RepMessage.DELETE_SUCCESS);
     }
 }

+ 63 - 19
yt-advertise/advertise-service/src/main/java/com/ytpm/util/TakuRequestUtil.java

@@ -1,5 +1,20 @@
 package com.ytpm.util;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.ytpm.advertise.param.AddPlacementParam;
+import com.ytpm.advertise.param.AppAuthContent;
+import com.ytpm.advertise.param.AuthContent;
+import com.ytpm.advertise.param.Network;
+import com.ytpm.advertise.param.NetworkAppInfo;
+import com.ytpm.advertise.param.PlacementListParam;
+import com.ytpm.advertise.param.PlacementParam;
+import com.ytpm.enums.AdPlatformTypeEnum;
+import com.ytpm.enums.AndroidFirstCategoryEnum;
+import com.ytpm.enums.AndroidSecondCategoryEnum;
+import com.ytpm.advertise.param.AddAppParam;
+import com.ytpm.enums.OpenReportEnum;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
@@ -12,25 +27,17 @@ import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
 
 import java.net.URL;
+import java.util.Objects;
 
+@Slf4j(topic = "Taku请求工具类")
 public class TakuRequestUtil {
 
+    private final static String DOMAIN = "https://openapi.toponad.com";
     public final static String CONTENT_TYPE = "application/json";
-    public final static String PUBLISHER_KEY = "537981a7286b9b3dd2ba02609fe22ceeaccbf896";
+    public final static String PUBLISHER_KEY = "d4b80bef5f946f618c9e781070aedbf2b1a073d4";
 
     public static void main(String[] args){
-        // POST example:
-        System.out.println("post response: " + doRequest(HttpPost.METHOD_NAME, "https://openapi.toponad.com/v1/apps", "{\"limit\":1}"));
-        // GET example:
-//        System.out.println("get response: " + doRequest(HttpGet.METHOD_NAME, "https://openapi.toponad.com/v1/waterfall/units?placement_id=xxx", ""));
-    }
-
-    public String doPost(String url, String reqBody) {
-        return doRequest(HttpPost.METHOD_NAME, url, reqBody);
-    }
-
-    public String doGet(String url, String reqBody) {
-        return this.doRequest(HttpGet.METHOD_NAME, url, "");
+        System.err.println(doRequest(HttpGet.METHOD_NAME, DOMAIN+"/v1/networks", ""));
     }
 
     public static String doRequest(String httpMethod, String reqUrl, String reqBody) {
@@ -49,7 +56,7 @@ public class TakuRequestUtil {
                 // TODO
             }
             // create the final signature
-            String contentMD5 = DigestUtils.md5Hex(reqBody).toUpperCase();
+            String contentMD5 = Objects.nonNull(reqBody)?DigestUtils.md5Hex(reqBody).toUpperCase():"";
             String nowMillis = System.currentTimeMillis() + "";
             String headerStr = "X-Up-Key:" + PUBLISHER_KEY + "\n" + "X-Up-Timestamp:" + nowMillis;
             String relativePath = new URL(reqUrl).getPath();
@@ -59,14 +66,19 @@ public class TakuRequestUtil {
             httpRequest.setHeader("X-Up-Timestamp", nowMillis);
             httpRequest.setHeader("X-Up-Key", PUBLISHER_KEY);
             httpRequest.setHeader("X-Up-Signature", finalSign);
-
+            log.debug("尝试向{}发送请求:请求类型{}, 请求内容:{}", httpMethod, reqUrl, reqBody);
             HttpResponse response = httpClient.execute(httpRequest);
-            if (response != null) {
-                HttpEntity resEntity = response.getEntity();
-                result = resEntity != null ? EntityUtils.toString(resEntity, "utf-8") : "";
+            int statusCode = response.getStatusLine().getStatusCode();
+            HttpEntity resEntity = response.getEntity();
+            result = resEntity != null ? EntityUtils.toString(resEntity, "utf-8") : "";
+            if(200!=statusCode){
+                JSONObject obj = JSON.parseObject(result);
+                throw new RuntimeException("错误码:" + statusCode + "\n message:"+obj.getString("errors"));
             }
+            log.debug("result:{}", result);
         } catch (Exception e) {
             e.printStackTrace();
+            log.error(e.getMessage());
         }
         return result;
     }
@@ -84,4 +96,36 @@ public class TakuRequestUtil {
                 append(relativePath);
         return DigestUtils.md5Hex(buf.toString()).toUpperCase();
 
-    }}
+    }
+
+    public static String sendWxRequest(String httpMethod, String reqUrl, String reqBody){
+        String result = null;
+        try{
+            CloseableHttpClient httpClient = HttpClients.createDefault();
+            HttpRequestBase httpRequest = null;
+            if (httpMethod.equals(HttpPost.METHOD_NAME)) {
+                HttpPost httpPost = new HttpPost(reqUrl);
+                httpPost.setEntity(new StringEntity(reqBody,"utf-8")); // 兼容中文
+//                httpPost.setEntity(new StringEntity(reqBody));
+                httpRequest = httpPost;
+            } else if (httpMethod.equals(HttpGet.METHOD_NAME)) {
+                httpRequest = new HttpGet(reqUrl);
+            }
+            httpRequest.setHeader("Content-Type", CONTENT_TYPE);
+            log.debug("尝试向{}发送请求:请求类型{}, 请求内容:{}", httpMethod, reqUrl, reqBody);
+            HttpResponse response = httpClient.execute(httpRequest);
+            int statusCode = response.getStatusLine().getStatusCode();
+            HttpEntity resEntity = response.getEntity();
+            result = resEntity != null ? EntityUtils.toString(resEntity, "utf-8") : "";
+            if(200!=statusCode){
+                JSONObject obj = JSON.parseObject(result);
+                throw new RuntimeException("错误码:" + statusCode + "\n message:"+obj.getString("errors"));
+            }
+            log.debug("result:{}", result);
+        }catch (Exception e){
+            e.printStackTrace();
+            log.error(e.getMessage());
+        }
+        return result;
+    }
+}

+ 31 - 0
yt-agent/agent-service/src/main/java/com/ytpm/controller/AgentChannelController.java

@@ -1,12 +1,16 @@
 package com.ytpm.controller;
 
+import com.ytpm.agent.param.ChannelParam;
 import com.ytpm.agent.view.AgentChannelView;
+import com.ytpm.general.Result;
 import com.ytpm.general.ResultTable;
 import com.ytpm.service.ChannelService;
 import io.swagger.annotations.Api;
 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;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
@@ -27,4 +31,31 @@ public class AgentChannelController {
     public ResultTable<AgentChannelView> list(){
         return channelService.channelList();
     }
+
+    /**
+     * 新增广告渠道
+     */
+    @ApiOperation("新增广告渠道")
+    @PostMapping("/addOne")
+    public Result<?> addOne(ChannelParam param){
+        return channelService.addOne(param);
+    }
+
+    /**
+     * 修改广告渠道
+     */
+    @ApiOperation("修改广告渠道")
+    @PostMapping("/updateOne")
+    public Result<?> updateOne(ChannelParam param){
+        return channelService.updateOne(param);
+    }
+
+    /**
+     * 删除广告渠道
+     */
+    @ApiOperation("删除广告渠道")
+    @GetMapping("/deleteOne")
+    public Result<?> deleteOne(@RequestParam("channelId")String channelId){
+        return channelService.deleteOne(channelId);
+    }
 }

+ 2 - 2
yt-agent/agent-service/src/main/java/com/ytpm/controller/AppController.java

@@ -23,9 +23,9 @@ public class AppController {
     private AgentAppService agentAppService;
 
     /**
-     * 查询渠道启用的应用列表
+     * 根据当前登录的加盟商查询启用的应用列表
      */
-    @ApiOperation("查询渠道启用的应用列表")
+    @ApiOperation("根据当前登录的加盟商查询启用的应用列表")
     @GetMapping("/getEnabledList")
     public ResultTable<AgentEnableAppView> getEnabledList(@ApiIgnore @AuthenticationPrincipal AgentUserInfo userInfo) {
         return agentAppService.getEnabledList(userInfo.getUserId());

+ 1 - 1
yt-agent/agent-service/src/main/java/com/ytpm/dao/AgentAppMapper.java

@@ -11,5 +11,5 @@ public interface AgentAppMapper {
     /**
      * 查询渠道启用的应用列表
      */
-    List<AgentEnableAppView> getEnabledList(@Param("channelId") String channelId);
+    List<AgentEnableAppView> getEnabledList(@Param("userId") String userId);
 }

+ 9 - 0
yt-agent/agent-service/src/main/java/com/ytpm/dao/ChannelMapper.java

@@ -1,5 +1,6 @@
 package com.ytpm.dao;
 
+import com.ytpm.agent.model.YtChannel;
 import com.ytpm.agent.view.AgentChannelView;
 import org.mapstruct.Mapper;
 
@@ -11,4 +12,12 @@ public interface ChannelMapper {
      * 获取渠道商列表
      */
     List<AgentChannelView> channelList();
+    /**
+     * 修改广告渠道
+     */
+    void update(YtChannel channel);
+    /**
+     * 新增广告渠道
+     */
+    void insert(YtChannel channel);
 }

+ 17 - 0
yt-agent/agent-service/src/main/java/com/ytpm/service/ChannelService.java

@@ -1,6 +1,8 @@
 package com.ytpm.service;
 
+import com.ytpm.agent.param.ChannelParam;
 import com.ytpm.agent.view.AgentChannelView;
+import com.ytpm.general.Result;
 import com.ytpm.general.ResultTable;
 
 public interface ChannelService {
@@ -8,4 +10,19 @@ public interface ChannelService {
      * 获取渠道商列表
      */
     ResultTable<AgentChannelView> channelList();
+
+    /**
+     * 新增广告渠道
+     */
+    Result<?> addOne(ChannelParam param);
+
+    /**
+     * 修改广告渠道
+     */
+    Result<?> updateOne(ChannelParam param);
+
+    /**
+     * 删除广告渠道
+     */
+    Result<?> deleteOne(String channelId);
 }

+ 2 - 2
yt-agent/agent-service/src/main/java/com/ytpm/service/impl/AgentAppServiceImpl.java

@@ -19,7 +19,7 @@ public class AgentAppServiceImpl implements AgentAppService {
      * 查询渠道启用的应用列表
      */
     @Override
-    public ResultTable<AgentEnableAppView> getEnabledList(String channelId) {
-        return ResultTable.resultTableOk(new PageInfo<>(agentAppMapper.getEnabledList(channelId)));
+    public ResultTable<AgentEnableAppView> getEnabledList(String userId) {
+        return ResultTable.resultTableOk(new PageInfo<>(agentAppMapper.getEnabledList(userId)));
     }
 }

+ 42 - 0
yt-agent/agent-service/src/main/java/com/ytpm/service/impl/ChannelServiceImpl.java

@@ -1,10 +1,16 @@
 package com.ytpm.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.github.pagehelper.PageInfo;
+import com.ytpm.agent.model.YtChannel;
+import com.ytpm.agent.param.ChannelParam;
 import com.ytpm.agent.view.AgentChannelView;
 import com.ytpm.dao.ChannelMapper;
+import com.ytpm.general.RepMessage;
+import com.ytpm.general.Result;
 import com.ytpm.general.ResultTable;
 import com.ytpm.service.ChannelService;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -22,4 +28,40 @@ public class ChannelServiceImpl implements ChannelService {
     public ResultTable<AgentChannelView> channelList() {
         return ResultTable.resultTableOk(new PageInfo<AgentChannelView>(channelMapper.channelList()));
     }
+
+    /**
+     * 新增广告渠道
+     */
+    @Override
+    public Result<?> addOne(ChannelParam param) {
+        YtChannel channel = new YtChannel();
+        BeanUtils.copyProperties(param, channel);
+        channel.setChannelId(IdWorker.get32UUID());
+        channel.setEnabled(1);
+        channelMapper.insert(channel);
+        return Result.resultOk(RepMessage.SAVE_SUCCESS);
+    }
+
+    /**
+     * 修改广告渠道
+     */
+    @Override
+    public Result<?> updateOne(ChannelParam param) {
+        YtChannel channel = new YtChannel();
+        BeanUtils.copyProperties(param, channel);
+        channelMapper.update(channel);
+        return Result.resultOk(RepMessage.SAVE_SUCCESS);
+    }
+
+    /**
+     * 删除广告渠道
+     */
+    @Override
+    public Result<?> deleteOne(String channelId) {
+        YtChannel channel = new YtChannel();
+        channel.setChannelId(channelId);
+        channel.setEnabled(0);
+        channelMapper.update(channel);
+        return Result.resultOk(RepMessage.DELETE_SUCCESS);
+    }
 }

+ 20 - 4
yt-agent/agent-service/src/main/resources/mapper/AgentAppMapper.xml

@@ -3,9 +3,25 @@
 <mapper namespace="com.ytpm.dao.AgentAppMapper">
 
     <select id="getEnabledList" resultType="com.ytpm.agent.view.AgentEnableAppView">
-        select
-        app_id, app_name, channel_id, app_type, parent_id, apk_url, qr_code, version_code, update_tips, enabled
-        from yt_app
-        where enabled = 1 and channel_id = #{channelId}
+        SELECT
+            ya.app_id,
+            ya.app_name,
+            ya.user_id,
+            ya.channel_id,
+            ya.app_type,
+            ya.parent_id,
+            ya.apk_url,
+            ya.qr_code,
+            ya.version_code,
+            ya.update_tips,
+            yc.channel_name,
+            ypu.nick_name
+        FROM
+            yt_app ya
+                LEFT JOIN yt_channel yc ON ya.channel_id = yc.channel_id
+                LEFT JOIN yt_platform_user ypu ON ya.user_id = ypu.user_id
+        WHERE
+            ya.enabled = 1
+          AND ya.user_id = #{userId}
     </select>
 </mapper>

+ 48 - 0
yt-agent/agent-service/src/main/resources/mapper/ChannelMapper.xml

@@ -1,10 +1,58 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ytpm.dao.ChannelMapper">
+    <insert id="insert">
+        insert into yt_channel
+            (
+             channel_id,
+             channel_name,
+             login_type,
+             channel_account,
+             channel_pwd,
+             channel_status,
+             api_key,
+             api_secret,
+             remark
+            )
+        values
+            (
+                #{channelId},
+                #{channelName},
+                #{loginType},
+                #{channelAccount},
+                #{channelPwd},
+                #{channelStatus},
+                #{apiKey},
+                #{apiSecret},
+                #{remark}
+            )
+    </insert>
+    <update id="update">
+        update yt_channel
+        <set>
+            <if test="channelName !=null">
+                channel_name = #{channelName},
+            </if>
+            <if test="channelStatus !=null">
+                channel_status = #{channelStatus},
+            </if>
+            <if test="apiKey !=null">
+                api_key = #{apiKey},
+            </if>
+            <if test="apiSecret !=null">
+                api_secret = #{apiSecret},
+            </if>
+            <if test="remark !=null">
+                remark = #{remark},
+            </if>
+        </set>
+        where channel_id = #{channelId}
+    </update>
 
     <select id="channelList" resultType="com.ytpm.agent.view.AgentChannelView">
         select
             channel_id, channel_name, login_type, channel_account, channel_pwd, channel_status, api_key, api_secret, remark
         from yt_channel
+        where enabled = 1
     </select>
 </mapper>

+ 3 - 8
yt-app/app-service/pom.xml

@@ -22,10 +22,6 @@
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-oauth2</artifactId>
-        </dependency>
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
@@ -33,13 +29,12 @@
         </dependency>
         <dependency>
             <groupId>com.ytpm</groupId>
-            <artifactId>agent-feign</artifactId>
+            <artifactId>risk-feign</artifactId>
             <version>1.0-SNAPSHOT</version>
         </dependency>
         <dependency>
-            <groupId>com.ytpm</groupId>
-            <artifactId>risk-feign</artifactId>
-            <version>1.0-SNAPSHOT</version>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
         </dependency>
     </dependencies>
     <build>

+ 1 - 1
yt-app/app-service/src/main/java/com/ytpm/AppApplication.java

@@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.RestController;
 @SpringBootApplication
 @EnableDiscoveryClient
 @MapperScan(basePackages = "com.ytpm.dao")
-//@EnableFeignClients(basePackages = {"com.ytpm.feign"})
+@EnableFeignClients(basePackages = {"com.ytpm.feign"})
 public class AppApplication
 {
     public static void main( String[] args )

+ 0 - 104
yt-app/app-service/src/main/java/com/ytpm/config/CustomUserAuthenticationConverter.java

@@ -1,104 +0,0 @@
-package com.ytpm.config;
-
-import cn.hutool.core.bean.BeanUtil;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.ytpm.agent.view.AgentUserInfo;
-import com.ytpm.constant.StrConstant;
-import com.ytpm.dao.AgentUserMapper;
-import com.ytpm.util.RedisService;
-import lombok.Data;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.AuthorityUtils;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.oauth2.provider.token.UserAuthenticationConverter;
-import org.springframework.stereotype.Component;
-import org.springframework.util.StringUtils;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Objects;
-
-/**
- * 自定义Security上下文信息
- */
-@Data
-@Component
-@Slf4j
-public class CustomUserAuthenticationConverter implements UserAuthenticationConverter {
-    private Collection<? extends GrantedAuthority> defaultAuthorities =
-            new ArrayList<>(AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_ADMIN"));
-    private UserDetailsService userDetailsService;
-
-    @Autowired
-    private RedisService redisService;
-    @Autowired
-    private AgentUserMapper userMapper;
-
-    @Override
-    public Map<String, ?> convertUserAuthentication(Authentication authentication) {
-        Map<String, Object> response = new LinkedHashMap();
-        response.put("username", authentication.getName());
-        if (authentication.getAuthorities() != null && !authentication.getAuthorities().isEmpty()) {
-            response.put("authorities", AuthorityUtils.authorityListToSet(authentication.getAuthorities()));
-        }
-        return response;
-    }
-
-    @Override
-    public Authentication extractAuthentication(Map<String, ?> map) {
-        if (map.containsKey("user_name")) {
-            String userName = (String) map.get("user_name");
-            Object principal;
-            Collection<? extends GrantedAuthority> authorities = this.getAuthorities(map);
-            AgentUserInfo user = userMapper.getCurrentUserInfo(userName);
-            if(Objects.isNull(user)){
-                log.error("当前用户不存在,应该退出登录");
-                return null;
-            }
-            String key = StrConstant.USER_INFO_PRE + userName ;
-            if (redisService.hasKey(key)) {
-                String str = redisService.getStr(key);
-                AgentUserInfo jwtUser = JSONObject.parseObject(str, AgentUserInfo.class);
-                principal = jwtUser;
-                authorities = jwtUser.getAuthorities();
-            } else {
-                AgentUserInfo jwtUser = new AgentUserInfo();
-                BeanUtil.copyProperties(user,jwtUser);
-                authorities = jwtUser.getAuthorities();
-                principal = jwtUser;
-                redisService.setStr(key, JSON.toJSONString(user));
-            }
-            return new UsernamePasswordAuthenticationToken(principal, "N/A", authorities);
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * 用户资源授权的方法重写  暂时未使用
-     *
-     * @param map
-     * @return
-     */
-    private Collection<? extends GrantedAuthority> getAuthorities(Map<String, ?> map) {
-        if (!map.containsKey("authorities")) {
-            return this.defaultAuthorities;
-        } else {
-            Object authorities = map.get("authorities");
-            if (authorities instanceof String) {
-                return AuthorityUtils.commaSeparatedStringToAuthorityList((String) authorities);
-            } else if (authorities instanceof Collection) {
-                return AuthorityUtils.commaSeparatedStringToAuthorityList(StringUtils.collectionToCommaDelimitedString((Collection) authorities));
-            } else {
-                throw new IllegalArgumentException("Authorities must be either a String or a Collection");
-            }
-        }
-    }
-}

+ 0 - 72
yt-app/app-service/src/main/java/com/ytpm/config/ResourceServerConfig.java

@@ -1,72 +0,0 @@
-package com.ytpm.config;
-
-import com.ytpm.handle.AppAuthExceptionEntryPoint;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.data.redis.connection.RedisConnectionFactory;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
-import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
-import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;
-import org.springframework.security.oauth2.provider.token.DefaultAccessTokenConverter;
-import org.springframework.security.oauth2.provider.token.RemoteTokenServices;
-import org.springframework.security.oauth2.provider.token.TokenStore;
-import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore;
-
-
-@Configuration
-@EnableResourceServer
-public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
-    @Value("${security.oauth2.client.client-id}")
-    private String clientId;
-
-    @Value("${security.oauth2.client.client-secret}")
-    private String secret;
-
-    @Value("${security.oauth2.authorization.check-token-access}")
-    private String checkTokenEndpointUrl;
-
-    @Autowired
-    private RedisConnectionFactory redisConnectionFactory;
-
-    @Autowired
-    private AppAuthExceptionEntryPoint appAuthExceptionEntryPoint;
-
-    @Autowired
-    private CustomUserAuthenticationConverter userAuthenticationConverter;
-
-    @Bean
-    public TokenStore redisTokenStore() {
-        return new RedisTokenStore(redisConnectionFactory);
-    }
-
-    @Bean
-    public RemoteTokenServices tokenService() {
-        RemoteTokenServices tokenService = new RemoteTokenServices();
-        tokenService.setClientId(clientId);
-        tokenService.setClientSecret(secret);
-        tokenService.setCheckTokenEndpointUrl(checkTokenEndpointUrl);
-        DefaultAccessTokenConverter defaultAccessTokenConverter = new DefaultAccessTokenConverter();
-        defaultAccessTokenConverter.setUserTokenConverter(userAuthenticationConverter);
-        tokenService.setAccessTokenConverter(defaultAccessTokenConverter);
-        return tokenService;
-    }
-
-    @Override
-    public void configure(ResourceServerSecurityConfigurer resources) {
-        resources.authenticationEntryPoint(appAuthExceptionEntryPoint);
-        resources.resourceId("app-service");
-    }
-
-    @Override
-    public void configure(HttpSecurity http) throws Exception {
-        http.headers().frameOptions().disable()
-                .and()
-                .authorizeRequests().antMatchers("/question/**","/api/public/**","/doc.html","/api/v2/**","/v2/api-docs", "/configuration/ui", "/swagger-resources", "/configuration/security",
-                        "/swagger-ui.html", "/webjars/**","/swagger-resources/configuration/ui","/swagger-ui.html").permitAll()
-                .anyRequest().authenticated();
-    }
-
-}

+ 51 - 10
yt-app/app-service/src/main/java/com/ytpm/controller/WxController.java

@@ -1,39 +1,80 @@
 package com.ytpm.controller;
 
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import com.ytpm.app.model.YtAppUserLoginRecord;
+import com.ytpm.app.param.WxLoginParam;
+import com.ytpm.app.view.WxDefaultConfig;
+import com.ytpm.app.view.WxLoginResult;
+import com.ytpm.app.view.WxUserInfo;
+import com.ytpm.dao.LoginRecordMapper;
 import com.ytpm.feign.RiskFeign;
+import com.ytpm.general.RepMessage;
 import com.ytpm.general.Result;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Date;
+
+
+@Slf4j
 @Api(tags = "微信开放能力模块")
 @RestController
 @RequestMapping("/wx")
 public class WxController {
+    @Value("${wx.openid}")
+    private  String APP_ID;
+    @Value("${wx.secret}")
+    private  String SECRET;
+    private final static String GRANT_TYPE = "authorization_code";
 
+    @Autowired
+    private LoginRecordMapper loginRecordMapper;
     @Autowired
     private RiskFeign riskFeign;
 
     @PostMapping("/login")
     @ApiOperation("微信登录")
-    public Result<?> wxLogin(@RequestParam("code")String code) {
+    public Result<WxUserInfo> wxLogin(@RequestBody WxLoginParam param) {
         //拿到授权码 请求微信登录返回access_token
-
-        //添加用户登录记录
-        return Result.resultOk();
+        String wxLoginUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+APP_ID+"&secret="+SECRET+"&code="+param.getWxCode()+"&grant_type="+GRANT_TYPE;
+        String result = HttpUtil.get(wxLoginUrl);
+        WxLoginResult loginResult = JSON.parseObject(result, WxLoginResult.class);
+        // TODO 拿到openid 调用风控服务过审,不满足风控要求则抛出异常
+//        riskFeign.checkUser(loginResult.getOpenid());
+        // 根据token和openid 获取用户信息
+        String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token="+loginResult.getAccess_token()+"&openid="+loginResult.getOpenid()+"&lang=zh_CN";
+        String curUser = HttpUtil.get(userInfoUrl);
+        WxUserInfo wxUserInfo = JSON.parseObject(curUser, WxUserInfo.class);
+        // 添加用户登录记录
+        YtAppUserLoginRecord loginRecord = new YtAppUserLoginRecord();
+        loginRecord.setAppId(APP_ID);
+        loginRecord.setRecordId(IdUtil.fastSimpleUUID());
+        loginRecord.setUserId(wxUserInfo.getOpenid());
+        loginRecord.setLoginTime(new Date());
+        loginRecord.setPhoneBrand(param.getBrand());
+        loginRecord.setPhoneModel(param.getModel());
+        loginRecord.setLoginIp(param.getLoginIp());
+        loginRecord.setCommunicationOperator(param.getIpOperator());
+        loginRecord.setIpAddr(param.getLoginIp());
+        loginRecordMapper.insertOne(loginRecord);
+        return Result.resultOk(RepMessage.LOGIN_SUCCESS,wxUserInfo);
     }
 
-    @GetMapping("/checkRisk")
-    @ApiOperation("校验用户是否满足风控规则")
-    public Result<?> checkRisk(@Param("userId")String userId) {
-//        riskFeign.checkUserRisk(userId);
-        return Result.resultOk();
+    @ApiOperation("获取微信默认配置项")
+    @GetMapping("/defaultConfig")
+    public Result<WxDefaultConfig> getWxDefaultConfig() {
+        return Result.resultObjOk(new WxDefaultConfig(APP_ID,SECRET)) ;
     }
 
 }

+ 12 - 0
yt-app/app-service/src/main/java/com/ytpm/dao/LoginRecordMapper.java

@@ -0,0 +1,12 @@
+package com.ytpm.dao;
+
+import com.ytpm.app.model.YtAppUserLoginRecord;
+import org.mapstruct.Mapper;
+
+@Mapper
+public interface LoginRecordMapper {
+    /**
+     * 增加用户登录记录
+     */
+    void insertOne(YtAppUserLoginRecord loginRecord);
+}

+ 0 - 40
yt-app/app-service/src/main/java/com/ytpm/handle/AppAuthExceptionEntryPoint.java

@@ -1,40 +0,0 @@
-package com.ytpm.handle;
-
-import com.alibaba.fastjson.JSONObject;
-import com.ytpm.general.RepMessage;
-import com.ytpm.general.StatusCode;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.oauth2.common.exceptions.InvalidTokenException;
-import org.springframework.security.web.AuthenticationEntryPoint;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-/**
- * 客户端未授权的访问处理逻辑
- */
-@Component
-@Slf4j
-public class AppAuthExceptionEntryPoint implements AuthenticationEntryPoint {
-    @Override
-    public void commence(HttpServletRequest request, HttpServletResponse response,
-                         AuthenticationException authException) {
-        Throwable cause = authException.getCause();
-        response.setHeader("Content-Type", "application/json;charset=UTF-8");
-        try {
-            JSONObject body = new JSONObject();
-            body.put("code", StatusCode.MANAGE_NOT_LOGIN);
-            body.put("message", RepMessage.TOKEN_EXPIRE);
-            if (!(cause instanceof InvalidTokenException)) {
-                body.put("code", StatusCode.MANAGE_NOT_LOGIN);
-                body.put("message", RepMessage.TOKEN_INVALID);
-            }
-            response.getWriter().write(body.toJSONString());
-        } catch (IOException e) {
-            log.error("token认证失败={}", e);
-        }
-    }
-}

+ 31 - 0
yt-app/app-service/src/main/resources/mapper/LoginRecordMapper.xml

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.dao.LoginRecordMapper">
+
+    <insert id="insertOne">
+        insert into yt_app_user_login_record
+        (
+         record_id,
+         user_id,
+         app_id,
+         login_time,
+         phone_brand,
+         phone_model,
+         login_ip,
+         communication_operator,
+         ip_addr
+        )
+        values
+        (
+         #{recordId},
+         #{userId},
+         #{appId},
+         #{loginTime},
+         #{phoneBrand},
+         #{phoneModel},
+         #{loginIp},
+         #{communicationOperator},
+         #{ipAddr}
+        )
+    </insert>
+</mapper>

+ 4 - 0
yt-app/pom.xml

@@ -102,6 +102,10 @@
                     <artifactId>jsr305</artifactId>
                     <groupId>com.google.code.findbugs</groupId>
                 </exclusion>
+                <exclusion>
+                    <groupId>org.springframework.cloud</groupId>
+                    <artifactId>spring-cloud-starter-oauth2</artifactId>
+                </exclusion>
             </exclusions>
         </dependency>
         <dependency>

+ 3 - 1
yt-advertise/advertise-service/src/main/java/com/ytpm/param/AddAppParam.java → yt-common/src/main/java/com/ytpm/advertise/param/AddAppParam.java

@@ -1,4 +1,4 @@
-package com.ytpm.param;
+package com.ytpm.advertise.param;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -27,4 +27,6 @@ public class AddAppParam {
     private Integer coppa;
     @ApiModelProperty(value = "是否遵守CCPA协议 1-否 2-是", required = true)
     private Integer ccpa;
+    @ApiModelProperty(value = "应用ID",required = false, notes = "修改时传新增时不传")
+    private String uuid;
 }

+ 17 - 0
yt-common/src/main/java/com/ytpm/advertise/param/AddPlacementParam.java

@@ -0,0 +1,17 @@
+package com.ytpm.advertise.param;
+
+import lombok.Data;
+
+import javax.validation.constraints.Size;
+import java.util.List;
+
+@Data
+public class AddPlacementParam {
+    /** 创建或修改的广告位数量 */
+    private Integer count;
+    /** 创建或修改的广告位的应用ID */
+    private String app_id;
+    /** 创建或修改的广告位信息列表 */
+    @Size(min = 1,max = 100)
+    private List<PlacementParam> placements;
+}

+ 16 - 0
yt-common/src/main/java/com/ytpm/advertise/param/AppAuthContent.java

@@ -0,0 +1,16 @@
+package com.ytpm.advertise.param;
+
+import lombok.Data;
+
+/**
+ * 广告平台的应用认证信息
+ */
+@Data
+public class AppAuthContent {
+    /* 腾讯广告 穿山甲 百度 快手 Sigmob */
+    private String app_id;
+    /* 快手 额外*/
+    private String app_name;
+    /* Sigmob 额外*/
+    private String app_key;
+}

+ 30 - 0
yt-common/src/main/java/com/ytpm/advertise/param/AuthContent.java

@@ -0,0 +1,30 @@
+package com.ytpm.advertise.param;
+
+import lombok.Data;
+
+/**
+ * 广告平台的认证信息
+ */
+@Data
+public class AuthContent {
+    /* 腾讯广告 (快手)都需要*/
+    private String account_id;
+    /* 腾讯广告 (Sigmob)都需要 */
+    private String secret_key;
+    private String oauth_key;
+
+    /* Sigmob */
+    private String public_key;
+
+    /* 穿山甲 api_version = 1 */
+    private String user_id;
+    private String secure_key;
+    /* 穿山甲 api_version = 2 增加一个字段 */
+    private String role_id;
+
+    /* 百度(快手)都需要*/
+    private String access_key;
+
+    /* 快手 */
+    private String security_key;
+}

+ 27 - 0
yt-common/src/main/java/com/ytpm/advertise/param/Network.java

@@ -0,0 +1,27 @@
+package com.ytpm.advertise.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 广告平台请求参数
+ */
+@Data
+public class Network {
+    @ApiModelProperty(value = "广告平台账号名称", required = false)
+    private String network_name;
+    @ApiModelProperty(value = "广告平台ID 参考聚合文档", required = true)
+    private Integer nw_firm_id;
+    @ApiModelProperty(value = "广告平台账号ID", required = false, notes = "修改传,创建不传")
+    private Integer network_id;
+    @ApiModelProperty(value = "是否开通Report API", required = true)
+    private Integer is_open_report;
+    @ApiModelProperty(value = "不同的版本有不同的三方参数,暂时只有穿山甲平台支持分版本,其他平台可不传", required = false)
+    private String api_version;
+    @ApiModelProperty(value = "广告平台Publisher维度参数 1:百度平台默认支持的是公钥模式 2:分api版本的平台主要不同版本传不同参数", required = false)
+    private AuthContent auth_content;
+    @ApiModelProperty(value = "广告平台App维度信息列表", required = false)
+    private List<NetworkAppInfo> network_app_info;
+}

+ 15 - 0
yt-common/src/main/java/com/ytpm/advertise/param/NetworkAppInfo.java

@@ -0,0 +1,15 @@
+package com.ytpm.advertise.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 广告平台APP信息
+ */
+@Data
+public class NetworkAppInfo {
+    @ApiModelProperty("Taku应用ID")
+    private String app_id;
+    @ApiModelProperty("广告平台的APP认证信息")
+    private AppAuthContent app_auth_content;
+}

+ 18 - 0
yt-common/src/main/java/com/ytpm/advertise/param/PlacementListParam.java

@@ -0,0 +1,18 @@
+package com.ytpm.advertise.param;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class PlacementListParam {
+
+    /** 应用ID列表,默认所有应用ID,数量最大限制为100  */
+    private List<String> app_ids;
+    /** 广告位ID列表,默认所有广告位ID,数量最大限制为100 注意:和start, limit参数一起使用时,以start+limit条件获取到的广告位个数为准 */
+    private List<String> placement_ids;
+    /** 起始偏移量,默认0 */
+    private Integer start;
+    /** 起始偏移量,默认100, 最大一次性获取100 */
+    private Integer limit;
+}

+ 27 - 0
yt-common/src/main/java/com/ytpm/advertise/param/PlacementParam.java

@@ -0,0 +1,27 @@
+package com.ytpm.advertise.param;
+
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+@Data
+public class PlacementParam {
+    /** 广告位id 1.修改操作传入 2.创建操作不传 此时如果placement_name已存在,则也标识为修改操作,即不允许在同一个应用下创建相同名字的广告位 */
+    private String placement_id;
+    /** 广告位名称 */
+    @Length(min = 1, max = 100)
+    private String placement_name;
+    /** 广告样式,创建后不可修改,枚举值:native、banner、rewarded_video、interstitial、splash */
+    private String adformat;
+    /** 服务端激励回调开关,
+     注意:只有激励视频样式才有的属性,非激励视频不传即可,
+     激励视频创建时默认是关闭,编辑时不不传代表不修改 */
+    private Integer reward_s2s_sw;
+    /** 激励回调规则ID,服务端激励回调开启时必传,非激励视频或激励回调关闭时不传即可, 0代表自定义规则,大于0代表已有的回调规则 */
+    private Integer reward_rule_id;
+    /** 服务端激励回调开启时(reward_s2s_sw=1)并且选择了自定义规则(reward_rule_id=0)时必传属性,非激励视频或激励回调关闭时不传即可 */
+    private RewardS2S reward_s2s;
+    /** 备注 */
+    private String remark;
+    /** 广告位状态(后期不再维护,请使用下面Api4接口),默认正常,注意:设置1,2会影响广告位使用,枚举值说明: 1: 锁定 2: 等待审核 3: 正常 */
+    private Integer status;
+}

+ 13 - 0
yt-common/src/main/java/com/ytpm/advertise/param/RewardS2S.java

@@ -0,0 +1,13 @@
+package com.ytpm.advertise.param;
+
+import lombok.Data;
+
+@Data
+public class RewardS2S {
+    /** 激励数量,有效范围[1:10000000] */
+    private Integer number;
+    /** 激励名称 */
+    private String name;
+    /** 激励回调地址,注意:请输入有效地址,Taku会在操作时回调该地址(增加参数is_test=1)测试是否正常,正常需要返回200状态码 */
+    private String url;
+}

+ 19 - 0
yt-common/src/main/java/com/ytpm/advertise/view/AddAppResponse.java

@@ -0,0 +1,19 @@
+package com.ytpm.advertise.view;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AddAppResponse {
+    /** 添加成功后的应用ID */
+    private String uuid;
+    /** 添加成功后的应用Key */
+    private String app_key;
+    /**
+     * 错误服应用信息列表,注意:
+     * 1. 列表为空,则标识操作成功
+     * 2. 列表不为空,则列表标识哪些应用校验不通过,所有应用
+     * */
+    private List<ResponseErrors> errs;
+}

+ 25 - 0
yt-common/src/main/java/com/ytpm/advertise/view/AddPlacementResponse.java

@@ -0,0 +1,25 @@
+package com.ytpm.advertise.view;
+
+import lombok.Data;
+
+@Data
+public class AddPlacementResponse {
+    /** 开发者后台的应用ID */
+    private String app_name;
+    /** 应用名称 */
+    private String app_id;
+    /** 广告位名称 */
+    private Integer platform;
+    /** 开发者后台的广告位ID */
+    private String placement_id;
+    /** 广告位名称 */
+    private String placement_name;
+    /** 广告样式,枚举值:native、banner、rewarded_video、interstitial、splash */
+    private String adformat;
+    /** 备注 */
+    private String remark;
+    /** 广告位状态 */
+    private Integer status;
+    /** 广告位开启、关闭等状态,枚举说明 1: 关闭 3: 开启*/
+    private Integer status_v2;
+}

+ 35 - 0
yt-common/src/main/java/com/ytpm/advertise/view/AppV1View.java

@@ -0,0 +1,35 @@
+package com.ytpm.advertise.view;
+
+import lombok.Data;
+
+@Data
+public class AppV1View {
+    /** 开发者后台的应用ID */
+    private String app_name;
+    /** 应用名称 */
+    private String app_id;
+    /** 应用标识key */
+    private String app_key;
+    /** 应用平台,创建后不可修改 1: 安卓平台 2: iOS平台 */
+    private Integer platform;
+    /** 应用商店链接 */
+    private String market_url;
+    /** 应用包名 */
+    private String package_name;
+    /** 应用一级分类 */
+    private String category;
+    /** 应用二级分类 */
+    private String sub_category;
+    /** 屏幕方向 1: 竖屏 2: 横屏 3: 所有 */
+    private Integer screen_orientation;
+    /** 是否遵守COPPA协议 */
+    private String coppa;
+    /** 是否遵守CCPA协议 */
+    private String ccpa;
+    /** 应用开启、关闭等状态  1: 关闭 3: 开启 */
+    private String status;
+    /** 是否在商店上架 1: 否 2: 是 */
+    private String store_on_sale;
+    /** errors  */
+    private String errors;
+}

+ 13 - 0
yt-common/src/main/java/com/ytpm/advertise/view/ResponseErrors.java

@@ -0,0 +1,13 @@
+package com.ytpm.advertise.view;
+
+import lombok.Data;
+
+@Data
+public class ResponseErrors {
+    /** 错误item在请求参数items中的索引位置,从0开始  */
+    private Integer index;
+    /** 错误码 */
+    private Integer code;
+    /** 错误信息 */
+    private String msg;
+}

+ 1 - 0
yt-common/src/main/java/com/ytpm/agent/model/YtChannel.java

@@ -13,4 +13,5 @@ public class YtChannel {
     private String apiKey;
     private String apiSecret;
     private String remark;
+    private Integer enabled;
 }

+ 30 - 0
yt-common/src/main/java/com/ytpm/agent/param/ChannelParam.java

@@ -0,0 +1,30 @@
+package com.ytpm.agent.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("广告渠道入参")
+public class ChannelParam {
+    @ApiModelProperty("渠道ID")
+    private String channelId;
+    @ApiModelProperty("渠道名称")
+    private String channelName;
+    @ApiModelProperty("登录类型 1-账号密码 2-微信")
+    private Integer loginType;
+    @ApiModelProperty("渠道账号")
+    private String channelAccount;
+    @ApiModelProperty("渠道密码")
+    private String channelPwd;
+    @ApiModelProperty("渠道状态")
+    private Integer channelStatus;
+    @ApiModelProperty("请求秘钥")
+    private String apiKey;
+    @ApiModelProperty("请求密令")
+    private String apiSecret;
+    @ApiModelProperty("备注")
+    private String remark;
+    @ApiModelProperty("广告平台类型 1-穿山甲 2-腾讯广告 3-百度联盟 4-快手 5-Sigmob")
+    private Integer adPlatformType;
+}

+ 24 - 0
yt-common/src/main/java/com/ytpm/app/param/WxLoginParam.java

@@ -0,0 +1,24 @@
+package com.ytpm.app.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@ApiModel("微信登录参数")
+@Data
+public class WxLoginParam {
+    @ApiModelProperty(value = "手机品牌")
+    private String brand;
+    @ApiModelProperty(value = "手机型号")
+    private String model;
+    @ApiModelProperty(value = "手机别名")
+    private String alias;
+    @ApiModelProperty(value = "登录IP")
+    private String loginIp;
+    @ApiModelProperty(value = "IP运营商")
+    private String ipOperator;
+    @ApiModelProperty(value = "IP归属地")
+    private String ipLocation;
+    @ApiModelProperty(value = "微信登录认证授权码",required = true)
+    private String wxCode;
+}

+ 15 - 0
yt-common/src/main/java/com/ytpm/app/view/WxDefaultConfig.java

@@ -0,0 +1,15 @@
+package com.ytpm.app.view;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel("微信默认配置")
+public class WxDefaultConfig {
+    private String appId;
+    private String secret;
+}

+ 13 - 0
yt-common/src/main/java/com/ytpm/app/view/WxLoginResult.java

@@ -0,0 +1,13 @@
+package com.ytpm.app.view;
+
+import lombok.Data;
+
+@Data
+public class WxLoginResult {
+    private String access_token;
+    private Integer expires_in;
+    private String refresh_token;
+    private String openid;
+    private String scope;
+    private String unionid;
+}

+ 18 - 0
yt-common/src/main/java/com/ytpm/app/view/WxUserInfo.java

@@ -0,0 +1,18 @@
+package com.ytpm.app.view;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class WxUserInfo {
+    private String openid;
+    private String nickname;
+    private Integer sex;
+    private String province;
+    private String city;
+    private String country;
+    private String headimgurl;
+    private List<String> privilege;
+    private String unionid;
+}

+ 4 - 0
yt-common/src/main/java/com/ytpm/general/RepMessage.java

@@ -8,11 +8,14 @@ public class RepMessage {
     public static final String QUERY_SUCCESS = "查询成功";
     public static final String MODIFY_SUCCESS = "修改成功";
     public static final String SAVE_SUCCESS = "保存成功";
+    public static final String DELETE_SUCCESS = "删除成功";
+    public static final String RELATIVE_SUCCESS = "关联成功";
     public static final String LOGOUT_SUCCESS = "已退出登录";
     public static final String NOT_LOGIN= "当前用户未登录";
     public static final String USER_NAME_EMPTY = "用户名不能为空";
     public static final String USERNAME_OR_PASSWORD_ERROR = "用户名或密码错误";
     public static final String LOGIN_NON_MSG = "请输入验证码";
+    public static final String LOGIN_SUCCESS = "登录成功";
     public static final String METHOD_NOT_ARROW = "请求方式不允许";
     public static final String TOKEN_EXPIRE = "登录超时,请重新登录";
     public static final String TOKEN_INVALID = "登录已失效,请重新登录";
@@ -26,4 +29,5 @@ public class RepMessage {
     public static final String RELATIVE_APP_SUCCESS = "关联应用成功";
     public static final String SERVICE_UNAVAILABLE = "服务暂时不可用,请稍后重试";
     public static final String OBJECT_NOT_EXIST = "查询对象不存在";
+    public static final String CURRENT_USER_RISKING = "当前用户处于风控中";
 }

+ 4 - 0
yt-common/src/main/java/com/ytpm/util/HttpClientUtil.java

@@ -0,0 +1,4 @@
+package com.ytpm.util;
+
+public class HttpClientUtil {
+}

+ 3 - 0
yt-risk/risk-feign/src/main/java/com/ytpm/feign/RiskFeign.java

@@ -58,4 +58,7 @@ public interface RiskFeign {
 
     @GetMapping("/riskConfig/templateView")
     Result<RiskTemplateView> templateView(@RequestParam("templateId")String templateId);
+
+    @GetMapping("/riskManage/checkRisk")
+    Result<?> checkRisk(@RequestParam("openid")String openid);
 }

+ 1 - 1
yt-risk/risk-manage/src/main/java/com/ytpm/config/ResourceServerConfig.java

@@ -64,7 +64,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
     public void configure(HttpSecurity http) throws Exception {
         http.headers().frameOptions().disable()
                 .and()
-                .authorizeRequests().antMatchers("/api/public/**","/doc.html","/api/v2/**","/v2/api-docs", "/configuration/ui", "/swagger-resources", "/configuration/security",
+                .authorizeRequests().antMatchers("/riskManage/checkRisk","/api/public/**","/doc.html","/api/v2/**","/v2/api-docs", "/configuration/ui", "/swagger-resources", "/configuration/security",
                         "/swagger-ui.html", "/webjars/**","/swagger-resources/configuration/ui","/swagger-ui.html").permitAll()
                 .anyRequest().authenticated();
     }

+ 9 - 0
yt-risk/risk-manage/src/main/java/com/ytpm/controller/RiskManageController.java

@@ -97,4 +97,13 @@ public class RiskManageController {
         return riskService.relativeApp(param);
     }
 
+    /**
+     * 校验用户是否属于风控中
+     */
+    @ApiOperation("校验用户是否属于风控中")
+    @ApiImplicitParam(name = "userId", value = "用户ID", required = true, paramType = "path")
+    @GetMapping("/checkRisk")
+    public Result<?> checkRisk(@RequestParam("openid")String openid){
+        return riskService.checkRisk(openid);
+    }
 }

+ 5 - 0
yt-risk/risk-manage/src/main/java/com/ytpm/dao/RiskUserMapper.java

@@ -17,6 +17,11 @@ public interface RiskUserMapper {
      */
     YtAppUser selectByUserId(@Param("userId") String userId);
 
+    /**
+     * 微信openid查询用户
+     */
+    YtAppUser selectByWx(@Param("openid") String openid);
+
     /**
      * 主键修改
      */

+ 5 - 0
yt-risk/risk-manage/src/main/java/com/ytpm/service/RiskService.java

@@ -67,4 +67,9 @@ public interface RiskService {
      * 修改风控配置模版
      */
     Result<?> updateConfig(RiskConfigParam param);
+
+    /**
+     * 校验用户是否处于风控中
+     */
+    Result<?> checkRisk(String openid);
 }

+ 16 - 1
yt-risk/risk-manage/src/main/java/com/ytpm/service/impl/RiskServiceImpl.java

@@ -22,6 +22,7 @@ import com.ytpm.dao.RiskUserMapper;
 import com.ytpm.general.RepMessage;
 import com.ytpm.general.Result;
 import com.ytpm.general.ResultTable;
+import com.ytpm.handle.CustomerException;
 import com.ytpm.risk.model.YtRiskConfig;
 import com.ytpm.risk.model.YtRiskTemplate;
 import com.ytpm.risk.param.RiskBannedListParam;
@@ -72,7 +73,6 @@ public class RiskServiceImpl extends ReflectUtil implements RiskService {
     private RiskManageMapper riskManageMapper;
     @Resource
     private AppLoginRecordMapper loginRecordMapper;
-
     /**
      * 查询配置字段选项
      */
@@ -321,6 +321,21 @@ public class RiskServiceImpl extends ReflectUtil implements RiskService {
         return Result.resultOk(RepMessage.MODIFY_SUCCESS);
     }
 
+    /**
+     * 校验用户是否处于风控中
+     */
+    @Override
+    public Result<?> checkRisk(String openid) {
+        YtAppUser appUser = riskUserMapper.selectByUserId(openid);
+        if(Objects.isNull(appUser)){
+            throw new CustomerException(RepMessage.OBJECT_NOT_EXIST);
+        }
+        if(!UserStatusEnum.NORMAL.getCode().equals(appUser.getUserStatus())){
+            throw new CustomerException(RepMessage.CURRENT_USER_RISKING);
+        }
+        return Result.resultOk(RepMessage.QUERY_SUCCESS);
+    }
+
     /**
      * 修改用户信息
      */

+ 3 - 0
yt-risk/risk-manage/src/main/resources/mapper/RiskUserMapper.xml

@@ -127,4 +127,7 @@
             </choose>
         </if>
     </select>
+    <select id="selectByWx" resultType="com.ytpm.agent.model.YtAppUser">
+        select user_id, app_id, nick_name, registry_time, last_login_time, last_login_ip, login_days, channel_type, channel_origin, user_type, total_video, total_income, red_packet_balance, red_packet_amount, points_balance, points_total, withdraw_total, sign_days, user_status, lock_reason, wx_open_id, platform_id, channel_id from yt_app_user where wx_open_id = #{openid}
+    </select>
 </mapper>