Browse Source

微信授权登录

chunping 3 years ago
parent
commit
ed8d2af7fe

+ 103 - 23
mp-admin/src/main/java/com/qs/mp/web/controller/api/common/UserController.java

@@ -4,7 +4,9 @@ import cn.jsms.api.ValidSMSResult;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.common.constant.Constants;
 import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.enums.UserIdentityEnum;
 import com.qs.mp.common.enums.WxActTypeEnum;
 import com.qs.mp.common.jsms.JSMSUtils;
 import com.qs.mp.common.qcloud.QcloudFileUtils;
@@ -15,7 +17,9 @@ import com.qs.mp.common.utils.http.HttpUtils;
 import com.qs.mp.core.domain.LoginUser;
 import com.qs.mp.framework.domain.WxAccount;
 import com.qs.mp.framework.security.handle.HostHolder;
+import com.qs.mp.framework.service.IAppTokenService;
 import com.qs.mp.framework.service.IWxAccountService;
+import com.qs.mp.framework.web.service.SysLoginService;
 import com.qs.mp.system.domain.SysUser;
 import com.qs.mp.system.domain.vo.WxLoginParams;
 import com.qs.mp.system.service.ISysUserService;
@@ -60,10 +64,15 @@ public class UserController extends BaseApiController {
   @Autowired
   private IWxAccountService wxAccountService;
 
-  @Value("${wx.appId}")
-  private String appId;
-  @Value("${wx.appSecret}")
-  private String appSecret;
+  @Value("${wx-channel.appId}")
+  private String channelAppId;
+  @Value("${wx-channel.appSecret}")
+  private String channelAppSecret;
+
+  @Value("${wx-user.appId}")
+  private String userAppId;
+  @Value("${wx-user.appSecret}")
+  private String userAppSecret;
 
   /**
    * 文件上传路径
@@ -77,12 +86,24 @@ public class UserController extends BaseApiController {
   @Value("${cloud.public-bucket-name}")
   private String publicBucketName;
 
+  @Autowired
+  private IAppTokenService appTokenService;
+
+  @Autowired
+  private SysLoginService sysLoginService;
+
 
   @RequestMapping(value = "/user/wxauth", method = RequestMethod.POST)
   @ResponseBody
   public AjaxResult wxauth(@RequestBody WxLoginParams wxLoginParams) {
+    String appId = channelAppId;
+    String appSecret = channelAppSecret;
+    if (wxLoginParams.getIdentity() == UserIdentityEnum.USER.ordinal()) {
+      appId = userAppId;
+      appSecret = userAppSecret;
+    }
     //调用微信后台接口获取openId
-    String res = wxLoginCheck(wxLoginParams, appSecret);
+    String res = wxLoginCheck(wxLoginParams, appId, appSecret);
     JSONObject jsonObject = JSONObject.parseObject(res);
     String openId = jsonObject.getString("openid");
     String sessionKey = jsonObject.getString("session_key");
@@ -96,7 +117,12 @@ public class UserController extends BaseApiController {
     LoginUser loginUser = hostHolder.getUser();
     SysUser user = new SysUser();
     user.setUserId(loginUser.getUserId());
-    user.setOpenId(openId);
+    if (wxLoginParams.getIdentity() == UserIdentityEnum.USER.ordinal()) {
+      user.setOpenId(openId);
+    } else {
+      user.setChannelOpenId(openId);
+    }
+
     user.setSessionKey(sessionKey);
     user.setUnionId(unionId);
     user.setLoginDate(new Date());
@@ -131,6 +157,49 @@ public class UserController extends BaseApiController {
     return success("微信授权成功");
   }
 
+
+  @RequestMapping(value = "/user/wxauth/mobile", method = RequestMethod.POST)
+  @ResponseBody
+  public AjaxResult wxauthMobile(@RequestBody WxLoginParams wxLoginParams) {
+    String appId = userAppId;
+    String appSecret = userAppSecret;
+    if (UserIdentityEnum.isChannel(UserIdentityEnum.valueOf(wxLoginParams.getIdentity()))) {
+      appId = channelAppId;
+      appSecret = channelAppSecret;
+    }
+    //调用微信后台接口获取openId
+    String res = getWxMobile(wxLoginParams, appId, appSecret);
+    JSONObject jsonObject = JSONObject.parseObject(res);
+    int errcode = jsonObject.getIntValue("errcode");
+    if (errcode != 0 ) {
+      LogUtil.error(logger, "手机号获取失败:" + res);
+      return error("手机号获取失败");
+    }
+    JSONObject phoneInfo = jsonObject.getJSONObject("phone_info");
+    String phoneNumber = phoneInfo.getString("phoneNumber");
+
+    if (StringUtils.isBlank(phoneNumber)) {
+      LogUtil.error(logger, "微信手机号不存在:" + res);
+      return error("手机号获取失败");
+    }
+    AjaxResult ajax = AjaxResult.success();
+
+    SysUser sysUser = sysUserService.selectUserByUserName(phoneNumber);
+    if (null == sysUser) {
+      if (wxLoginParams.getIdentity() != UserIdentityEnum.USER.ordinal()) {
+        return error("用户不存在,请联系客服");
+      }
+      // C端直接注册新用户
+      sysUser = new SysUser();
+      sysUser.setUserName(phoneNumber);
+      sysUser.setNickName(phoneNumber);
+      sysUserService.registerUser(sysUser);
+    }
+    String token = sysLoginService.wxAuthLogin(phoneNumber, wxLoginParams.getIdentity());
+    ajax.put(Constants.TOKEN, token);
+    return ajax;
+  }
+
   /**
    * 重置密码
    */
@@ -162,6 +231,8 @@ public class UserController extends BaseApiController {
     jsonObject.put("userName", loginUser.getUsername());
     jsonObject.put("avatar", loginUser.getUser().getAvatar());
     jsonObject.put("nickName", loginUser.getUser().getNickName());
+    jsonObject.put("openId", loginUser.getUser().getOpenId());
+    jsonObject.put("channelOpenId", loginUser.getUser().getChannelOpenId());
     JSONArray roleKeys = new JSONArray();
     JSONArray roles = new JSONArray();
     loginUser.getUser().getRoles().forEach(sysRole -> roles.add(sysRole.getRoleName()));
@@ -179,13 +250,38 @@ public class UserController extends BaseApiController {
    * @param
    * @return
    */
-  private String wxLoginCheck(WxLoginParams params, String appSecret) {
+  private String wxLoginCheck(WxLoginParams params, String appId, String appSecret) {
     String param = "appid=" + appId + "&secret=" + appSecret + "&js_code=" + params.getCode()
         + "&grant_type=authorization_code";
     String res = HttpUtils.sendGet("https://api.weixin.qq.com/sns/jscode2session", param);
     return res;
   }
 
+  /**
+   * code 换取 手机号
+   *{
+   *     "errcode":0,
+   *     "errmsg":"ok",
+   *     "phone_info": {
+   *         "phoneNumber":"xxxxxx",
+   *         "purePhoneNumber": "xxxxxx",
+   *         "countryCode": 86,
+   *         "watermark": {
+   *             "timestamp": 1637744274,
+   *             "appid": "xxxx"
+   *         }
+   *     }
+   * }
+   * @param
+   * @return
+   */
+  private String getWxMobile(WxLoginParams params, String appId, String appSecret) {
+    String accessToken = appTokenService.getAccessToken(appId);
+    String param = "access_token=" + accessToken + "&code=" + params.getCode();
+    String res = HttpUtils.sendPost("https://api.weixin.qq.com/wxa/business/getuserphonenumber", param);
+    return res;
+  }
+
   /**
    * { "subscribe": 1, "openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M", "nickname": "Band", "sex": 1,
    * "language": "zh_CN", "city": "广州", "province": "广东", "country": "中国", "headimgurl":
@@ -204,22 +300,6 @@ public class UserController extends BaseApiController {
     return res;
   }
 
-  /**
-   * {"access_token":"ACCESS_TOKEN","expires_in":7200}
-   *
-   * @param appId
-   * @param appSecret
-   * @return
-   */
-  private String wxGetAccessToken(String appId, String appSecret) {
-    String param = "appid=" + appId + "&secret=" + appSecret + "&grant_type=client_credential";
-    String res = HttpUtils.sendGet("https://api.weixin.qq.com/cgi-bin/token", param);
-    JSONObject tokenJson = JSONObject.parseObject(res);
-    String token = tokenJson.getString("access_token");
-    return token;
-
-  }
-
   private JSONObject saveHeadImage(String serverUrl,String userId) throws Exception {
     String outFilePath = filePath+"/headImage";
     File outPath = new File(outFilePath);

+ 1 - 1
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketController.java

@@ -52,7 +52,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 @RestController
 @RequestMapping("/api/v1/mp/user")
-@Api(tags = "渠道盲票商城接口")
+@Api(tags = "盲票商城接口")
 @AllArgsConstructor
 public class UserTicketController extends BaseApiController {
 

+ 250 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketOrderController.java

@@ -0,0 +1,250 @@
+/*
+ * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
+ *
+ * https://www.mall4j.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.qs.mp.web.controller.api.user;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.Ticket;
+import com.qs.mp.admin.domain.TicketAwardsPrize;
+import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.param.TicketBoxParam;
+import com.qs.mp.admin.domain.param.TicketParam;
+import com.qs.mp.admin.domain.vo.TicketBoxListVO;
+import com.qs.mp.admin.domain.vo.TicketBoxVO;
+import com.qs.mp.admin.domain.vo.TicketVO;
+import com.qs.mp.admin.service.ITicketAwardsPrizeService;
+import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.admin.service.ITicketService;
+import com.qs.mp.channel.domain.ChannelAddr;
+import com.qs.mp.channel.domain.ChannelCart;
+import com.qs.mp.channel.domain.param.ChannelOrderParam;
+import com.qs.mp.channel.domain.vo.ChannelCartVO;
+import com.qs.mp.channel.domain.vo.ChannelOrderSettleVO;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.page.TableDataInfo;
+import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.common.enums.TicketBoxStatusEnum;
+import com.qs.mp.common.enums.TicketStatusEnum;
+import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.user.domain.UserTicketOrderItem;
+import com.qs.mp.user.service.IUserHitPrizeService;
+import com.qs.mp.user.service.IUserTicketOrderItemService;
+import com.qs.mp.utils.SecurityUtils;
+import com.qs.mp.web.controller.common.BaseApiController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import javax.validation.Valid;
+import lombok.AllArgsConstructor;
+import ma.glasnost.orika.MapperFacade;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+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
+@RequestMapping("/api/v1/mp/user/ticket")
+@Api(tags = "用户端购买盲票接口")
+@AllArgsConstructor
+public class UserTicketOrderController extends BaseApiController {
+
+
+  @Autowired
+  private ITicketBoxService ticketBoxService;
+
+  @Autowired
+  private ITicketAwardsPrizeService ticketAwardsPrizeService;
+
+  @Autowired
+  private ITicketService ticketService;
+
+  @Autowired
+  private IUserTicketOrderItemService userTicketOrderItemService;
+
+  @Autowired
+  private IUserHitPrizeService userHitPrizeService;
+
+  @Autowired
+  private MapperFacade mapperFacade;
+
+
+  /**
+   * 订单结算,每次更换优惠券时需重新请求此接口
+   */
+  @PostMapping("/order/settle")
+  @ApiOperation(value = "订单结算" , notes = "购物车里点结算或者单个盲票组商品上点立即购买")
+  public AjaxResult settle(@Valid @RequestBody ChannelOrderParam param) {
+    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+
+    ChannelOrderSettleVO orderSettleVO = new ChannelOrderSettleVO();
+/*
+    // 收货地址,如果用户选了地址,则此处不做处理
+    if (null == param.getAddrId() || 0 == param.getAddrId()) {
+      //读取默认地址
+      ChannelAddr addr = channelAddrService.getDefaultChannelAddr(channelId);
+      if (null != addr) {
+        orderSettleVO.setAddr(addr);
+      }
+    }
+
+    // 订单金额计算
+    Integer orderAmt = 0;
+    Integer pkgNum = 0;
+    if (!CollectionUtils.isEmpty(param.getCartIds())){
+      // 购物车里下单的
+      List<ChannelCart> channelCarts = channelCartService.listByIds(param.getCartIds());
+      for (ChannelCart channelCart : channelCarts) {
+        TicketBox ticketBox = ticketBoxService.getById(channelCart.getBoxId());
+        orderAmt += ticketBox.getPkgSalePrice() * channelCart.getOrderNum();
+        ChannelCartVO cartVO = mapperFacade.map(ticketBox, ChannelCartVO.class);
+        cartVO.setCartId(channelCart.getCartId());
+        cartVO.setOrderNum(channelCart.getOrderNum());
+        orderSettleVO.getItems().add(cartVO);
+        pkgNum += channelCart.getOrderNum();
+      }
+    } else {
+      TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
+      orderAmt += ticketBox.getPkgSalePrice() * param.getOrderNum();
+      ChannelCartVO cartVO = mapperFacade.map(ticketBox, ChannelCartVO.class);
+      cartVO.setOrderNum(param.getOrderNum());
+      orderSettleVO.getItems().add(cartVO);
+      pkgNum += param.getOrderNum();
+    }
+    orderSettleVO.setOrderAmt(orderAmt);
+    // 当前没有运费和优惠,实付金额=订单金额
+    orderSettleVO.setPayAmt(orderAmt);
+    orderSettleVO.setPkgNum(pkgNum);
+
+    // 缓存订单结算对象
+    redisCache.setCacheObject(CHANNEL_ORDER_CACHE_KEY + channelId, orderSettleVO, 10, TimeUnit.MINUTES);*/
+    return AjaxResult.success(orderSettleVO);
+  }
+
+
+  /**
+   * 查看盲票详情
+   */
+  @PostMapping("/mall/ticket/detail")
+  @ApiOperation(value = "查看盲票详情" , notes = "根据盲票组ID,获取盲票信息")
+  public AjaxResult getInfo(@RequestBody TicketBoxParam param) {
+    if (StringUtils.isBlank(param.getBoxId())) {
+      return AjaxResult.error("参数异常,盲票组ID缺失");
+    }
+    TicketBox ticketBox = ticketBoxService.getById(param.getBoxId());
+    TicketBoxVO ticketBoxVO = mapperFacade.map(ticketBox, TicketBoxVO.class);
+    ticketBoxVO.setPrizeList(ticketAwardsPrizeService.listPrizeVO(new QueryWrapper<TicketAwardsPrize>()
+        .eq("t1.box_id", ticketBox.getBoxId()).orderByAsc("t1.sort").orderByDesc("t2.value")));
+    return AjaxResult.success(ticketBoxVO);
+  }
+
+  /**
+   * 扫码查看盲票幸运数字
+   */
+  @PostMapping("/ticket/queryLuckyNum")
+  @ApiOperation(value = "查看盲票幸运数字" , notes = "根据盲票组ID,获取盲票幸运数字")
+  public AjaxResult queryLuckyNum(@RequestBody TicketParam param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    if (StringUtils.isBlank(param.getTicketId())) {
+      return AjaxResult.error("参数异常,盲票ID缺失");
+    }
+
+    Ticket ticket = ticketService.getById(param.getTicketId());
+    if (null == ticket) {
+      return AjaxResult.error("参数异常,盲票不存在");
+    }
+
+    if (ticket.getStatus() == TicketStatusEnum.CASHED) {
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
+    }
+
+    // 已付款的盲票,需要校验当前用户是否有权限查看
+    if (ticket.getStatus() == TicketStatusEnum.ACTIVATED) {
+      UserTicketOrderItem orderItem = userTicketOrderItemService.queryFinishedOrderItem(userId, param.getTicketId());
+      if (null == orderItem) {
+        return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1018);
+      }
+    }
+
+    TicketBox ticketBox = ticketBoxService.getById(ticket.getBoxId());
+
+    TicketVO ticketVO = new TicketVO();
+    ticketVO.setPrizeList(ticketAwardsPrizeService.listPrizeVO(new QueryWrapper<TicketAwardsPrize>()
+        .eq("t1.box_id", ticketBox.getBoxId()).orderByAsc("t1.sort").orderByDesc("t2.value")));
+    ticketVO.setTicketId(ticket.getTicketId());
+    ticketVO.setBoxId(ticket.getBoxId());
+    ticketVO.setTitle(ticketBox.getTitle());
+    ticketVO.setSerialNo(ticket.getSerialNo());
+    ticketVO.setFacePrice(ticket.getFacePrice());
+    ticketVO.setSalePrice(ticketBox.getSalePrice());
+    ticketVO.setPlainLuckyNum(ticket.getPlainLuckyNum());
+    ticketVO.setStatus(ticket.getStatus().getValue());
+
+    return AjaxResult.success(ticketVO);
+  }
+
+  /**
+   * 查看能兑奖的奖品
+   */
+  @PostMapping("/ticket/queryHitPrizeList")
+  @ApiOperation(value = "查看兑奖奖品" , notes = "根据盲票ID,查看兑奖奖品")
+  public AjaxResult queryHitPrizeList(@RequestBody TicketParam param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    if (StringUtils.isBlank(param.getTicketId())) {
+      return AjaxResult.error("参数异常,盲票ID缺失");
+    }
+
+    Ticket ticket = ticketService.getById(param.getTicketId());
+    if (null == ticket) {
+      return AjaxResult.error("参数异常,盲票不存在");
+    }
+    if (ticket.getStatus() == TicketStatusEnum.CASHED) {
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
+    }
+    if (ticket.getStatus() != TicketStatusEnum.ACTIVATED) {
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1019);
+    }
+
+    List<TicketAwardsPrize> ticketAwardsPrizes = userHitPrizeService.listPrize(ticket, userId);
+    return AjaxResult.success(ticketAwardsPrizes);
+  }
+
+  /**
+   * 兑奖
+   */
+  @PostMapping("/ticket/cashPrize")
+  @ApiOperation(value = "兑奖" , notes = "选择奖品兑奖")
+  public AjaxResult cashPrize(@RequestBody TicketParam param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    if (StringUtils.isBlank(param.getTicketId()) || StringUtils.isBlank(param.getAwardsId())
+    || StringUtils.isBlank(param.getPrizeId())) {
+      return AjaxResult.error("参数缺失");
+    }
+
+    Ticket ticket = ticketService.getById(param.getTicketId());
+    if (null == ticket) {
+      return AjaxResult.error("参数异常,盲票不存在");
+    }
+    if (ticket.getStatus() == TicketStatusEnum.CASHED) {
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1017);
+    }
+    if (ticket.getStatus() != TicketStatusEnum.ACTIVATED) {
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1019);
+    }
+
+    userHitPrizeService.cashPrize(ticket, userId, param.getAwardsId(), param.getPrizeId());
+    return AjaxResult.success();
+  }
+
+}

+ 6 - 2
mp-admin/src/main/resources/application.yml

@@ -123,10 +123,14 @@ cloud:
   #private-bucket-name: ygp-auth
 
 
-#小程序appid和密钥
-wx:
+#渠道端小程序appid和密钥
+wx-channel:
   appId: wxc3a684f1196f6e15
   appSecret: 7708655ba65f04de2a42f23d20ab4134
+#渠道端小程序appid和密钥
+wx-user:
+  appId: wx8533800e393dbd6b
+  appSecret: f7a104e09d6c2e55445be2a45c4ab551
 #公众号appid
 wxgzh:
   appId: wxfe9785e665c741a2

+ 3 - 1
mp-common/src/main/java/com/qs/mp/common/enums/UserIdentityEnum.java

@@ -9,7 +9,9 @@ package com.qs.mp.common.enums;
 public enum UserIdentityEnum {
 
 	CHANNEL, // 代理渠道
-	SALESITE // 经销商
+	SALESITE, // 经销商
+	USER, // 用户
+	ADMIN // 管理后台
 	;
 	public static boolean isChannel(UserIdentityEnum identity) {
 		return identity == CHANNEL || identity == SALESITE;

+ 2 - 1
mp-framework/src/main/java/com/qs/mp/framework/config/SecurityConfig.java

@@ -106,7 +106,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                     "/captchaImage",
                     "/auth/mobile",
                     "/wxlogin",
-                    "/api/v1/mp/sms/sendSmsCode").anonymous()
+                    "/api/v1/mp/sms/sendSmsCode",
+                    "/api/v1/mp/user/wxauth/mobile").anonymous()
                 .antMatchers(
                         HttpMethod.GET,
                         "/",

+ 19 - 0
mp-framework/src/main/java/com/qs/mp/framework/web/service/SysLoginService.java

@@ -30,6 +30,7 @@ import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
+import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.stereotype.Component;
 
 /**
@@ -61,6 +62,9 @@ public class SysLoginService
     @Autowired
     private IChannelService channelService;
 
+    @Autowired
+    private UserDetailsService userDetailsService;
+
     /**
      * 登录验证
      *
@@ -117,6 +121,21 @@ public class SysLoginService
         return tokenService.createToken(loginUser);
     }
 
+    public String wxAuthLogin(String username, int identity)
+    {
+        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
+        LoginUser loginUser = (LoginUser) userDetailsService.loadUserByUsername(username);
+        recordLoginInfo(loginUser.getUser());
+
+        loginUser.setIdentity(UserIdentityEnum.valueOf(identity));
+        if (!loginUser.getUsername().equals("admin") && UserIdentityEnum.isChannel(loginUser.getIdentity())) {
+            fillChannelInfo(loginUser);
+        }
+
+        // 生成token
+        return tokenService.createToken(loginUser);
+    }
+
     /**
      * 登录验证
      *

+ 6 - 3
mp-service/src/main/java/com/qs/mp/framework/service/impl/WxSubscribeMessageImpl.java

@@ -31,8 +31,11 @@ public class WxSubscribeMessageImpl implements IWxSubscribeMessage {
   @Autowired
   private IAppTokenService appTokenService;
 
-  @Value("${wx.appId}")
-  private String appId;
+  @Value("${wx-channel.appId}")
+  private String channelAppId;
+
+  @Value("${wx-user.appId}")
+  private String userAppId;
 
   @Value("${miniprogram.state}")
   private String state;
@@ -40,7 +43,7 @@ public class WxSubscribeMessageImpl implements IWxSubscribeMessage {
 
   private boolean sendNotify(Long userId, String bizId, WxSubscribeMessage message) {
     // 获取access_token
-    String accessToken = appTokenService.getAccessToken(appId);
+    String accessToken = appTokenService.getAccessToken(channelAppId);
     String res = HttpUtils.sendPost(
         "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + accessToken,
         JSON.toJSONString(message));

+ 0 - 3
mp-service/src/main/java/com/qs/mp/framework/service/impl/WxTemplateMessageImpl.java

@@ -36,9 +36,6 @@ public class WxTemplateMessageImpl implements IWxTemplateMessage {
   @Value("${wxgzh.appId}")
   private String gzhAppId;
 
-  @Value("${wx.appId}")
-  private String appId;
-
   private boolean sendNotify(Long userId, String bizId, WxTemplateMessage message, String msg) {
     // 获取access_token
     String accessToken = appTokenService.getAccessToken(gzhAppId);

+ 3 - 3
mp-service/src/main/java/com/qs/mp/framework/service/impl/WxUrlLinkServiceImpl.java

@@ -28,8 +28,8 @@ public class WxUrlLinkServiceImpl implements IWxUrlLinkService {
   @Autowired
   private IAppTokenService appTokenService;
 
-  @Value("${wx.appId}")
-  private String appId;
+  @Value("${wx-channel.appId}")
+  private String channelAppId;
 
   @Override
   public String generate(String path, String query) {
@@ -43,7 +43,7 @@ public class WxUrlLinkServiceImpl implements IWxUrlLinkService {
     param.put("expire_interval", 30);
     // 云管铺小程序永久短链接https://wxaurl.cn/YL8D48CQbMr
     // 获取access_token
-    String accessToken = appTokenService.getAccessToken(appId);
+    String accessToken = appTokenService.getAccessToken(channelAppId);
     String res = HttpUtils.sendPost(
         "https://api.weixin.qq.com/wxa/generate_urllink?access_token=" + accessToken,
         JSON.toJSONString(param));

+ 10 - 4
mp-service/src/main/java/com/qs/mp/pay/service/impl/WalletServiceImpl.java

@@ -47,8 +47,10 @@ public class WalletServiceImpl implements IWalletService {
   private String callbackUrl;  //支付回调地址
   @Value("${pay.base.url}")
   private String baseUrl = "https://jlpays.kakapaypay.com/";
-  @Value("${wx.appId}")
-  private String appId = "wxb86cb7f459fc3675";
+  @Value("${wx-channel.appId}")
+  private String channelAppId;
+  @Value("${wx-user.appId}")
+  private String userAppId;
 
   @Value("${pay.shopNo}")
   private String payShopNo;  //平台商户号
@@ -62,7 +64,11 @@ public class WalletServiceImpl implements IWalletService {
   @Override
   public JSONObject pay(BizTypeEnum bizType, String bizId, String openId, int money) {
     String reqUrl = baseUrl + "/pay/payMoneyCTB";
-    JSONObject params = buildPayOrderReqData(payShopNo, paySign, money, openId);
+    String appId = channelAppId;
+    if (bizType == BizTypeEnum.USER_ORDER) {
+      appId = userAppId;
+    }
+    JSONObject params = buildPayOrderReqData(payShopNo, paySign, money, openId, appId);
     String result = OkHttpUtil.postJsonParams(reqUrl, params.toJSONString());
     logger.info("request params:" + params.toJSONString() + "  result:" + result);
     if (StringUtils.isBlank(result)) {
@@ -143,7 +149,7 @@ public class WalletServiceImpl implements IWalletService {
     return payOrder;
   }
 
-  private JSONObject buildPayOrderReqData(String shopNo, String sign, int money, String openId) {
+  private JSONObject buildPayOrderReqData(String shopNo, String sign, int money, String openId, String appId) {
 
     JSONObject sendData = new JSONObject();
     sendData.put("shop_no" , shopNo);

+ 12 - 3
mp-service/src/main/java/com/qs/mp/system/domain/SysUser.java

@@ -17,7 +17,7 @@ import org.apache.commons.lang3.builder.ToStringStyle;
 
 /**
  * 用户对象 sys_user
- * 
+ *
  * @author ygp
  */
 public class SysUser extends BaseEntity
@@ -96,7 +96,8 @@ public class SysUser extends BaseEntity
     private Long roleId;
 
     private String gzhOpenId; // 关注公众号的openid
-    private String openId;   //绑定微信openId
+    private String openId;   //绑定微信用户端小程序openId
+    private String channelOpenId;   //绑定微信渠道端小程序openId
     private String unionId;  //用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台帐号下会返回
     private String sessionKey; //会话密钥
 
@@ -116,6 +117,14 @@ public class SysUser extends BaseEntity
         return openId;
     }
 
+    public String getChannelOpenId() {
+        return channelOpenId;
+    }
+
+    public void setChannelOpenId(String channelOpenId) {
+        this.channelOpenId = channelOpenId;
+    }
+
     public String getUnionId() {
         return unionId;
     }
@@ -375,7 +384,7 @@ public class SysUser extends BaseEntity
             .append("dept", getDept())
             .toString();
     }
-    
+
     public static void main(String[] args) {
     	String mobile = "15112682435";
     	String ss = mobile.length()>6?mobile.substring(mobile.length()-6):mobile;

+ 7 - 25
mp-service/src/main/java/com/qs/mp/system/domain/vo/WxLoginParams.java

@@ -1,38 +1,20 @@
 package com.qs.mp.system.domain.vo;
 
+import lombok.Data;
+
 /**
  * @author duota
  *
  */
+@Data
 public class WxLoginParams {
 
     private String code;   //微信返回code,用于服务端换取鉴权信息
     private String nickName;
     private String avatarUrl;
-
-
-    public void setNickName(String nickName) {
-        this.nickName = nickName;
-    }
-
-    public void setAvatarUrl(String avatarUrl) {
-        this.avatarUrl = avatarUrl;
-    }
-
-    public String getNickName() {
-        return nickName;
-    }
-
-    public String getAvatarUrl() {
-        return avatarUrl;
-    }
-
-    public String getCode() {
-        return code;
-    }
-
-    public void setCode(String code) {
-        this.code = code;
-    }
+    /**
+     * 登录身份
+     */
+    private int identity = 2;
 
 }

+ 26 - 0
mp-service/src/main/java/com/qs/mp/user/domain/param/TicketOrderParam.java

@@ -0,0 +1,26 @@
+package com.qs.mp.user.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.List;
+import lombok.Data;
+
+@ApiModel(value= "订单参数")
+@Data
+public class TicketOrderParam {
+
+	@ApiModelProperty(value = "优惠券IDs",required=false)
+	private List<String> couponIds;
+
+	@ApiModelProperty(value = "盲票组ID",required=false)
+	private String boxId;
+
+	@ApiModelProperty(value = "购买数量",required=false)
+	private Integer orderNum;
+
+	@ApiModelProperty(value = "盲票ID",required=false)
+	private String ticketId;
+
+	@ApiModelProperty(value = "系统自动选择优惠券,1代表系统自动选择,忽略couponIds,首次请求时传1;0代表以传入的couponIds为准",required=false)
+	private Integer autoCoupon;
+}

+ 63 - 0
mp-service/src/main/java/com/qs/mp/user/domain/vo/TicketOrderSettleVO.java

@@ -0,0 +1,63 @@
+package com.qs.mp.user.domain.vo;
+
+import com.qs.mp.admin.domain.Coupon;
+import com.qs.mp.channel.domain.ChannelAddr;
+import com.qs.mp.channel.domain.vo.ChannelCartVO;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.ArrayList;
+import java.util.List;
+import lombok.Data;
+
+/**
+ * @author zhongcp
+ * @Date 2022/3/3
+ */
+@Data
+public class TicketOrderSettleVO {
+
+  /**
+   * 订单金额
+   */
+  private Integer orderAmt = 0;
+
+  /**
+   * 优惠金额
+   */
+  private Integer discountAmt = 0;
+
+  /**
+   * 实付金额
+   */
+  private Integer payAmt = 0;
+
+  /**
+   * 票组ID
+   */
+  private String boxId;
+
+  /**
+   * 订购数量
+   */
+  private Integer orderNum;
+
+  /**
+   * 盲票ID
+   */
+  private String ticketId;
+
+  /**
+   * 盲票图片
+   */
+  private String picUrl;
+
+  /**
+   * 盲票标题
+   */
+  private String title;
+
+  /**
+   * 使用优惠券列表
+   */
+  List<Coupon> couponList;
+
+}

+ 22 - 20
mp-service/src/main/resources/mapper/system/SysUserMapper.xml

@@ -25,13 +25,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="remark"       column="remark"       />
 		<result property="gzhOpenId"       column="gzh_open_id"       />
 		<result property="openId"       column="open_id"       />
+		<result property="channelOpenId"       column="channel_open_id"       />
 		<result property="unionId"       column="union_id"       />
 		<result property="sessionKey"       column="session_key"       />
 
 		<association property="dept"    column="dept_id" javaType="com.qs.mp.system.domain.SysDept" resultMap="deptResult" />
 		<collection  property="roles"   javaType="java.util.List"        resultMap="RoleResult" />
 	</resultMap>
-	
+
 	<resultMap id="deptResult" type="com.qs.mp.system.domain.SysDept">
 		<id     property="deptId"   column="dept_id"     />
 		<result property="parentId" column="parent_id"   />
@@ -40,7 +41,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="leader"   column="leader"      />
 		<result property="status"   column="dept_status" />
 	</resultMap>
-	
+
 	<resultMap id="RoleResult" type="com.qs.mp.system.domain.SysRole">
 		<id     property="roleId"       column="role_id"        />
 		<result property="roleName"     column="role_name"      />
@@ -49,17 +50,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="dataScope"     column="data_scope"    />
 		<result property="status"       column="role_status"    />
 	</resultMap>
-	
+
 	<sql id="selectUserVo">
-        select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, 
-        u.gzh_open_id,u.open_id,u.union_id,u.session_key,d.dept_id, d.parent_id, d.dept_name, d.order_num, d.leader, d.status as dept_status,
+        select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
+        u.gzh_open_id,u.open_id,u.channel_open_id,u.union_id,u.session_key,d.dept_id, d.parent_id, d.dept_name, d.order_num, d.leader, d.status as dept_status,
         r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
         from sys_user u
 		    left join sys_dept d on u.dept_id = d.dept_id
 		    left join sys_user_role ur on u.user_id = ur.user_id
 		    left join sys_role r on r.role_id = ur.role_id
     </sql>
-    
+
     <select id="selectUserList" parameterType="com.qs.mp.system.domain.SysUser" resultMap="SysUserResult">
 		select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader from sys_user u
 		left join sys_dept d on u.dept_id = d.dept_id
@@ -88,7 +89,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<!-- 数据范围过滤 -->
 		${params.dataScope}
 	</select>
-	
+
 	<select id="selectAllocatedList" parameterType="com.qs.mp.system.domain.SysUser" resultMap="SysUserResult">
 	    select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
 	    from sys_user u
@@ -105,7 +106,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<!-- 数据范围过滤 -->
 		${params.dataScope}
 	</select>
-	
+
 	<select id="selectUnallocatedList" parameterType="com.qs.mp.system.domain.SysUser" resultMap="SysUserResult">
 	    select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
 	    from sys_user u
@@ -132,7 +133,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	    <include refid="selectUserVo"/>
 		where u.user_name = #{userName} and u.del_flag = '0'
 	</select>
-	
+
 	<select id="selectUserById" parameterType="Long" resultMap="SysUserResult">
 		<include refid="selectUserVo"/>
 		where u.user_id = #{userId}
@@ -141,15 +142,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	<select id="checkUserNameUnique" parameterType="String" resultType="int">
 		select count(1) from sys_user where user_name = #{userName} and del_flag = '0' limit 1
 	</select>
-	
+
 	<select id="checkPhoneUnique" parameterType="String" resultMap="SysUserResult">
 		select user_id, phonenumber from sys_user where phonenumber = #{phonenumber} and del_flag = '0' limit 1
 	</select>
-	
+
 	<select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
 		select user_id, email from sys_user where email = #{email} and del_flag = '0' limit 1
 	</select>
-	
+
 	<insert id="insertUser" parameterType="com.qs.mp.system.domain.SysUser" useGeneratedKeys="true" keyProperty="userId">
  		insert into sys_user(
  			<if test="userId != null and userId != 0">user_id,</if>
@@ -181,7 +182,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			sysdate()
  		)
 	</insert>
-	
+
 	<update id="updateUser" parameterType="com.qs.mp.system.domain.SysUser">
  		update sys_user
  		<set>
@@ -200,6 +201,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="remark != null">remark = #{remark},</if>
 			<if test="gzhOpenId != null">gzh_open_id = #{gzhOpenId},</if>
 			<if test="openId != null">open_id = #{openId},</if>
+			<if test="channelOpenId != null">channel_open_id = #{channelOpenId},</if>
 			<if test="unionId != null">union_id = #{unionId},</if>
 			<if test="sessionKey != null">session_key = #{sessionKey},</if>
  			update_time = sysdate()
@@ -214,24 +216,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	<update id="updateUserStatus" parameterType="com.qs.mp.system.domain.SysUser">
  		update sys_user set status = #{status} where user_id = #{userId}
 	</update>
-	
+
 	<update id="updateUserAvatar" parameterType="com.qs.mp.system.domain.SysUser">
  		update sys_user set avatar = #{avatar} where user_name = #{userName} and del_flag = '0'
 	</update>
-	
+
 	<update id="resetUserPwd" parameterType="com.qs.mp.system.domain.SysUser">
  		update sys_user set password = #{password} where user_name = #{userName} and del_flag = '0'
 	</update>
-	
+
 	<delete id="deleteUserById" parameterType="Long">
 		update sys_user set del_flag = '1' where user_id = #{userId}
  	</delete>
- 	
+
  	<delete id="deleteUserByIds" parameterType="Long">
  		update sys_user set del_flag = '1' where user_id in
  		<foreach collection="array" item="userId" open="(" separator="," close=")">
  			#{userId}
-        </foreach> 
+        </foreach>
  	</delete>
-	
-</mapper> 
+
+</mapper>