package com.yeshi.buwan.controller.api; import com.google.gson.*; import com.yeshi.buwan.domain.user.LoginUser; import com.yeshi.buwan.domain.vip.UserVIPInfo; import com.yeshi.buwan.domain.vip.VIPOrderRecord; import com.yeshi.buwan.domain.vip.VIPPrice; import com.yeshi.buwan.domain.vip.VIPPriceType; import com.yeshi.buwan.exception.vip.VIPException; import com.yeshi.buwan.service.inter.LoginUserService; import com.yeshi.buwan.service.inter.vip.VIPPriceService; import com.yeshi.buwan.service.inter.vip.VIPService; import com.yeshi.buwan.util.*; import com.yeshi.buwan.util.user.VipUtil; import com.yeshi.buwan.util.vip.VIPOrderUtil; import com.yeshi.buwan.vo.AcceptData; import com.yeshi.buwan.vo.client.user.UserInfoVO; import net.sf.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.yeshi.utils.annotation.RequestSerializableByKey; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Type; import java.util.List; import java.util.UUID; @Controller @RequestMapping("api/v2/vip") public class VIPController { Logger logger = LoggerFactory.getLogger(VIPController.class); @Resource private RedisManager redisManager; @Resource private VIPService vipService; @Resource private LoginUserService loginUserService; @Resource private VIPPriceService vipPriceService; @RequestMapping("getVIPPriceList") @ResponseBody public String getVIPPriceList(AcceptData acceptData, String loginUid) { Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().registerTypeAdapter(VIPPriceType.class, new JsonSerializer() { @Override public JsonElement serialize(VIPPriceType value, Type theType, JsonSerializationContext context) { if (value == null) { return new JsonPrimitive(""); } else { return new JsonPrimitive(value.getName()); } } }).create(); JSONObject root = new JSONObject(); if (!StringUtil.isNullOrEmpty(loginUid)) { LoginUser user = loginUserService.getLoginUser(loginUid); if (user == null) { return JsonUtilV2.loadFalseJson("用户不存在"); } UserVIPInfo vipInfo = vipService.getVIPInfo(loginUid); UserInfoVO userInfoVO = new UserInfoVO(); userInfoVO.setId(user.getId()); userInfoVO.setNickName(user.getName()); userInfoVO.setPortrait(user.getPortrait()); if (vipInfo != null && vipInfo.getExpireDate() != null) userInfoVO.setVipExpireTime(vipInfo.getExpireDate().getTime()); root.put("user", new Gson().toJson(userInfoVO)); } List vipPriceList = vipPriceService.listValidPrice(); root.put("list", gson.toJson(vipPriceList)); return JsonUtilV2.loadTrueJson(root.toString()); } /** * 生成订单 * * @param acceptData * @param loginUid * @return */ @RequestMapping("createOrder") @ResponseBody public String createOrder(AcceptData acceptData, HttpServletRequest request, String loginUid, String priceId, int payWay) { if (StringUtil.isNullOrEmpty(loginUid)) { return JsonUtilV2.loadFalseJson("用户未登录"); } LoginUser user = loginUserService.getLoginUser(loginUid); if (user == null) { return JsonUtilV2.loadFalseJson("用户不存在"); } if (StringUtil.isNullOrEmpty(user.getPhone())) { return JsonUtilV2.loadFalseJson(10001, "请绑定电话号码"); } String ip = IPUtil.getRemotIP(request); VIPPrice vipPrice = vipPriceService.selectByPrimaryKey(priceId); if (vipPrice == null) { return JsonUtilV2.loadFalseJson("套餐不存在"); } VIPOrderRecord record = new VIPOrderRecord(); record.setUid(loginUid); record.setType(vipPrice.getType()); record.setMoney(vipPrice.getPrice()); record.setPayWay(payWay); record.setState(VIPOrderRecord.STATE_NOT_PAY); try { vipService.addVIPRecord(record); } catch (VIPException e) { logger.error("生成订单出错", e); return JsonUtilV2.loadFalseJson("生成订单出错"); } String orderNo = VIPOrderUtil.getOutOrderNo(record.getId()); switch (payWay) { case VIPOrderRecord .PAY_WAY_ALIPAY: { //生成支付宝支付订单 String form = VipUtil.getVipChargeAlipayForm(record.getId(), orderNo, record.getMoney()); //暂存2分钟 String id = StringUtil.Md5(UUID.randomUUID().toString() + "#" + System.currentTimeMillis()); redisManager.cacheCommonString(id, form, 120); org.json.JSONObject data = new org.json.JSONObject(); data.put("payUrl", Constant.HOST + "/BuWan/alipay/printPayForm?formId=" + id); data.put("payWay", payWay); return JsonUtilV2.loadTrueJson(data.toString()); } case VIPOrderRecord .PAY_WAY_WX: { //生成微信支付订单 try { String payUrl = VipUtil.createWXOrder(record.getId(), ip, orderNo, vipPrice.getPrice(), "影视大全VIP-" + vipPrice.getType().getName()); org.json.JSONObject data = new org.json.JSONObject(); data.put("payUrl", payUrl); data.put("payWay", payWay); return JsonUtilV2.loadTrueJson(data.toString()); } catch (Exception e) { logger.error("生成微信支付订单出错", e); return JsonUtilV2.loadFalseJson("生成微信支付订单出错"); } } } return JsonUtilV2.loadFalseJson("请选择支付方式"); } /** * 检查是否支付 * * @param acceptData * @param loginUid * @param id * @return */ @RequestMapping("checkPay") @ResponseBody @RequestSerializableByKey(key = "'vip-checkPay-'+#id") public String checkPay(AcceptData acceptData, String loginUid, String id) { VIPOrderRecord record = vipService.getOrderRecord(id); if (record == null || !record.getUid().equalsIgnoreCase(loginUid)) { return JsonUtilV2.loadFalseJson("记录不存在/不是您的订单"); } record = vipService.checkOrderPayState(id); //未支付 if (record != null && record.getState() != VIPOrderRecord.STATE_PAY) { return JsonUtilV2.loadFalseJson(1, "支付未完成"); } JSONObject data = new JSONObject(); data.put("money", record.getPayMoney() == null ? record.getMoney() : record.getPayMoney()); return JsonUtilV2.loadTrueJson(data.toString()); } }