Parcourir la source

Merge remote-tracking branch 'origin/master'

小么熊🐻 il y a 3 ans
Parent
commit
d97efe43b0
30 fichiers modifiés avec 573 ajouts et 66 suppressions
  1. 13 3
      twzd-admin/src/main/java/com/miaxis/app/controller/wx/UserInfoController.java
  2. 1 25
      twzd-admin/src/main/java/com/miaxis/app/controller/wx/WxController.java
  3. 2 0
      twzd-admin/src/main/java/com/miaxis/app/controller/wx/WxNotifyController.java
  4. 65 0
      twzd-admin/src/main/java/com/miaxis/app/controller/wx/XcXUserInfoController.java
  5. 191 0
      twzd-admin/src/main/java/com/miaxis/app/controller/wx/XcxWxController.java
  6. 34 6
      twzd-admin/src/main/java/com/miaxis/system/controller/system/SysLoginController.java
  7. 6 1
      twzd-admin/src/main/resources/application-dev.yml
  8. 7 0
      twzd-admin/src/main/resources/application-prod.yml
  9. 7 0
      twzd-admin/src/main/resources/application-prodtest.yml
  10. 66 2
      twzd-admin/src/test/java/com/miaxis/test/NormalTest.java
  11. 13 1
      twzd-common/src/main/java/com/miaxis/common/core/domain/entity/UserInfo.java
  12. 2 1
      twzd-common/src/main/java/com/miaxis/common/enums/StudentLoginTypeEnum.java
  13. 1 1
      twzd-framework/src/main/java/com/miaxis/framework/config/SecurityConfig.java
  14. 4 3
      twzd-framework/src/main/java/com/miaxis/framework/web/service/SysLoginService.java
  15. 22 8
      twzd-framework/src/main/java/com/miaxis/framework/web/service/UserDetailsServiceImpl.java
  16. 14 0
      twzd-service/src/main/java/com/miaxis/feign/dto/WxGzhBatchUser.java
  17. 13 1
      twzd-service/src/main/java/com/miaxis/feign/service/IWxSendService.java
  18. 4 0
      twzd-service/src/main/java/com/miaxis/score/dto/ScoreInfoPcDTO.java
  19. 4 0
      twzd-service/src/main/java/com/miaxis/score/vo/ScoreIStudentInfoPcVo.java
  20. 28 0
      twzd-service/src/main/java/com/miaxis/user/dto/UserInfoUpdateDto.java
  21. 13 0
      twzd-service/src/main/java/com/miaxis/wx/domain/WxOrder.java
  22. 16 1
      twzd-service/src/main/java/com/miaxis/wx/service/WxService.java
  23. 5 4
      twzd-service/src/main/java/com/miaxis/wx/service/impl/WxGzhServiceImpl.java
  24. 7 4
      twzd-service/src/main/java/com/miaxis/wx/service/impl/WxOrderServiceImpl.java
  25. 2 1
      twzd-service/src/main/resources/mapper/score/ScoreInfoMapper.xml
  26. 1 1
      twzd-service/src/main/resources/mapper/user/UserInfoMapper.xml
  27. 2 0
      twzd-system/src/main/java/com/miaxis/system/mapper/SysUserMapper.java
  28. 2 0
      twzd-system/src/main/java/com/miaxis/system/service/ISysUserService.java
  29. 5 0
      twzd-system/src/main/java/com/miaxis/system/service/impl/SysUserServiceImpl.java
  30. 23 3
      twzd-system/src/main/resources/mapper/system/SysUserMapper.xml

+ 13 - 3
twzd-admin/src/main/java/com/miaxis/app/controller/wx/UserInfoController.java

@@ -1,6 +1,5 @@
 package com.miaxis.app.controller.wx;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.miaxis.common.constant.Constants;
 import com.miaxis.common.core.controller.BaseController;
 import com.miaxis.common.core.domain.Response;
@@ -13,6 +12,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -32,8 +32,18 @@ public class UserInfoController extends BaseController {
     @GetMapping(value = "/info")
     @ApiOperation("获取用户信息")
     public Response<UserInfo> getInfo(){
-        String openid = SecurityUtils.getLoginUser().getStudent().getOpenid();
-        return Response.success(userInfoService.getOne(new QueryWrapper<UserInfo>().eq("openid",openid)));
+        Long userId  = SecurityUtils.getLoginUser().getStudent().getId();
+        return Response.success(userInfoService.getById(userId));
+    }
+
+
+    @PutMapping(value = "/realname")
+    @ApiOperation("更新用户信息真实姓名")
+    public Response updaterealname(String  realName){
+        Long userId  = SecurityUtils.getLoginUser().getStudent().getId();
+        UserInfo userInfo = userInfoService.getById(userId);
+        userInfo.setRealName(realName);
+        return Response.success(userInfoService.updateById(userInfo));
     }
 
 

+ 1 - 25
twzd-admin/src/main/java/com/miaxis/app/controller/wx/WxController.java

@@ -9,7 +9,6 @@ import com.miaxis.common.core.controller.BaseController;
 import com.miaxis.common.core.domain.Response;
 import com.miaxis.common.core.domain.entity.SysDictData;
 import com.miaxis.common.core.domain.entity.UserInfo;
-import com.miaxis.common.enums.OrderStatusEnum;
 import com.miaxis.common.exception.CustomException;
 import com.miaxis.common.utils.SecurityUtils;
 import com.miaxis.common.utils.uuid.CommonUtils;
@@ -106,7 +105,7 @@ public class WxController extends BaseController {
         String orderCode = getOrderCode(student.getId());
         order.setOutTradeNo(orderCode);
         order.setOpenid(student.getOpenid());
-        order.setOrderStatus(OrderStatusEnum.PROCESSING.getCode());
+        order.setUnionId(student.getUnionId());
         Double dprice = Double.valueOf(values[0]);
         Double v =dprice* 100;
         order.setTotal(v.intValue());
@@ -114,29 +113,6 @@ public class WxController extends BaseController {
         return order;
     }
 
-    /**
-     * 微信支付获取预订单id
-     */
-    @PostMapping(value = "/prepareOrder-test")
-    @ApiOperation("微信支付下单-测试")
-    public Response<JSONObject> getPrepareOrderTest() throws Exception{
-
-
-        //创建本地微信订单
-        WxOrder order = new WxOrder();
-        UserInfo student = SecurityUtils.getLoginUser().getStudent();
-        String orderCode = getOrderCode(student.getId());
-        order.setOutTradeNo(orderCode);
-        order.setOpenid(student.getOpenid());
-        order.setGoodsType("1");
-        wxOrderService.createVipOrder(order);
-        //wxOrderService.save(order);
-        return Response.success(placeWxOrder(order, "学车vip充值", "http://jpcj-h5.zzxcx.net.zzxcx.net/prod-api/open-api/wx/notify/wxpay1"));
-
-
-    }
-
-
     //下单
     private JSONObject placeWxOrder(WxOrder order, String goodsName, String notifyUrl) throws Exception {
         HttpPost httpPost = initHttpPost();

+ 2 - 0
twzd-admin/src/main/java/com/miaxis/app/controller/wx/WxNotifyController.java

@@ -85,6 +85,8 @@ public class WxNotifyController {
 
 
 
+
+
     private String getBodyString(HttpServletRequest request) {
             BufferedReader br = null;
             StringBuilder sb = new StringBuilder("");

+ 65 - 0
twzd-admin/src/main/java/com/miaxis/app/controller/wx/XcXUserInfoController.java

@@ -0,0 +1,65 @@
+package com.miaxis.app.controller.wx;
+
+import com.miaxis.common.constant.Constants;
+import com.miaxis.common.core.controller.BaseController;
+import com.miaxis.common.core.domain.Response;
+import com.miaxis.common.core.domain.entity.UserInfo;
+import com.miaxis.common.utils.SecurityUtils;
+import com.miaxis.common.utils.StringUtils;
+import com.miaxis.user.dto.UserInfoUpdateDto;
+import com.miaxis.user.service.IUserInfoService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(Constants.STUDENT_PREFIX+"/xcx/user")
+@Api(tags = {"【小程序-用户信息】"})
+@Slf4j
+public class XcXUserInfoController extends BaseController {
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+
+
+    /**
+     * 修改用户信息
+     */
+    @PostMapping
+    @ApiOperation("修改用户信息")
+    public Response edit(@RequestBody UserInfoUpdateDto userInfoUpdateDto){
+
+        UserInfo userInfo= SecurityUtils.getLoginUser().getStudent();
+        if (userInfo!= null){
+            if (!StringUtils.isEmpty(userInfoUpdateDto.getHeadImage())){
+                userInfo.setHeadImage(userInfoUpdateDto.getHeadImage());
+            }
+            if (!StringUtils.isEmpty(userInfoUpdateDto.getNickName())){
+                userInfo.setNickName(userInfoUpdateDto.getNickName());
+            }
+        }
+        //更新数据库
+        userInfoService.updateById(userInfo);
+        return Response.success("更新成功");
+    }
+
+
+
+
+
+
+
+
+
+
+
+}

+ 191 - 0
twzd-admin/src/main/java/com/miaxis/app/controller/wx/XcxWxController.java

@@ -0,0 +1,191 @@
+package com.miaxis.app.controller.wx;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.miaxis.common.config.WxpayConfig;
+import com.miaxis.common.constant.Constants;
+import com.miaxis.common.core.controller.BaseController;
+import com.miaxis.common.core.domain.Response;
+import com.miaxis.common.core.domain.entity.SysDictData;
+import com.miaxis.common.core.domain.entity.UserInfo;
+import com.miaxis.common.exception.CustomException;
+import com.miaxis.common.utils.SecurityUtils;
+import com.miaxis.common.utils.uuid.CommonUtils;
+import com.miaxis.system.service.ISysDictDataService;
+import com.miaxis.wx.domain.WxOrder;
+import com.miaxis.wx.dto.WxOrderDTO;
+import com.miaxis.wx.service.IWxOrderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.ClassPathResource;
+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.io.ByteArrayOutputStream;
+import java.io.File;
+import java.security.PrivateKey;
+import java.security.Signature;
+import java.util.Base64;
+
+import static com.miaxis.common.utils.OrderCodeFactory.getOrderCode;
+
+/**
+ * 【小程序-微信支付】Controller
+ *
+ * @author miaxis
+ * @date 2021-03-10
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(Constants.STUDENT_PREFIX+"/xcx/wx")
+@Api(tags = {"【小程序-微信支付】"})
+@Slf4j
+public class XcxWxController extends BaseController {
+
+    @Autowired
+    private HttpClient httpClient;
+
+    @Autowired
+    private WxpayConfig wxpayConfig;
+
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+
+    @Autowired
+    private IWxOrderService wxOrderService;
+
+
+    @Value("${xcx.appId}")
+    private String appId;
+    @Value("${wxpay.notifyUrl}")
+    private  String notifyUrl ;
+
+
+
+    /**
+     * 微信支付获取预订单id
+     */
+    @PostMapping(value = "/prepareOrder")
+    @ApiOperation("微信支付下单")
+    public Response<JSONObject> getXcxPrepareOrder(@RequestBody WxOrderDTO wxOrderDTO) throws Exception{
+
+
+        SysDictData sysDictData = dictDataService.selectDictDataById(wxOrderDTO.getDictCode());
+        String[] values = sysDictData.getDictValue().split(",");
+        //创建本地微信订单
+        WxOrder order = createOrder(values);
+        wxOrderService.save(order);
+        return Response.success(placeWxOrder(order, sysDictData.getDictLabel(),notifyUrl));
+
+
+    }
+
+    private WxOrder createOrder(String[] values) {
+        WxOrder order = new WxOrder();
+        UserInfo student = SecurityUtils.getLoginUser().getStudent();
+        String orderCode = getOrderCode(student.getId());
+        order.setOutTradeNo(orderCode);
+        order.setXcxOpenid(student.getXcxOpenid());
+        order.setUnionId(student.getUnionId());
+        Double dprice = Double.valueOf(values[0]);
+        Double v =dprice* 100;
+        order.setTotal(v.intValue());
+        order.setOrderDataJson(values[2]);
+        return order;
+    }
+
+    //下单
+    private JSONObject placeWxOrder(WxOrder order, String goodsName, String notifyUrl) throws Exception {
+        HttpPost httpPost = initHttpPost();
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        ObjectMapper objectMapper = new ObjectMapper();
+        ObjectNode rootNode = objectMapper.createObjectNode();
+        rootNode.put("mchid",wxpayConfig.getMerchantId())
+                .put("appid", appId)
+                .put("description", goodsName)
+                .put("notify_url", notifyUrl)
+                .put("out_trade_no", order.getOutTradeNo());
+        rootNode.putObject("amount")
+                .put("total", order.getTotal());
+        rootNode.putObject("payer")
+                .put("openid", order.getXcxOpenid());
+        objectMapper.writeValue(bos, rootNode);
+        httpPost.setEntity(new StringEntity(rootNode.toString(), "utf-8"));
+        HttpResponse response = httpClient.execute(httpPost);
+        String bodyAsString = EntityUtils.toString(response.getEntity());
+        if (JSONObject.parseObject(bodyAsString).get("prepay_id") == null){
+            throw new CustomException(JSONObject.parseObject(bodyAsString).get("message").toString());
+        }
+        return getWxParamJson(bodyAsString,order.getOutTradeNo());
+
+    }
+
+    // 生成调用调起微信支付所需参数
+    private JSONObject getWxParamJson(String bodyAsString, String orderCode) throws Exception {
+        String  packageStr = "prepay_id="+JSONObject.parseObject(bodyAsString).get("prepay_id");
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("package",packageStr);
+        String nonce_str = RandomStringUtils.randomAlphanumeric(32);
+        jsonObject.put("nonceStr",nonce_str);
+        long timestamp =  System.currentTimeMillis()/1000;
+        jsonObject.put("timeStamp",String.valueOf(timestamp));
+        jsonObject.put("signType","RSA");
+        StringBuffer sb = new StringBuffer();
+        sb.append(appId + "\n");
+        sb.append(timestamp + "\n");
+        sb.append(nonce_str + "\n");
+        sb.append(packageStr+ "\n");
+        System.out.println(sb);
+
+        File file = new ClassPathResource("wechatpay/apiclient_key.pem").getFile();
+        String realPath =file.getAbsolutePath();
+        PrivateKey privateKey = CommonUtils.getPrivateKey(realPath);
+        // 进行签名服务
+        Signature signature = Signature.getInstance("SHA256withRSA");
+        signature.initSign(privateKey);
+        signature.update(sb.toString().getBytes("UTF-8"));
+        byte[] signedData = signature.sign();
+        String base64Str =  Base64.getEncoder().encodeToString(signedData);
+        jsonObject.put("paySign",base64Str);
+        jsonObject.put("outTradeNo",orderCode);
+        return jsonObject;
+    }
+
+
+
+
+
+
+    private HttpPost initHttpPost() {
+        HttpPost httpPost = new HttpPost(wxpayConfig.getV3url());
+        httpPost.addHeader("Accept", "application/json");
+        httpPost.addHeader("Content-type","application/json; charset=utf-8");
+        return httpPost;
+    }
+
+
+
+
+
+
+
+
+
+
+
+}

+ 34 - 6
twzd-admin/src/main/java/com/miaxis/system/controller/system/SysLoginController.java

@@ -21,6 +21,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -66,12 +67,11 @@ public class SysLoginController
     @Value("${app.appSecret}")
     private String appSecret;
 
+    @Value("${xcx.appId}")
+    private String xcxAppid;
 
-
-
-
-
-
+    @Value("${xcx.secret}")
+    private String xcxSecret;
 
 
     /**
@@ -123,7 +123,7 @@ public class SysLoginController
         }
         String userInfoStr = wxService.getUserInfo("zh_CN", wxResult.getAccess_token(), wxResult.getOpenid());
         WxUserInfo wxUserInfo = JSONObject.parseObject(userInfoStr,WxUserInfo.class);
-
+        ServletUtils.getRequest().setAttribute("openid",wxUserInfo.getOpenid());
         String token = loginService.login(wxUserInfo,null, StudentLoginTypeEnum.AUTHORIZATION_CODE_LOGIN.getCode());
         TokenDTO tokenDTO = new TokenDTO();
         tokenDTO.setToken(token);
@@ -138,6 +138,7 @@ public class SysLoginController
     public Response<TokenDTO> testloginByAuthorizationCode(String authorizationCode ){
         WxUserInfo wxUserInfo = new WxUserInfo();
         wxUserInfo.setOpenid("ovKTX5-FKLF6_sgTtCIXpG_lz3PY");
+        wxUserInfo.setUnionid("oqEKX6GxPyBPfRbM-Bk01CGwA0oM");
         wxUserInfo.setNickname("Sss");
         wxUserInfo.setSex("0");
         wxUserInfo.setHeadimgurl("https://thirdwx.qlogo.cn/mmopen/vi_32/DYAIOgq83erGMFzKaOmz6cIaA0J1nicWSlBLdLKY46N5CNCoASiajT7Z3RIfPngPhJsjmqsSjGCFibPU4vCtfz3aw/132");
@@ -152,6 +153,33 @@ public class SysLoginController
 
     }
 
+    /**
+     * 用户 jscode登录
+     *
+     */
+    @PostMapping("/login/jscode")
+    @ApiOperation("小程序jscode登录")
+    public Response<TokenDTO> getInfo(String jscode){
+        String result = wxService.getWxInfo(xcxAppid, xcxSecret, jscode,"authorization_code");
+        JSONObject jsonString = JSONObject.parseObject(result);
+        WxResult wxResult = JSONObject.toJavaObject(jsonString, WxResult.class);
+        TokenDTO tokenDTO = new TokenDTO();
+        // 生成令牌
+        if (wxResult.getOpenid() != null){
+            // 生成令牌
+            WxUserInfo wxUserInfo = new WxUserInfo();
+            BeanUtils.copyProperties(wxResult,wxUserInfo);
+            ServletUtils.getRequest().setAttribute("xcxOpenid",wxUserInfo.getOpenid());
+            String token = loginService.login(wxUserInfo,null, StudentLoginTypeEnum.AUTHORIZATION_XCX_LOGIN.getCode());
+            tokenDTO.setToken(token);
+            return Response.success(tokenDTO) ;
+        }
+        else{
+            return Response.error(500,wxResult.getErrmsg());
+        }
+
+    }
+
 //
 //    /**
 //     * 用户 jscode登录

+ 6 - 1
twzd-admin/src/main/resources/application-dev.yml

@@ -85,7 +85,10 @@ spring:
 app:
     appId: wx67ca1b8c9816ef28
     appSecret: 8604f2a6eb6338cfa64e7df4ec2c08b3
-
+# 微信小程序
+xcx:
+    appId: wx8f43db501343feab
+    secret: 3509a81880669ffa6fa554b2aa050351
 
 # 微信支付
 wxpay:
@@ -96,6 +99,8 @@ wxpay:
     v3key: 8604f2a6eb6338cfa64e7df4ec2c08b3
     notifyUrl: http://1.15.26.233:8080/twzd-admin/open-api/wx/notify/wxpay
     notifyUrlRefund: http://1.15.26.233:8080/twzd-admin/open-api/wx/notify/refund
+    xcxNotifyUrl: http://1.15.26.233:8080/twzd-admin/open-api/wx/notify/xcxWxpay
+    xcxNotifyUrlRefund: http://1.15.26.233:8080/twzd-admin/open-api/wx/notify/xcxRefund
     appId: wx67ca1b8c9816ef28
 
 # 腾讯cos

+ 7 - 0
twzd-admin/src/main/resources/application-prod.yml

@@ -83,6 +83,11 @@ app:
     appId: wx67ca1b8c9816ef28
     appSecret: 8604f2a6eb6338cfa64e7df4ec2c08b3
 
+# 微信小程序
+xcx:
+    appId: wx8f43db501343feab
+    secret: 3509a81880669ffa6fa554b2aa050351
+
 # 微信支付
 wxpay:
     v3url: https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi
@@ -92,6 +97,8 @@ wxpay:
     v3key: 8604f2a6eb6338cfa64e7df4ec2c08b3
     notifyUrl: http://jpcj-h5.zzxcx.net/prod-api/open-api/wx/notify/wxpay
     notifyUrlRefund: http://jpcj-h5.zzxcx.net/prod-api/open-api/wx/notify/refund
+    xcxNotifyUrl: http://jpcj-h5.zzxcx.net/prod-api/open-api/wx/notify/xcxWxpay
+    xcxNotifyUrlRefund: http://jpcj-h5.zzxcx.net/prod-api/open-api/wx/notify/xcxRefund
 
 
 # 腾讯cos

+ 7 - 0
twzd-admin/src/main/resources/application-prodtest.yml

@@ -83,6 +83,11 @@ app:
     appId: wx67ca1b8c9816ef28
     appSecret: 8604f2a6eb6338cfa64e7df4ec2c08b3
 
+# 微信小程序
+xcx:
+    appId: wx8f43db501343feab
+    secret: 3509a81880669ffa6fa554b2aa050351
+
 # 微信支付
 wxpay:
     v3url: https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi
@@ -92,6 +97,8 @@ wxpay:
     v3key: 8604f2a6eb6338cfa64e7df4ec2c08b3
     notifyUrl: http://jpcj-h5.zzxcx.net/prod-api/open-api/wx/notify/wxpay
     notifyUrlRefund: http://jpcj-h5.zzxcx.net/prod-api/open-api/wx/notify/refund
+    xcxNotifyUrl: http://jpcj-h5.zzxcx.net/prod-api/open-api/wx/notify/xcxWxpay
+    xcxNotifyUrlRefund: http://jpcj-h5.zzxcx.net/prod-api/open-api/wx/notify/xcxRefund
 
 
 # 腾讯cos

+ 66 - 2
twzd-admin/src/test/java/com/miaxis/test/NormalTest.java

@@ -1,8 +1,14 @@
 package com.miaxis.test;
 
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.miaxis.TwzdApplication;
 import com.miaxis.common.core.domain.entity.UserInfo;
+import com.miaxis.feign.dto.WxGzhBatchUser;
+import com.miaxis.feign.service.IWxSendService;
 import com.miaxis.spread.service.impl.WxSpreadRelationServiceImpl;
+import com.miaxis.user.service.IUserInfoService;
+import com.miaxis.wx.service.IWxGzhService;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.boot.test.context.SpringBootTest;
@@ -10,6 +16,7 @@ import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.context.junit4.SpringRunner;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
 import java.util.List;
 
 @ActiveProfiles("prodtest")
@@ -20,10 +27,67 @@ public class NormalTest {
 
     @Resource
     WxSpreadRelationServiceImpl wxSpreadRelationService;
+
+    @Resource
+    IWxSendService wxSendService;
+    @Resource
+    IWxGzhService wxGzhService;
+    @Resource
+    IUserInfoService userInfoService;
     @Test
     public void test666() throws Exception {
-        List<UserInfo> list = wxSpreadRelationService.getWxSpreadRelationList("ovKTX56l0yUAR-c1KKu6VsaV3Erk");
-        System.out.println("wancheng");
+        String gzhToken = wxGzhService.getGzhToken();
+//        String res = wxSendService.userInfo(gzhToken, "ovKTX59m65qpQAd-Bh0AIc5KhW3Q", "zh_CN");
+        List<UserInfo> list = userInfoService.list();
+        int times = (list.size()-1)/100+1;
+        for (int i= 0; i < times-1; i++){
+            WxGzhBatchUser batchUser = new WxGzhBatchUser();
+            List<JSONObject> jlist = new ArrayList<JSONObject>();
+            for(int j=0+i*100;j<99+i*100;j++){
+                JSONObject jo = new JSONObject();
+                jo.put("lang","zh_CN");
+                jo.put("openid",list.get(j).getOpenid());
+                jlist.add(jo);
+            }
+            batchUser.setUser_list(jlist);
+            String res = wxSendService.batchUserInfo(gzhToken,batchUser);
+            System.out.println(res);
+        }
+        WxGzhBatchUser batchUser = new WxGzhBatchUser();
+        List<JSONObject> jlist = new ArrayList<JSONObject>();
+        for(int j=0+(times-1)*100;j<list.size()-1;j++){
+            JSONObject jo = new JSONObject();
+            jo.put("lang","zh_CN");
+            jo.put("openid",list.get(j).getOpenid());
+            jlist.add(jo);
+        }
+        batchUser.setUser_list(jlist);
+        String res = wxSendService.batchUserInfo(gzhToken,batchUser);
+        System.out.println("最后一次");
+        System.out.println(res);
+
+
+
+
+    }
+    @Test
+    public void test777() throws Exception {
+        List<UserInfo> list = userInfoService.list(new QueryWrapper<UserInfo>().isNull("union_id"));
+        System.out.println(list.size());
+        int index =1 ;
+        for (UserInfo userInfo : list){
+            String res = wxSendService.userInfo( wxGzhService.getGzhToken(), userInfo.getOpenid(), "zh_CN");
+            JSONObject jsonObject = JSONObject.parseObject(res);
+            if (jsonObject.getString("unionid") ==null){
+                System.out.println( index);
+                index++;
+                continue;
+            }
+            userInfo.setUnionId(jsonObject.getString("unionid"));
+
+            index++;
+        }
+        userInfoService.updateBatchById(list);
     }
 
 

+ 13 - 1
twzd-common/src/main/java/com/miaxis/common/core/domain/entity/UserInfo.java

@@ -54,13 +54,25 @@ public class UserInfo extends BaseBusinessEntity{
     @ApiModelProperty(value = "app昵称")
     private String nickName;
 
+    /** app昵称 */
+    @Excel(name = "真实姓名")
+    @TableField("real_name")
+    @ApiModelProperty(value = "真实姓名")
+    private String realName;
+
 
     /** 微信openid */
-    @Excel(name = "微信openid")
+    @Excel(name = "公众号openid")
     @TableField("openid")
     @ApiModelProperty(value = "微信openid")
     private String openid;
 
+    /** 微信openid */
+    @Excel(name = "小程序openid")
+    @TableField("xcx_openid")
+    @ApiModelProperty(value = "小程序openid")
+    private String xcxOpenid;
+
 
 
     /** 0 启用 1禁用 */

+ 2 - 1
twzd-common/src/main/java/com/miaxis/common/enums/StudentLoginTypeEnum.java

@@ -7,7 +7,8 @@ package com.miaxis.common.enums;
  */
 public enum StudentLoginTypeEnum
 {
-    AUTHORIZATION_CODE_LOGIN("1", "授权码登录");
+    AUTHORIZATION_CODE_LOGIN("1", "公众号授权码登录"),
+    AUTHORIZATION_XCX_LOGIN("2", "小程序登录");
 
     private final String code;
     private final String info;

+ 1 - 1
twzd-framework/src/main/java/com/miaxis/framework/config/SecurityConfig.java

@@ -102,7 +102,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 // 对于app 开放页面,允许任意访问
                 .antMatchers("/**/open-api/**").permitAll()
                 // 对于登录login 验证码captchaImage 允许匿名访问
-                .antMatchers("/login", "/login/noCode","/captchaImage","/login/code","/login/code/test","/login/jscode-test").anonymous()
+                .antMatchers("/login", "/login/noCode","/captchaImage","/login/code","/login/jscode","/login/code/test","/login/jscode-test").anonymous()
                 //.antMatchers("/student/open/**").permitAll()
                 .antMatchers("/student/**").hasRole("STUDENT")
                 .antMatchers("/vip/**").hasRole("VIP")

+ 4 - 3
twzd-framework/src/main/java/com/miaxis/framework/web/service/SysLoginService.java

@@ -100,10 +100,11 @@ public class SysLoginService
         ServletUtils.getRequest().setAttribute("loginType",loginType);
         ServletUtils.getRequest().setAttribute("headImage",wxUserInfo.getHeadimgurl());
         ServletUtils.getRequest().setAttribute("nickName",wxUserInfo.getNickname());
-        ServletUtils.getRequest().setAttribute("unionid",wxUserInfo.getUnionid());
+
         // 用户验证
-        if (StudentLoginTypeEnum.AUTHORIZATION_CODE_LOGIN.getCode().equals(loginType)){
-            return authenticate(wxUserInfo.getOpenid(),new OpenIdAuthenticationToken(wxUserInfo.getOpenid()));
+        if (StudentLoginTypeEnum.AUTHORIZATION_CODE_LOGIN.getCode().equals(loginType)
+                ||StudentLoginTypeEnum.AUTHORIZATION_XCX_LOGIN.getCode().equals(loginType)){
+            return authenticate(wxUserInfo.getOpenid(),new OpenIdAuthenticationToken(wxUserInfo.getUnionid()));
         }
         else{
             throw new CustomException("loginType参数错误");

+ 22 - 8
twzd-framework/src/main/java/com/miaxis/framework/web/service/UserDetailsServiceImpl.java

@@ -63,22 +63,35 @@ public class UserDetailsServiceImpl implements UserDetailsService
             return createLoginUser(user);
         } else if (StudentLoginTypeEnum.AUTHORIZATION_CODE_LOGIN.getCode().equals(loginType)){
             {
-                UserInfo userInfo = userService.getStudentByOpenId(identification);
+                UserInfo userInfo = userService.getStudentByUnionid(identification);
                 if (userInfo == null) {
                     userInfo = new UserInfo();
                     userInfo.setHeadImage((String) ServletUtils.getRequest().getAttribute("headImage"));
                     userInfo.setNickName((String) ServletUtils.getRequest().getAttribute("nickName"));
-                    userInfo.setUnionId((String) ServletUtils.getRequest().getAttribute("unionid"));
-                    userInfo.setOpenid(identification);
+                    userInfo.setOpenid((String) ServletUtils.getRequest().getAttribute("openid"));
+                    userInfo.setUnionId(identification);
                     userService.saveUserInfo(userInfo);
-                    userInfo = userService.getStudentByOpenId(identification);
                 }else {
                     userInfo.setHeadImage((String) ServletUtils.getRequest().getAttribute("headImage"));
                     userInfo.setNickName((String) ServletUtils.getRequest().getAttribute("nickName"));
-                    userInfo.setUnionId((String) ServletUtils.getRequest().getAttribute("unionid"));
+                    userInfo.setOpenid((String) ServletUtils.getRequest().getAttribute("openid"));
                     userService.updateStudent(userInfo);
                 }
-                return createLoginUser(userInfo);
+                return createLoginUser(identification);
+            }
+        }else if (StudentLoginTypeEnum.AUTHORIZATION_XCX_LOGIN.getCode().equals(loginType)){
+            {
+                UserInfo userInfo = userService.getStudentByUnionid(identification);
+                if (userInfo == null) {
+                    userInfo = new UserInfo();
+                    userInfo.setXcxOpenid((String) ServletUtils.getRequest().getAttribute("xcxOpenid"));
+                    userInfo.setUnionId(identification);
+                    userService.saveUserInfo(userInfo);
+                }else {
+                    userInfo.setXcxOpenid((String) ServletUtils.getRequest().getAttribute("xcxOpenid"));
+                    userService.updateStudent(userInfo);
+                }
+                return createLoginUser(identification);
             }
         } else{
             throw new CustomException("登录类型不存在");
@@ -88,8 +101,9 @@ public class UserDetailsServiceImpl implements UserDetailsService
 
     }
 
-    private UserDetails createLoginUser(UserInfo student) {
-        return new LoginUser(student);
+    private UserDetails createLoginUser(String identification) {
+        UserInfo userInfo = userService.getStudentByUnionid(identification);
+        return new LoginUser(userInfo);
     }
 
     public UserDetails createLoginUser(SysUser user)

+ 14 - 0
twzd-service/src/main/java/com/miaxis/feign/dto/WxGzhBatchUser.java

@@ -0,0 +1,14 @@
+package com.miaxis.feign.dto;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class WxGzhBatchUser {
+
+
+    private List<JSONObject> user_list;
+
+}

+ 13 - 1
twzd-service/src/main/java/com/miaxis/feign/service/IWxSendService.java

@@ -2,11 +2,11 @@ package com.miaxis.feign.service;
 
 import com.alibaba.fastjson.JSONObject;
 import com.miaxis.common.config.FeignConfig;
+import com.miaxis.feign.dto.WxGzhBatchUser;
 import com.miaxis.feign.dto.WxMessageCusom;
 import com.miaxis.feign.dto.WxMessageTemplate;
 import com.miaxis.feign.dto.WxQrTicket;
 import feign.Headers;
-
 import feign.Param;
 import feign.form.FormData;
 import org.springframework.cloud.openfeign.FeignClient;
@@ -24,6 +24,9 @@ import org.springframework.web.bind.annotation.*;
 public interface IWxSendService {
 
 
+
+
+
     /**
      *  获取token
      * @param grant_type
@@ -97,6 +100,15 @@ public interface IWxSendService {
                     @RequestParam("openid") String openid,
                     @RequestParam("lang") String lang);
 
+
+    /**
+     * 批量获取用户信息
+     * @param token 调用接口凭证
+     * @return
+     */
+    @PostMapping(value = "/user/info/batchget")
+    String batchUserInfo(@RequestParam("access_token") String token, WxGzhBatchUser batchUser);
+
     /**
      * 发送客服消息
      * @param accessToken

+ 4 - 0
twzd-service/src/main/java/com/miaxis/score/dto/ScoreInfoPcDTO.java

@@ -18,6 +18,10 @@ public class ScoreInfoPcDTO extends BaseBusinessEntity {
     @ApiModelProperty(value = "昵称")
     private String nickName;
 
+    /**  昵称*/
+    @ApiModelProperty(value = "学员名字")
+    private String realName;
+
     /** 驾校名称 */
     @ApiModelProperty(value = "驾校名称")
     private String schoolName;

+ 4 - 0
twzd-service/src/main/java/com/miaxis/score/vo/ScoreIStudentInfoPcVo.java

@@ -25,6 +25,10 @@ public class ScoreIStudentInfoPcVo extends BaseBusinessEntity {
     @ApiModelProperty(value = "昵称")
     private String nickName;
 
+    /** 昵称 */
+    @ApiModelProperty(value = "真实姓名")
+    private String realName;
+
 
 
     /** 分数 */

+ 28 - 0
twzd-service/src/main/java/com/miaxis/user/dto/UserInfoUpdateDto.java

@@ -0,0 +1,28 @@
+package com.miaxis.user.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.miaxis.common.annotation.Excel;
+import com.miaxis.common.core.domain.BaseBusinessEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author wwl
+ * @Date 2020/12/24
+ * @Version 1.0
+ */
+@Data
+public class UserInfoUpdateDto extends BaseBusinessEntity {
+    /** 小程序头像地址 */
+    @Excel(name = "小程序头像地址")
+    @TableField("head_image")
+    @ApiModelProperty(value = "小程序头像地址")
+    private String headImage;
+
+    /** 小程序昵称 */
+    @Excel(name = "小程序昵称")
+    @TableField("nick_name")
+    @ApiModelProperty(value = "小程序昵称")
+    private String nickName;
+
+}

+ 13 - 0
twzd-service/src/main/java/com/miaxis/wx/domain/WxOrder.java

@@ -104,6 +104,19 @@ public class WxOrder extends BaseBusinessEntity {
     @ApiModelProperty(value = "用户在直连商户appid下的唯一标识")
     private String openid;
 
+    /** 驾校班型Id */
+    @Excel(name = "联合id")
+    @TableField("union_id")
+    @ApiModelProperty(value = "联合id")
+    private String unionId;
+
+    /** 微信openid */
+    @Excel(name = "小程序openid")
+    @TableField("xcx_openid")
+    @ApiModelProperty(value = "小程序openid")
+    private String xcxOpenid;
+
+
     /** 商品名称 */
     @Excel(name = "商品类型")
     @TableField("goods_type")

+ 16 - 1
twzd-service/src/main/java/com/miaxis/wx/service/WxService.java

@@ -32,7 +32,7 @@ public interface WxService {
 
 
     /**
-     * 获取用户信息
+     * 公众号获取用户信息
      */
     @GetMapping(value = "/sns/userinfo")
     String getUserInfo(
@@ -41,6 +41,21 @@ public interface WxService {
             @RequestParam("openid") String openid
     );
 
+    /**
+     *  小程序获取openid
+     * @param appid
+     * @param secret
+     * @param jsCode
+     * @param grantType
+     * @return
+     */
+    @GetMapping(value = "/sns/jscode2session")
+    String getWxInfo(
+            @RequestParam("appid") String appid,
+            @RequestParam("secret") String secret,
+            @RequestParam("js_code") String jsCode,
+            @RequestParam("grant_type") String grantType);
+
     /**
      * 获取jsapi_ticket
      */

+ 5 - 4
twzd-service/src/main/java/com/miaxis/wx/service/impl/WxGzhServiceImpl.java

@@ -86,10 +86,11 @@ public class WxGzhServiceImpl implements IWxGzhService {
             String result = wxSendService.getAccessToken("client_credential",appid,secret);
             JSONObject json = JSONObject.parseObject(result);
             token = json.getString("access_token");
-            expiresIn = json.getIntValue("expires_in");
-            if (expiresIn <= 0){
-                expiresIn = 7000;
-            }
+            expiresIn = 1800;
+//            expiresIn = json.getIntValue("expires_in");
+//            if (expiresIn <= 0){
+//                expiresIn = 7000;
+//            }
 
             redisTemplate.opsForValue().set(Constants.GZH_MESSAGE_TOKEN,token,expiresIn, TimeUnit.SECONDS);
         }

+ 7 - 4
twzd-service/src/main/java/com/miaxis/wx/service/impl/WxOrderServiceImpl.java

@@ -274,7 +274,7 @@ public class WxOrderServiceImpl extends ServiceImpl<WxOrderMapper, WxOrder> impl
             throw new CustomException("参数值转化异常,请检查数据是否为数值类型");
         }
         long timeMillis = days*1440*60*1000l;
-        UserInfo userinfo = userInfoService.getOne(new QueryWrapper<UserInfo>().eq("openid", wxOrder.getOpenid()));
+        UserInfo userinfo = userInfoService.getOne(new QueryWrapper<UserInfo>().eq("union_id", wxOrder.getUnionId()));
         Date expireTime = userinfo.getExpireTime();
         if (expireTime == null || expireTime.getTime()< System.currentTimeMillis()){
             userinfo.setExpireTime(new Date(System.currentTimeMillis()+timeMillis));
@@ -284,10 +284,13 @@ public class WxOrderServiceImpl extends ServiceImpl<WxOrderMapper, WxOrder> impl
         userInfoService.updateById(userinfo);
 
         //发送模板消息
-        messageTemplateSend(userinfo,wxOrder);
+        if (wxOrder.getOpenid()!=null){
+            messageTemplateSend(userinfo,wxOrder);
+
+            // 分成
+            wxExtensionIncomeService.addExtensionIncomeBySourceId(wxOrder.getOutTradeNo(),wxOrder.getOpenid(),wxOrder.getTotal());
+        }
 
-        // 分成
-        wxExtensionIncomeService.addExtensionIncomeBySourceId(wxOrder.getOutTradeNo(),wxOrder.getOpenid(),wxOrder.getTotal());
 
     }
 

+ 2 - 1
twzd-service/src/main/resources/mapper/score/ScoreInfoMapper.xml

@@ -92,13 +92,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 </select>
 
     <select id="selectStudentList" resultType="com.miaxis.score.vo.ScoreIStudentInfoPcVo" >
-        SELECT s.user_id,head_image,nick_name,max(score) as highScore,min(score) as lowScore,count(1) as times,avg(score) as averageScore
+        SELECT s.user_id,head_image,nick_name,real_name,max(score) as highScore,min(score) as lowScore,count(1) as times,avg(score) as averageScore
          FROM user_info u  JOIN score_info s ON u.id = s.user_id
         <where>
             <if test="cityName != null and cityName != ''"> and u.city_name like concat('%', #{cityName}, '%')</if>
             <if test="areaName != null and areaName != ''"> and u.area_name like concat('%', #{areaName}, '%')</if>
             <if test="schoolName != null and schoolName != ''"> and u.school_name like concat('%', #{schoolName}, '%')</if>
             <if test="nickName != null and nickName != ''"> and u.nick_name like concat('%', #{nickName}, '%')</if>
+            <if test="realName != null and realName != ''"> and u.real_name like concat('%', #{realName}, '%')</if>
             <!--<if test="type != null and type != ''"> and s.type = #{type} </if>-->
         </where>
         group by u.id desc

+ 1 - 1
twzd-service/src/main/resources/mapper/user/UserInfoMapper.xml

@@ -73,7 +73,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="getDownLevelPoints"  resultType="com.miaxis.extension.vo.ExtensionIncomeVo">
         select id,openid,IFNULL(nick_name,'未知') as nick_name,IFNULL(head_image,'未知') as head_image,achievement,achievement_settled,
         (select count(1) from wx_spread_relation where parent_openid =t1.openid) as extension_count from user_info t1
-        where openid in (select openid from wx_spread_relation where parent_openid = #{openid})
+        where openid in (select openid from wx_spread_relation where parent_openid = #{openid}) order by achievement desc
     </select>
 
     <select id="getPcDownLevelPoints"  resultType="com.miaxis.extension.vo.ExtensionIncomeVo">

+ 2 - 0
twzd-system/src/main/java/com/miaxis/system/mapper/SysUserMapper.java

@@ -123,4 +123,6 @@ public interface SysUserMapper
     List<AgentVO> getAgentList(@Param("roleId")Long roleId, @Param("userName")String userName);
 
     void updateSysUserByNickName(@Param("schoolName")String schoolName, @Param("total")Integer total);
+
+    UserInfo getStudentByUnionid(String identification);
 }

+ 2 - 0
twzd-system/src/main/java/com/miaxis/system/service/ISysUserService.java

@@ -184,4 +184,6 @@ public interface ISysUserService
     List<AgentVO> getAgentList(Long roleId, String schoolName);
 
     void updateSysUserByNickName(String schoolName, Integer total);
+
+    UserInfo getStudentByUnionid(String identification);
 }

+ 5 - 0
twzd-system/src/main/java/com/miaxis/system/service/impl/SysUserServiceImpl.java

@@ -478,4 +478,9 @@ public class SysUserServiceImpl implements ISysUserService
     public void updateSysUserByNickName(String schoolName, Integer total) {
         userMapper.updateSysUserByNickName(schoolName,total);
     }
+
+    @Override
+    public UserInfo getStudentByUnionid(String identification) {
+        return userMapper.getStudentByUnionid(identification);
+    }
 }

+ 23 - 3
twzd-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -92,17 +92,37 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
 	<select id="getStudentByOpenId" parameterType="String" resultType="com.miaxis.common.core.domain.entity.UserInfo">
 		select * from user_info
-		where openid = #{openid}
+		where union_id = #{unionId}
+	</select>
+
+	<select id="getStudentByUnionid" parameterType="String" resultType="com.miaxis.common.core.domain.entity.UserInfo">
+		select * from user_info
+		where union_id = #{unionId}
 	</select>
 	<select id="getStudentByName" parameterType="String" resultType="com.miaxis.common.core.domain.entity.UserInfo">
 		select * from user_info
 		where name = #{name}
 	</select>
 	<insert id="saveUserInfo" parameterType="com.miaxis.common.core.domain.entity.UserInfo" >
-		insert into user_info (head_image,nick_name,openid) values (#{headImage},#{nickName},#{openid})
+		insert into user_info (head_image,nick_name,openid,xcx_openid,union_id)
+		 values (#{headImage},#{nickName},#{openid},#{xcxOpenid},#{unionId})
 	</insert>
 	<insert id="updateStudent" parameterType="com.miaxis.common.core.domain.entity.UserInfo" >
-		update user_info set head_image = #{headImage},nick_name = #{nickName},union_id = #{unionId} where openid = #{openid}
+		update user_info set
+		<if test="headImage != null and headImage != ''">
+			head_image = #{headImage},
+		</if>
+		<if test="nickName != null and nickName != ''">
+			nick_name = #{nickName},
+		</if>
+		<if test="openid != null and openid != ''">
+			openid = #{openid},
+		</if>
+		<if test="xcxOpenid != null and xcxOpenid != ''">
+			xcx_openid = #{xcxOpenid},
+		</if>
+		union_id = #{unionId}
+		where union_id = #{unionId}
 	</insert>