Przeglądaj źródła

广告投放新增公众号

chenbiao 3 lat temu
rodzic
commit
152e6aed1a

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/advertisement/AdvertisementOrderDonService.java

@@ -14,7 +14,7 @@ import java.util.Map;
  * @date 2023/5/16 11:07 AM
  */
 public interface AdvertisementOrderDonService extends IService<AdvertisementOrderDon> {
-    H5JsPayParams minipay(Long popularizeId, BigDecimal money, String appId, AdvertisementUser user, String callback, String callbackType) throws Exception;
+    H5JsPayParams pay(Long popularizeId, BigDecimal money, String appId, AdvertisementUser user, AdvertisementOrderDon.Source source, String callback, String callbackType) throws Exception;
 
     void prepayNotify(Map<String, String> map) throws Exception;
 

+ 2 - 5
netflix-service/src/main/java/com/cyksj/service/advertisement/impl/AdvertisementOrderDonServiceImpl.java

@@ -73,7 +73,7 @@ public class AdvertisementOrderDonServiceImpl extends ServiceImpl<AdvertisementO
     private final AdvertisementProjectMapper projectMapper;
 
     @Override
-    public H5JsPayParams minipay(Long popularizeId, BigDecimal money, String appId, AdvertisementUser user, String callback, String callbackType) throws Exception {
+    public H5JsPayParams pay(Long popularizeId, BigDecimal money, String appId, AdvertisementUser user, AdvertisementOrderDon.Source source, String callback, String callbackType) throws Exception {
         if(!this.appId.equals(appId)){
             throw BusinessRuntimeException.getInstance("appId非法.");
         }
@@ -93,10 +93,7 @@ public class AdvertisementOrderDonServiceImpl extends ServiceImpl<AdvertisementO
                 .toHexString();
 
         AdvertisementOrderDon orderDon = new AdvertisementOrderDon().setPopularizeId(popularizeId).setMoney(money).setOrderNo(donNo).setUserId(user.getId())
-                .setOpenId(payOpenId).setSource(AdvertisementOrderDon.Source.Mini_Program);
-
-        this.saveOrUpdate(orderDon);
-
+                .setOpenId(payOpenId).setSource(source);
         //数据回传
         if (StringUtils.isNotBlank(callback)) {
             orderPostService.savePostData(orderDon.getId(), callback, callbackType);

+ 48 - 6
netflix-web/src/main/java/com/cyksj/web/controller/advertisement/AdvertisementOrderDonController.java

@@ -2,13 +2,17 @@ package com.cyksj.web.controller.advertisement;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.Codec;
 import com.cyksj.common.util.IoKit;
 import com.cyksj.common.util.Xmls;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayApiCode;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.WxAppMapper;
 import com.cyksj.model.dto.H5JsPayParams;
+import com.cyksj.model.entity.AdvertisementOrderDon;
 import com.cyksj.model.entity.AdvertisementUser;
 import com.cyksj.model.entity.WxApp;
 import com.cyksj.model.request.WeChatPayRequest;
@@ -24,12 +28,15 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.OutputStream;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Stream;
 
 /**
  * @author chan
@@ -41,9 +48,16 @@ import java.util.Map;
 @RequestMapping("/applets/advertisement/order")
 public class AdvertisementOrderDonController {
 
+    private static final String OPEN_KEY = "openKey";
+    
+    private final HttpServletRequest request;
+    
     private final AdvertisementUserService advertisementUserService;
 
     private final AdvertisementOrderDonService advertisementOrderDonService;
+    
+    private final WxAppMapper wxAppMapper;
+    
 
     @PostMapping("/post/pay")
     public Result<H5JsPayParams> pay(@RequestBody @Validated WeChatPayRequest weChatPayRequest) throws Exception {
@@ -54,12 +68,40 @@ public class AdvertisementOrderDonController {
         if (StringUtils.isBlank(weChatPayRequest.getAppId())) {
             throw BusinessRuntimeException.getInstance("缺少必填参数appId");
         }
-
-        //小程序支付
-        AdvertisementUser user = advertisementUserService.getById(StpUserUtil.getLoginIdAsLong());
-
-        H5JsPayParams payParams = advertisementOrderDonService.minipay(weChatPayRequest.getPopularizeId()
-                , donMoney.setScale(0, RoundingMode.DOWN), weChatPayRequest.getAppId(), user
+        WxApp wxApp = wxAppMapper.selectOne(Wrappers.lambdaQuery(WxApp.class).eq(WxApp::getAppId, weChatPayRequest.getAppId()));
+        if (wxApp == null) {
+            throw BusinessRuntimeException.getInstance("app不存在.");
+        }
+        AdvertisementOrderDon.Source source;
+        AdvertisementUser user;
+        if ("小程序".equals(wxApp.getCategory())) {
+            
+            //小程序支付
+            user = advertisementUserService.getById(StpUserUtil.getLoginIdAsLong());
+            source = AdvertisementOrderDon.Source.Mini_Program;
+        }else {
+
+            source = AdvertisementOrderDon.Source.WeChat;
+            AtomicReference<String> openKey = new AtomicReference<>();
+            Cookie[] cookies = request.getCookies();
+            Stream.of(cookies).forEach((cookie) -> {
+                if (StringUtils.equals(cookie.getName(), OPEN_KEY)) {
+                    openKey.set(cookie.getValue());
+                }
+            });
+            if (StringUtils.isBlank(openKey.get())) {
+                throw BusinessRuntimeException.getInstance("您还未授权.");
+            }
+            String payOpenId = Codec.DoBase64.custom().setData(openKey.get()).decodeAsText();
+
+            user = new AdvertisementUser();
+            user.setOpenId(payOpenId);
+            user.setId(0L);
+        }
+        
+      
+        H5JsPayParams payParams = advertisementOrderDonService.pay(weChatPayRequest.getPopularizeId()
+                , donMoney.setScale(0, RoundingMode.DOWN), weChatPayRequest.getAppId(), user, source
                 , weChatPayRequest.getCallback(), weChatPayRequest.getCallbackType());
 
 

+ 74 - 0
netflix-web/src/main/java/com/cyksj/web/controller/advertisement/AdvertisementUserController.java

@@ -1,19 +1,31 @@
 package com.cyksj.web.controller.advertisement;
 
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.snowflake.Sequence;
+import com.cyksj.common.util.Codec;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.enums.WeChatAuthRedirectUrl;
+import com.cyksj.model.dto.AuthRedirect;
+import com.cyksj.model.dto.AuthToken;
 import com.cyksj.model.dto.UserWhoami;
 import com.cyksj.model.entity.AdvertisementUser;
 import com.cyksj.model.request.MiniProgramLoginPost;
+import com.cyksj.redis.RedisService;
 import com.cyksj.service.advertisement.AdvertisementUserService;
+import com.cyksj.service.wechat.WeChatService;
 import com.cyksj.web.util.StpUserUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletResponse;
+
 /**
  * @author chan
  * @date 2023/5/16 11:49 AM
@@ -24,8 +36,21 @@ import org.springframework.web.bind.annotation.*;
 @RequestMapping("/applets/advertisement/user")
 public class AdvertisementUserController {
 
+    @Value("${advertisementwxapp.notify}")
+    private String notify;
+
+    @Value("${advertisementwxapp.appId}")
+    private String appId;
+
+    private final static Sequence SEQUENCE = new Sequence(0);
+
     private final AdvertisementUserService advertisementUserService;
 
+    private final RedisService redisService;
+
+
+    private final WeChatService weChatService;
+
     /**
      * 小程序静默授权
      */
@@ -62,5 +87,54 @@ public class AdvertisementUserController {
 
 
 
+    @GetMapping(value = "/weChat")
+    public void base(String url, String authType, HttpServletResponse response) throws Exception {
+
+        log.info("微信授权转跳. url: {},authType:{}",url,authType);
+
+        // 无论是否为老用户 均转跳到授权页面
+        // 若授权过 则无需再次授权 直接回调 /user/wechat/redirect
+        // 新用户同意授权后 也会回调 /user/wechat/redirect
+
+        Long mappingId = SEQUENCE.nextId();
+        redisService.set(mappingId.toString(),url,60*60*24L);
+        AuthRedirect redirect = new AuthRedirect().setMappingId(mappingId);
+        String state = Codec.DoBase64.custom().setData(Jsons.toJson(redirect)).encodeAsText();
+
+        response.sendRedirect(weChatService.createUrl(state, notify + WeChatAuthRedirectUrl.get(authType).getUrl(), appId, WeChatAuthRedirectUrl.get(authType).getScope() ));
+
+    }
+
+    /**
+     * 静默授权
+     * @author chan
+     * @date 2021-10-11 上午11:58
+     */
+    @GetMapping("/weChat/silentRedirect")
+    @Transactional(rollbackFor = Throwable.class)
+    public void redirectV2(String code, String state, HttpServletResponse response) throws Exception {
+
+        // 转跳参数
+        String json = Codec.DoBase64.custom().setData(state).decodeAsText();
+        AuthRedirect re = Jsons.parseObject(json, AuthRedirect.class);
+
+        AuthToken token = weChatService.getAuthToken(code,appId);
+
+        //  查询用户期望转跳的url
+        String url = redisService.getStr(re.getMappingId().toString());
+        String data = Codec.DoBase64.custom().setData(token.getOpenid()).encodeAsText();
+
+        Cookie cookie = new Cookie("openKey",data);
+        cookie.setMaxAge(31536000);
+        cookie.setPath("/");
+        response.addCookie(cookie);
+
+        log.info("微信授权转跳. url: {}",url);
+        response.sendRedirect(url);
+
+    }
+
+
+
 
 }

Plik diff jest za duży
+ 0 - 0
netflix-web/src/main/resources/application-dev.yml


Plik diff jest za duży
+ 0 - 0
netflix-web/src/main/resources/application-prd.yml


Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików