123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- package com.miaxis.app.controller.film;
- import com.alibaba.fastjson.JSONObject;
- import com.miaxis.common.config.WxpayConfig;
- import com.miaxis.common.constant.Constants;
- import com.miaxis.common.core.domain.Response;
- import com.miaxis.common.core.domain.entity.UserInfo;
- import com.miaxis.common.exception.CustomException;
- import com.miaxis.common.utils.AesUtil;
- import com.miaxis.common.utils.SecurityUtils;
- import com.miaxis.feign.dto.FilmDTO;
- import com.miaxis.film.domain.FilmOrder;
- import com.miaxis.film.dto.*;
- import com.miaxis.film.service.IFilmOrderService;
- import com.miaxis.film.service.IRefundRecordService;
- import io.swagger.annotations.Api;
- import io.swagger.annotations.ApiModelProperty;
- import io.swagger.annotations.ApiOperation;
- import io.swagger.annotations.ApiParam;
- import lombok.Data;
- import lombok.RequiredArgsConstructor;
- import lombok.extern.slf4j.Slf4j;
- import org.joda.time.DateTime;
- import org.springframework.beans.BeanUtils;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
- import org.springframework.transaction.annotation.Transactional;
- import org.springframework.web.bind.annotation.*;
- import javax.servlet.http.HttpServletRequest;
- import java.io.IOException;
- import java.security.GeneralSecurityException;
- import java.sql.Date;
- import java.time.ZoneId;
- import java.time.ZonedDateTime;
- import java.util.Locale;
- import static com.miaxis.common.utils.OrderCodeFactory.getOrderCode;
- @RestController
- @RequiredArgsConstructor
- @RequestMapping(Constants.OPEN_PREFIX+"/film/notify")
- @Api(tags = {"【小程序-回调】"})
- @Slf4j
- public class NotifyController {
- @Autowired
- private WxpayConfig wxpayConfig;
- @Autowired
- private IFilmOrderService filmOrderService;
- @Autowired
- private ThreadPoolTaskExecutor threadPoolTaskExecutor;
- @Autowired
- private IRefundRecordService refundRecordService;
- @Value("${film.notifyUrl}")
- private String notifyUrl ;
- /**
- * 微信支付回调接口
- */
- @PostMapping(value = "/wxpay")
- @ApiOperation("微信支付回调")
- public WxNotifyReturnDTO wxpayNotify(@RequestBody FilmWxpayDTO filmWxpayDTO, HttpServletRequest request) throws GeneralSecurityException, IOException {
- AesUtil aesUtil = new AesUtil(wxpayConfig.getV3key().getBytes());
- FilmWxpayDTO.WxpaySource wxpaySource = filmWxpayDTO.getResource();
- String resourceString = aesUtil.decryptToString(wxpaySource.getAssociated_data().getBytes(), wxpaySource.getNonce().getBytes(), wxpaySource.getCiphertext());
- log.info(resourceString);
- JSONObject jsonObject = JSONObject.parseObject(resourceString);
- //将回调数据写入数据库
- writeNotifyDataToDb(jsonObject);
- WxNotifyReturnDTO wxNotifyReturnDTO = new WxNotifyReturnDTO();
- wxNotifyReturnDTO.setCode("SUCCESS");
- wxNotifyReturnDTO.setMessage("成功");
- return wxNotifyReturnDTO;
- }
- /**
- * 电影回调接口
- */
- @PostMapping(value = "/filmOrder")
- @ApiOperation("电影订单回调")
- public FilmNotifyReturnDTO filmOrderNotify(FilmOrderNotifyDTO filmOrderNotifyDTO ,String sign, String appKey) {
- FilmOrder filmOrder = filmOrderService.getByOutTradeNo(filmOrderNotifyDTO.getThirdOrderId());
- //todo 检查sign
- String orderDataJson = filmOrder.getOrderDataJson();
- FilmOrderJsonData filmOrderJsonData = JSONObject.parseObject(orderDataJson, FilmOrderJsonData.class);
- FilmOrderNotifyDTO dbFilmOrderNotifyDTO= filmOrderJsonData.getFilmOrderNotifyDTO();
- if (dbFilmOrderNotifyDTO == null){
- dbFilmOrderNotifyDTO = filmOrderNotifyDTO;
- }else{
- dbFilmOrderNotifyDTO.setEventName(filmOrderNotifyDTO.getEventName());
- if (filmOrderNotifyDTO.getOrderPrice()!= null)
- dbFilmOrderNotifyDTO.setOrderPrice(filmOrderNotifyDTO.getOrderPrice());
- if (filmOrderNotifyDTO.getCloseCause()!= null)
- dbFilmOrderNotifyDTO.setCloseCause(filmOrderNotifyDTO.getCloseCause());
- if (filmOrderNotifyDTO.getRealSeat()!= null)
- dbFilmOrderNotifyDTO.setRealSeat(filmOrderNotifyDTO.getRealSeat());
- if (filmOrderNotifyDTO.getTicketCode()!= null)
- dbFilmOrderNotifyDTO.setTicketCode(filmOrderNotifyDTO.getTicketCode());
- if (filmOrderNotifyDTO.getTicketImage()!= null)
- dbFilmOrderNotifyDTO.setTicketImage(filmOrderNotifyDTO.getTicketImage());
- }
- filmOrderJsonData.setFilmOrderNotifyDTO(dbFilmOrderNotifyDTO);
- filmOrder.setOrderDataJson(JSONObject.toJSONString(filmOrderJsonData));
- UserInfo student = SecurityUtils.getLoginUser().getStudent();
- Long id = student.getId();
- String refundCode = getOrderCode(id);
- //如果回调回来的订单关闭,则调用退款
- if ("ORDER_CLOSE".equals(filmOrderNotifyDTO.getEventName())){
- threadPoolTaskExecutor.execute(new Runnable() {
- @Override
- public void run() {
- try {
- refundRecordService.refund(filmOrder,refundCode);
- } catch (Exception e) {
- log.info(e.getMessage());
- }
- }
- });
- }
- filmOrder.setOutRefundNo(refundCode);
- filmOrderService.updateById(filmOrder);
- FilmNotifyReturnDTO filmNotifyReturnDTO = new FilmNotifyReturnDTO();
- filmNotifyReturnDTO.setCode("200");
- filmNotifyReturnDTO.setMessage("请求成功");
- filmNotifyReturnDTO.setSuccess(true);
- return filmNotifyReturnDTO;
- }
- /**
- * 电影下单测试
- */
- @PostMapping(value = "/filmOrder-test")
- @ApiOperation("电影订单下单测试")
- public Response<String> filmOrderNotifytest(String outTradeNo) throws GeneralSecurityException, IOException {
- String s = "";
- FilmOrder filmOrder1 = filmOrderService.getByOutTradeNo(outTradeNo);
- FilmDTO filmDTO = new FilmDTO();
- filmDTO.setUrl("api/order/create");
- StringBuffer paramData = new StringBuffer();
- FilmOrderJsonData filmOrderJsonData = JSONObject.parseObject(filmOrder1.getOrderDataJson(), FilmOrderJsonData.class);
- FilmOrderCreateDTO filmOrder = filmOrderJsonData.getFilmOrderCreateDTO();
- paramData.append("showId="+filmOrder.getShowId()+"&");
- paramData.append("seat="+filmOrder.getSeat()+"&");
- if (filmOrder.getReservedPhone() != null){
- paramData.append("reservedPhone="+filmOrder.getReservedPhone()+"&");
- }
- paramData.append("thirdOrderId="+filmOrder.getThirdOrderId()+"&");
- paramData.append("notifyUrl="+notifyUrl+"&");
- if (filmOrder.getSeatId() != null){
- paramData.append("seatId="+filmOrder.getSeatId()+"&");
- }
- if (filmOrder.getSeatNo() != null){
- paramData.append("seatNo="+filmOrder.getSeatNo()+"&");
- }
- paramData.append("acceptChangeSeat="+filmOrder.getAcceptChangeSeat());
- filmDTO.setParamData(paramData.toString());
- s = filmOrderService.excuteFilmApi(filmDTO);
- log.info("电影下单返回值:"+s);
- return Response.success(s);
- }
- @Transactional
- public void writeNotifyDataToDb(JSONObject jsonObject) {
- String outTradeNo = jsonObject.getString("out_trade_no");
- FilmOrder filmOrder = filmOrderService.getByOutTradeNo(outTradeNo);
- if (filmOrder == null) {
- throw new CustomException("该订单不存在");
- }
- filmOrder.setTransactionId(jsonObject.getString("transaction_id"));
- JSONObject amount = jsonObject.getJSONObject("amount");
- filmOrder.setPayerTotal(amount.getInteger("payer_total"));
- filmOrder.setTotal(amount.getInteger("total"));
- filmOrder.setCurrency(amount.getString("currency"));
- filmOrder.setPayerCurrency(amount.getString("payer_currency"));
- filmOrder.setTradeState(jsonObject.getString("trade_state"));
- filmOrder.setBankType(jsonObject.getString("bank_type"));
- DateTime dateTime = new DateTime(jsonObject.getString("success_time"));
- filmOrder.setSuccessTime(dateTime.toDate());
- filmOrder.setTradeStateDesc(jsonObject.getString("trade_state_desc"));
- filmOrder.setTradeType(jsonObject.getString("trade_type"));
- filmOrder.setAttach(jsonObject.getString("attach"));
- JSONObject sceneInfo = jsonObject.getJSONObject("scene_info");
- if (sceneInfo != null){
- filmOrder.setDeviceId(sceneInfo.getString("device_id"));
- }
- //如果订单还未下过电影票订单,则异步调用电影下单api
- String orderDataJson= filmOrder.getOrderDataJson();
- FilmOrderJsonData filmOrderJsonData = JSONObject.parseObject(orderDataJson, FilmOrderJsonData.class);
- if (filmOrderJsonData != null && filmOrderJsonData.getFilmOrderNotifyDTO() == null){
- threadPoolTaskExecutor.execute(new Runnable() {
- @Override
- public void run() {
- FilmDTO filmDTO = new FilmDTO();
- filmDTO.setUrl("api/order/create");
- StringBuffer paramData = new StringBuffer();
- FilmOrderCreateDTO filmOrder = filmOrderJsonData.getFilmOrderCreateDTO();
- paramData.append("showId="+filmOrder.getShowId()+"&");
- paramData.append("seat="+filmOrder.getSeat()+"&");
- if (filmOrder.getReservedPhone() != null){
- paramData.append("reservedPhone="+filmOrder.getReservedPhone()+"&");
- }
- paramData.append("thirdOrderId="+filmOrder.getThirdOrderId()+"&");
- paramData.append("notifyUrl="+notifyUrl+"&");
- if (filmOrder.getSeatId() != null){
- paramData.append("seatId="+filmOrder.getSeatId()+"&");
- }
- if (filmOrder.getSeatNo() != null){
- paramData.append("seatNo="+filmOrder.getSeatNo()+"&");
- }
- paramData.append("acceptChangeSeat="+filmOrder.getAcceptChangeSeat());
- filmDTO.setParamData(paramData.toString());
- String s = filmOrderService.excuteFilmApi(filmDTO);
- log.info("电影下单返回值:"+s);
- }
- });
- }
- filmOrderService.updateById(filmOrder);
- }
- @Data
- public class FilmNotifyReturnDTO {
- String code;
- String message;
- Boolean success;
- }
- }
|