Althars123 пре 3 година
родитељ
комит
956b6ba5c0
20 измењених фајлова са 566 додато и 144 уклоњено
  1. 8 23
      zzjs-admin/src/main/java/com/miaxis/app/controller/fulu/FuluController.java
  2. 85 0
      zzjs-admin/src/main/java/com/miaxis/app/controller/fulu/FuluNotifyController.java
  3. 52 26
      zzjs-admin/src/main/java/com/miaxis/app/controller/wx/WxController.java
  4. 9 59
      zzjs-admin/src/main/java/com/miaxis/app/controller/wx/WxNotifyController.java
  5. 1 0
      zzjs-admin/src/main/resources/application-dev.yml
  6. 1 0
      zzjs-admin/src/main/resources/application-prod.yml
  7. 2 2
      zzjs-admin/src/test/java/com/miaxis/test/FuluTest.java
  8. 23 0
      zzjs-service/src/main/java/com/miaxis/feign/dto/fulu/FuluGoodsInfo.java
  9. 1 0
      zzjs-service/src/main/java/com/miaxis/feign/dto/fulu/FuluResult.java
  10. 2 1
      zzjs-service/src/main/java/com/miaxis/feign/service/IFuluService.java
  11. 6 0
      zzjs-service/src/main/java/com/miaxis/wx/domain/WxOrder.java
  12. 3 2
      zzjs-service/src/main/java/com/miaxis/wx/dto/FilmWxOrderJsonData.java
  13. 23 0
      zzjs-service/src/main/java/com/miaxis/wx/dto/FuluWxOrderJsonData.java
  14. 71 0
      zzjs-service/src/main/java/com/miaxis/wx/dto/WxFuluOrderDetailDTO.java
  15. 55 0
      zzjs-service/src/main/java/com/miaxis/wx/dto/WxFuluOrderNotifyDTO.java
  16. 2 2
      zzjs-service/src/main/java/com/miaxis/wx/dto/WxOrderCreateDTO.java
  17. 32 0
      zzjs-service/src/main/java/com/miaxis/wx/dto/WxOrderCreateFuluDTO.java
  18. 0 24
      zzjs-service/src/main/java/com/miaxis/wx/dto/WxOrderJsonData.java
  19. 11 0
      zzjs-service/src/main/java/com/miaxis/wx/service/IWxOrderService.java
  20. 179 5
      zzjs-service/src/main/java/com/miaxis/wx/service/impl/WxOrderServiceImpl.java

+ 8 - 23
zzjs-admin/src/main/java/com/miaxis/app/controller/fulu/FuluController.java

@@ -9,6 +9,7 @@ import com.miaxis.common.sms.MD5Utils;
 import com.miaxis.feign.dto.FilmDTO;
 import com.miaxis.feign.dto.fulu.FuluCommonApiDTO;
 import com.miaxis.feign.dto.fulu.FuluDTO;
+import com.miaxis.feign.dto.fulu.FuluResult;
 import com.miaxis.feign.service.IFuluService;
 import com.miaxis.wx.service.IWxOrderService;
 import io.swagger.annotations.Api;
@@ -44,6 +45,9 @@ public class FuluController extends BaseController {
     @Autowired
     private IFuluService fuluService;
 
+
+    @Autowired
+    private IWxOrderService wxOrderService;
     @Value("${fulu.appKey}")
     private String appKey;
     @Value("${fulu.appSecret}")
@@ -51,35 +55,16 @@ public class FuluController extends BaseController {
 
     @PostMapping(value = "/fuluCommonApi")
     @ApiOperation("福禄通用接口")
-    public  Response<JSONObject>  httpPostWithForm(@RequestBody FuluCommonApiDTO fuluCommonApiDTO) {
+    public  Response<FuluResult>  httpPostWithForm(@RequestBody FuluCommonApiDTO fuluCommonApiDTO) {
 
 
         FuluDTO fuluDTO = new FuluDTO();
-        init(fuluDTO,fuluCommonApiDTO);
-
+        wxOrderService.init(fuluDTO,fuluCommonApiDTO);
         // 用于接收返回的结果
-        String resultData = fuluService.fuluCommonApi(fuluDTO);
-        return Response.success(JSONObject.parseObject(resultData));
+        return Response.success(fuluService.fuluCommonApi(fuluDTO));
     }
 
-    private void init(FuluDTO fuluDTO, FuluCommonApiDTO fuluCommonApiDTO) {
-        fuluDTO.setApp_key(appKey);
-        fuluDTO.setMethod(fuluCommonApiDTO.getMethod());
-        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        fuluDTO.setTimestamp(simpleDateFormat.format(new Date()));
-        fuluDTO.setVersion("2.0");
-        fuluDTO.setFormat("json");
-        fuluDTO.setCharset("utf-8");
-        fuluDTO.setSign_type("md5");
-        fuluDTO.setApp_auth_token("");
-        fuluDTO.setBiz_content(fuluCommonApiDTO.getBiz_content());
-        String str = JSONObject.toJSONString(fuluDTO);
-        char[] s = str.toCharArray();
-        Arrays.sort(s);
-        String outputSignOriginalStr = new String(s) + appSecret;
-        String sign = MD5Utils.MD5Encode(outputSignOriginalStr);
-        fuluDTO.setSign(sign);
-    }
+
 
 
 }

+ 85 - 0
zzjs-admin/src/main/java/com/miaxis/app/controller/fulu/FuluNotifyController.java

@@ -0,0 +1,85 @@
+package com.miaxis.app.controller.fulu;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.miaxis.common.config.WxpayConfig;
+import com.miaxis.common.constant.Constants;
+import com.miaxis.wx.domain.WxOrder;
+import com.miaxis.wx.dto.FilmWxOrderJsonData;
+import com.miaxis.wx.dto.FuluWxOrderJsonData;
+import com.miaxis.wx.dto.WxFuluOrderDetailDTO;
+import com.miaxis.wx.dto.WxOrderNotifyDTO;
+import com.miaxis.wx.service.IRefundRecordService;
+import com.miaxis.wx.service.IWxOrderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import static com.miaxis.common.utils.OrderCodeFactory.getOrderCode;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(Constants.OPEN_PREFIX+"/fulu/notify")
+@Api(tags = {"【小程序-福禄回调】"})
+@Slf4j
+public class FuluNotifyController {
+
+
+    @Autowired
+    private WxpayConfig wxpayConfig;
+
+
+    @Autowired
+    private IWxOrderService wxOrderService;
+
+    @Autowired
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
+    @Autowired
+    private  IRefundRecordService  refundRecordService;
+
+
+
+    /**
+     * 电影回调接口
+     */
+    @PostMapping(value = "/fuluOrder")
+    @ApiOperation("福禄订单回调")
+    public FilmNotifyReturnDTO wxOrderNotify(WxFuluOrderDetailDTO wxFuluOrderDetailDTO) {
+        //todo 验签sign
+        WxOrder wxOrder = wxOrderService.getByOutTradeNo(wxFuluOrderDetailDTO.getCustomer_order_no());
+        String orderDataJson = wxOrder.getOrderDataJson();
+        FuluWxOrderJsonData fuluWxOrderJsonData = JSONObject.parseObject(orderDataJson, FuluWxOrderJsonData.class);
+        WxFuluOrderDetailDTO dbWxFuluOrderDetailDTO= fuluWxOrderJsonData.getWxFuluOrderDetailDTO();
+        if (wxFuluOrderDetailDTO.getCharge_finish_time()!=null){
+            dbWxFuluOrderDetailDTO.setCharge_finish_time(wxFuluOrderDetailDTO.getCharge_finish_time());
+        }
+        dbWxFuluOrderDetailDTO.setOrder_status(wxFuluOrderDetailDTO.getOrder_status());
+        fuluWxOrderJsonData.setWxFuluOrderDetailDTO(dbWxFuluOrderDetailDTO);
+        wxOrder.setOrderDataJson(fuluWxOrderJsonData.toString());
+        wxOrderService.updateById(wxOrder);
+
+        FilmNotifyReturnDTO filmNotifyReturnDTO = new FilmNotifyReturnDTO();
+        filmNotifyReturnDTO.setCode("200");
+        filmNotifyReturnDTO.setMessage("请求成功");
+        filmNotifyReturnDTO.setSuccess(true);
+        return filmNotifyReturnDTO;
+    }
+
+
+
+    @Data
+    public class FilmNotifyReturnDTO {
+        String code;
+        String message;
+        Boolean success;
+    }
+
+}

+ 52 - 26
zzjs-admin/src/main/java/com/miaxis/app/controller/wx/WxController.java

@@ -13,10 +13,7 @@ import com.miaxis.common.exception.CustomException;
 import com.miaxis.common.utils.SecurityUtils;
 import com.miaxis.common.utils.uuid.CommonUtils;
 import com.miaxis.wx.domain.WxOrder;
-import com.miaxis.wx.dto.WxOrderCreateDTO;
-import com.miaxis.wx.dto.FilmWxOrderJsonData;
-import com.miaxis.wx.dto.WxOrderJsonData;
-import com.miaxis.wx.dto.WxOrderListDTO;
+import com.miaxis.wx.dto.*;
 import com.miaxis.wx.service.IWxOrderService;
 import com.miaxis.system.service.ISysDictDataService;
 import io.swagger.annotations.*;
@@ -35,6 +32,7 @@ import org.springframework.web.bind.annotation.*;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.IOException;
 import java.security.PrivateKey;
 import java.security.Signature;
 import java.util.Base64;
@@ -93,56 +91,78 @@ public class WxController extends BaseController {
         return toResponsePageInfo(list);
     }
 
+    /**
+     * 微信支付获取预订单id
+     */
+    @PostMapping(value = "/prepareOrderForFulu")
+    @ApiOperation("微信支付福禄下单")
+    public Response<JSONObject> getPrepareOrderIdForFulu(@RequestBody WxOrderCreateFuluDTO wxOrderCreateFuluDTO) throws Exception{
+
+        //创建本地微信订单
+        WxOrder order = new WxOrder();
+        UserInfo student = SecurityUtils.getLoginUser().getStudent();
+        String orderCode = getOrderCode(student.getId());
+        order.setOutTradeNo(orderCode);
+        order.setOpenid(student.getOpenid());
+        order.setGoodsType("2");
+        //保存电影下单数据
+        wxOrderService.createFuluOrder(order,wxOrderCreateFuluDTO);
+        wxOrderService.save(order);
+        return Response.success(placeWxOrder(order, "视频会员"));
+
+
+    }
+
     /**
      * 微信支付获取预订单id
      */
     @PostMapping(value = "/prepareOrder")
-    @ApiOperation("微信支付获取预订单id")
+    @ApiOperation("微信支付电影下单")
     public Response<JSONObject> getPrepareOrderId(@RequestBody WxOrderCreateDTO wxOrderCreateDTO) throws Exception{
-        HttpPost httpPost = new HttpPost(wxpayConfig.getV3url());
-        httpPost.addHeader("Accept", "application/json");
-        httpPost.addHeader("Content-type","application/json; charset=utf-8");
-        ByteArrayOutputStream bos = new ByteArrayOutputStream();
-        ObjectMapper objectMapper = new ObjectMapper();
         UserInfo student = SecurityUtils.getLoginUser().getStudent();
-
-        //1 本地创建订单
+        //创建本地微信订单
         WxOrder order = new WxOrder();
-        Long id = student.getId();
-        String orderCode = getOrderCode(id);
+        String orderCode = getOrderCode(student.getId());
         order.setOutTradeNo(orderCode);
         order.setOpenid(student.getOpenid());
-        String goodsName = dictDataService.selectDictLabel("goods_type", wxOrderCreateDTO.getGoodsType());
-        order.setGoodsType(wxOrderCreateDTO.getGoodsType());
+        order.setGoodsType("1");
         order.setGoodsPictureUrl(wxOrderCreateDTO.getGoodsPictureUrl());
-        //电影下单
-        if ("1".equals(wxOrderCreateDTO.getGoodsType()) ){
-            wxOrderService.createFilmOrder(order,wxOrderCreateDTO);
-        }
+        //保存电影下单数据
+        wxOrderService.createFilmOrder(order,wxOrderCreateDTO);
         wxOrderService.save(order);
+        // 2 调用微信接口生成预订单,并返回调起支付所需json数据
+        return Response.success(placeWxOrder(order, "电影票"));
+
+    }
 
-        // 2 调用微信接口生成预订单
+    //微信预订单
+    private JSONObject placeWxOrder(WxOrder order, String goodsName) throws Exception {
+        HttpPost httpPost = initHttpPost();
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        ObjectMapper objectMapper = new ObjectMapper();
         ObjectNode rootNode = objectMapper.createObjectNode();
         rootNode.put("mchid",wxpayConfig.getMerchantId())
                 .put("appid", appid)
                 .put("description", goodsName)
                 .put("notify_url", notifyUrl)
-                .put("out_trade_no", orderCode);
+                .put("out_trade_no", order.getOutTradeNo());
         rootNode.putObject("amount")
                 .put("total", order.getTotal());
         rootNode.putObject("payer")
-                .put("openid", student.getOpenid());
+                .put("openid", order.getOpenid());
         objectMapper.writeValue(bos, rootNode);
         httpPost.setEntity(new StringEntity(rootNode.toString(), "utf-8"));
         HttpResponse response = httpClient.execute(httpPost);
         String bodyAsString = EntityUtils.toString(response.getEntity());
-        System.out.println(bodyAsString);
         if (JSONObject.parseObject(bodyAsString).get("prepay_id") == null){
             throw new CustomException(JSONObject.parseObject(bodyAsString).get("message").toString());
         }
+        return getWxParamJson(bodyAsString,order.getOutTradeNo());
 
+    }
 
-        //3 生成前端小程序调用调起微信支付所需参数
+    // 生成前端小程序调用调起微信支付所需参数
+    private JSONObject getWxParamJson(String bodyAsString, String orderCode) throws Exception {
         String  packageStr = "prepay_id="+JSONObject.parseObject(bodyAsString).get("prepay_id");
         JSONObject jsonObject = new JSONObject();
         jsonObject.put("package",packageStr);
@@ -169,8 +189,14 @@ public class WxController extends BaseController {
         String base64Str =  Base64.getEncoder().encodeToString(signedData);
         jsonObject.put("paySign",base64Str);
         jsonObject.put("outTradeNo",orderCode);
-        return Response.success(jsonObject);
+        return jsonObject;
+    }
 
+    private HttpPost initHttpPost() {
+        HttpPost httpPost = new HttpPost(wxpayConfig.getV3url());
+        httpPost.addHeader("Accept", "application/json");
+        httpPost.addHeader("Content-type","application/json; charset=utf-8");
+        return httpPost;
     }
 
     /**

+ 9 - 59
zzjs-admin/src/main/java/com/miaxis/app/controller/wx/WxNotifyController.java

@@ -56,8 +56,7 @@ public class WxNotifyController {
     @Autowired
     private IWxOrderService wxOrderService;
 
-    @Autowired
-    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
 
     @Autowired
     private  IRefundRecordService  refundRecordService;
@@ -217,65 +216,16 @@ public class WxNotifyController {
         if (sceneInfo != null){
             wxOrder.setDeviceId(sceneInfo.getString("device_id"));
         }
-        //如果订单还未下过电影票订单,则异步调用电影下单api
-        String  orderDataJson= wxOrder.getOrderDataJson();
-        FilmWxOrderJsonData wxOrderJsonData = JSONObject.parseObject(orderDataJson, FilmWxOrderJsonData.class);
-        if (wxOrderJsonData != null && wxOrderJsonData.getWxOrderNotifyDTO() == null){
-            threadPoolTaskExecutor.execute(new Runnable() {
-                @Override
-                public void run() {
-                    WxOrderCreateDTO wxOrderCreateDTO = wxOrderJsonData.getWxOrderCreateDTO();
-                    FilmDTO filmDTO = new FilmDTO();
-                    if (wxOrderCreateDTO.getTicketType() ==1){
-                        filmDTO.setUrl("api/order/create");
-                    }else if (wxOrderCreateDTO.getTicketType() ==2){
-                        filmDTO.setUrl("api/order/create-soon-order");
-                    }
-
-                    StringBuffer paramData =  new StringBuffer();
-                    paramData.append("showId="+wxOrderCreateDTO.getShowId()+"&");
-                    paramData.append("seat="+wxOrderCreateDTO.getSeat()+"&");
-                    if (wxOrderCreateDTO.getReservedPhone() != null){
-                        paramData.append("reservedPhone="+wxOrderCreateDTO.getReservedPhone()+"&");
-                    }
-                    paramData.append("thirdOrderId="+wxOrderCreateDTO.getThirdOrderId()+"&");
-                    paramData.append("notifyUrl="+notifyUrl+"&");
-                    if (wxOrderCreateDTO.getSeatId() != null){
-                        paramData.append("seatId="+wxOrderCreateDTO.getSeatId()+"&");
-                    }
-                    if (wxOrderCreateDTO.getSeatNo() != null){
-                        paramData.append("seatNo="+wxOrderCreateDTO.getSeatNo()+"&");
-                    }
-                    paramData.append("acceptChangeSeat="+wxOrderCreateDTO.getAcceptChangeSeat());
-                    filmDTO.setParamData(paramData.toString());
-
-                    String s = wxOrderService.excuteFilmApi(filmDTO);
-                    log.info("电影下单返回值:"+s);
-                    FilmXdResult filmXdResult = JSONObject.parseObject(s, FilmXdResult.class);
-                    //如果返回值不是200 ,则调用退款流程
-                    if (filmXdResult.getCode()!=200){
-                        String refundCode = getOrderCode(null);
-                        wxOrder.setOutRefundNo(refundCode);
-                        try {
-                            refundRecordService.refund(wxOrder,refundCode);
-                        } catch (Exception e) {
-                            e.printStackTrace();
-                        }
-                    }else {
-                        if (filmXdResult.getData()!= null){
-                            FilmMcpData filmMcpData = filmXdResult.getData();
-                            wxOrderJsonData.setFilmMcpData(filmMcpData);
-                            wxOrder.setOrderDataJson(JSONObject.toJSONString(wxOrderJsonData));
-
-                        }
-                    }
-
+        //购买电影票
+        if (wxOrder.getGoodsType() =="1"){
+            wxOrderService.buyFilmOrder(wxOrder);
+        }
+        //购买福禄视频会员
+        else if (wxOrder.getGoodsType() =="2"){
+            wxOrderService.buyFuluOrder(wxOrder);
+        }
 
-                    wxOrderService.updateById(wxOrder);
 
-                }
-            });
-        }
 
 
     }

+ 1 - 0
zzjs-admin/src/main/resources/application-dev.yml

@@ -146,3 +146,4 @@ fulu:
     appKey: "i4esv1l+76l/7NQCL3QudG90Fq+YgVfFGJAWgT+7qO1Bm9o/adG/1iwO2qXsAXNB"
     appSecret: "0a091b3aa4324435aab703142518a8f7"
     url: "http://pre.openapi.fulu.com"
+    notifyUrl: "http://218.85.55.253:65535/zzjs-admin/open-api/fulu/notify/fuluOrder"

+ 1 - 0
zzjs-admin/src/main/resources/application-prod.yml

@@ -146,3 +146,4 @@ fulu:
     appKey: "qxTK3W/RNleYH5tygePOu52hoFHpaqCi0eR5yKhHVgYQanIcua5edOG2rgrldHnL"
     appSecret: "a1be19d04c724c05971942305ea97489"
     url: "http://openapi.fulu.com"
+    notifyUrl: "http://admin.zzxcx.net/zzjs-admin/open-api/fulu/notify/fuluOrder"

+ 2 - 2
zzjs-admin/src/test/java/com/miaxis/test/FuluTest.java

@@ -44,8 +44,8 @@ public class FuluTest {
         String outputSignOriginalStr = new String(s) + AppSecret;
         String sign = MD5Utils.MD5Encode(outputSignOriginalStr);
         fuluDTO.setSign(sign);
-        String s1 = fuluService.fuluCommonApi(fuluDTO);
-        System.out.println(s1);
+        fuluService.fuluCommonApi(fuluDTO);
+
     }
 
 

+ 23 - 0
zzjs-service/src/main/java/com/miaxis/feign/dto/fulu/FuluGoodsInfo.java

@@ -0,0 +1,23 @@
+package com.miaxis.feign.dto.fulu;
+
+
+import lombok.Data;
+
+/**
+ * Fulu商品
+ */
+
+@Data
+public class FuluGoodsInfo {
+    int product_id;
+    String product_name;
+    double face_value;
+    String product_type;
+    double purchase_price;
+    String template_id;
+    String stock_status;
+    String sales_status;
+    String details;
+    String four_category_icon;
+
+}

+ 1 - 0
zzjs-service/src/main/java/com/miaxis/feign/dto/fulu/FuluResult.java

@@ -15,5 +15,6 @@ public class FuluResult {
     Integer code;
     String message;
     String result;
+    String sign;
 
 }

+ 2 - 1
zzjs-service/src/main/java/com/miaxis/feign/service/IFuluService.java

@@ -3,6 +3,7 @@ package com.miaxis.feign.service;
 
 import com.miaxis.common.config.FeignConfig;
 import com.miaxis.feign.dto.fulu.FuluDTO;
+import com.miaxis.feign.dto.fulu.FuluResult;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.http.MediaType;
 import org.springframework.stereotype.Component;
@@ -21,5 +22,5 @@ public interface IFuluService {
      * @return
      */
     @GetMapping(value = "/api/getway",consumes = MediaType.APPLICATION_JSON_VALUE)
-    String fuluCommonApi(FuluDTO fuluDTO);
+    FuluResult fuluCommonApi(FuluDTO fuluDTO);
 }

+ 6 - 0
zzjs-service/src/main/java/com/miaxis/wx/domain/WxOrder.java

@@ -146,6 +146,12 @@ public class WxOrder extends BaseBusinessEntity{
     @ApiModelProperty(value = "订单数据详情")
     private String orderDataJson;
 
+    /** 订单状态 */
+    @Excel(name = "订单数据详情")
+    @TableField("order_status")
+    @ApiModelProperty(value = "订单状态: 1 -进行中 2-购买成功 3-购买失败")
+    private String orderStatus;
+
 
 
 

+ 3 - 2
zzjs-service/src/main/java/com/miaxis/wx/dto/FilmWxOrderJsonData.java

@@ -7,9 +7,10 @@ import lombok.Data;
  * 电影数据
  */
 @Data
-public class FilmWxOrderJsonData extends WxOrderJsonData{
+public class FilmWxOrderJsonData {
     private static final long serialVersionUID = 1L;
-
+    //电影下单信息
+    private  WxOrderCreateDTO wxOrderCreateDTO;
     //电影排场信息
     private CinemaData cinemaData;
     //电影订单回调信息

+ 23 - 0
zzjs-service/src/main/java/com/miaxis/wx/dto/FuluWxOrderJsonData.java

@@ -0,0 +1,23 @@
+package com.miaxis.wx.dto;
+
+import com.miaxis.feign.dto.FilmMcpData;
+import com.miaxis.feign.dto.fulu.FuluGoodsInfo;
+import lombok.Data;
+
+/**
+ * 电影数据
+ */
+@Data
+public class FuluWxOrderJsonData {
+    private static final long serialVersionUID = 1L;
+    //视频会员下单信息
+    private  WxOrderCreateFuluDTO wxOrderCreateDTO;
+
+    //Fulu商品信息
+    private FuluGoodsInfo fuluGoodsInfo;
+
+
+    //Fulu订单详情
+    private WxFuluOrderDetailDTO wxFuluOrderDetailDTO;
+
+}

+ 71 - 0
zzjs-service/src/main/java/com/miaxis/wx/dto/WxFuluOrderDetailDTO.java

@@ -0,0 +1,71 @@
+package com.miaxis.wx.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.omg.CORBA.INTERNAL;
+
+/**
+ * 福禄订单详情
+ */
+@Data
+public class WxFuluOrderDetailDTO {
+    private static final long serialVersionUID = 1L;
+
+
+
+    @ApiModelProperty(value = "福禄开放平台订单号")
+    private String order_id;
+
+    @ApiModelProperty(value = "合作商家订单号")
+    private String customer_order_no;
+
+    @ApiModelProperty(value = "充值描述")
+    private String recharge_description;
+
+    @ApiModelProperty(value = "运营商流水号")
+    private String operator_serial_number;
+
+
+    @ApiModelProperty(value = "商品Id")
+    private String product_id;
+
+    @ApiModelProperty(value = "商品名称")
+    private String product_name;
+
+    @ApiModelProperty(value = "创建时间,格式为:yyyy-MM-dd HH:mm:ss")
+    private String create_time;
+
+    @ApiModelProperty(value = "交易完成时间,格式为:yyyy-MM-dd HH:mm:ss")
+    private String charge_finish_time;
+
+
+    @ApiModelProperty(value = "充值账号")
+    private String charge_account;
+
+
+
+    @ApiModelProperty(value = "购买数量")
+    private Integer buy_num;
+
+    @ApiModelProperty(value = "订单类型:1-话费 2-流量 3-卡密 4-直充")
+    private Integer order_type;
+
+    @ApiModelProperty(value = "交易单价")
+    private Double order_price;
+
+
+    @ApiModelProperty(value = "订单状态: (success:成功,processing:处理中,failed:失败,untreated:未处理)")
+    private String order_status;
+
+    @ApiModelProperty(value = "签名")
+    private String sign;
+
+
+
+
+
+
+
+
+
+}

+ 55 - 0
zzjs-service/src/main/java/com/miaxis/wx/dto/WxFuluOrderNotifyDTO.java

@@ -0,0 +1,55 @@
+package com.miaxis.wx.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 微信支付回调 dto
+ */
+@Data
+public class WxFuluOrderNotifyDTO {
+    private static final long serialVersionUID = 1L;
+
+
+
+    @ApiModelProperty(value = "福禄开放平台订单号")
+    private String order_id;
+
+
+    @ApiModelProperty(value = "交易完成时间,格式为:yyyy-MM-dd HH:mm:ss")
+    private String charge_finish_time;
+
+
+    @ApiModelProperty(value = "合作商家订单号")
+    private String customer_order_no;
+
+    @ApiModelProperty(value = "订单状态")
+    private String order_status;
+
+
+    @ApiModelProperty(value = "充值描述")
+    private String recharge_description;
+
+
+    @ApiModelProperty(value = "商品Id")
+    private String product_id;
+
+    @ApiModelProperty(value = "购买数量")
+    private String buy_num;
+
+    @ApiModelProperty(value = "运营商流水号")
+    private String operator_serial_number;
+
+
+    @ApiModelProperty(value = "签名")
+    private String sign;
+
+
+
+
+
+
+
+
+
+}

+ 2 - 2
zzjs-service/src/main/java/com/miaxis/wx/dto/WxOrderCreateDTO.java

@@ -17,8 +17,8 @@ public class WxOrderCreateDTO {
     private String showId;
 
     /** 商品名称 */
-    @ApiModelProperty(value = "商品类型")
-    private String goodsType;
+//    @ApiModelProperty(value = "商品类型")
+//    private String goodsType;
 
     /** 商品名称 */
     @ApiModelProperty(value = "商品图片地址")

+ 32 - 0
zzjs-service/src/main/java/com/miaxis/wx/dto/WxOrderCreateFuluDTO.java

@@ -0,0 +1,32 @@
+package com.miaxis.wx.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.models.auth.In;
+import lombok.Data;
+
+@Data
+public class WxOrderCreateFuluDTO {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "商品编号")
+    private Integer product_id;
+
+    @ApiModelProperty(value = "外部订单号",hidden = true)
+    private String customer_order_no;
+
+    @ApiModelProperty(value = "充值账号")
+    private String charge_account;
+
+    /** 商品名称 */
+    @ApiModelProperty(value = "购买数量")
+    private Integer buy_num;
+
+    @ApiModelProperty(value = "商品图片地址")
+    private String goodsPictureUrl;
+
+
+
+
+
+
+}

+ 0 - 24
zzjs-service/src/main/java/com/miaxis/wx/dto/WxOrderJsonData.java

@@ -1,24 +0,0 @@
-package com.miaxis.wx.dto;
-
-import com.miaxis.feign.dto.FilmMcpData;
-import lombok.Data;
-
-/**
- * 电影数据
- */
-@Data
-public class WxOrderJsonData {
-    private static final long serialVersionUID = 1L;
-
-    //微信下单对象
-    private  WxOrderCreateDTO wxOrderCreateDTO;
-
-
-
-
-
-
-
-
-
-}

+ 11 - 0
zzjs-service/src/main/java/com/miaxis/wx/service/IWxOrderService.java

@@ -3,10 +3,13 @@ package com.miaxis.wx.service;
 import java.util.List;
 
 import com.miaxis.feign.dto.FilmDTO;
+import com.miaxis.feign.dto.fulu.FuluCommonApiDTO;
+import com.miaxis.feign.dto.fulu.FuluDTO;
 import com.miaxis.wx.domain.WxOrder;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.miaxis.wx.dto.FilmWxOrderJsonData;
 import com.miaxis.wx.dto.WxOrderCreateDTO;
+import com.miaxis.wx.dto.WxOrderCreateFuluDTO;
 import com.miaxis.wx.dto.WxOrderListDTO;
 
 /**
@@ -34,4 +37,12 @@ public interface IWxOrderService extends IService<WxOrder>{
     Integer getPrice(String cinemaId, String showId, int ticketType, FilmWxOrderJsonData wxOrderJsonData);
 
     void createFilmOrder(WxOrder order, WxOrderCreateDTO wxOrderCreateDTO);
+
+    void createFuluOrder(WxOrder order, WxOrderCreateFuluDTO wxOrderCreateDTO);
+
+    void init(FuluDTO fuluDTO, FuluCommonApiDTO fuluCommonApiDTO);
+
+    void buyFilmOrder(WxOrder orderDataJson);
+
+    void buyFuluOrder(WxOrder wxOrder);
 }

+ 179 - 5
zzjs-service/src/main/java/com/miaxis/wx/service/impl/WxOrderServiceImpl.java

@@ -1,21 +1,27 @@
 package com.miaxis.wx.service.impl;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
+import java.text.SimpleDateFormat;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.miaxis.common.config.WxpayConfig;
+import com.miaxis.common.exception.CustomException;
 import com.miaxis.common.sms.MD5Utils;
 import com.miaxis.common.utils.StringUtils;
 import com.miaxis.feign.dto.FilmDTO;
+import com.miaxis.feign.dto.FilmMcpData;
+import com.miaxis.feign.dto.FilmXdResult;
+import com.miaxis.feign.dto.fulu.FuluCommonApiDTO;
+import com.miaxis.feign.dto.fulu.FuluDTO;
+import com.miaxis.feign.dto.fulu.FuluGoodsInfo;
+import com.miaxis.feign.dto.fulu.FuluResult;
+import com.miaxis.feign.service.IFuluService;
 import com.miaxis.wx.dto.*;
 import com.miaxis.system.service.ISysConfigService;
+import com.miaxis.wx.service.IRefundRecordService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.HttpResponse;
 import org.apache.http.HttpStatus;
@@ -27,6 +33,7 @@ import org.apache.http.message.BasicNameValuePair;
 import org.apache.http.util.EntityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
 import com.miaxis.wx.mapper.WxOrderMapper;
 import com.miaxis.wx.domain.WxOrder;
@@ -34,6 +41,8 @@ import com.miaxis.wx.service.IWxOrderService;
 
 import javax.annotation.Resource;
 
+import static com.miaxis.common.utils.OrderCodeFactory.getOrderCode;
+
 /**
  * 电影订单Service业务层处理
  *
@@ -49,6 +58,15 @@ public class WxOrderServiceImpl extends ServiceImpl<WxOrderMapper, WxOrder> impl
 
     @Autowired
     private ISysConfigService configService;
+    @Autowired
+    private IRefundRecordService refundRecordService;
+    @Autowired
+    private IFuluService fuluService;
+    @Autowired
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
+    @Value("${film.notifyUrl}")
+    private  String notifyUrl ;
 
 
 
@@ -64,6 +82,12 @@ public class WxOrderServiceImpl extends ServiceImpl<WxOrderMapper, WxOrder> impl
     private  String v2Url ;
 
 
+    @Value("${fulu.appKey}")
+    private  String fuluAppKey ;
+    @Value("${fulu.appSecret}")
+    private  String fuluAppSecret ;
+
+
 
 
     /**
@@ -202,4 +226,154 @@ public class WxOrderServiceImpl extends ServiceImpl<WxOrderMapper, WxOrder> impl
         order.setOrderDataJson(JSONObject.toJSONString(filmWxOrderJsonData));
         order.setTotal(price*number);
     }
+
+    @Override
+    public void createFuluOrder(WxOrder order, WxOrderCreateFuluDTO wxOrderCreateDTO) {
+        FuluWxOrderJsonData fuluWxOrderJsonData = new FuluWxOrderJsonData();
+        wxOrderCreateDTO.setCustomer_order_no(order.getOutTradeNo());
+        fuluWxOrderJsonData.setWxOrderCreateDTO(wxOrderCreateDTO);
+        order.setOrderDataJson(JSONObject.toJSONString(fuluWxOrderJsonData));
+        //调用福禄接口 获取产品详情对象
+        FuluDTO fuluDTO = new FuluDTO();
+        FuluCommonApiDTO fuluCommonApiDTO = new FuluCommonApiDTO();
+        fuluCommonApiDTO.setMethod("fulu.goods.info.get");
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("product_id",wxOrderCreateDTO.getProduct_id());
+        fuluCommonApiDTO.setBiz_content(jsonObject.toJSONString());
+        FuluResult fuluResult = fuluService.fuluCommonApi(fuluDTO);
+        if (fuluResult.getCode()!= 0){
+            throw new CustomException("福禄接口调用失败:"+fuluResult.getMessage());
+        }
+        FuluGoodsInfo fuluGoodsInfo =   JSONObject.parseObject(fuluResult.getResult(), FuluGoodsInfo.class);
+        fuluWxOrderJsonData.setFuluGoodsInfo(fuluGoodsInfo);
+        String fuluVipDiscount = configService.selectConfigByKey("fulu_vip_discount");
+        Double fuluVipDiscountDoubleValue = Double.valueOf(fuluVipDiscount);
+        Double v = fuluVipDiscountDoubleValue * wxOrderCreateDTO.getBuy_num() * 100;
+        order.setTotal(v.intValue());
+    }
+
+    @Override
+    public void init(FuluDTO fuluDTO, FuluCommonApiDTO fuluCommonApiDTO) {
+        fuluDTO.setApp_key(fuluAppKey);
+        fuluDTO.setMethod(fuluCommonApiDTO.getMethod());
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        fuluDTO.setTimestamp(simpleDateFormat.format(new Date()));
+        fuluDTO.setVersion("2.0");
+        fuluDTO.setFormat("json");
+        fuluDTO.setCharset("utf-8");
+        fuluDTO.setSign_type("md5");
+        fuluDTO.setApp_auth_token("");
+        fuluDTO.setBiz_content(fuluCommonApiDTO.getBiz_content());
+        String str = JSONObject.toJSONString(fuluDTO);
+        char[] s = str.toCharArray();
+        Arrays.sort(s);
+        String outputSignOriginalStr = new String(s) + fuluAppSecret;
+        String sign = MD5Utils.MD5Encode(outputSignOriginalStr);
+        fuluDTO.setSign(sign);
+    }
+
+    @Override
+    public void buyFilmOrder(WxOrder wxOrder) {
+        String orderDataJson = wxOrder.getOrderDataJson();
+        FilmWxOrderJsonData wxOrderJsonData = JSONObject.parseObject(orderDataJson, FilmWxOrderJsonData.class);
+        if (wxOrderJsonData != null && wxOrderJsonData.getWxOrderNotifyDTO() == null){
+            threadPoolTaskExecutor.execute(new Runnable() {
+                @Override
+                public void run() {
+                    WxOrderCreateDTO wxOrderCreateDTO = wxOrderJsonData.getWxOrderCreateDTO();
+                    FilmDTO filmDTO = new FilmDTO();
+                    if (wxOrderCreateDTO.getTicketType() ==1){
+                        filmDTO.setUrl("api/order/create");
+                    }else if (wxOrderCreateDTO.getTicketType() ==2){
+                        filmDTO.setUrl("api/order/create-soon-order");
+                    }
+
+                    StringBuffer paramData =  new StringBuffer();
+                    paramData.append("showId="+wxOrderCreateDTO.getShowId()+"&");
+                    paramData.append("seat="+wxOrderCreateDTO.getSeat()+"&");
+                    if (wxOrderCreateDTO.getReservedPhone() != null){
+                        paramData.append("reservedPhone="+wxOrderCreateDTO.getReservedPhone()+"&");
+                    }
+                    paramData.append("thirdOrderId="+wxOrderCreateDTO.getThirdOrderId()+"&");
+                    paramData.append("notifyUrl="+notifyUrl+"&");
+                    if (wxOrderCreateDTO.getSeatId() != null){
+                        paramData.append("seatId="+wxOrderCreateDTO.getSeatId()+"&");
+                    }
+                    if (wxOrderCreateDTO.getSeatNo() != null){
+                        paramData.append("seatNo="+wxOrderCreateDTO.getSeatNo()+"&");
+                    }
+                    paramData.append("acceptChangeSeat="+wxOrderCreateDTO.getAcceptChangeSeat());
+                    filmDTO.setParamData(paramData.toString());
+
+                    String s = excuteFilmApi(filmDTO);
+                    log.info("电影下单返回值:"+s);
+                    FilmXdResult filmXdResult = JSONObject.parseObject(s, FilmXdResult.class);
+                    //如果返回值不是200 ,则调用退款流程
+                    if (filmXdResult.getCode()!=200){
+                        String refundCode = getOrderCode(null);
+                        wxOrder.setOutRefundNo(refundCode);
+                        try {
+                            refundRecordService.refund(wxOrder,refundCode);
+                        } catch (Exception e) {
+                            throw new CustomException("退款失败");
+                        }
+                    }else {
+                        if (filmXdResult.getData().getTicket()!= null){
+                            FilmMcpData filmMcpData = filmXdResult.getData();
+                            wxOrderJsonData.setFilmMcpData(filmMcpData);
+                            wxOrder.setOrderDataJson(JSONObject.toJSONString(wxOrderJsonData));
+
+                        }
+                    }
+
+
+                    updateById(wxOrder);
+
+                }
+            });
+        }
+
+    }
+
+    @Override
+    public void buyFuluOrder(WxOrder wxOrder) {
+        String orderDataJson = wxOrder.getOrderDataJson();
+        FuluWxOrderJsonData wxOrderJsonData = JSONObject.parseObject(orderDataJson, FuluWxOrderJsonData.class);
+        if (wxOrderJsonData != null && wxOrderJsonData.getWxFuluOrderDetailDTO()== null){
+            threadPoolTaskExecutor.execute(new Runnable() {
+                @Override
+                public void run() {
+                    WxOrderCreateFuluDTO wxOrderCreateDTO = wxOrderJsonData.getWxOrderCreateDTO();
+                    //调用福禄下单接口
+                    FuluDTO fuluDTO = new FuluDTO();
+                    FuluCommonApiDTO fuluCommonApiDTO = new FuluCommonApiDTO();
+                    fuluCommonApiDTO.setMethod("fulu.order.direct.add");
+                    JSONObject jsonObject = new JSONObject();
+                    jsonObject.put("product_id",wxOrderCreateDTO.getProduct_id());
+                    jsonObject.put("customer_order_no",wxOrderCreateDTO.getCustomer_order_no());
+                    jsonObject.put("charge_account",wxOrderCreateDTO.getCharge_account());
+                    jsonObject.put("buy_num",wxOrderCreateDTO.getBuy_num());
+                    fuluCommonApiDTO.setBiz_content(jsonObject.toJSONString());
+                    FuluResult fuluResult = fuluService.fuluCommonApi(fuluDTO);
+                    log.info("福禄下单返回值:"+JSONObject.toJSONString(fuluResult));
+                    //如果返回值不是200 ,则调用退款流程
+                    if (fuluResult.getCode() != 0){
+                        String refundCode = getOrderCode(null);
+                        wxOrder.setOutRefundNo(refundCode);
+                        try {
+                            refundRecordService.refund(wxOrder,refundCode);
+                        } catch (Exception e) {
+                            throw new CustomException("退款失败");
+                        }
+                    }
+                    //返回成功,则保存返回福禄订单详情到微信订单json传中
+                    WxFuluOrderDetailDTO wxFuluOrderDetailDTO = JSONObject.parseObject(fuluResult.getResult(),WxFuluOrderDetailDTO.class);
+                    wxOrderJsonData.setWxFuluOrderDetailDTO(wxFuluOrderDetailDTO);
+                    wxOrder.setOrderDataJson(wxOrderJsonData.toString());
+                    updateById(wxOrder);
+                }
+            });
+        }
+
+    }
 }