Althars123 3 năm trước cách đây
mục cha
commit
7b607d6cf9

+ 3 - 2
zzjs-admin/src/main/java/com/miaxis/app/controller/film/FilmController.java

@@ -128,8 +128,8 @@ public class FilmController extends BaseController {
         String orderCode = getOrderCode(id);
         order.setOutTradeNo(orderCode);
         order.setOpenid(student.getOpenid());
-        dictDataService.selectDictLabel("goods_type",filmOrderCreateDTO.getGoodsType());
-        order.setGoodsType(filmOrderCreateDTO.getGoodsType());
+        String goodsName = dictDataService.selectDictLabel("goods_type", filmOrderCreateDTO.getGoodsType());
+        order.setGoodsType(goodsName);
         order.setGoodsPictureUrl(filmOrderCreateDTO.getGoodsPictureUrl());
         FilmOrderJsonData filmOrderJsonData = new FilmOrderJsonData();
         filmOrderCreateDTO.setThirdOrderId(orderCode);
@@ -209,6 +209,7 @@ public class FilmController extends BaseController {
         JSONObject  data = jsonObject.getJSONObject("data");
         JSONObject  discountRule = data.getJSONObject("discountRule");
         JSONArray list = data.getJSONArray("list");
+        log.info(list.toJSONString());
         List<CinemaData> cinemaData = list.toJavaList(CinemaData.class);
         List<CinemaData> listdata = cinemaData.stream().filter(a -> showId.equals(a.getShowId())).collect(Collectors.toList());
         CinemaData realCinemaData = listdata.get(0);

+ 32 - 10
zzjs-admin/src/main/java/com/miaxis/app/controller/film/NotifyController.java

@@ -5,15 +5,15 @@ 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.FilmOrderCreateDTO;
-import com.miaxis.film.dto.FilmOrderJsonData;
-import com.miaxis.film.dto.FilmOrderNotifyDTO;
-import com.miaxis.film.dto.FilmWxpayDTO;
+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;
@@ -37,6 +37,8 @@ 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")
@@ -55,6 +57,10 @@ public class NotifyController {
     @Autowired
     private ThreadPoolTaskExecutor threadPoolTaskExecutor;
 
+    @Autowired
+    private  IRefundRecordService  refundRecordService;
+
+
     @Value("${film.notifyUrl}")
     private  String notifyUrl ;
 
@@ -63,7 +69,7 @@ public class NotifyController {
      */
     @PostMapping(value = "/wxpay")
     @ApiOperation("微信支付回调")
-    public WxNotifyReturnDTO wxpayNotify(@RequestBody FilmWxpayDTO filmWxpayDTO,HttpServletRequest request) throws GeneralSecurityException, IOException {
+    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());
@@ -108,9 +114,28 @@ public class NotifyController {
         }
         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("请求成功");
@@ -215,11 +240,8 @@ public class NotifyController {
 
         filmOrderService.updateById(filmOrder);
     }
-    @Data
-    public class WxNotifyReturnDTO {
-        String code;
-        String message;
-    }
+
+
 
     @Data
     public class FilmNotifyReturnDTO {

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

@@ -105,6 +105,7 @@ cos:
 # 微信支付
 wxpay:
     v3url: https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi
+    v3urlRefund: https://api.mch.weixin.qq.com/v3/refund/domestic/refunds
     merchantId: 1608699504
     serialNumber: 487159E168001CDBA0EFE2C988249A84023AD6CC
     v3key: qqwweerrttyyuuiioopp123456789000

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

@@ -105,6 +105,7 @@ cos:
 # 微信支付
 wxpay:
     v3url: https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi
+    v3urlRefund: https://api.mch.weixin.qq.com/v3/refund/domestic/refunds
     merchantId: 1608699504
     serialNumber: 487159E168001CDBA0EFE2C988249A84023AD6CC
     v3key: qqwweerrttyyuuiioopp123456789000

+ 10 - 1
zzjs-admin/src/test/java/com/miaxis/test/NormalTest.java

@@ -1,18 +1,27 @@
 package com.miaxis.test;
 
 import com.miaxis.ZzjsApplication;
+import com.miaxis.film.domain.FilmOrder;
+import com.miaxis.film.service.IFilmOrderService;
+import com.miaxis.film.service.IRefundRecordService;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
 @SpringBootTest(classes = ZzjsApplication.class)
 @RunWith(SpringRunner.class)
 public class NormalTest {
+    @Autowired
+    private IFilmOrderService filmOrderService;
 
+    @Autowired
+    private IRefundRecordService refundRecordService;
     @Test
     public void test1() throws Exception {
-
+        FilmOrder filmOrder = filmOrderService.getByOutTradeNo("12021051815555556348172644409486");
+        refundRecordService.refund(filmOrder,"12021051815333778448136985596487");
     }
 
 

+ 2 - 0
zzjs-common/src/main/java/com/miaxis/common/config/WxpayConfig.java

@@ -10,7 +10,9 @@ import org.springframework.stereotype.Component;
 public class WxpayConfig {
 
     private String v3url;
+    private String v3urlRefund;
     private String merchantId;
     private String serialNumber;
     private String v3key;
+
 }

+ 117 - 0
zzjs-service/src/main/java/com/miaxis/film/controller/RefundRecordController.java

@@ -0,0 +1,117 @@
+package com.miaxis.film.controller;
+
+import com.miaxis.common.constant.Constants;
+import java.util.List;
+import java.util.Arrays;
+import io.swagger.annotations.*;
+import com.miaxis.common.core.domain.Response;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import com.miaxis.common.annotation.Log;
+import com.miaxis.common.core.controller.BaseController;
+import com.miaxis.common.enums.BusinessTypeEnum;
+import com.miaxis.film.domain.RefundRecord;
+import com.miaxis.film.service.IRefundRecordService;
+import com.miaxis.common.utils.poi.ExcelUtil;
+import com.miaxis.common.core.page.ResponsePageInfo;
+
+/**
+ * 【微信退款记录】Controller
+ *
+ * @author miaxis
+ * @date 2021-05-18
+ */
+@RestController
+@RequestMapping("/film/record")
+@Api(tags={"【小程序-微信退款记录】"})
+public class RefundRecordController extends BaseController{
+    @Autowired
+    private IRefundRecordService refundRecordService;
+
+    /**
+     * 查询微信退款记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('film:record:list')")
+    @GetMapping("/list")
+    @ApiOperation("查询微信退款记录列表")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNum",value = "当前页码" ,dataType = "int", paramType = "query", required = false),
+            @ApiImplicitParam(name = "pageSize",value = "每页数据量" , dataType = "int", paramType = "query", required = false),
+    })
+    public ResponsePageInfo<RefundRecord> list(@ModelAttribute RefundRecord refundRecord){
+        startPage();
+        List<RefundRecord> list = refundRecordService.selectRefundRecordList(refundRecord);
+        return toResponsePageInfo(list);
+    }
+
+    /**
+     * 导出微信退款记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('film:record:export')")
+    @Log(title = "微信退款记录", businessType = BusinessTypeEnum.EXPORT)
+    @GetMapping("/export")
+    @ApiOperation("导出微信退款记录列表Excel")
+    public Response<String> export(@ModelAttribute RefundRecord refundRecord){
+        List<RefundRecord> list = refundRecordService.selectRefundRecordList(refundRecord);
+        ExcelUtil<RefundRecord> util = new ExcelUtil<RefundRecord>(RefundRecord.class);
+        return util.exportExcel(list, "record");
+    }
+
+    /**
+     * 获取微信退款记录详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('film:record:query')")
+    @GetMapping(value = "/{id}")
+    @ApiOperation("获取微信退款记录详细信息")
+    public Response<RefundRecord> getInfo(
+            @ApiParam(name = "id", value = "微信退款记录参数", required = true)
+            @PathVariable("id") Long id
+    ){
+        return Response.success(refundRecordService.getById(id));
+    }
+
+    /**
+     * 新增微信退款记录
+     */
+    @PreAuthorize("@ss.hasPermi('film:record:add')")
+    @Log(title = "微信退款记录", businessType = BusinessTypeEnum.INSERT)
+    @PostMapping
+    @ApiOperation("新增微信退款记录")
+    public Response<Integer> add(@RequestBody RefundRecord refundRecord){
+        return toResponse(refundRecordService.save(refundRecord) ? 1 : 0);
+    }
+
+    /**
+     * 修改微信退款记录
+     */
+    @PreAuthorize("@ss.hasPermi('film:record:edit')")
+    @Log(title = "微信退款记录", businessType = BusinessTypeEnum.UPDATE)
+    @PutMapping
+    @ApiOperation("修改微信退款记录")
+    public Response<Integer> edit(@RequestBody RefundRecord refundRecord){
+        return toResponse(refundRecordService.updateById(refundRecord) ? 1 : 0);
+    }
+
+    /**
+     * 删除微信退款记录
+     */
+    @PreAuthorize("@ss.hasPermi('film:record:remove')")
+    @Log(title = "微信退款记录", businessType = BusinessTypeEnum.DELETE)
+	@DeleteMapping("/{ids}")
+    @ApiOperation("删除微信退款记录")
+    public  Response<Integer> remove(
+            @ApiParam(name = "ids", value = "微信退款记录ids参数", required = true)
+            @PathVariable Long[] ids
+    ){
+        return toResponse(refundRecordService.removeByIds(Arrays.asList(ids)) ? 1 : 0);
+    }
+}

+ 6 - 0
zzjs-service/src/main/java/com/miaxis/film/domain/FilmOrder.java

@@ -34,6 +34,12 @@ public class FilmOrder extends BaseBusinessEntity{
     @ApiModelProperty(value = "商户订单号")
     private String outTradeNo;
 
+    /** 退款单号 */
+    @Excel(name = "退款单号")
+    @TableField("out_refund_no")
+    @ApiModelProperty(value = "退款单号")
+    private String outRefundNo;
+
     /** 微信支付系统生成的订单号 */
     @Excel(name = "微信支付系统生成的订单号")
     @TableField("transaction_id")

+ 143 - 0
zzjs-service/src/main/java/com/miaxis/film/domain/RefundRecord.java

@@ -0,0 +1,143 @@
+package com.miaxis.film.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.miaxis.common.annotation.Excel;
+import com.miaxis.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.miaxis.common.core.domain.BaseBusinessEntity;
+import lombok.Data;
+/**
+ * 微信退款记录对象 refund_record
+ *
+ * @author miaxis
+ * @date 2021-05-18
+ */
+@Data
+@TableName("refund_record")
+@ApiModel(value = "RefundRecord", description = "微信退款记录对象 refund_record")
+public class RefundRecord extends BaseBusinessEntity{
+    private static final long serialVersionUID = 1L;
+
+    /** 记录id */
+    @TableId(value = "id")
+    @ApiModelProperty(value = "记录id")
+    private Long id;
+
+    /** 微信支付退款号 */
+    @Excel(name = "微信支付退款号")
+    @TableField("refund_id")
+    @ApiModelProperty(value = "微信支付退款号")
+    private String refundId;
+
+    /** 退款单号 */
+    @Excel(name = "退款单号")
+    @TableField("out_refund_no")
+    @ApiModelProperty(value = "退款单号")
+    private String outRefundNo;
+
+    /** 微信支付订单号 */
+    @Excel(name = "微信支付订单号")
+    @TableField("transaction_id")
+    @ApiModelProperty(value = "微信支付订单号")
+    private String transactionId;
+
+    /** 商户订单号 */
+    @Excel(name = "商户订单号")
+    @TableField("out_trade_no")
+    @ApiModelProperty(value = "商户订单号")
+    private String outTradeNo;
+
+    /** 枚举值:
+ORIGINAL:原路退款
+BALANCE:退回到余额
+OTHER_BALANCE:原账户异常退到其他余额账户
+OTHER_BANKCARD:原银行卡异常退到其他银行卡
+示例值:ORIGINAL */
+    @Excel(name = "枚举值: ORIGINAL:原路退款 BALANCE:退回到余额 OTHER_BALANCE:原账户异常退到其他余额账户 OTHER_BANKCARD:原银行卡异常退到其他银行卡 示例值:ORIGINAL")
+    @TableField("channel")
+    @ApiModelProperty(value = "枚举值: ORIGINAL:原路退款 BALANCE:退回到余额 OTHER_BALANCE:原账户异常退到其他余额账户 OTHER_BANKCARD:原银行卡异常退到其他银行卡 示例值:ORIGINAL")
+    private String channel;
+
+    /** 退款入账账户 */
+    @Excel(name = "退款入账账户")
+    @TableField("user_received_account")
+    @ApiModelProperty(value = "退款入账账户")
+    private String userReceivedAccount;
+
+    /** 退款成功时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "退款成功时间", width = 30, dateFormat = "yyyy-MM-dd")
+    @TableField("success_time")
+    @ApiModelProperty(value = "退款成功时间")
+    private Date successTime;
+
+    /** 退款状态枚举值:SUCCESS:退款成功CLOSED:退款关闭PROCESSING:退款处理中ABNORMAL:退款异常 */
+    @Excel(name = "退款状态 枚举值: SUCCESS:退款成功 CLOSED:退款关闭 PROCESSING:退款处理中 ABNORMAL:退款异常")
+    @TableField("status")
+    @ApiModelProperty(value = "退款状态 枚举值: SUCCESS:退款成功 CLOSED:退款关闭 PROCESSING:退款处理中 ABNORMAL:退款异常")
+    private String status;
+
+    /** 资金账户 */
+    @Excel(name = "资金账户")
+    @TableField("funds_account")
+    @ApiModelProperty(value = "资金账户")
+    private String fundsAccount;
+
+    /** 订单总金额,单位为分。
+示例值:100 */
+    @Excel(name = "订单总金额,单位为分。 示例值:100")
+    @TableField("total")
+    @ApiModelProperty(value = "订单总金额,单位为分。 示例值:100")
+    private Long total;
+
+    /** 退款标价金额,单位为分 */
+    @Excel(name = "退款标价金额,单位为分")
+    @TableField("refund")
+    @ApiModelProperty(value = "退款标价金额,单位为分")
+    private Long refund;
+
+    /** 现金支付金额 */
+    @Excel(name = "现金支付金额")
+    @TableField("payer_total")
+    @ApiModelProperty(value = "现金支付金额")
+    private Long payerTotal;
+
+    /** 退款给用户的金额,不包含所有优惠券金额 */
+    @Excel(name = "退款给用户的金额,不包含所有优惠券金额")
+    @TableField("payer_refund")
+    @ApiModelProperty(value = "退款给用户的金额,不包含所有优惠券金额")
+    private Long payerRefund;
+
+    /** 去掉非充值代金券退款金额后的退款金额 */
+    @Excel(name = "去掉非充值代金券退款金额后的退款金额")
+    @TableField("settlement_refund")
+    @ApiModelProperty(value = "去掉非充值代金券退款金额后的退款金额")
+    private Long settlementRefund;
+
+    /** 应结订单金额=订单金额-免充值代金券金额 */
+    @Excel(name = "应结订单金额=订单金额-免充值代金券金额")
+    @TableField("settlement_total")
+    @ApiModelProperty(value = "应结订单金额=订单金额-免充值代金券金额")
+    private Long settlementTotal;
+
+    /** 优惠退款金额&lt;=退款金额,退款金额-代金券或立减优惠退款金额为现金,说明详见 */
+    @Excel(name = "优惠退款金额&lt;=退款金额,退款金额-代金券或立减优惠退款金额为现金,说明详见")
+    @TableField("discount_refund")
+    @ApiModelProperty(value = "优惠退款金额&lt;=退款金额,退款金额-代金券或立减优惠退款金额为现金,说明详见")
+    private Long discountRefund;
+
+    /** 符合ISO 4217标准的三位字母代码,目前只支持人民币:CNY。 */
+    @Excel(name = "符合ISO 4217标准的三位字母代码,目前只支持人民币:CNY。")
+    @TableField("currency")
+    @ApiModelProperty(value = "符合ISO 4217标准的三位字母代码,目前只支持人民币:CNY。")
+    private String currency;
+
+}

+ 50 - 0
zzjs-service/src/main/java/com/miaxis/film/dto/FilmWxpayRefundDTO.java

@@ -0,0 +1,50 @@
+package com.miaxis.film.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 微信支付退款 dto
+ */
+@Data
+public class FilmWxpayRefundDTO {
+    private static final long serialVersionUID = 1L;
+
+
+    @ApiModelProperty(value = "商户订单号")
+    private String out_trade_no;
+
+    @ApiModelProperty(value = "商户系统内部的退款单号")
+    private String out_refund_no;
+
+
+    @ApiModelProperty(value = "原因")
+    private String reason;
+
+
+    @ApiModelProperty(value = "是否允许调座,1-允许,0-不允许")
+    private WxpaySource resource;
+
+    @ApiModelProperty(value = "回调摘要")
+    private String summary;
+
+
+    @Data
+    public class WxpaySource{
+        @ApiModelProperty(value = "对开启结果数据进行加密的加密算法,目前只支持AEAD_AES_256_GCM")
+        private String algorithm;
+        @ApiModelProperty(value = "Base64编码后的开启/停用结果数据密文")
+        private String ciphertext;
+        @ApiModelProperty(value = "附加数据")
+        private String associated_data;
+        @ApiModelProperty(value = "原始回调类型,为transaction")
+        private String original_type;
+        @ApiModelProperty(value = "加密使用的随机串")
+        private String nonce;
+
+
+    }
+
+
+
+}

+ 9 - 0
zzjs-service/src/main/java/com/miaxis/film/dto/WxNotifyReturnDTO.java

@@ -0,0 +1,9 @@
+package com.miaxis.film.dto;
+
+import lombok.Data;
+
+@Data
+public class WxNotifyReturnDTO {
+    String code;
+    String message;
+}

+ 22 - 0
zzjs-service/src/main/java/com/miaxis/film/mapper/RefundRecordMapper.java

@@ -0,0 +1,22 @@
+package com.miaxis.film.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.miaxis.film.domain.RefundRecord;
+
+/**
+ * 微信退款记录Mapper接口
+ *
+ * @author miaxis
+ * @date 2021-05-18
+ */
+public interface RefundRecordMapper extends BaseMapper<RefundRecord> {
+    /**
+     * 查询微信退款记录列表
+     *
+     * @param refundRecord 微信退款记录
+     * @return 微信退款记录集合
+     */
+    public List<RefundRecord> selectRefundRecordList(RefundRecord refundRecord);
+
+}

+ 2 - 0
zzjs-service/src/main/java/com/miaxis/film/service/IFilmOrderService.java

@@ -28,4 +28,6 @@ public interface IFilmOrderService extends IService<FilmOrder>{
     String excuteFilmApi(FilmDTO filmDTO) ;
 
     List<FilmOrder> selectOrderList(FilmOrderListDTO filmOrderListDTO);
+
+
 }

+ 26 - 0
zzjs-service/src/main/java/com/miaxis/film/service/IRefundRecordService.java

@@ -0,0 +1,26 @@
+package com.miaxis.film.service;
+
+import java.util.List;
+
+import com.miaxis.film.domain.FilmOrder;
+import com.miaxis.film.domain.RefundRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.miaxis.film.dto.WxNotifyReturnDTO;
+
+/**
+ * 微信退款记录Service接口
+ *
+ * @author miaxis
+ * @date 2021-05-18
+ */
+public interface IRefundRecordService extends IService<RefundRecord>{
+    /**
+     * 查询微信退款记录列表
+     *
+     * @param refundRecord 微信退款记录
+     * @return 微信退款记录集合
+     */
+    public List<RefundRecord> selectRefundRecordList(RefundRecord refundRecord);
+
+    WxNotifyReturnDTO refund(FilmOrder filmOrder, String refundCode) throws Exception;
+}

+ 3 - 0
zzjs-service/src/main/java/com/miaxis/film/service/impl/FilmOrderServiceImpl.java

@@ -16,6 +16,7 @@ import com.miaxis.feign.dto.FilmDTO;
 import com.miaxis.film.dto.FilmOrderListDTO;
 import org.apache.http.HttpResponse;
 import org.apache.http.HttpStatus;
+import org.apache.http.client.HttpClient;
 import org.apache.http.client.entity.UrlEncodedFormEntity;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.impl.client.CloseableHttpClient;
@@ -55,6 +56,8 @@ public class FilmOrderServiceImpl extends ServiceImpl<FilmOrderMapper, FilmOrder
     private  String v2Url ;
 
 
+
+
     /**
      * 查询电影订单列表
      *

+ 87 - 0
zzjs-service/src/main/java/com/miaxis/film/service/impl/RefundRecordServiceImpl.java

@@ -0,0 +1,87 @@
+package com.miaxis.film.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.miaxis.common.config.WxpayConfig;
+import com.miaxis.common.exception.CustomException;
+import com.miaxis.film.domain.FilmOrder;
+import com.miaxis.film.domain.RefundRecord;
+import com.miaxis.film.dto.WxNotifyReturnDTO;
+import com.miaxis.film.mapper.RefundRecordMapper;
+import com.miaxis.film.service.IRefundRecordService;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.ByteArrayOutputStream;
+import java.util.List;
+
+/**
+ * 微信退款记录Service业务层处理
+ *
+ * @author miaxis
+ * @date 2021-05-18
+ */
+@Service
+public class RefundRecordServiceImpl extends ServiceImpl<RefundRecordMapper, RefundRecord> implements IRefundRecordService {
+    @Resource
+    private RefundRecordMapper refundRecordMapper;
+
+    @Autowired
+    private HttpClient httpClient;
+
+
+    @Autowired
+    private WxpayConfig wxpayConfig;
+    /**
+     * 查询微信退款记录列表
+     *
+     * @param refundRecord 微信退款记录
+     * @return 微信退款记录
+     */
+    @Override
+    public List<RefundRecord> selectRefundRecordList(RefundRecord refundRecord){
+        return refundRecordMapper.selectRefundRecordList(refundRecord);
+    }
+
+    @Override
+    public WxNotifyReturnDTO refund(FilmOrder filmOrder, String refundCode) throws Exception{
+        HttpPost httpPost = new HttpPost(wxpayConfig.getV3urlRefund());
+        httpPost.addHeader("Accept", "application/json");
+        httpPost.addHeader("Content-type","application/json; charset=utf-8");
+        ObjectMapper objectMapper = new ObjectMapper();
+        ObjectNode rootNode = objectMapper.createObjectNode();
+
+        rootNode.put("out_trade_no", filmOrder.getOutTradeNo())
+                .put("out_refund_no", refundCode)
+                .put("reason", "电影购票失败");
+        rootNode.putObject("amount")
+                .put("refund", filmOrder.getTotal())
+                .put("total", filmOrder.getTotal())
+                .put("currency", filmOrder.getCurrency());
+        System.out.println(rootNode.toString());
+//        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+//        objectMapper.writeValue(bos, rootNode);
+        httpPost.setEntity(new StringEntity(rootNode.toString()));
+        HttpResponse response = httpClient.execute(httpPost);
+        // 返回数据:
+        String bodyAsString = EntityUtils.toString(response.getEntity());
+        if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
+            //to-do  保存数据到数据库
+            WxNotifyReturnDTO wxNotifyReturnDTO = new WxNotifyReturnDTO();
+            wxNotifyReturnDTO.setCode("SUCCESS");
+            wxNotifyReturnDTO.setMessage("成功");
+            return wxNotifyReturnDTO;
+        }else{
+            throw new CustomException(bodyAsString);
+        }
+
+    }
+}

+ 57 - 0
zzjs-service/src/main/resources/mapper/film/RefundRecordMapper.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.miaxis.film.mapper.RefundRecordMapper">
+
+    <resultMap type="RefundRecord" id="RefundRecordResult">
+        <result property="id"    column="id"    />
+        <result property="refundId"    column="refund_id"    />
+        <result property="outRefundNo"    column="out_refund_no"    />
+        <result property="transactionId"    column="transaction_id"    />
+        <result property="outTradeNo"    column="out_trade_no"    />
+        <result property="channel"    column="channel"    />
+        <result property="userReceivedAccount"    column="user_received_account"    />
+        <result property="successTime"    column="success_time"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="status"    column="status"    />
+        <result property="fundsAccount"    column="funds_account"    />
+        <result property="total"    column="total"    />
+        <result property="refund"    column="refund"    />
+        <result property="payerTotal"    column="payer_total"    />
+        <result property="payerRefund"    column="payer_refund"    />
+        <result property="settlementRefund"    column="settlement_refund"    />
+        <result property="settlementTotal"    column="settlement_total"    />
+        <result property="discountRefund"    column="discount_refund"    />
+        <result property="currency"    column="currency"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectRefundRecordVo">
+        select * from refund_record
+    </sql>
+
+    <select id="selectRefundRecordList" parameterType="RefundRecord" resultMap="RefundRecordResult">
+        <include refid="selectRefundRecordVo"/>
+        <where>
+            <if test="refundId != null  and refundId != ''"> and refund_id = #{refundId}</if>
+            <if test="outRefundNo != null  and outRefundNo != ''"> and out_refund_no = #{outRefundNo}</if>
+            <if test="transactionId != null  and transactionId != ''"> and transaction_id = #{transactionId}</if>
+            <if test="outTradeNo != null  and outTradeNo != ''"> and out_trade_no = #{outTradeNo}</if>
+            <if test="channel != null  and channel != ''"> and channel = #{channel}</if>
+            <if test="userReceivedAccount != null  and userReceivedAccount != ''"> and user_received_account = #{userReceivedAccount}</if>
+            <if test="successTime != null "> and success_time = #{successTime}</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+            <if test="fundsAccount != null  and fundsAccount != ''"> and funds_account = #{fundsAccount}</if>
+            <if test="total != null "> and total = #{total}</if>
+            <if test="refund != null "> and refund = #{refund}</if>
+            <if test="payerTotal != null "> and payer_total = #{payerTotal}</if>
+            <if test="payerRefund != null "> and payer_refund = #{payerRefund}</if>
+            <if test="settlementRefund != null "> and settlement_refund = #{settlementRefund}</if>
+            <if test="settlementTotal != null "> and settlement_total = #{settlementTotal}</if>
+            <if test="discountRefund != null "> and discount_refund = #{discountRefund}</if>
+            <if test="currency != null  and currency != ''"> and currency = #{currency}</if>
+        </where>
+    </select>
+
+</mapper>