WxMiniController.java 13.4 KB
package com.w1hd.zzhnc.controller.wx;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.theyeasy.weixin.model.WxMiniSessionInfo;
import org.theyeasy.weixin.service.WxMiniService;
import org.theyeasy.weixin.util.WxMiniUtil;

import com.beust.jcommander.internal.Maps;
import com.w1hd.zzhnc.controller.pc.BaseController;
import com.w1hd.zzhnc.model.Activity;
import com.w1hd.zzhnc.model.Articles;
import com.w1hd.zzhnc.model.Banner;
import com.w1hd.zzhnc.model.Fans;
import com.w1hd.zzhnc.model.Goods;
import com.w1hd.zzhnc.model.Lotterylog;
import com.w1hd.zzhnc.model.Prize;
import com.w1hd.zzhnc.service.ActivityService;
import com.w1hd.zzhnc.service.ArticleService;
import com.w1hd.zzhnc.service.BannerService;
import com.w1hd.zzhnc.service.FansService;
import com.w1hd.zzhnc.service.GoodsService;
import com.w1hd.zzhnc.service.PrizeService;
import com.w1hd.zzhnc.util.PageResults;
import com.w1hd.zzhnc.util.RedisUtil;
import com.w1hd.zzhnc.vo.Vo_msg;
import com.wordnik.swagger.annotations.ApiOperation;

@Controller
@RequestMapping("/wxmini")
public class WxMiniController extends BaseController {

	public static final String PRIZE_KEY_TIME = RedisUtil.PROJECTNAME.concat("_").concat("PRIZE_KEY_TIME_");

	@Autowired
	FansService fansService;
	@Autowired
	WxMiniService wxMiniService;

	@Autowired
	ArticleService articleService;

	@Autowired
	ActivityService activityService;

	@Autowired
	PrizeService prizeService;

	@RequestMapping(value = "/wxmsg")
	public void WxMsg(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String signature = request.getParameter("signature");
		String timestamp = request.getParameter("timestamp");
		String nonce = request.getParameter("nonce");
		String echostr = request.getParameter("echostr");

		PrintWriter out = response.getWriter();
		if (!WxMiniUtil.checkSignature(signature, timestamp, nonce)) {
			out.print("sorry,该方法只处理微信推送的消息!");
			System.out.println("sorry,该方法只处理微信推送的消息!");
			out.close();
			return;

		}

		// 微信消息接入验证echostr
		if (null != echostr && echostr.length() > 0) {
			System.out.println("check ok,echostr=" + echostr);
			out.print(echostr);
			out.close();
			return;
		}

		// 处理用户发送来的消息
		WxMiniUtil wxMiniUtil = new WxMiniUtil();
		String responseMsg = wxMiniService.processRequest(request);
		if (null == response || responseMsg.length() <= 0)
			responseMsg = "success";

		// 响应微信服务器
		out.print(responseMsg);
		out.close();

		System.out.println("回复给微信的消息:" + responseMsg);

	}

	@RequestMapping(value = "/login", method = RequestMethod.GET) // 购房助手登录 double lng,double lat
	public @ResponseBody Vo_msg login(@RequestParam(value = "code") String code,
			@RequestParam(value = "shareId") Integer shareId, @RequestParam(value = "fansId") Integer fansId,
			@RequestParam(value = "nickname") String nickname, @RequestParam(value = "logo") String logo,
			@RequestParam(value = "lng") double lng, @RequestParam(value = "lat") double lat) {
		logger.info("小程序登录:code=" + code);
		// 取openid
		WxMiniSessionInfo sessionInfo = WxMiniUtil.jscode2session(code);
		// 添加粉丝记录
		Fans fans = fansService.addFans(sessionInfo, shareId, nickname, logo, lng, lat, fansId);
		if (fans != null) {
			Map<String, Object> map = new HashMap<>();
			map.put("miniOpenId", sessionInfo.getOpenid());
			map.put("fansId", fans.getId());
			return new Vo_msg(0, map);
		} else {
			return new Vo_msg(-1, "登录失败,服务器异常");
		}
	}

	// 获取小程序二维码码1
	@RequestMapping(value = "/getminicode1", method = RequestMethod.POST)
	public @ResponseBody Vo_msg getMiniCode1(String path, int width) {
		String result = WxMiniUtil.getMiniCode1(path, width, true, 0, 0, 0);
		return new Vo_msg(0, result);
	}

	// 获取小程序二维码码2
	@RequestMapping(value = "/getminicode2", method = RequestMethod.POST)
	public @ResponseBody Vo_msg getMiniCode2(String scene, String page, int width) {
		try {
			scene = URLEncoder.encode("lcc", "utf-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

		String result = WxMiniUtil.getMiniCode2(scene, page, width, true, 0, 0, 0);
		return new Vo_msg(0, result);
	}

	// 获取小程序二维码码1
	@RequestMapping(value = "/getminicode3", method = RequestMethod.POST)
	public @ResponseBody Vo_msg getMiniCode3(String path, int width) {
		String result = WxMiniUtil.getMiniCode3(path, width);
		return new Vo_msg(0, result);
	}

	// 强制刷新Token
	@RequestMapping(value = "/refresh_token", method = RequestMethod.POST)
	public @ResponseBody String refreshToken(String pwd) {
		if (!pwd.equals("nmdzpsmhs"))
			return "error pwd";
		return WxMiniUtil.refreshToken();
	}

	// 文章列表
	@RequestMapping(value = "/getArticlesList", method = RequestMethod.GET)
	@ResponseBody
	public Object getArticlesList(Integer page, Integer pagesize) {

		return new Vo_msg(0, articleService.getArticlesList(page, pagesize, "", null));
	}

	// 增加文章浏览数
	@RequestMapping(value = "/addArticleViewCount", method = RequestMethod.GET)
	@ResponseBody
	public Object addArticleViewCount(Integer id) {
		articleService.addArticleViewCount(id);
		return new Vo_msg(0, "ok");
	}

	// 获取
	@RequestMapping(value = "/getArticle", method = RequestMethod.GET)
	@ResponseBody
	public Object getArticle(Integer id) {
		Articles article = articleService.getArticle(id);
		if (article != null) {
			return new Vo_msg(0, article);
		} else {
			return new Vo_msg(-1, "获取失败,数据为空");
		}
	}

	// //用户隐藏了小程序时调用此接口,将会向用户发送一个小程序卡片,一天只发送一次。
	// @RequestMapping(value = "/leave")
	// @ResponseBody
	// public String leaveMini(@RequestParam(value = "fansId") Integer fansId) {
	// if (fansId<1) return "Failed: fansId < 1";
	//
	// Activity activitySetting = activityService.getActivitySetting();
	// if (activitySetting != null && activitySetting.getStatus() ==
	// ActivityStatus.进行中.getIndex() ) //抽奖活动进行中
	// {
	// Fans fans = fansDao.selectByPrimaryKey(fansId);
	// if (null==fans) return "Failed:fans is null";
	//
	// //一天最多发送一次
	// SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
	// Date last = fans.getLastSendProgram();
	// if(last!=null &&
	// fmt.format(last).equals(fmt.format(DateTime.now().toDate()))) return "faild:
	// allowed send one time everyday.";
	//
	// //发送小程序卡片
	// String media_id = RedisUtil.get("zzhnc_leave_program_media_id");
	// String thumb_url = RedisUtil.get("zzhnc_leave_program_thumb_url");
	//
	// if (null==media_id || media_id.length()<1 || null==thumb_url ||
	// thumb_url.length()<1)
	// {
	// //获取默认首页的海报
	// Example example = new Example(Postertemplet.class);
	// example.createCriteria().andEqualTo("postertype",
	// 2).andEqualTo("deleted",false);
	// java.util.List<Postertemplet> posterList =
	// postertempletDao.selectByExample(example);
	// if (posterList.size() < 1) return "failed: Postertemplet Img not exists!";
	// thumb_url = posterList.get(0).getImgurl();
	//
	// Vo_msg imgMsg = WxMiniUtil.uploadImage(thumb_url, false);
	// if (imgMsg.code==0)
	// {
	// media_id = imgMsg.data.toString();
	// RedisUtil.set("zzhnc_leave_program_media_id",media_id,60*60);
	// RedisUtil.set("zzhnc_leave_program_thumb_url",thumb_url,60*60);
	// }
	// else
	// {
	// return "failed: upload media img failed,errmsg=" + imgMsg.msg;
	// }
	// }
	//
	//
	// String result = WxMiniUtil.sendCustoMiniprogrampage(fans.getMiniopenid(),
	// "买房就找万小二","pages/openAnimation/openAnimation", thumb_url, media_id);
	// System.out.println("粉丝离开小程序时发送小程序卡片:" + result);
	// fans.setLastSendProgram(DateTime.now().toDate());
	// fansDao.updateByPrimaryKeySelective(fans);
	// return result;
	// }
	// return "ok";
	// }
	//
	// 清除小程序卡片的media_id的方法
	@RequestMapping(value = "/cleanProgramMedia", method = RequestMethod.GET)
	@ResponseBody
	public String cleanProgramMedia(@RequestParam(value = "code") String code) {
		if (!code.equals("nmdzpsmhs"))
			return "error pwd";
		RedisUtil.remove("zzhnc_leave_program_media_id");
		RedisUtil.remove("zzhnc_leave_program_thumb_url");
		return "ok";
	}

	@Autowired
	BannerService bannerService;

	@Autowired
	GoodsService goodsService;

	@RequestMapping(value = "/index", method = RequestMethod.GET)
	@ResponseBody
	public Object index(@RequestParam("openId") String openId) {
		try {
			Map<String, Object> result = Maps.newHashMap();
			List<Banner> bannerList = bannerService.getAll();
			List<Articles> homeData = articleService.getHomeData();
			List<Goods> homeData2 = goodsService.getHomeData();
			result.put("bannerList", bannerList);
			result.put("articlesList", homeData);
			result.put("goodsList", homeData2);
			return new Vo_msg(0, result);
		} catch (Exception e) {
			return new Vo_msg(-1, "系统繁忙");
		}
	}

	@RequestMapping(value = "/second", method = RequestMethod.GET)
	@ResponseBody
	public Object second(@RequestParam(value = "openId") String openId,
			@RequestParam(value = "key", defaultValue = "", required = false) String key,
			@RequestParam(value = "page", defaultValue = "1", required = false) Integer page,
			@RequestParam(value = "size", defaultValue = "20", required = false) Integer size) {
		try {
			Map<String, Object> result = Maps.newHashMap();
			List<Banner> bannerList = bannerService.getAll();
			PageResults<Goods> seacrh = goodsService.seacrh(null, key, null, page, size);
			List<Goods> rows = seacrh.getRows();
			result.put("banner", bannerList);
			result.put("data", rows);
			return new Vo_msg(0, result);
		} catch (Exception e) {
			return new Vo_msg(-1, "系统繁忙");
		}
	}

	/** 查看我的奖品 */
	@RequestMapping(value = "/prizes/my", method = RequestMethod.GET)
	@ResponseBody
	public Object prizes(@RequestParam(value = "openId") String openId) {
		Fans fans = fansService.getFansByMiniOpenid(openId);
		if (fans != null) {
			try {
				List<Lotterylog> list = prizeService.getMyLotteryLog(fans.getId());
				return new Vo_msg(0, list);
			} catch (Exception e) {
				e.printStackTrace();
			}

		}
		return new Vo_msg(0, null);

	}

	/** 中奖 */
	@RequestMapping(value = "/prizes/kill", method = RequestMethod.GET)
	@ResponseBody
	public Object prizesKill(@RequestParam(value = "openId") String openId) {
		Fans fans = fansService.getFansByMiniOpenid(openId);
		Integer logId = prizeService.randomKill(fans.getId(), 0);
		if (logId == 0) {
			return new Vo_msg(-1, null, "不好意思你没中奖");
		}
		if (logId == -1) {
			return new Vo_msg(-1, null, "你已经中过奖了");
		}
		Lotterylog log = prizeService.getLog(logId);
		return new Vo_msg(0, log);

	}

	/** 获取奖品列表 */
	@RequestMapping(value = "/prizes/all", method = RequestMethod.GET)
	@ResponseBody
	public Object prizesList(@RequestParam(value = "openId") String openId) {
		List<Prize> prizeList = activityService.getPrizeList();
		return prizeList;
	}

	@Autowired
	RedisTemplate<String, Long> redisTemplate;

	/** 核销奖品 */
	@ApiOperation( value = "二维码地址")
	@RequestMapping(value = "/prizes/sqr", method = RequestMethod.GET)
	@ResponseBody
	public Object scanQr() {
		long timeMillis = System.currentTimeMillis();
		redisTemplate.opsForValue().set(PRIZE_KEY_TIME + timeMillis, timeMillis);
		redisTemplate.expire(PRIZE_KEY_TIME + timeMillis, 300, TimeUnit.SECONDS);
		return timeMillis;
	}

	/** 核销奖品 */
	@RequestMapping(value = "/prizes/{id}", method = RequestMethod.GET)
	@ResponseBody
	public Object prizes(@RequestParam(value = "openId") String openId,
			@RequestParam(value = "timeMillis") Long timeMillis, @RequestParam(value = "localMillis") Long localMillis,
			@PathVariable(value = "id") Integer id) {
		Fans fans = fansService.getFansByMiniOpenid(openId);
		return prizeService.updateLotteryLog(id, fans.getId());
	}

	@RequestMapping(value = "/goods/{id}", method = RequestMethod.GET)
	@ResponseBody
	public Object goods(@RequestParam(value = "openId") String openId, @PathVariable(value = "id") Integer id) {
		PageResults<Goods> seacrh = goodsService.seacrh(id, null, null, null, null);
		return new Vo_msg(0, seacrh);
	}

	@RequestMapping(value = "/goods/share/{id}", method = RequestMethod.GET)
	@ResponseBody
	public Object goodsShare(@RequestParam(value = "openId") String openId, @PathVariable(value = "id") Integer id) {
		if (id > 0) {
			PageResults<Goods> seacrh = goodsService.seacrh(id, null, null, null, null);
			Goods goods = seacrh.getRows().get(0);
			goods.setShareCount(goods.getShareCount() + 1);
			goodsService.update(goods);
		}
		Fans fans = fansService.getFansByMiniOpenid(openId);
		fans.setShareCount(fans.getShareCount() + 1);
		fansService.updateFans(fans);
		return new Vo_msg(0, null);
	}

}