zyp 1 week ago
parent
commit
1a7f3c0e74

+ 10 - 0
fs-service-system/src/main/java/com/fs/course/config/CourseConfig.java

@@ -31,6 +31,16 @@ public class CourseConfig implements Serializable {
     private String courseLogo;//课程Logo
     private Integer openCommentStatus; //开启评论/弹幕
     private Integer viewCommentNum; // 查看历史评论数量
+    /**
+     * 小程序授权头像昵称方式(目前仅会员看课有效)
+     * 1:小程序原生授权 2:跳转H5服务号授权
+     */
+    private Integer miniAppAuthType;
+    /**
+     * 会员看课
+     * 小程序授权头像昵称,跳转H5服务号授权域名
+     */
+    private String userCourseAuthDomain;
 
     @Data
     public static class DisabledTimeVo{

+ 2 - 0
fs-service-system/src/main/java/com/fs/course/service/IFsUserCourseVideoService.java

@@ -175,4 +175,6 @@ public interface IFsUserCourseVideoService
     ResponseResult<Boolean> setWatchCourseTime(List<FsWatchCourseTimeParam> paramList);
 
     FsUserCourseVideoQVO selectFsUserCourseVideoByVideoIdVO(Long videoId);
+
+    R checkUserInfo(Long userId);
 }

+ 21 - 0
fs-service-system/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -1441,6 +1441,27 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         return fsUserCourseVideoQVO;
     }
 
+    @Override
+    public R checkUserInfo(Long userId) {
+        FsUser user=fsUserService.selectFsUserById(userId);
+        if (user==null) {
+            return R.error(404,"用户不存在!");
+        }
+        //读取配置给前端返回
+        String json = sysConfigService.selectConfigByKey("course.config");
+        CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
+        if (org.apache.commons.lang3.StringUtils.isEmpty(user.getNickname()) || org.apache.commons.lang3.StringUtils.isEmpty(user.getAvatar())){
+            Map<String,Object> map = new HashMap<>();
+            map.put("authType",config.getMiniAppAuthType());
+            if (config.getMiniAppAuthType()==2){
+                map.put("domain",config.getUserCourseAuthDomain());
+            }
+            map.put("code",500);
+            return R.ok(map);
+        }
+        return R.ok().put("user",user);
+    }
+
     /**
      * 生成唯一键
      */

+ 3 - 0
fs-service-system/src/main/java/com/fs/store/mapper/FsUserMapper.java

@@ -183,6 +183,9 @@ public interface FsUserMapper
     @Select("select * from fs_user where union_id=#{unionId}")
     FsUser selectFsUserByUnionId(String unionId);
 
+    @Select("select * from fs_user where course_ma_open_id=#{openId}")
+    FsUser selectFsUserByCourseMaOpenId(String openId);
+
     Long selectCrmCustomerCount(int type, Long companyId);
 
     @Select("select * from fs_user where user_code=#{userCode}")

+ 5 - 0
fs-service-system/src/main/java/com/fs/store/param/FsUserEditParam.java

@@ -2,15 +2,20 @@ package com.fs.store.param;
 
 import lombok.Data;
 
+import javax.validation.constraints.NotBlank;
 import java.io.Serializable;
 
 @Data
 public class FsUserEditParam implements Serializable
 {
 
+    @NotBlank(message = "用户昵称不能为空!")
     private String nickname;
 
+    @NotBlank(message = "用户头像不能为空!")
     private String avatar;
 
+    private Long userId;
+
 
 }

+ 3 - 0
fs-service-system/src/main/java/com/fs/store/service/IFsUserService.java

@@ -125,6 +125,9 @@ public interface IFsUserService
     FsUser selectFsUserByUnionId(String unionId);
 
 
+    FsUser selectFsUserByCourseMaOpenId(String openId);
+
+
     FsUser selectFsUserByUserCode(String userCode);
 
     //CRM客户绑定 小程序客户之 查询小程序客户

+ 23 - 34
fs-service-system/src/main/java/com/fs/store/service/impl/FsStorePaymentServiceImpl.java

@@ -488,55 +488,44 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService
         String  json = configService.selectConfigByKey("redPacket.config");
         config = JSONUtil.toBean(json, RedPacketConfig.class);
 
-        param.setSource(1);
-        param.setOpenId("ooXAA1Fw5ekSqCT-WLKpoA0cDVDo");
+        param.setSource(2);
+//        param.setOpenId("ooXAA1Fw5ekSqCT-WLKpoA0cDVDo");
         param.setAmount(new BigDecimal(0.1));
 
 
         WxPayConfig payConfig = new WxPayConfig();
         BeanUtils.copyProperties(config, payConfig);
-//        payConfig.setPublicKeyId(null);
-//        payConfig.setPublicKeyPath(null);
-//        payConfig.setCertSerialNo("63AC73F33E0A21973BB1DE533421A2337FD91C20");
+        payConfig.setAppId(config.getMiniappId());
         WxPayService wxPayService = new WxPayServiceImpl();
         wxPayService.setConfig(payConfig);
         TransferService transferService = wxPayService.getTransferService();
 
-        TransferBillsRequest request = new TransferBillsRequest();
-        request.setAppid(config.getAppId());
-        System.out.println("appid:"+config.getAppId());
-        request.setOpenid(param.getOpenId());
-
-        String code = String.valueOf(IdUtil.getSnowflake(0, 0).nextId());
-        request.setOutBillNo("fsCourse" + code);
-
-        Integer amount = WxPayUnifiedOrderRequest.yuanToFen(param.getAmount() != null ? param.getAmount().toString() : "0.1");
-        request.setTransferAmount(amount);
-        request.setTransferRemark("活动奖励");
-        request.setUserRecvPerception("活动奖励");
+        TransferBatchesRequest request = new TransferBatchesRequest();
+        request.setAppid(config.getMiniappId());
+        String code = IdUtil.getSnowflake(0, 0).nextIdStr();
+        request.setOutBatchNo("fsCourse" + code);
+        request.setBatchRemark("课堂答题奖励");
+        request.setBatchName("课堂答题奖励");
+        Integer amount = WxPayUnifiedOrderRequest.yuanToFen(param.getAmount().toString());
+        request.setTotalAmount(amount);
+        request.setTotalNum(1);
         request.setNotifyUrl(config.getNotifyUrl());
-        request.setTransferSceneId("1000");
-
-        // 设置场景信息
-        List<TransferBillsRequest.TransferSceneReportInfo> transferSceneReportInfos = new ArrayList<>();
-        TransferBillsRequest.TransferSceneReportInfo info1 = new TransferBillsRequest.TransferSceneReportInfo();
-        info1.setInfoType("活动名称");
-        info1.setInfoContent("新会员有礼");
-        transferSceneReportInfos.add(info1);
 
-        TransferBillsRequest.TransferSceneReportInfo info2 = new TransferBillsRequest.TransferSceneReportInfo();
-        info2.setInfoType("奖励说明");
-        info2.setInfoContent("注册会员抽奖一等奖");
-        transferSceneReportInfos.add(info2);
-        request.setTransferSceneReportInfos(transferSceneReportInfos);
+        ArrayList<TransferBatchesRequest.TransferDetail> transferDetailList = new ArrayList<>();
+        TransferBatchesRequest.TransferDetail transferDetail = new TransferBatchesRequest.TransferDetail();
+        transferDetail.setOpenid(param.getOpenId());
+        String code1 = IdUtil.getSnowflake(0, 0).nextIdStr();
+        transferDetail.setOutDetailNo("fsCourse" + code1);
+        transferDetail.setTransferAmount(amount);
+        transferDetail.setTransferRemark("恭喜同学,认真听课,奖励你一朵小红花!");
+        transferDetailList.add(transferDetail);
+        request.setTransferDetailList(transferDetailList);
 
         try {
-            TransferBillsResult transferBillsResult = transferService.transferBills(request);
-            logger.info("商家转账支付完成:[msg:{}]", transferBillsResult);
-            return R.ok("发送红包成功").put("data", transferBillsResult);
+            TransferBatchesResult transferBatchesResult = transferService.transferBatches(request);
+            return R.ok("发送红包成功").put("orderCode", transferBatchesResult.getOutBatchNo());
         } catch (WxPayException e) {
             e.printStackTrace();
-            logger.info("商家转账支付失败:[msg:{}]", e.getMessage());
             return R.error("发送失败");
         }
     }

+ 5 - 0
fs-service-system/src/main/java/com/fs/store/service/impl/FsUserServiceImpl.java

@@ -433,6 +433,11 @@ public class FsUserServiceImpl implements IFsUserService
         return fsUserMapper.selectFsUserByUnionId(unionId);
     }
 
+    @Override
+    public FsUser selectFsUserByCourseMaOpenId(String openId) {
+        return fsUserMapper.selectFsUserByCourseMaOpenId(openId);
+    }
+
     @Override
     public FsUser selectFsUserByUserCode(String userCode) {
         return fsUserMapper.selectFsUserByUserCode(userCode);

+ 54 - 15
fs-user-app/src/main/java/com/fs/app/controller/AppBaseController.java

@@ -42,24 +42,63 @@ public class AppBaseController {
 	@Autowired
 	RedisCache redisCache;
 
-	public String getUserId()
-	{
-		String headValue =  ServletUtils.getRequest().getHeader("APPToken");
-		if(StringUtils.isNotEmpty(headValue)){
-			Claims claims=jwtUtils.getClaimByToken(headValue);
-			if(StringUtils.isNotEmpty(claims)){
-				String userId = claims.getSubject().toString();
-				return userId;
-			}
-			else{
-				return null;
-			}
+//	public String getUserId()
+//	{
+//		String headValue =  ServletUtils.getRequest().getHeader("APPToken");
+//		if(StringUtils.isNotEmpty(headValue)){
+//			Claims claims=jwtUtils.getClaimByToken(headValue);
+//			if(StringUtils.isNotEmpty(claims)){
+//				String userId = claims.getSubject().toString();
+//				return userId;
+//			}
+//			else{
+//				return null;
+//			}
+//
+//		}
+//		else{
+//			return null;
+//		}
+//
+//	}
 
+	public enum TokenStrategy {
+		DEFAULT,            // 默认策略:优先 APPToken,回退 UserToken
+		USER_TOKEN_ONLY,    // 仅使用 UserToken
+		// 未来可扩展其他策略,如 BACKUP_TOKEN_ONLY
+	}
+
+	/**
+	 * 获取用户ID(默认优先 APPToken,传参可覆盖策略)
+	 * @param strategy 可选策略,默认 DEFAULT(APPToken优先)
+	 */
+	public String getUserId(TokenStrategy strategy) {
+		if (strategy == TokenStrategy.USER_TOKEN_ONLY) {
+			return parseToken("UserToken"); // 仅 UserToken
+		} else {
+			// 默认策略:优先 APPToken
+			return parseToken("APPToken");
 		}
-		else{
-			return null;
-		}
+	}
 
+	// 不传参数时,默认走 DEFAULT 策略
+	public String getUserId() {
+		return getUserId(TokenStrategy.DEFAULT);
+	}
+
+
+	/**
+	 * 通用方法:从指定 Token 获取 userId(私有方法,复用逻辑)
+	 */
+	private String parseToken(String tokenHeaderName) {
+		String token = ServletUtils.getRequest().getHeader(tokenHeaderName);
+		if (StringUtils.isNotEmpty(token)) {
+			Claims claims = jwtUtils.getClaimByToken(token);
+			if (claims != null && StringUtils.isNotEmpty(claims.getSubject())) {
+				return claims.getSubject();
+			}
+		}
+		return null;
 	}
 
 

+ 24 - 1
fs-user-app/src/main/java/com/fs/app/controller/UserController.java

@@ -10,6 +10,9 @@ import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
 import com.fs.common.param.BaseQueryParam;
 import com.fs.common.utils.OrderUtils;
+import com.fs.course.config.CourseConfig;
+import com.fs.course.service.IFsUserCourseService;
+import com.fs.course.service.IFsUserCourseVideoService;
 import com.fs.store.domain.FsStoreOrder;
 import com.fs.store.domain.FsUser;
 import com.fs.store.domain.FsUserBill;
@@ -26,11 +29,14 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
 import java.awt.*;
 import java.io.File;
 import java.io.IOException;
@@ -44,6 +50,7 @@ import java.util.List;
 @RequestMapping(value="/app/user")
 public class UserController extends  AppBaseController {
 
+    private static final Logger log = LoggerFactory.getLogger(UserController.class);
     @Autowired
     private FSConfig fsConfig;
     @Autowired
@@ -59,6 +66,8 @@ public class UserController extends  AppBaseController {
     private IFsUserExtractService userExtractService;
     @Autowired
     private IFsUserPromoterApplyService userPromoterApplyService;
+    @Autowired
+    private IFsUserCourseVideoService courseVideoService;
     /**
      * 获取用户信息
      * @param request
@@ -82,6 +91,15 @@ public class UserController extends  AppBaseController {
         }
     }
 
+
+    @Login
+    @ApiOperation("判断用户是否存在头像昵称")
+    @GetMapping("/checkUserInfo")
+    public R checkUserInfo(){
+        log.info("【判断判断用户是否存在头像昵称】:{}",getUserId());
+        return courseVideoService.checkUserInfo(Long.parseLong(getUserId()));
+    }
+
     @Login
     @ApiOperation("检测是否登录")
     @GetMapping("/checkLogin")
@@ -276,7 +294,12 @@ public class UserController extends  AppBaseController {
     @Login
     @ApiOperation("修改用户信息")
     @PostMapping("/editUser")
-    public R editUser(@RequestBody FsUserEditParam param, HttpServletRequest request){
+    public R editUser(@RequestBody @Valid FsUserEditParam param, HttpServletRequest request){
+        param.setUserId(Long.parseLong(getUserId()));
+        log.info("【修改用户头像昵称】:{}",param);
+        if (param.getNickname().length()>50){
+            return R.error("请授权正确的昵称!");
+        }
         FsUser user=new FsUser();
         user.setUserId(Long.parseLong(getUserId()));
         user.setAvatar(param.getAvatar());

+ 13 - 13
fs-user-app/src/main/java/com/fs/app/controller/WxCompanyUserController.java

@@ -71,9 +71,9 @@ public class WxCompanyUserController extends AppBaseController {
         if (StringUtils.isBlank(param.getCode())) {
             return R.error("code不存在");
         }
-        if (param.getNickname().length()>100){
-            return R.error("昵称不符合标准!");
-        }
+//        if (param.getNickname().length()>100){
+//            return R.error("昵称不符合标准!");
+//        }
         //获取第二个小程序配置,序号从0开始
         final WxMaService wxService = WxMaConfiguration.getMaService(maProperties.getConfigs().get(1).getAppid());
         try {
@@ -124,8 +124,8 @@ public class WxCompanyUserController extends AppBaseController {
                     userMap.setMaOpenId(session.getOpenid());
                     userMap.setUnionId(session.getUnionid());
                     userMap.setUpdateTime(new DateTime());
-                    userMap.setNickname(param.getNickname() != null ? param.getNickname() : "微信用户");
-                    userMap.setAvatar(param.getAvatar() != null ? param.getAvatar() : null);
+//                    userMap.setNickname(param.getNickname() != null ? param.getNickname() : "微信用户");
+//                    userMap.setAvatar(param.getAvatar() != null ? param.getAvatar() : null);
                     userMap.setPhone(phoneNoInfo.getPhoneNumber());
                     // 逻辑调整:如果会员已经绑定了销售,直接提示,不让注册-2025年6月16日14点53分
                     if (user.getCompanyUserId() != null && !param.getCompanyUserId().equals(user.getCompanyUserId())){
@@ -141,8 +141,8 @@ public class WxCompanyUserController extends AppBaseController {
                 } else {
                     //新增
                     user = new FsUser();
-                    user.setNickname(param.getNickname() != null ? param.getNickname() : "微信用户");
-                    user.setAvatar(param.getAvatar() != null ? param.getAvatar() : null);
+//                    user.setNickname(param.getNickname() != null ? param.getNickname() : "微信用户");
+//                    user.setAvatar(param.getAvatar() != null ? param.getAvatar() : null);
                     user.setStatus((company != null ? company.getFsUserIsDefaultBlack() : 0) == 1 ? 0 : 1);
                     user.setMaOpenId(session.getOpenid());
                     user.setUnionId(session.getUnionid());
@@ -197,12 +197,12 @@ public class WxCompanyUserController extends AppBaseController {
      *
      * @return 用户id
      */
-    public String getUserId() {
-        String headValue = ServletUtils.getRequest().getHeader("UserToken");
-        Claims claims = jwtUtils.getClaimByToken(headValue);
-        String userId = claims.getSubject().toString();
-        return userId;
-    }
+//    public String getUserId() {
+//        String headValue = ServletUtils.getRequest().getHeader("UserToken");
+//        Claims claims = jwtUtils.getClaimByToken(headValue);
+//        String userId = claims.getSubject().toString();
+//        return userId;
+//    }
 
 
 }

+ 2 - 2
fs-user-app/src/main/java/com/fs/app/param/LoginMaWxParam.java

@@ -28,11 +28,11 @@ public class LoginMaWxParam implements Serializable {
     @ApiModelProperty(value = "销售id")
     private Long companyUserId;
 
-    @NotBlank(message = "用户昵称不能为空")
+//    @NotBlank(message = "用户昵称不能为空")
     @ApiModelProperty(value = "用户昵称")
     private String nickname;
 
-    @NotBlank(message = "用户头像不能为空")
+//    @NotBlank(message = "用户头像不能为空")
     @ApiModelProperty(value = "用户头像")
     private String avatar;