NotifyController.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. package com.miaxis.app.controller.film;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.miaxis.common.config.WxpayConfig;
  4. import com.miaxis.common.constant.Constants;
  5. import com.miaxis.common.core.domain.Response;
  6. import com.miaxis.common.core.domain.entity.UserInfo;
  7. import com.miaxis.common.exception.CustomException;
  8. import com.miaxis.common.utils.AesUtil;
  9. import com.miaxis.common.utils.SecurityUtils;
  10. import com.miaxis.feign.dto.FilmDTO;
  11. import com.miaxis.film.domain.FilmOrder;
  12. import com.miaxis.film.dto.*;
  13. import com.miaxis.film.service.IFilmOrderService;
  14. import com.miaxis.film.service.IRefundRecordService;
  15. import io.swagger.annotations.Api;
  16. import io.swagger.annotations.ApiModelProperty;
  17. import io.swagger.annotations.ApiOperation;
  18. import io.swagger.annotations.ApiParam;
  19. import lombok.Data;
  20. import lombok.RequiredArgsConstructor;
  21. import lombok.extern.slf4j.Slf4j;
  22. import org.joda.time.DateTime;
  23. import org.springframework.beans.BeanUtils;
  24. import org.springframework.beans.factory.annotation.Autowired;
  25. import org.springframework.beans.factory.annotation.Value;
  26. import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
  27. import org.springframework.transaction.annotation.Transactional;
  28. import org.springframework.web.bind.annotation.*;
  29. import javax.servlet.http.HttpServletRequest;
  30. import java.io.IOException;
  31. import java.security.GeneralSecurityException;
  32. import java.sql.Date;
  33. import java.time.ZoneId;
  34. import java.time.ZonedDateTime;
  35. import java.util.Locale;
  36. import static com.miaxis.common.utils.OrderCodeFactory.getOrderCode;
  37. @RestController
  38. @RequiredArgsConstructor
  39. @RequestMapping(Constants.OPEN_PREFIX+"/film/notify")
  40. @Api(tags = {"【小程序-回调】"})
  41. @Slf4j
  42. public class NotifyController {
  43. @Autowired
  44. private WxpayConfig wxpayConfig;
  45. @Autowired
  46. private IFilmOrderService filmOrderService;
  47. @Autowired
  48. private ThreadPoolTaskExecutor threadPoolTaskExecutor;
  49. @Autowired
  50. private IRefundRecordService refundRecordService;
  51. @Value("${film.notifyUrl}")
  52. private String notifyUrl ;
  53. /**
  54. * 微信支付回调接口
  55. */
  56. @PostMapping(value = "/wxpay")
  57. @ApiOperation("微信支付回调")
  58. public WxNotifyReturnDTO wxpayNotify(@RequestBody FilmWxpayDTO filmWxpayDTO, HttpServletRequest request) throws GeneralSecurityException, IOException {
  59. AesUtil aesUtil = new AesUtil(wxpayConfig.getV3key().getBytes());
  60. FilmWxpayDTO.WxpaySource wxpaySource = filmWxpayDTO.getResource();
  61. String resourceString = aesUtil.decryptToString(wxpaySource.getAssociated_data().getBytes(), wxpaySource.getNonce().getBytes(), wxpaySource.getCiphertext());
  62. log.info(resourceString);
  63. JSONObject jsonObject = JSONObject.parseObject(resourceString);
  64. //将回调数据写入数据库
  65. writeNotifyDataToDb(jsonObject);
  66. WxNotifyReturnDTO wxNotifyReturnDTO = new WxNotifyReturnDTO();
  67. wxNotifyReturnDTO.setCode("SUCCESS");
  68. wxNotifyReturnDTO.setMessage("成功");
  69. return wxNotifyReturnDTO;
  70. }
  71. /**
  72. * 电影回调接口
  73. */
  74. @PostMapping(value = "/filmOrder")
  75. @ApiOperation("电影订单回调")
  76. public FilmNotifyReturnDTO filmOrderNotify(FilmOrderNotifyDTO filmOrderNotifyDTO ,String sign, String appKey) {
  77. FilmOrder filmOrder = filmOrderService.getByOutTradeNo(filmOrderNotifyDTO.getThirdOrderId());
  78. //todo 检查sign
  79. String orderDataJson = filmOrder.getOrderDataJson();
  80. FilmOrderJsonData filmOrderJsonData = JSONObject.parseObject(orderDataJson, FilmOrderJsonData.class);
  81. FilmOrderNotifyDTO dbFilmOrderNotifyDTO= filmOrderJsonData.getFilmOrderNotifyDTO();
  82. if (dbFilmOrderNotifyDTO == null){
  83. dbFilmOrderNotifyDTO = filmOrderNotifyDTO;
  84. }else{
  85. dbFilmOrderNotifyDTO.setEventName(filmOrderNotifyDTO.getEventName());
  86. if (filmOrderNotifyDTO.getOrderPrice()!= null)
  87. dbFilmOrderNotifyDTO.setOrderPrice(filmOrderNotifyDTO.getOrderPrice());
  88. if (filmOrderNotifyDTO.getCloseCause()!= null)
  89. dbFilmOrderNotifyDTO.setCloseCause(filmOrderNotifyDTO.getCloseCause());
  90. if (filmOrderNotifyDTO.getRealSeat()!= null)
  91. dbFilmOrderNotifyDTO.setRealSeat(filmOrderNotifyDTO.getRealSeat());
  92. if (filmOrderNotifyDTO.getTicketCode()!= null)
  93. dbFilmOrderNotifyDTO.setTicketCode(filmOrderNotifyDTO.getTicketCode());
  94. if (filmOrderNotifyDTO.getTicketImage()!= null)
  95. dbFilmOrderNotifyDTO.setTicketImage(filmOrderNotifyDTO.getTicketImage());
  96. }
  97. filmOrderJsonData.setFilmOrderNotifyDTO(dbFilmOrderNotifyDTO);
  98. filmOrder.setOrderDataJson(JSONObject.toJSONString(filmOrderJsonData));
  99. UserInfo student = SecurityUtils.getLoginUser().getStudent();
  100. Long id = student.getId();
  101. String refundCode = getOrderCode(id);
  102. //如果回调回来的订单关闭,则调用退款
  103. if ("ORDER_CLOSE".equals(filmOrderNotifyDTO.getEventName())){
  104. threadPoolTaskExecutor.execute(new Runnable() {
  105. @Override
  106. public void run() {
  107. try {
  108. refundRecordService.refund(filmOrder,refundCode);
  109. } catch (Exception e) {
  110. log.info(e.getMessage());
  111. }
  112. }
  113. });
  114. }
  115. filmOrder.setOutRefundNo(refundCode);
  116. filmOrderService.updateById(filmOrder);
  117. FilmNotifyReturnDTO filmNotifyReturnDTO = new FilmNotifyReturnDTO();
  118. filmNotifyReturnDTO.setCode("200");
  119. filmNotifyReturnDTO.setMessage("请求成功");
  120. filmNotifyReturnDTO.setSuccess(true);
  121. return filmNotifyReturnDTO;
  122. }
  123. /**
  124. * 电影下单测试
  125. */
  126. @PostMapping(value = "/filmOrder-test")
  127. @ApiOperation("电影订单下单测试")
  128. public Response<String> filmOrderNotifytest(String outTradeNo) throws GeneralSecurityException, IOException {
  129. String s = "";
  130. FilmOrder filmOrder1 = filmOrderService.getByOutTradeNo(outTradeNo);
  131. FilmDTO filmDTO = new FilmDTO();
  132. filmDTO.setUrl("api/order/create");
  133. StringBuffer paramData = new StringBuffer();
  134. FilmOrderJsonData filmOrderJsonData = JSONObject.parseObject(filmOrder1.getOrderDataJson(), FilmOrderJsonData.class);
  135. FilmOrderCreateDTO filmOrder = filmOrderJsonData.getFilmOrderCreateDTO();
  136. paramData.append("showId="+filmOrder.getShowId()+"&");
  137. paramData.append("seat="+filmOrder.getSeat()+"&");
  138. if (filmOrder.getReservedPhone() != null){
  139. paramData.append("reservedPhone="+filmOrder.getReservedPhone()+"&");
  140. }
  141. paramData.append("thirdOrderId="+filmOrder.getThirdOrderId()+"&");
  142. paramData.append("notifyUrl="+notifyUrl+"&");
  143. if (filmOrder.getSeatId() != null){
  144. paramData.append("seatId="+filmOrder.getSeatId()+"&");
  145. }
  146. if (filmOrder.getSeatNo() != null){
  147. paramData.append("seatNo="+filmOrder.getSeatNo()+"&");
  148. }
  149. paramData.append("acceptChangeSeat="+filmOrder.getAcceptChangeSeat());
  150. filmDTO.setParamData(paramData.toString());
  151. s = filmOrderService.excuteFilmApi(filmDTO);
  152. log.info("电影下单返回值:"+s);
  153. return Response.success(s);
  154. }
  155. @Transactional
  156. public void writeNotifyDataToDb(JSONObject jsonObject) {
  157. String outTradeNo = jsonObject.getString("out_trade_no");
  158. FilmOrder filmOrder = filmOrderService.getByOutTradeNo(outTradeNo);
  159. if (filmOrder == null) {
  160. throw new CustomException("该订单不存在");
  161. }
  162. filmOrder.setTransactionId(jsonObject.getString("transaction_id"));
  163. JSONObject amount = jsonObject.getJSONObject("amount");
  164. filmOrder.setPayerTotal(amount.getInteger("payer_total"));
  165. filmOrder.setTotal(amount.getInteger("total"));
  166. filmOrder.setCurrency(amount.getString("currency"));
  167. filmOrder.setPayerCurrency(amount.getString("payer_currency"));
  168. filmOrder.setTradeState(jsonObject.getString("trade_state"));
  169. filmOrder.setBankType(jsonObject.getString("bank_type"));
  170. DateTime dateTime = new DateTime(jsonObject.getString("success_time"));
  171. filmOrder.setSuccessTime(dateTime.toDate());
  172. filmOrder.setTradeStateDesc(jsonObject.getString("trade_state_desc"));
  173. filmOrder.setTradeType(jsonObject.getString("trade_type"));
  174. filmOrder.setAttach(jsonObject.getString("attach"));
  175. JSONObject sceneInfo = jsonObject.getJSONObject("scene_info");
  176. if (sceneInfo != null){
  177. filmOrder.setDeviceId(sceneInfo.getString("device_id"));
  178. }
  179. //如果订单还未下过电影票订单,则异步调用电影下单api
  180. String orderDataJson= filmOrder.getOrderDataJson();
  181. FilmOrderJsonData filmOrderJsonData = JSONObject.parseObject(orderDataJson, FilmOrderJsonData.class);
  182. if (filmOrderJsonData != null && filmOrderJsonData.getFilmOrderNotifyDTO() == null){
  183. threadPoolTaskExecutor.execute(new Runnable() {
  184. @Override
  185. public void run() {
  186. FilmDTO filmDTO = new FilmDTO();
  187. filmDTO.setUrl("api/order/create");
  188. StringBuffer paramData = new StringBuffer();
  189. FilmOrderCreateDTO filmOrder = filmOrderJsonData.getFilmOrderCreateDTO();
  190. paramData.append("showId="+filmOrder.getShowId()+"&");
  191. paramData.append("seat="+filmOrder.getSeat()+"&");
  192. if (filmOrder.getReservedPhone() != null){
  193. paramData.append("reservedPhone="+filmOrder.getReservedPhone()+"&");
  194. }
  195. paramData.append("thirdOrderId="+filmOrder.getThirdOrderId()+"&");
  196. paramData.append("notifyUrl="+notifyUrl+"&");
  197. if (filmOrder.getSeatId() != null){
  198. paramData.append("seatId="+filmOrder.getSeatId()+"&");
  199. }
  200. if (filmOrder.getSeatNo() != null){
  201. paramData.append("seatNo="+filmOrder.getSeatNo()+"&");
  202. }
  203. paramData.append("acceptChangeSeat="+filmOrder.getAcceptChangeSeat());
  204. filmDTO.setParamData(paramData.toString());
  205. String s = filmOrderService.excuteFilmApi(filmDTO);
  206. log.info("电影下单返回值:"+s);
  207. }
  208. });
  209. }
  210. filmOrderService.updateById(filmOrder);
  211. }
  212. @Data
  213. public class FilmNotifyReturnDTO {
  214. String code;
  215. String message;
  216. Boolean success;
  217. }
  218. }