浏览代码

同步scrm fs-user-app代码

Long 4 周之前
父节点
当前提交
d6831bcd64

+ 5 - 0
fs-user-app/src/main/java/com/fs/app/controller/CourseH5Controller.java

@@ -64,6 +64,7 @@ public class CourseH5Controller extends  AppBaseController{
     @GetMapping("/getH5CourseVideoDetails")
     public R getCourseVideoDetails(FsUserCourseVideoFinishUParam param)
     {
+        param.setUserId(Long.parseLong(getUserId()));
         String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
         FsUserCourseVideoH5DVO course = courseService.selectFsUserCourseVideoH5DVOByVideoId(param.getVideoId());
@@ -128,6 +129,7 @@ public class CourseH5Controller extends  AppBaseController{
     @PostMapping("/updateWatchDuration")
     public R updateWatchDuration(@RequestBody FsUserCourseVideoFinishUParam param)
     {
+        param.setUserId(Long.parseLong(getUserId()));
         return courseVideoService.updateWatchDuration(param);
     }
 
@@ -135,6 +137,7 @@ public class CourseH5Controller extends  AppBaseController{
     @ApiOperation("获取缓冲流量")
     @PostMapping("/getInternetTraffic")
     public R getInternetTraffic(@RequestBody FsUserCourseVideoFinishUParam param) {
+        param.setUserId(Long.parseLong(getUserId()));
         return courseVideoService.getInternetTraffic(param);
     }
 
@@ -142,6 +145,7 @@ public class CourseH5Controller extends  AppBaseController{
     @PostMapping("/courseAnswer")
     public R courseAnswer(@RequestBody FsCourseQuestionAnswerUParam param)
     {
+        param.setUserId(Long.parseLong(getUserId()));
         logger.info("zyp \n【答题】:{}",param.getQuestions());
         if (param.getDuration()==null){
             logger.info("zyp \n【未识别到时长】:{}",param.getUserId());
@@ -154,6 +158,7 @@ public class CourseH5Controller extends  AppBaseController{
     @RepeatSubmit
     public R sendReward(@RequestBody FsCourseSendRewardUParam param)
     {
+        param.setUserId(Long.parseLong(getUserId()));
         logger.info("zyp \n【发放奖励】:{}",param);
         return courseVideoService.sendReward(param);
     }

+ 3 - 93
fs-user-app/src/main/java/com/fs/app/controller/PayController.java

@@ -5,7 +5,6 @@ import com.alibaba.fastjson.JSON;
 import com.fs.common.config.FSSysConfig;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.redis.RedisCache;
-import com.fs.common.exception.CustomException;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.erp.service.IErpOrderService;
@@ -14,22 +13,18 @@ import com.fs.pay.pay.domain.OrderCallback;
 import com.fs.pay.pay.domain.OrderResult;
 import com.fs.pay.pay.dto.OrderQueryDTO;
 import com.fs.pay.pay.service.PayService;
-import com.fs.pay.pay.service.impl.PayApiServiceImpl;
 import com.fs.pay.pay.util.PayUtil;
-import com.fs.store.domain.*;
-import com.fs.store.enums.*;
-import com.fs.store.service.*;
 import com.fs.pay.service.dto.PayNotifyDTO;
 import com.fs.pay.service.dto.RefundNotifyDTO;
 import com.fs.pay.service.dto.TradeOrder;
+import com.fs.store.domain.FsStorePayment;
+import com.fs.store.service.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
@@ -86,7 +81,7 @@ public class PayController {
         //验证
         HuiFuResult o = JSON.parseObject(resp_data, HuiFuResult.class);
         logger.info("汇付支付回调:"+o);
-        if(o.getResp_code().equals("00000000")){
+        if(o.getResp_code().equals("00000000") && o.getNotify_type().equals("1")){
             String[] order=o.getReq_seq_id().split("-");
             switch (order[0]) {
                 case "store":
@@ -127,89 +122,4 @@ public class PayController {
 
 
 
-    @ApiOperation("小雨点第三方支付回调")
-    @PostMapping(value="/payNotify")
-    public String payNotify(HttpServletRequest request,PayNotifyDTO dto) throws Exception {
-            if("SUCCESS".equals(dto.getOrderStatus())) {
-                //订单号
-                String tradeNo = dto.getMerchOrderNo();
-                List<TradeOrder> tradeOrders= JSON.parseArray(dto.getTradeOrders(),TradeOrder.class);
-                if(tradeOrders!=null&&tradeOrders.size()>0){
-                    for(TradeOrder tradeOrder:tradeOrders){
-                        String[] order=tradeOrder.getSubMerchOrderNo().split("-");
-                        switch (order[0]) {
-                            case "store":
-                                orderService.payConfirm(1,null,order[1], tradeNo,dto.getBankTransactionId(),dto.getBankSerialNo());
-                                return "success";
-                            case "store_remain":
-                                orderService.payRemainConfirm( order[1], tradeNo,dto.getBankTransactionId(),dto.getBankSerialNo());
-                                return "success";
-                            case "payment":
-                                return storePaymentService.payConfirm(order[1], tradeNo,dto.getBankTransactionId(),dto.getBankSerialNo());
-                        }
-                    }
-                }
-            }
-            return "success";
-    }
-    @ApiOperation("小雨点第三方退款回调")
-    @PostMapping(value="/refundNotify")
-    public String refundNotify(HttpServletRequest request, RefundNotifyDTO dto) throws Exception {
-        if("SUCCESS".equals(dto.getOrderStatus())) {
-            String[] orderIds=dto.getOrigMerchOrderNo().split("-");
-            FsStorePayment storePayment=null;
-            switch (orderIds[0]) {
-                case "store":
-                    storePayment=storePaymentService.selectFsStorePaymentByCode(orderIds[1]);
-                    if(storePayment!=null){
-                        storePayment.setRefundMoney(BigDecimal.valueOf(Double.parseDouble(dto.getAmount())));
-                        storePayment.setStatus(-1);
-                        storePayment.setRefundTime(new Date());
-                        storePaymentService.updateFsStorePayment(storePayment);
-                    }
-                    return "success";
-                case "store_remain":
-                    storePayment=storePaymentService.selectFsStorePaymentByCode(orderIds[1]);
-                    if(storePayment!=null){
-                        storePayment.setRefundMoney(BigDecimal.valueOf(Double.parseDouble(dto.getAmount())));
-                        storePayment.setStatus(-1);
-                        storePayment.setRefundTime(new Date());
-                        storePaymentService.updateFsStorePayment(storePayment);
-                    }
-                    return "success";
-                case "doctor":
-                   return "success";
-                case "payment":
-                    storePaymentService.refund(orderIds[1]);
-                    return "success";
-            }
-            return "success";
-        }
-        return "success";
-    }
-
-
-//    @Transactional
-//    public String paymentOp(String payCode,String tradeNo,String bankTransactionId,String bankSerialNo) {
-//
-//        //更新订单状态
-//        FsStorePayment storePayment=storePaymentService.selectFsStorePaymentByCode(payCode);
-//        if(!storePayment.getStatus().equals(0)){
-//            return "";
-//        }
-//        storePayment.setStatus(1);
-//        storePayment.setPayTime(new Date());
-//        storePayment.setTradeNo(tradeNo);
-//        storePayment.setBankSerialNo(bankSerialNo);
-//        storePayment.setBankTransactionId(bankTransactionId);
-//        storePaymentService.updateFsStorePayment(storePayment);
-//        //增加佣金
-//        if(storePayment.getCompanyId()!=null&&storePayment.getCompanyId()>0){
-//            companyService.addCompanyPaymentMoney(storePayment);
-//        }
-//        return "success";
-//
-//    }
-
-
 }

+ 25 - 59
fs-user-app/src/main/java/com/fs/app/controller/StoreOrderController.java

@@ -2,41 +2,30 @@ package com.fs.app.controller;
 
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
-
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.TypeReference;
 import com.fs.app.annotation.Login;
-import com.fs.common.annotation.Log;
-import com.fs.common.annotation.RepeatSubmit;
-
 import com.fs.common.config.FSSysConfig;
 import com.fs.common.core.domain.R;
-import com.fs.common.enums.BusinessType;
 import com.fs.common.exception.CustomException;
-import com.fs.common.utils.*;
+import com.fs.common.utils.IpUtil;
+import com.fs.common.utils.ParseUtils;
+import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.ip.IpUtils;
+import com.fs.erp.service.IErpOrderService;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuifuCreateOrderResult;
 import com.fs.huifuPay.service.HuiFuService;
-import com.fs.pay.pay.config.PayConfig;
-import com.fs.pay.pay.domain.CreateWxOrderResult;
 import com.fs.pay.pay.domain.OrderResult;
 import com.fs.pay.pay.dto.OrderQueryDTO;
-import com.fs.pay.pay.dto.WxJspayDTO;
 import com.fs.pay.pay.service.PayService;
-import com.fs.pay.pay.service.impl.PayApiServiceImpl;
-import com.fs.pay.service.dto.PayQueryDTO;
-import com.fs.store.domain.*;
-import com.fs.system.domain.SysConfig;
-import com.fs.wx.miniapp.config.WxMaConfiguration;
-import com.fs.wx.miniapp.config.WxMaProperties;
-import com.fs.wx.pay.config.WxPayProperties;
-import com.fs.erp.service.IErpOrderService;
+import com.fs.pay.service.IPayService;
 import com.fs.store.config.StoreConfig;
-
+import com.fs.store.domain.*;
 import com.fs.store.dto.FsStoreOrderComputeDTO;
 import com.fs.store.enums.OrderInfoEnum;
 import com.fs.store.mapper.FsStorePaymentMapper;
@@ -44,26 +33,20 @@ import com.fs.store.param.*;
 import com.fs.store.service.*;
 import com.fs.store.vo.FsMyStoreOrderListQueryVO;
 import com.fs.store.vo.FsStoreOrderItemVO;
-import com.fs.pay.service.IPayService;
-import com.fs.pay.service.dto.CreatePayDTO;
-import com.fs.pay.service.dto.PayDTO;
-import com.fs.pay.service.dto.TradeOrder;
 import com.fs.system.service.ISysConfigService;
-import com.github.binarywang.wxpay.bean.entpay.EntPayResult;
+import com.fs.wx.miniapp.config.WxMaConfiguration;
+import com.fs.wx.miniapp.config.WxMaProperties;
+import com.fs.wx.pay.config.WxPayProperties;
 import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
 import com.github.binarywang.wxpay.config.WxPayConfig;
 import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.EntPayService;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
-import com.google.gson.Gson;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import lombok.Synchronized;
 import me.chanjar.weixin.common.error.WxErrorException;
-import org.apache.catalina.servlets.DefaultServlet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -78,8 +61,6 @@ import java.util.*;
 import java.util.concurrent.TimeUnit;
 
 
-
-
 @Api("商城接口")
 @RestController
 @RequestMapping(value="/app/storeOrder")
@@ -241,7 +222,6 @@ public class StoreOrderController extends  AppBaseController {
     //@Synchronized
     public R pay(HttpServletRequest request, @Validated @RequestBody FsStoreOrderPayParam param)
     {
-        logger.info("zzf \n【pay】:"+param.getOrderId()+"的订单支付类型为"+param.getPayType());
         FsStoreOrder order=orderService.selectFsStoreOrderById(param.getOrderId());
         if(order==null){
             return R.error("订单不存在");
@@ -259,6 +239,7 @@ public class StoreOrderController extends  AppBaseController {
             //已改价处理
             if(order.getIsEditMoney()!=null&&order.getIsEditMoney()==1){
                 //改过价不做处理
+
             }
             else{
                 String config=configService.selectConfigByKey("store.config");
@@ -285,7 +266,6 @@ public class StoreOrderController extends  AppBaseController {
             }
             String payCode = IdUtil.getSnowflake(0, 0).nextIdStr();
 //            order.setOrderCode(orderCode);
-            //易宝支付
             if(order.getPayType().equals("1")||order.getPayType().equals("2")){
                 String json = configService.selectConfigByKey("store.pay");
                 FsPayConfig fsPayConfig = JSON.parseObject(json, FsPayConfig.class);
@@ -306,29 +286,6 @@ public class StoreOrderController extends  AppBaseController {
                 storePayment.setOrderId(order.getId());
                 fsStorePaymentMapper.insertFsStorePayment(storePayment);
 
-//                //创建订单
-//                WxJspayDTO p = new WxJspayDTO();
-//                // 使用setter方法为对象赋值
-//                p.setPayMoney(order.getPayMoney().toString());
-//                p.setLowOrderId("store-"+payCode);
-//                p.setBody("商城订单支付");
-//                p.setIsMinipg("1");
-//                p.setReturnUrl(PayConfig.notifyUrl);
-//                p.setOpenId(user.getMaOpenId());
-//                p.setAttach("");
-//                p.setStoreid("0");
-//                CreateWxOrderResult wxOrder = ybPayService.createWxOrder(p);
-//                if(wxOrder.getStatus().equals("100")){
-//                    FsStorePayment ment=new FsStorePayment();
-//                    ment.setPaymentId(storePayment.getPaymentId());
-//                    ment.setTradeNo(wxOrder.getUpOrderId());
-//                    fsStorePaymentMapper.updateFsStorePayment(ment);
-//                    redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
-//                    return R.ok().put("payType",param.getPayType()).put("result",wxOrder.getPay_info());
-//                }
-//                else{
-//                    return R.error(wxOrder.getMessage());
-//                }
                 if (fsPayConfig.getType().equals("hf")){
                     HuiFuCreateOrder o = new HuiFuCreateOrder();
                     o.setTradeType("T_MINIAPP");
@@ -337,7 +294,7 @@ public class StoreOrderController extends  AppBaseController {
                     o.setTransAmt(storePayment.getPayMoney().toString());
                     o.setGoodsDesc("商城订单支付");
                     HuifuCreateOrderResult result = huiFuService.createOrder(o);
-                    if(result.getBank_code()!=null&&result.getBank_code().equals("00000000")){
+                    if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
                         FsStorePayment mt=new FsStorePayment();
                         mt.setPaymentId(storePayment.getPaymentId());
                         mt.setTradeNo(result.getHf_seq_id());
@@ -520,14 +477,17 @@ public class StoreOrderController extends  AppBaseController {
                 o.setGoodsDesc("商城订单尾款支付");
                 HuifuCreateOrderResult result = huiFuService.createOrder(o);
                 //创建订单
-                if(result.getBank_code()!=null&&result.getBank_code().equals("00000000")){
+                if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+
                     FsStorePayment mt=new FsStorePayment();
                     mt.setPaymentId(storePayment.getPaymentId());
                     mt.setTradeNo(result.getHf_seq_id());
                     fsStorePaymentMapper.updateFsStorePayment(mt);
                     redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
                     Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
-                    return R.ok().put("result",resultMap);
+                    String s = (String) resultMap.get("package");
+                    resultMap.put("packageValue",s);
+                    return R.ok().put("payType",param.getPayType()).put("result",resultMap);
                 }
                 else{
                     return R.error(result.getResp_desc());
@@ -635,13 +595,16 @@ public class StoreOrderController extends  AppBaseController {
                 o.setTransAmt(storePayment.getPayMoney().toString());
                 o.setGoodsDesc("商城订单支付");
                 HuifuCreateOrderResult result = huiFuService.createOrder(o);
-                if(result.getBank_code()!=null&&result.getBank_code().equals("00000000")){
+                if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+
                     FsStorePayment mt=new FsStorePayment();
                     mt.setPaymentId(storePayment.getPaymentId());
                     mt.setTradeNo(result.getHf_seq_id());
                     fsStorePaymentMapper.updateFsStorePayment(mt);
                     redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
                     Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
+                    String s = (String) resultMap.get("package");
+                    resultMap.put("packageValue",s);
                     return R.ok().put("result",resultMap);
                 }
                 else{
@@ -752,13 +715,16 @@ public class StoreOrderController extends  AppBaseController {
                 o.setTransAmt(storePayment.getPayMoney().toString());
                 o.setGoodsDesc("商城订单支付");
                 HuifuCreateOrderResult result = huiFuService.createOrder(o);
-                if(result.getBank_code()!=null&&result.getBank_code().equals("00000000")){
+                if(result.getResp_code()!=null&&(result.getResp_code().equals("00000000")||result.getResp_code().equals("00000100"))){
+
                     FsStorePayment mt=new FsStorePayment();
                     mt.setPaymentId(storePayment.getPaymentId());
                     mt.setTradeNo(result.getHf_seq_id());
                     fsStorePaymentMapper.updateFsStorePayment(mt);
                     redisCache.setCacheObject("isPaying:"+order.getId(),order.getId().toString(),1, TimeUnit.MINUTES);
                     Map<String, Object> resultMap = JSON.parseObject(result.getPay_info(), new TypeReference<Map<String, Object>>() {});
+                    String s = (String) resultMap.get("package");
+                    resultMap.put("packageValue",s);
                     return R.ok().put("result",resultMap);
                 }
                 else{

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

@@ -0,0 +1,205 @@
+package com.fs.app.controller;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
+import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
+import cn.hutool.core.date.DateTime;
+import com.fs.app.annotation.Login;
+import com.fs.app.param.LoginMaWxParam;
+import com.fs.app.utils.JwtUtils;
+import com.fs.common.core.domain.R;
+import com.fs.common.core.redis.RedisCache;
+import com.fs.common.utils.IpUtil;
+import com.fs.common.utils.ServletUtils;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.service.ICompanyDeptService;
+import com.fs.company.service.ICompanyUserService;
+import com.fs.store.domain.FsUser;
+import com.fs.store.service.IFsUserService;
+import com.fs.wx.miniapp.config.WxMaConfiguration;
+import com.fs.wx.miniapp.config.WxMaProperties;
+import io.jsonwebtoken.Claims;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+
+@Api("微信小程序相关接口")
+@RestController
+@RequestMapping(value = "/app/wx/miniapp")
+@Slf4j
+public class WxCompanyUserController extends AppBaseController {
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    @Autowired
+    private WxMaProperties maProperties;
+
+    @Autowired
+    JwtUtils jwtUtils;
+
+    @Autowired
+    RedisCache redisCache;
+
+    @Autowired
+    private ICompanyUserService companyUserService;
+
+    @Autowired
+    private ICompanyDeptService companyDeptService;
+
+    @Autowired
+    private IFsUserService userService;
+
+    @ApiOperation("小程序-授权登录")
+    @PostMapping("/loginByMa")
+    public R login(@RequestBody LoginMaWxParam param) {
+        if (StringUtils.isBlank(param.getCode())) {
+            return R.error("code不存在");
+        }
+        //获取第二个小程序配置,序号从0开始
+        final WxMaService wxService = WxMaConfiguration.getMaService(maProperties.getConfigs().get(1).getAppid());
+        try {
+            WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
+            this.logger.info(session.getSessionKey());
+            this.logger.info(session.getOpenid());
+            // 解密
+            WxMaPhoneNumberInfo phoneNoInfo = wxService.getUserService().getPhoneNoInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
+            WxMaUserInfo userInfo = wxService.getUserService().getUserInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
+            FsUser user = userService.selectFsUserByPhone(phoneNoInfo.getPhoneNumber());
+            //以下暂时注释,不需要往销售表添加数据
+//            CompanyUser companyUser = companyUserService.getCompanyUserByOpenId(session.getOpenid());
+//            String ip = IpUtil.getRequestIp();
+//
+////            // 如果公司id为空(表示可能是该公司的第一位销售管理员),则需要根据电话号码判断是否存在销售,如果不存在则提示
+////            if (param.getCompanyId() == null) {
+////                if (checkPhone == null) {
+////                    throw new CustomException("由于不是管理员,不能直接登录", 401);
+////                }
+////            }
+//            if (companyUser == null) {
+//                CompanyUser checkPhone = companyUserService.getCompanyUserByPhone(phoneNoInfo.getPhoneNumber());
+//                if (checkPhone != null) {
+//                    if (checkPhone.getMaOpenId() == null) {
+//                        companyUser = checkPhone;
+//                        companyUser.setMaOpenId(session.getOpenid());
+//                        companyUser.setUserId(companyUser.getUserId());
+//                        companyUser.setUpdateTime(new DateTime());
+//                        companyUser.setLoginIp(ip);
+//                        companyUserService.updateUserProfile(companyUser);
+//                    } else {
+//                        throw new CustomException("此手机号用户已存在");
+//                    }
+//                } else {
+//                    //新增
+//                    companyUser = new CompanyUser();
+//                    companyUser.setUserName(phoneNoInfo.getPhoneNumber());
+//                    companyUser.setNickName(userInfo.getNickName() == null ? "微信用户" : userInfo.getNickName());
+//                    companyUser.setPhonenumber(phoneNoInfo.getPhoneNumber());
+//                    companyUser.setSex(userInfo.getGender());
+//                    //密码初始化为123456
+//                    String pw = "123456";
+//                    companyUser.setPassword(SecurityUtils.encryptPassword(param.getPassword() == null ? pw : param.getPassword()));
+//                    companyUser.setCreateTime(new Date());
+//                    companyUser.setCompanyId(param.getCompanyId());
+//                    companyUser.setParentId(param.getParentCompanyUseId());
+//                    companyUser.setMaOpenId(session.getOpenid());
+//
+//                    //部门信息
+//                    CompanyDept dept = companyDeptService.getDefaultCompanyDeptByCompanyId(param.getCompanyId());
+//                    if (Objects.nonNull(dept)) {
+//                        companyUser.setDeptId(dept.getDeptId());
+//                    }
+//                    companyUserService.insertUser(companyUser);
+//                }
+//            } else {
+//                CompanyUser companyUserMp = new CompanyUser();
+//                companyUserMp.setPhonenumber(phoneNoInfo.getPhoneNumber());
+//                companyUserMp.setUserId(companyUser.getUserId());
+//                companyUserMp.setUpdateTime(new DateTime());
+//                companyUserMp.setLoginIp(ip);
+//                companyUserService.updateUserProfile(companyUser);
+//            }
+            String ip = IpUtil.getRequestIp();
+            if (user == null) {
+                user = userService.selectFsUserByMaOpenId(session.getOpenid());
+                if (user != null) {
+                    //修改
+                    FsUser userMap = new FsUser();
+                    userMap.setUserId(user.getUserId());
+//                userMap.setMpOpenId(session.getOpenid());
+                    userMap.setMaOpenId(session.getOpenid());
+                    userMap.setUnionId(session.getUnionid());
+                    userMap.setUpdateTime(new DateTime());
+                    userMap.setNickname(userInfo.getNickName() != null ? userInfo.getNickName() : "微信用户");
+                    userMap.setAvatar(userInfo.getAvatarUrl() != null ? userInfo.getAvatarUrl() : null);
+                    userMap.setPhone(phoneNoInfo.getPhoneNumber());
+                    userService.updateFsUser(userMap);
+                } else {
+                    //新增
+                    user = new FsUser();
+                    user.setNickname(userInfo.getNickName() != null ? userInfo.getNickName() : "微信用户");
+                    user.setAvatar(userInfo.getAvatarUrl() != null ? userInfo.getAvatarUrl() : null);
+                    user.setStatus(1);
+                    user.setMaOpenId(session.getOpenid());
+                    user.setUnionId(session.getUnionid());
+                    user.setCreateTime(new Date());
+                    user.setPhone(phoneNoInfo.getPhoneNumber());
+                    userService.insertFsUser(user);
+                }
+            } else {
+                FsUser userMap = new FsUser();
+                userMap.setUserId(user.getUserId());
+                userMap.setUpdateTime(new DateTime());
+                userMap.setPhone(phoneNoInfo.getPhoneNumber());
+                userMap.setLastIp(ip);
+                if (StringUtils.isNotEmpty(session.getUnionid())) {
+                    userMap.setUnionId(session.getUnionid());
+                }
+                userService.updateFsUser(userMap);
+            }
+            log.info("保存成功的用户信息user: {}, 用户id: {}", user, user.getUserId());
+            String token = jwtUtils.generateToken(user.getUserId());
+            // 返回一个写死的数据到前端
+            return R.ok("登录成功").put("token", token).put("phoneNumber", phoneNoInfo.getPhoneNumber()).put("nickName", "微信用户").put("user", user);
+        } catch (WxErrorException e) {
+            this.logger.error(e.getMessage(), e);
+            return R.error("授权失败," + e.getMessage());
+        }
+    }
+
+//    @Login(isMiniLogin = true)
+//    @ApiOperation("获取销售通过小程序登录后的用户信息")
+//    @GetMapping("/getMaUser")
+//    public R getUserInfo() {
+//        try {
+//            CompanyUser companyUser = companyUserService.selectCompanyUserById(Long.parseLong(getUserId()));
+//            if (companyUser == null) {
+//                return R.error(401, "用户信息不存在");
+//            }
+//            return R.ok().put("user", companyUser);
+//        } catch (Exception e) {
+//            return R.error("操作异常");
+//        }
+//    }
+
+    /**
+     * 特殊要求:销售小程序临时登录,登录后页面中还有一个之前常用的登录,所以为了区分,token名称不能跟之前的一样
+     *
+     * @return 用户id
+     */
+    public String getUserId() {
+        String headValue = ServletUtils.getRequest().getHeader("UserToken");
+        Claims claims = jwtUtils.getClaimByToken(headValue);
+        String userId = claims.getSubject().toString();
+        return userId;
+    }
+
+
+}

+ 2 - 1
fs-user-app/src/main/java/com/fs/app/controller/WxH5MpController.java

@@ -71,13 +71,14 @@ public class WxH5MpController {
             if(param.getCompanyId() != null){
                 company = companyService.selectCompanyById(param.getCompanyId());
             }
-            FsUser user = userService.selectFsUserByUnionid(wxMpUser.getUnionId());
+            FsUser user = userService.selectFsUserByMpOpenId(wxMpUser.getOpenid());
             if (user != null) {
                 //修改
                 FsUser userMap = new FsUser();
                 userMap.setUserId(user.getUserId());
                 userMap.setMpOpenId(wxMpUser.getOpenid());
                 userMap.setUpdateTime(new DateTime());
+                userMap.setAvatar(wxMpUser.getHeadImgUrl());
                 userMap.setNickname(wxMpUser.getNickname());
                 userService.updateFsUser(userMap);
             } else {

+ 183 - 102
fs-user-app/src/main/java/com/fs/app/controller/WxUserController.java

@@ -1,43 +1,40 @@
 package com.fs.app.controller;
 
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
+import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
 import cn.hutool.core.date.DateTime;
-import cn.hutool.core.util.StrUtil;
 import com.fs.app.annotation.Login;
 import com.fs.app.utils.JwtUtils;
 import com.fs.common.core.domain.R;
-import com.fs.common.core.redis.RedisCache;
 import com.fs.common.exception.CustomException;
-import com.fs.common.utils.OrderUtils;
-import com.fs.store.param.LoginMpWxParam;
 import com.fs.common.utils.IpUtil;
-import com.fs.wx.miniapp.config.WxMaConfiguration;
-import com.fs.wx.miniapp.config.WxMaProperties;
+import com.fs.common.utils.OrderUtils;
 import com.fs.store.domain.FsUser;
+import com.fs.store.param.LoginMpWxParam;
 import com.fs.store.param.LoginWxParam;
 import com.fs.store.service.IFsUserService;
-import com.fs.wx.mp.config.WxMpConfiguration;
+import com.fs.wx.miniapp.config.WxMaConfiguration;
+import com.fs.wx.miniapp.config.WxMaProperties;
 import com.fs.wx.mp.config.WxMpProperties;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.Synchronized;
 import me.chanjar.weixin.common.bean.WxOAuth2UserInfo;
 import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
+import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.mp.api.WxMpService;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.bind.annotation.*;
-
-import cn.binarywang.wx.miniapp.api.WxMaService;
-import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
-import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
-import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
-import me.chanjar.weixin.common.error.WxErrorException;
+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.RestController;
 
 import java.util.Date;
-import java.util.concurrent.TimeUnit;
 
 /**
  * 微信小程序用户接口
@@ -66,103 +63,187 @@ public class WxUserController extends AppBaseController{
      */
     @ApiOperation("登录")
     @PostMapping("/login")
-    public R login( @RequestBody LoginMpWxParam param) {
+    public R login(@RequestBody LoginMpWxParam param) {
         if (StringUtils.isBlank(param.getCode())) {
             return R.error("code不存在");
         }
+
         final WxMaService wxService = WxMaConfiguration.getMaService(maProperties.getConfigs().get(0).getAppid());
         try {
+            // 获取微信会话信息
             WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
-            this.logger.info(session.getSessionKey());
-            this.logger.info(session.getOpenid());
-            // 解密
-            WxMaPhoneNumberInfo phoneNoInfo = wxService.getUserService().getPhoneNoInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
-            FsUser user=userService.selectFsUserByMaOpenId(session.getOpenid());
+            logger.info("获取微信会话信息成功 - openid: {}, sessionKey: {}", session.getOpenid(), session.getSessionKey());
+
+            // 获取手机号信息
+            WxMaPhoneNumberInfo phoneNoInfo = wxService.getUserService().getPhoneNoInfo(
+                session.getSessionKey(),
+                param.getEncryptedData(),
+                param.getIv()
+            );
+            logger.info("获取手机号信息成功 - phone: {}", phoneNoInfo.getPhoneNumber());
+
+            // 获取用户IP
             String ip = IpUtil.getRequestIp();
-            if(user==null){
-                //查询手机号是否存在,如果存在,更新
-                FsUser checkPhone=userService.selectFsUserByPhone(phoneNoInfo.getPhoneNumber());
-                if(checkPhone!=null){
-                    if(checkPhone.getMaOpenId()==null){
-                        user=checkPhone;
-                        FsUser userMap=new FsUser();
-                        userMap.setMaOpenId(session.getOpenid());
-                        userMap.setUserId(checkPhone.getUserId());
-                        userMap.setUpdateTime(new DateTime());
-                        userMap.setLastIp(ip);
-                        userService.updateFsUser(userMap);
-                    }
-                    else{
-                        throw new CustomException("此手机号已存在");
-                    }
-                }
-                else{
-                    //写入
-                    user=new FsUser();
-                    if(StringUtils.isNotEmpty(param.getUserCode())){
-                        FsUser tuiUser=userService.selectFsUserByUserCode(param.getUserCode());
-                        if(tuiUser!=null){
-                            user.setIsPromoter(1);
-                            user.setSpreadUserId(tuiUser.getUserId());
-                        }
-                    }
-                    user.setUserCode(OrderUtils.genUserCode());
-                    user.setPhone(phoneNoInfo.getPhoneNumber());
-                    user.setUsername(phoneNoInfo.getPhoneNumber());
-                    user.setNickname("微信用户");
-                    user.setStatus(1);
-                    user.setMaOpenId(session.getOpenid());
-                    user.setLastIp(ip);
-                    user.setIsWeixinAuth(0);
-                    user.setCreateTime(new Date());
-                    userService.insertFsUser(user);
-                }
-           }
-           else{
-               FsUser userMap=new FsUser();
-               userMap.setPhone(phoneNoInfo.getPhoneNumber());
-               userMap.setUserId(user.getUserId());
-               userMap.setUpdateTime(new DateTime());
-               userMap.setLastIp(ip);
-               userService.updateFsUser(userMap);
-           }
-           String token = jwtUtils.generateToken(user.getUserId());
-           return R.ok("登录成功").put("token",token).put("user", user);
+
+            // 查找或创建用户
+            FsUser user = findOrCreateUser(session, phoneNoInfo, ip, param.getUserCode());
+
+            // 生成token
+            String token = jwtUtils.generateToken(user.getUserId());
+
+            // 记录登录日志
+            logger.info("用户登录成功 - userId: {}, phone: {}", user.getUserId(), user.getPhone());
+
+            return R.ok("登录成功")
+                .put("token", token)
+                .put("user", user);
+
         } catch (WxErrorException e) {
-            //this.logger.error(e.getMessage(), e);
-            return R.error("授权失败,"+e.getMessage());
+            logger.error("微信授权失败: {}", e.getMessage(), e);
+            return R.error("授权失败: " + e.getMessage());
+        } catch (CustomException e) {
+            logger.error("业务处理异常: {}", e.getMessage(), e);
+            return R.error(e.getMessage());
+        } catch (Exception e) {
+            logger.error("系统异常: {}", e.getMessage(), e);
+            return R.error("系统异常,请稍后重试");
+        }
+    }
+
+    /**
+     * 查找或创建用户
+     */
+    private FsUser findOrCreateUser(WxMaJscode2SessionResult session,
+                                  WxMaPhoneNumberInfo phoneNoInfo,
+                                  String ip,
+                                  String userCode) {
+        // 优先通过unionid查找用户
+        FsUser user = null;
+        if (session.getUnionid() != null) {
+            user = userService.selectFsUserByUnionid(session.getUnionid());
+            if (user == null) {
+                user = userService.selectFsUserByMaOpenId(session.getOpenid());
+            }
+        } else {
+            user = userService.selectFsUserByMaOpenId(session.getOpenid());
+        }
+
+        if (user == null) {
+            // 检查手机号是否已存在
+            FsUser checkPhone = userService.selectFsUserByPhone(phoneNoInfo.getPhoneNumber());
+            if (checkPhone != null) {
+                if (checkPhone.getMaOpenId() == null) {
+                    // 更新已存在用户的信息
+                    user = updateExistingUser(checkPhone, session, ip);
+                } else {
+                    throw new CustomException("此手机号已被其他微信账号绑定");
+                }
+            } else {
+                // 创建新用户
+                user = createNewUser(session, phoneNoInfo, ip, userCode);
+            }
+        } else {
+            // 更新用户信息
+            updateUserInfo(user, phoneNoInfo, ip);
+        }
+
+        return user;
+    }
+
+    /**
+     * 更新已存在用户的信息
+     */
+    private FsUser updateExistingUser(FsUser existingUser, WxMaJscode2SessionResult session, String ip) {
+        FsUser userMap = new FsUser();
+        userMap.setMaOpenId(session.getOpenid());
+        userMap.setUserId(existingUser.getUserId());
+        userMap.setUpdateTime(new DateTime());
+        userMap.setLastIp(ip);
+        if (session.getUnionid() != null) {
+            userMap.setUnionId(session.getUnionid());
+        }
+        userService.updateFsUser(userMap);
+        return existingUser;
+    }
+
+    /**
+     * 创建新用户
+     */
+    private FsUser createNewUser(WxMaJscode2SessionResult session,
+                               WxMaPhoneNumberInfo phoneNoInfo,
+                               String ip,
+                               String userCode) {
+        FsUser user = new FsUser();
+
+        // 处理推荐关系
+        if (StringUtils.isNotEmpty(userCode)) {
+            FsUser tuiUser = userService.selectFsUserByUserCode(userCode);
+            if (tuiUser != null) {
+                user.setIsPromoter(1);
+                user.setSpreadUserId(tuiUser.getUserId());
+            }
         }
+
+        // 设置用户基本信息
+        user.setUserCode(OrderUtils.genUserCode());
+        user.setPhone(phoneNoInfo.getPhoneNumber());
+        user.setUsername(phoneNoInfo.getPhoneNumber());
+        user.setNickname("微信用户");
+        user.setStatus(1);
+        user.setMaOpenId(session.getOpenid());
+        user.setLastIp(ip);
+        user.setIsWeixinAuth(0);
+        user.setCreateTime(new Date());
+
+        if (session.getUnionid() != null) {
+            user.setUnionId(session.getUnionid());
+        }
+
+        userService.insertFsUser(user);
+        return user;
+    }
+
+    /**
+     * 更新用户信息
+     */
+    private void updateUserInfo(FsUser user, WxMaPhoneNumberInfo phoneNoInfo, String ip) {
+        FsUser userMap = new FsUser();
+        userMap.setPhone(phoneNoInfo.getPhoneNumber());
+        userMap.setUserId(user.getUserId());
+        userMap.setUpdateTime(new DateTime());
+        userMap.setLastIp(ip);
+        userService.updateFsUser(userMap);
     }
 
-//    /**
-//     * <pre>
-//     * 获取微信用户信息
-//     * </pre>
-//     */
-//    @Login
-//    @ApiOperation("获取微信小程序用户信息")
-//    @PostMapping("/getWeixinInfo")
-//    public R getWeixinInfo(@RequestBody LoginMpWxParam param) {
-//        final WxMaService wxService = WxMaConfiguration.getMaService(maProperties.getConfigs().get(0).getAppid());
-//        try {
-//            WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
-//            // 用户信息校验
-//            if (!wxService.getUserService().checkUserInfo(session.getSessionKey(), param.getRawData(), param.getSignature())) {
-//                return R.error("user check failed");
-//            }
-//            // 解密用户信息
-//            WxMaUserInfo userInfo = wxService.getUserService().getUserInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
-//            FsUser user=userService.selectFsUserById(Long.parseLong(getUserId()));
-//            user.setNickname(userInfo.getNickName());
-//            user.setAvatar(userInfo.getAvatarUrl());
-//            user.setIsWeixinAuth(1);
-//            userService.updateFsUser(user);
-//            return R.ok();
-//        } catch (WxErrorException e) {
-//            e.printStackTrace();
-//        }
-//        return R.ok("授权成功");
-//    }
+    /**
+     * <pre>
+     * 获取微信用户信息
+     * </pre>
+     */
+    @Login
+    @ApiOperation("获取微信小程序用户信息")
+    @PostMapping("/getWeixinInfo")
+    public R getWeixinInfo(@RequestBody LoginMpWxParam param) {
+        final WxMaService wxService = WxMaConfiguration.getMaService(maProperties.getConfigs().get(0).getAppid());
+        try {
+            WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
+            // 用户信息校验
+            if (!wxService.getUserService().checkUserInfo(session.getSessionKey(), param.getRawData(), param.getSignature())) {
+                return R.error("user check failed");
+            }
+            // 解密用户信息
+            WxMaUserInfo userInfo = wxService.getUserService().getUserInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
+            FsUser user=userService.selectFsUserById(Long.parseLong(getUserId()));
+            user.setNickname(userInfo.getNickName());
+            user.setAvatar(userInfo.getAvatarUrl());
+            user.setIsWeixinAuth(1);
+            userService.updateFsUser(user);
+            return R.ok();
+        } catch (WxErrorException e) {
+            e.printStackTrace();
+        }
+        return R.ok("授权成功");
+    }
 
     @ApiOperation("小程序登录")
     @PostMapping("/loginByMiniApp")

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

@@ -0,0 +1,34 @@
+package com.fs.app.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+@Data
+public class LoginMaWxParam implements Serializable {
+
+    @NotBlank(message = "code参数缺失")
+    @ApiModelProperty(value = "小程序登陆code")
+    private String code;
+
+    @ApiModelProperty(value = "小程序完整用户信息的加密数据")
+    private String encryptedData;
+
+    @ApiModelProperty(value = "小程序加密算法的初始向量")
+    private String iv;
+
+//    @ApiModelProperty(value = "公司id,如果不是第一位销售,都需要传")
+//    private Long companyId;
+
+//    @ApiModelProperty(value = "电话号码")
+//    private String phoneNumber;
+
+//    @ApiModelProperty(value = "上级销售id,如果没有则不传")
+//    private Long parentCompanyUseId;
+//
+//    @ApiModelProperty(value = "用户密码")
+//    private String password;
+
+}