Althars123 před 3 roky
rodič
revize
90a234d5c5
56 změnil soubory, kde provedl 2181 přidání a 1 odebrání
  1. 205 0
      jkt-admin/src/main/java/com/miaxis/app/controller/wx/WxController.java
  2. 239 0
      jkt-admin/src/main/java/com/miaxis/app/controller/wx/WxNotifyController.java
  3. 12 1
      jkt-admin/src/main/resources/application-dev.yml
  4. 11 0
      jkt-admin/src/main/resources/application-prod.yml
  5. binární
      jkt-admin/src/main/resources/wechatpay/apiclient_cert.p12
  6. 24 0
      jkt-admin/src/main/resources/wechatpay/apiclient_cert.pem
  7. 28 0
      jkt-admin/src/main/resources/wechatpay/apiclient_key.pem
  8. 55 0
      jkt-common/src/main/java/com/miaxis/common/config/BeanConfig.java
  9. 37 0
      jkt-common/src/main/java/com/miaxis/common/config/WxVerifierConfig.java
  10. 22 0
      jkt-common/src/main/java/com/miaxis/common/config/WxpayConfig.java
  11. 15 0
      jkt-service/src/main/java/com/miaxis/feign/dto/AddTemplate.java
  12. 15 0
      jkt-service/src/main/java/com/miaxis/feign/dto/Ai.java
  13. 11 0
      jkt-service/src/main/java/com/miaxis/feign/dto/Film.java
  14. 13 0
      jkt-service/src/main/java/com/miaxis/feign/dto/FilmDTO.java
  15. 17 0
      jkt-service/src/main/java/com/miaxis/feign/dto/FilmMcpData.java
  16. 11 0
      jkt-service/src/main/java/com/miaxis/feign/dto/FilmResult.java
  17. 16 0
      jkt-service/src/main/java/com/miaxis/feign/dto/FilmXdResult.java
  18. 18 0
      jkt-service/src/main/java/com/miaxis/feign/dto/Mei.java
  19. 25 0
      jkt-service/src/main/java/com/miaxis/feign/dto/Pdd.java
  20. 17 0
      jkt-service/src/main/java/com/miaxis/feign/dto/PddResult.java
  21. 18 0
      jkt-service/src/main/java/com/miaxis/feign/dto/TencentCosCommonParameters.java
  22. 13 0
      jkt-service/src/main/java/com/miaxis/feign/dto/Wa.java
  23. 13 0
      jkt-service/src/main/java/com/miaxis/feign/dto/WaResult.java
  24. 12 0
      jkt-service/src/main/java/com/miaxis/feign/dto/WaRetData.java
  25. 11 0
      jkt-service/src/main/java/com/miaxis/feign/dto/WxGzhMini.java
  26. 16 0
      jkt-service/src/main/java/com/miaxis/feign/dto/WxGzhSend.java
  27. 17 0
      jkt-service/src/main/java/com/miaxis/feign/dto/WxSend.java
  28. 18 0
      jkt-service/src/main/java/com/miaxis/feign/dto/fulu/FuluCommonApiDTO.java
  29. 26 0
      jkt-service/src/main/java/com/miaxis/feign/dto/fulu/FuluDTO.java
  30. 23 0
      jkt-service/src/main/java/com/miaxis/feign/dto/fulu/FuluGoodsInfo.java
  31. 20 0
      jkt-service/src/main/java/com/miaxis/feign/dto/fulu/FuluResult.java
  32. 40 0
      jkt-service/src/main/java/com/miaxis/feign/service/IWxSendService.java
  33. 22 0
      jkt-service/src/main/java/com/miaxis/feign/utils/FeignUtils.java
  34. 141 0
      jkt-service/src/main/java/com/miaxis/wx/domain/RefundRecord.java
  35. 166 0
      jkt-service/src/main/java/com/miaxis/wx/domain/WxOrder.java
  36. 10 0
      jkt-service/src/main/java/com/miaxis/wx/dto/AiOrderNotifyDTO.java
  37. 27 0
      jkt-service/src/main/java/com/miaxis/wx/dto/CinemaData.java
  38. 28 0
      jkt-service/src/main/java/com/miaxis/wx/dto/FilmWxOrderJsonData.java
  39. 50 0
      jkt-service/src/main/java/com/miaxis/wx/dto/FilmWxpayRefundDTO.java
  40. 22 0
      jkt-service/src/main/java/com/miaxis/wx/dto/FuluWxOrderJsonData.java
  41. 46 0
      jkt-service/src/main/java/com/miaxis/wx/dto/PcWxOrderListDTO.java
  42. 70 0
      jkt-service/src/main/java/com/miaxis/wx/dto/WxFuluOrderDetailDTO.java
  43. 55 0
      jkt-service/src/main/java/com/miaxis/wx/dto/WxFuluOrderNotifyDTO.java
  44. 9 0
      jkt-service/src/main/java/com/miaxis/wx/dto/WxNotifyReturnDTO.java
  45. 53 0
      jkt-service/src/main/java/com/miaxis/wx/dto/WxOrderCreateDTO.java
  46. 31 0
      jkt-service/src/main/java/com/miaxis/wx/dto/WxOrderCreateFuluDTO.java
  47. 28 0
      jkt-service/src/main/java/com/miaxis/wx/dto/WxOrderCreatePhoneBillDTO.java
  48. 26 0
      jkt-service/src/main/java/com/miaxis/wx/dto/WxOrderListDTO.java
  49. 55 0
      jkt-service/src/main/java/com/miaxis/wx/dto/WxOrderNotifyDTO.java
  50. 52 0
      jkt-service/src/main/java/com/miaxis/wx/dto/WxpayNotifyDTO.java
  51. 24 0
      jkt-service/src/main/java/com/miaxis/wx/mapper/RefundRecordMapper.java
  52. 30 0
      jkt-service/src/main/java/com/miaxis/wx/mapper/WxOrderMapper.java
  53. 28 0
      jkt-service/src/main/java/com/miaxis/wx/service/IRefundRecordService.java
  54. 23 0
      jkt-service/src/main/java/com/miaxis/wx/service/IWxOrderService.java
  55. 121 0
      jkt-service/src/main/java/com/miaxis/wx/service/impl/RefundRecordServiceImpl.java
  56. 46 0
      jkt-service/src/main/java/com/miaxis/wx/service/impl/WxOrderServiceImpl.java

+ 205 - 0
jkt-admin/src/main/java/com/miaxis/app/controller/wx/WxController.java

@@ -0,0 +1,205 @@
+package com.miaxis.app.controller.wx;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.miaxis.common.config.WxpayConfig;
+import com.miaxis.common.constant.Constants;
+import com.miaxis.common.core.controller.BaseController;
+import com.miaxis.common.core.domain.Response;
+import com.miaxis.common.core.domain.entity.UserInfo;
+import com.miaxis.common.core.page.ResponsePageInfo;
+import com.miaxis.common.exception.CustomException;
+import com.miaxis.common.utils.SecurityUtils;
+import com.miaxis.common.utils.uuid.CommonUtils;
+import com.miaxis.system.service.ISysDictDataService;
+import com.miaxis.wx.domain.WxOrder;
+import com.miaxis.wx.dto.WxOrderCreateDTO;
+import com.miaxis.wx.dto.WxOrderCreateFuluDTO;
+import com.miaxis.wx.dto.WxOrderCreatePhoneBillDTO;
+import com.miaxis.wx.dto.WxOrderListDTO;
+import com.miaxis.wx.service.IWxOrderService;
+import io.swagger.annotations.*;
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.http.HttpResponse;
+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.beans.factory.annotation.Value;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.security.PrivateKey;
+import java.security.Signature;
+import java.util.Base64;
+import java.util.List;
+
+import static com.miaxis.common.utils.OrderCodeFactory.getOrderCode;
+
+/**
+ * 【小程序-微信支付】Controller
+ *
+ * @author miaxis
+ * @date 2021-03-10
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(Constants.STUDENT_PREFIX+"/wx")
+@Api(tags = {"【小程序-微信支付】"})
+@Slf4j
+public class WxController extends BaseController {
+
+    @Autowired
+    private HttpClient httpClient;
+
+    @Autowired
+    private WxpayConfig wxpayConfig;
+
+    @Autowired
+    private IWxOrderService wxOrderService;
+
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    @Value("${app.appid}")
+    private String appid;
+    @Value("${wxpay.notifyUrl}")
+    private  String notifyUrl ;
+
+
+
+
+//
+//
+//    @GetMapping("/order/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<WxOrder> list(@ModelAttribute WxOrderListDTO wxOrderListDTO){
+//
+//        String openid = SecurityUtils.getLoginUser().getStudent().getOpenid();
+//        startPage();
+//        wxOrderListDTO.setOpenid(openid);
+//        List<WxOrder> list = wxOrderService.selectOrderList(wxOrderListDTO);
+//        return toResponsePageInfo(list);
+//    }
+
+    /**
+     * 微信支付获取预订单id
+     */
+    @PostMapping(value = "/prepareOrder")
+    @ApiOperation("微信支付下单")
+    public Response<WxParamEntity> getPrepareOrder() 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("1");
+        wxOrderService.createVipOrder(order);
+        wxOrderService.save(order);
+        return Response.success(placeWxOrder(order, "学车vip充值"));
+
+
+    }
+
+
+    //下单
+    private WxParamEntity 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", order.getOutTradeNo());
+        rootNode.putObject("amount")
+                .put("total", order.getTotal());
+        objectMapper.writeValue(bos, rootNode);
+        httpPost.setEntity(new StringEntity(rootNode.toString(), "utf-8"));
+        HttpResponse response = httpClient.execute(httpPost);
+        String bodyAsString = EntityUtils.toString(response.getEntity());
+        if (JSONObject.parseObject(bodyAsString).get("prepay_id") == null){
+            throw new CustomException(JSONObject.parseObject(bodyAsString).get("message").toString());
+        }
+        return getWxParamJson(bodyAsString,order.getOutTradeNo());
+
+    }
+
+    // 生成调用调起微信支付所需参数
+    private WxParamEntity getWxParamJson(String bodyAsString, String orderCode) throws Exception {
+        WxParamEntity wxParamEntity = new WxParamEntity();
+        wxParamEntity.setAppId(appid);
+        wxParamEntity.setPartnerId(wxpayConfig.getMerchantId());
+        String  prepayId = JSONObject.parseObject(bodyAsString).getString("prepay_id");
+        wxParamEntity.setPrepayId(prepayId);
+        wxParamEntity.setPackageValue("Sign=WXPay");
+        String nonce_str = RandomStringUtils.randomAlphanumeric(32);
+        wxParamEntity.setNonceStr(nonce_str);
+        String timestamp = String.valueOf(System.currentTimeMillis()/1000);
+        wxParamEntity.setTimeStamp(timestamp);
+
+        StringBuffer sb = new StringBuffer();
+        sb.append(appid + "\n");
+        sb.append(timestamp + "\n");
+        sb.append(nonce_str + "\n");
+        sb.append(prepayId+ "\n");
+
+
+        File file = new ClassPathResource("wechatpay/apiclient_key.pem").getFile();
+        String realPath =file.getAbsolutePath();
+        PrivateKey privateKey = CommonUtils.getPrivateKey(realPath);
+        // 进行签名服务
+        Signature signature = Signature.getInstance("SHA256withRSA");
+        signature.initSign(privateKey);
+        signature.update(sb.toString().getBytes("UTF-8"));
+        byte[] signedData = signature.sign();
+        String base64Str =  Base64.getEncoder().encodeToString(signedData);
+        wxParamEntity.setSign(base64Str);
+
+        return wxParamEntity;
+    }
+
+    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;
+    }
+
+    @Data
+    class  WxParamEntity{
+        String appId;
+        String partnerId;
+        String prepayId;
+        String packageValue;
+        String nonceStr;
+        String timeStamp;
+        String sign;
+
+    }
+
+
+
+
+
+
+
+
+
+
+}

+ 239 - 0
jkt-admin/src/main/java/com/miaxis/app/controller/wx/WxNotifyController.java

@@ -0,0 +1,239 @@
+package com.miaxis.app.controller.wx;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.miaxis.common.config.WxpayConfig;
+import com.miaxis.common.constant.Constants;
+import com.miaxis.common.exception.CustomException;
+import com.miaxis.common.utils.AesUtil;
+import com.miaxis.wx.domain.RefundRecord;
+import com.miaxis.wx.domain.WxOrder;
+import com.miaxis.wx.dto.WxNotifyReturnDTO;
+import com.miaxis.wx.dto.WxpayNotifyDTO;
+import com.miaxis.wx.service.IRefundRecordService;
+import com.miaxis.wx.service.IWxOrderService;
+import com.wechat.pay.contrib.apache.httpclient.auth.AutoUpdateCertificatesVerifier;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Base64Utils;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.security.*;
+import java.security.cert.X509Certificate;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(Constants.OPEN_PREFIX+"/wx/notify")
+@Api(tags = {"【小程序-微信回调】"})
+@Slf4j
+public class WxNotifyController {
+
+
+    @Autowired
+    private WxpayConfig wxpayConfig;
+
+
+    @Autowired
+    private IWxOrderService wxOrderService;
+
+
+
+    @Autowired
+    private  IRefundRecordService  refundRecordService;
+
+    @Autowired
+    private AutoUpdateCertificatesVerifier verifier;
+
+
+    /**
+     * 微信支付回调接口
+     */
+    @PostMapping(value = "/wxpay")
+    @ApiOperation("微信支付回调")
+    public WxNotifyReturnDTO wxpayNotify(@RequestBody WxpayNotifyDTO wxpayNotifyDTO, HttpServletRequest request) throws GeneralSecurityException, IOException {
+        String bodyString = getBodyString(request);
+        if (!validate(request,bodyString)){
+            throw new CustomException("签名失败");
+        }
+        String resourceString = getSourString(wxpayNotifyDTO);
+        log.info(resourceString);
+        JSONObject jsonObject = JSONObject.parseObject(resourceString);
+        //将回调数据写入数据库
+        writeNotifyDataToDb(jsonObject);
+
+        WxNotifyReturnDTO wxNotifyReturnDTO = new WxNotifyReturnDTO();
+        wxNotifyReturnDTO.setCode("SUCCESS");
+        wxNotifyReturnDTO.setMessage("成功");
+        return wxNotifyReturnDTO;
+    }
+
+    private String getBodyString(HttpServletRequest request) {
+            BufferedReader br = null;
+            StringBuilder sb = new StringBuilder("");
+            try
+            {
+                br = request.getReader();
+                String str;
+                while ((str = br.readLine()) != null)
+                {
+                    sb.append(str);
+                }
+                br.close();
+            }
+            catch (IOException e)
+            {
+                e.printStackTrace();
+            }
+            finally
+            {
+                if (null != br)
+                {
+                    try
+                    {
+                        br.close();
+                    }
+                    catch (IOException e)
+                    {
+                        e.printStackTrace();
+                    }
+                }
+            }
+            return sb.toString();
+
+    }
+
+    private Boolean validate(HttpServletRequest request, String bodyString) throws  NoSuchAlgorithmException, InvalidKeyException, SignatureException {
+        String sign = request.getHeader("Wechatpay-Signature");
+        String timestamp = request.getHeader("Wechatpay-Timestamp");
+        String nonce = request.getHeader("Wechatpay-Nonce");
+
+        StringBuffer sb = new StringBuffer();
+        sb.append(timestamp + "\n");
+        sb.append(nonce + "\n");
+        sb.append(bodyString + "\n");
+        X509Certificate validCertificate = verifier.getValidCertificate();
+        // 进行签名服务
+        Signature signature = Signature.getInstance("SHA256withRSA");
+        // 用微信平台公钥对签名器进行初始化
+        signature.initVerify(validCertificate);
+        // 把我们构造的验签名串更新到签名器中
+        signature.update(sb.toString().getBytes(StandardCharsets.UTF_8));
+        Boolean result = signature.verify(Base64Utils.decodeFromString(sign));
+        log.info("微信支付回调验签:"+result.toString());
+        return result;
+
+    }
+
+
+    /**
+     * 微信退款回调
+     */
+    @PostMapping(value = "/refund")
+    @ApiOperation("微信退款回调")
+    public WxNotifyReturnDTO refundNotify(@RequestBody WxpayNotifyDTO wxpayNotifyDTO, HttpServletRequest request) throws GeneralSecurityException, IOException {
+        String bodyString = getBodyString(request);
+        if (!validate(request,bodyString)){
+            throw new CustomException("签名失败");
+        }
+        String resourceString = getSourString(wxpayNotifyDTO);
+        log.info(resourceString);
+        JSONObject jsonObject = JSONObject.parseObject(resourceString);
+        //将回调数据写入数据库
+        writeRefundNotifyDataToDb(jsonObject);
+
+        WxNotifyReturnDTO wxNotifyReturnDTO = new WxNotifyReturnDTO();
+        wxNotifyReturnDTO.setCode("SUCCESS");
+        wxNotifyReturnDTO.setMessage("成功");
+
+        return wxNotifyReturnDTO;
+    }
+
+    private void writeRefundNotifyDataToDb(JSONObject jsonObject) {
+        String refundId = jsonObject.getString("refund_id");
+        RefundRecord refundRecord = refundRecordService.getByRefundId(refundId);
+        if (refundRecord == null) {
+            throw new CustomException("该退款订单不存在");
+        }
+        refundRecord.setTransactionId(jsonObject.getString("transaction_id"));
+        refundRecord.setUserReceivedAccount(jsonObject.getString("user_received_account"));
+        refundRecord.setStatus(jsonObject.getString("refund_status"));
+        refundRecordService.updateById(refundRecord);
+
+
+    }
+
+
+
+
+
+
+
+    @Transactional
+    public void writeNotifyDataToDb(JSONObject jsonObject) {
+        String outTradeNo = jsonObject.getString("out_trade_no");
+        WxOrder wxOrder = wxOrderService.getByOutTradeNo(outTradeNo);
+        if (wxOrder == null) {
+            throw new CustomException("该订单不存在");
+        }
+        wxOrder.setTransactionId(jsonObject.getString("transaction_id"));
+        JSONObject amount = jsonObject.getJSONObject("amount");
+        wxOrder.setPayerTotal(amount.getInteger("payer_total"));
+        wxOrder.setTotal(amount.getInteger("total"));
+        wxOrder.setCurrency(amount.getString("currency"));
+        wxOrder.setPayerCurrency(amount.getString("payer_currency"));
+        wxOrder.setTradeState(jsonObject.getString("trade_state"));
+        wxOrder.setBankType(jsonObject.getString("bank_type"));
+        DateTime dateTime  = new DateTime(jsonObject.getString("success_time"));
+        wxOrder.setSuccessTime(dateTime.toDate());
+        wxOrder.setTradeStateDesc(jsonObject.getString("trade_state_desc"));
+        wxOrder.setTradeType(jsonObject.getString("trade_type"));
+        wxOrder.setAttach(jsonObject.getString("attach"));
+        JSONObject sceneInfo = jsonObject.getJSONObject("scene_info");
+        if (sceneInfo != null){
+            wxOrder.setDeviceId(sceneInfo.getString("device_id"));
+        }
+//        //购买电影票
+//        if ( "1".equals(wxOrder.getGoodsType())){
+//            wxOrderService.buyFilmOrder(wxOrder);
+//        }
+//        //购买福禄视频会员
+//        else if ( "2".equals(wxOrder.getGoodsType())){
+//            wxOrderService.buyFuluOrder(wxOrder);
+//        }
+//
+//        //购买活动-话费充值
+//        else if ( "3".equals(wxOrder.getGoodsType())){
+//            wxOrderService.buyPhoneBillOrder(wxOrder);
+//        }
+
+
+
+
+    }
+
+    private String getSourString(WxpayNotifyDTO wxpayNotifyDTO) throws GeneralSecurityException, IOException {
+        AesUtil aesUtil = new AesUtil(wxpayConfig.getV3key().getBytes());
+        WxpayNotifyDTO.WxpaySource wxpaySource = wxpayNotifyDTO.getResource();
+        return aesUtil.decryptToString(wxpaySource.getAssociated_data().getBytes(), wxpaySource.getNonce().getBytes(), wxpaySource.getCiphertext());
+    }
+
+
+
+
+
+
+}

+ 12 - 1
jkt-admin/src/main/resources/application-dev.yml

@@ -79,12 +79,23 @@ spring:
                 # #连接池最大阻塞等待时间(使用负值表示没有限制)
                 max-wait: -1ms
 
-
+# 微信支付app端
 app:
     appId: wxc439503456129660
     appSecret: f9e43ce4a2709eb118e268827aa63cae
 
 
+# 微信支付
+wxpay:
+    v3url: https://api.mch.weixin.qq.com/v3/pay/transactions/app
+    v3urlRefund: https://api.mch.weixin.qq.com/v3/refund/domestic/refunds
+    merchantId: 1611324484
+    serialNumber: 26C02FEDDE8C9F0F69A71CA37226F58CCBB164DE
+    v3key: 7hM14893GvG3JK05575jk1l6P4tF042B
+    notifyUrl: http://218.85.55.253:65535/jkt-admin/open-api/wx/notify/wxpay
+    notifyUrlRefund: http://218.85.55.253:65535/jkt-admin/open-api/wx/notify/refund
+
+
 
 
 

+ 11 - 0
jkt-admin/src/main/resources/application-prod.yml

@@ -80,7 +80,18 @@ spring:
                 max-wait: -1ms
 
 
+# 微信支付app端
 app:
     appId: wxc439503456129660
     appSecret: f9e43ce4a2709eb118e268827aa63cae
 
+
+# 微信支付
+wxpay:
+    v3url: https://api.mch.weixin.qq.com/v3/pay/transactions/app
+    v3urlRefund: https://api.mch.weixin.qq.com/v3/refund/domestic/refunds
+    merchantId: 1611324484
+    serialNumber: 26C02FEDDE8C9F0F69A71CA37226F58CCBB164DE
+    v3key: 7hM14893GvG3JK05575jk1l6P4tF042B
+    notifyUrl: http://sdjk-admin.zzxcx.net/prod-api/open-api/wx/notify/wxpay
+    notifyUrlRefund: http://sdjk-admin.zzxcx.net/prod-api/open-api/wx/notify/refund

binární
jkt-admin/src/main/resources/wechatpay/apiclient_cert.p12


+ 24 - 0
jkt-admin/src/main/resources/wechatpay/apiclient_cert.pem

@@ -0,0 +1,24 @@
+-----BEGIN CERTIFICATE-----
+MIID8DCCAtigAwIBAgIUJsAv7d6Mnw9ppxyjcib1jMuxZN4wDQYJKoZIhvcNAQEL
+BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
+FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
+Q0EwHhcNMjExMDIxMDM0NDM4WhcNMjYxMDIwMDM0NDM4WjCBgTETMBEGA1UEAwwK
+MTYxMTMyNDQ4NDEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMS0wKwYDVQQL
+DCTnpo/lu7rkuK3mjK/nvZHnu5znp5HmioDmnInpmZDlhazlj7gxCzAJBgNVBAYM
+AkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAK7KvPLRrGlNHseksGVM65qY3NYqmg+bh2OQw+Qzdc/qaSnrxpBEUP7S
+eYU/GHACExquKEob621MsaAoyQ6GpPmJTMebF6eVN/F33L2XQnWhi9odF7VR4cf4
+bz7kKS4hFBvTyx/5N96ZN9QCXJu69OZVo0V3uLNn73dPuvs/TNDAzS0j4AxDM5mX
+QOjEndFqpQeZALuS70FRjW5pt70BBTdzzY9Ncob4L/ytWLgMNAqQQpPks8Nv2Gmd
+Qh2/ttK9rs9P4mLRgHpNoMezyV8YFj9taO+RzEXXh4wmBowugP17wCAzrkCrH90D
+xG2s1ByZKmhcuty+bclpyCHYuRtqcHsCAwEAAaOBgTB/MAkGA1UdEwQCMAAwCwYD
+VR0PBAQDAgTwMGUGA1UdHwReMFwwWqBYoFaGVGh0dHA6Ly9ldmNhLml0cnVzLmNv
+bS5jbi9wdWJsaWMvaXRydXNjcmw/Q0E9MUJENDIyMEU1MERCQzA0QjA2QUQzOTc1
+NDk4NDZDMDFDM0U4RUJEMjANBgkqhkiG9w0BAQsFAAOCAQEAPzIagWMOPax5qK/E
+B/k5nqC0KjgFsu68BfSNNTwJuBnl4baZiml5oqz1gagoDuIQLah8QMg4ABukb4ZW
+SSraodZruZ+YwA5ZDQ6Q9dVB89UewomL6bQV4ZY/5+59ruya6KgCE8MTbO+NRfVC
+t4MlXta2+xFLkrOBBeMQw4dgRIPqGw8Ep8Zf/EjmEnqzw3DYckpkTMWtqdlZEID3
+Vo/eA7qbWC5D0lon8ECnOnIpHmsY4tx+zTubBCbjU5mNNAeFSdzM2Rxi9nl6N74S
+PQKm/XMtCpwgPi7YGggH/eELWIdO1Hif/cE4M7U3u7dftAObRO3yJcKgSzIo3DTk
+UotQ0Q==
+-----END CERTIFICATE-----

+ 28 - 0
jkt-admin/src/main/resources/wechatpay/apiclient_key.pem

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCuyrzy0axpTR7H
+pLBlTOuamNzWKpoPm4djkMPkM3XP6mkp68aQRFD+0nmFPxhwAhMarihKG+ttTLGg
+KMkOhqT5iUzHmxenlTfxd9y9l0J1oYvaHRe1UeHH+G8+5CkuIRQb08sf+TfemTfU
+AlybuvTmVaNFd7izZ+93T7r7P0zQwM0tI+AMQzOZl0DoxJ3RaqUHmQC7ku9BUY1u
+abe9AQU3c82PTXKG+C/8rVi4DDQKkEKT5LPDb9hpnUIdv7bSva7PT+Ji0YB6TaDH
+s8lfGBY/bWjvkcxF14eMJgaMLoD9e8AgM65Aqx/dA8RtrNQcmSpoXLrcvm3Jacgh
+2LkbanB7AgMBAAECggEAHuJ72Hvr9v9FfQlAkeWxi7OO8di9OBzHI3Sk6GGfY4mL
+43hhsYQgu6X9CupHKyNytLgpLk8Ynkt6503NmN95rw3vnyVsXJQlOmlve6CKgbZ1
+u6iAU+2P84GWRoqSLDB0GSanMZMbqB1ym+d+7ZVvSHPBUbkBzdGDopVX+KUKsafU
+tkclyPAL2xzMpY6dZGeyboxOKJI8kqh3OOqtprupk+MvGmhf1C4DRSKmD9rz6fWy
+JIF75DktDpFP6cPGuGSciELKWi4MLl/kVVBmjKEOWG0cyISjb1JSardpQzSw3tuQ
+HYg374DDPAkDSoZ2zG4qvGXb/CMbU2lXXAPLg426oQKBgQDgdgdRR9Jdr4uFlAVL
+b4jXIwtkfk4VbWdG1A2EN2W80SwvQfUeVXF+0VvCdUAFtyily99UlQl3o7VYVgzm
+9HzrMgz4MXU8/oea0djokwOiGHPoZhjn4IiHxZf2HE85FeLD3TYMmyVD8LQtOXrF
+CP3VD9Y81rBCzqv9FfpqJD3udQKBgQDHWhaLDS1CQe3ZKu/kZjDiiQ7J2VYRsdjm
++zxPbx3ic52Xz8nSR65R82O7hbcj3v9aaVKPmiuiIJS8WSuBhFYODToDo4M1U1w0
+AT77ZC9ycHh1W+Z0ti6B60z7PqmxDlHSw7wpeogCXyx/3ng94S5oemFYCzRK2K6F
+sEZ8ySnlLwKBgQCl/mM29thZtEKIDIlF2jvmbeI09TslmXyw4o0EZDt2wXHdmPd+
+8U03rfgf/LnWADetNPH6CSWxNn4bz7dG7TOcc60nttuuucTq95ljlaUwMMk26pos
+kN4nGjdhKFpmKwtCMcuQ0wNiFRYKA+II6Lde45FZ+KLtJQ4H4kMIT7kFKQKBgCc9
+UFqmiVYVbB/nF7k5dD3jBIouwYZSH4O3yDNKh/NfFpIfUHaXrXRsGCF9PINPDaxa
+NuoVSqlrCFvaoXmo9tdlOxokQVtpwShrZl5NZhl8kfln0YD/qz/fdROvTe+QBgMa
+jBsOB1+QJE43GCv1+xCNpkOSUQS6if++puFBJ4H5AoGAE8UVWN2gi1gEgweG6HiX
+YKwho+E3sijd11PMCS2rorIoPvXx+LeWN3UG72YCoqncDzaINyr6UaF6kwGBCSHa
+q24GzRjv8Ts/7mj/cJnBM2jnwKFo+ZEUokA52/480taVYuL+1YSQ60OlfFR0XTiv
+2l5GZtSlRWmtNHL+r8J5lEw=
+-----END PRIVATE KEY-----

+ 55 - 0
jkt-common/src/main/java/com/miaxis/common/config/BeanConfig.java

@@ -0,0 +1,55 @@
+package com.miaxis.common.config;
+
+import com.miaxis.common.utils.uuid.CommonUtils;
+import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
+import com.wechat.pay.contrib.apache.httpclient.auth.AutoUpdateCertificatesVerifier;
+import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator;
+import org.apache.http.client.HttpClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ClassPathResource;
+
+import java.io.File;
+import java.security.PrivateKey;
+
+
+@Configuration
+public class BeanConfig {
+
+
+    @Autowired
+    private WxpayConfig wxpayConfig;
+    @Autowired
+    private AutoUpdateCertificatesVerifier verifier;
+
+    /**
+     * 腾讯云 COS
+     * @return
+     */
+
+
+
+
+    /**
+     * 微信支付 httpclient 对象
+     * @return
+     * @throws Exception
+     */
+    @Bean
+    public HttpClient wxpayConfigBean() throws Exception{
+        File file = new ClassPathResource("wechatpay/apiclient_key.pem").getFile();
+        String realPath =file.getAbsolutePath();
+        PrivateKey privateKey = CommonUtils.getPrivateKey(realPath);
+        // 初始化httpClient
+        HttpClient httpClient = WechatPayHttpClientBuilder.create()
+                .withMerchant(wxpayConfig.getMerchantId(), wxpayConfig.getSerialNumber(), privateKey)
+                .withValidator(new WechatPay2Validator(verifier)).build();
+        return httpClient;
+
+    }
+
+
+
+
+}

+ 37 - 0
jkt-common/src/main/java/com/miaxis/common/config/WxVerifierConfig.java

@@ -0,0 +1,37 @@
+package com.miaxis.common.config;
+
+import com.miaxis.common.utils.uuid.CommonUtils;
+import com.wechat.pay.contrib.apache.httpclient.auth.AutoUpdateCertificatesVerifier;
+import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner;
+import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ClassPathResource;
+
+import java.io.File;
+import java.security.PrivateKey;
+
+
+@Configuration
+public class WxVerifierConfig {
+
+
+    @Autowired
+    private WxpayConfig wxpayConfig;
+
+    @Bean
+    public AutoUpdateCertificatesVerifier getVerifier() throws Exception{
+        File file = new ClassPathResource("wechatpay/apiclient_key.pem").getFile();
+        String realPath =file.getAbsolutePath();
+        PrivateKey privateKey = CommonUtils.getPrivateKey(realPath);
+        // 加载平台证书(mchId:商户号,mchSerialNo:商户证书序列号,apiV3Key:V3密钥)
+        AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
+                new WechatPay2Credentials(wxpayConfig.getMerchantId(),
+                        new PrivateKeySigner(wxpayConfig.getSerialNumber(), privateKey)),
+                wxpayConfig.getV3key().getBytes("utf-8"));
+        return verifier;
+
+    }
+
+}

+ 22 - 0
jkt-common/src/main/java/com/miaxis/common/config/WxpayConfig.java

@@ -0,0 +1,22 @@
+package com.miaxis.common.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "wxpay")
+public class WxpayConfig {
+
+    private String v3url;
+    //退款
+    private String v3urlRefund;
+    //退款回调
+    private String notifyUrlRefund;
+    //商户id
+    private String merchantId;
+    private String serialNumber;
+    private String v3key;
+
+}

+ 15 - 0
jkt-service/src/main/java/com/miaxis/feign/dto/AddTemplate.java

@@ -0,0 +1,15 @@
+package com.miaxis.feign.dto;
+
+import lombok.Data;
+
+@Data
+public class AddTemplate {
+
+    private String access_token;  //是	接口调用凭证
+    private String tid;		//是	模板标题 id,可通过接口获取,也可登录小程序后台查看获取
+    private Integer[] kidList;  //是 开发者自行组合好的模板关键词列表,关键词顺序可以自由搭配(例如 [3,5,4] 或 [4,5,3]),最多支持5个,最少2个关键词组合
+    private String sceneDesc;   //否	服务场景描述,15个字以内
+
+
+
+}

+ 15 - 0
jkt-service/src/main/java/com/miaxis/feign/dto/Ai.java

@@ -0,0 +1,15 @@
+package com.miaxis.feign.dto;
+
+import lombok.Data;
+
+@Data
+public class Ai {
+    String appid;
+    String c_account;
+    String format;
+    String merchant_id;
+    String notify_url;
+    String sign;
+    String time;
+
+}

+ 11 - 0
jkt-service/src/main/java/com/miaxis/feign/dto/Film.java

@@ -0,0 +1,11 @@
+package com.miaxis.feign.dto;
+
+import lombok.Data;
+import org.springframework.web.bind.annotation.RequestBody;
+@Data
+public class Film {
+    String appKey;
+    String time;
+    String sign;
+
+}

+ 13 - 0
jkt-service/src/main/java/com/miaxis/feign/dto/FilmDTO.java

@@ -0,0 +1,13 @@
+package com.miaxis.feign.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class FilmDTO {
+    @ApiModelProperty("请求url")
+    String url;
+    @ApiModelProperty("请求参数,key1=value1&key2=value2...的格式")
+    String paramData;
+
+}

+ 17 - 0
jkt-service/src/main/java/com/miaxis/feign/dto/FilmMcpData.java

@@ -0,0 +1,17 @@
+package com.miaxis.feign.dto;
+
+
+import lombok.Data;
+
+/**
+ * 电影秒出票数据类型
+ */
+
+@Data
+public class FilmMcpData {
+    String third_order_id;
+    String ticket;
+    Integer ticketStatus;
+    String order_id;
+
+}

+ 11 - 0
jkt-service/src/main/java/com/miaxis/feign/dto/FilmResult.java

@@ -0,0 +1,11 @@
+package com.miaxis.feign.dto;
+
+
+import lombok.Data;
+
+@Data
+public class FilmResult {
+     int cityId;
+     String pinYin;
+     String regionName;
+}

+ 16 - 0
jkt-service/src/main/java/com/miaxis/feign/dto/FilmXdResult.java

@@ -0,0 +1,16 @@
+package com.miaxis.feign.dto;
+
+
+import lombok.Data;
+
+/**
+ * 电影下单返回类型
+ */
+
+@Data
+public class FilmXdResult {
+    Boolean success;
+    String message;
+    int code;
+    FilmMcpData data;
+}

+ 18 - 0
jkt-service/src/main/java/com/miaxis/feign/dto/Mei.java

@@ -0,0 +1,18 @@
+package com.miaxis.feign.dto;
+
+import lombok.Data;
+
+@Data
+public class Mei {
+
+    //公共参数
+    private String actId;  // 必填  	活动id,可以在联盟活动列表中查看获取 2
+    private String key; //必填 appkey 514202a9238958b16cb13805d6f79273
+    private String sid; //必填 推广位sid,支持通过接口自定义创建,不受平台200个上限限制,长度不能超过64个字符,支持小写字母和数字,历史已创建的推广位不受这个约束
+    private String linkType; //必填 链接类型,枚举值:1 h5链接 2 deeplink(唤起)链接 3 中间页唤起链接 4 微信小程序唤起路径
+    private String sign; //请求签名,计算方法参考文档中签名(sign)生成逻辑
+
+
+
+
+}

+ 25 - 0
jkt-service/src/main/java/com/miaxis/feign/dto/Pdd.java

@@ -0,0 +1,25 @@
+package com.miaxis.feign.dto;
+
+import lombok.Data;
+
+@Data
+public class Pdd {
+
+    //公共参数
+    private String type;  // 必填  API接口名称
+    private String client_id; //必填 POP分配给应用的client_id
+   // private String access_token;  //非必填	 通过code获取的access_token(无需授权的接口,该字段不参与sign签名运算)
+    private String timestamp; //必填 UNIX时间戳,单位秒,需要与拼多多服务器时间差值在10分钟内
+  //  private String data_type; //非必填  响应格式,即返回数据的格式,JSON或者XML(二选一),默认JSON,注意是大写
+  //  private String version;   //非必填 API协议版本号,默认为V1,可不填
+    private String sign; //API输入参数签名结果,签名算法参考开放平台接入指南第三部分底部。
+
+    //请求参数说明
+    private Boolean generate_we_app; //是否生成拼多多福利券微信小程序推广信息
+    private String pid; //必填	 推广位ID
+    private Integer resource_type; //非必填 频道来源:4-限时秒杀,39997-充值中心, 39998-活动转链,39996-百亿补贴,39999-电器城,40000-领券中心,50005-火车票
+    private String url; //非必填  原链接
+
+
+
+}

+ 17 - 0
jkt-service/src/main/java/com/miaxis/feign/dto/PddResult.java

@@ -0,0 +1,17 @@
+package com.miaxis.feign.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@JsonInclude(value= JsonInclude.Include.NON_NULL)
+@AllArgsConstructor
+public class PddResult {
+
+    private String resource_url_response;
+
+
+
+
+}

+ 18 - 0
jkt-service/src/main/java/com/miaxis/feign/dto/TencentCosCommonParameters.java

@@ -0,0 +1,18 @@
+package com.miaxis.feign.dto;
+
+import lombok.Data;
+
+/**
+ * @author wwl
+ * @version 1.0
+ * @date 2021/7/2 15:57
+ */
+@Data
+public class TencentCosCommonParameters {
+    private String action;//接口指令的名称,例如 DescribeInstances
+    private String region;//区域参数,用来标识希望操作哪个区域的实例。可选: bj:北京 gz:广州sh:上海 hk:中国香港
+    private String timestamp;//	当前 UNIX 时间戳
+    private String nonce;//随机正整数,与 Timestamp 联合起来, 用于防止重放攻击
+    private String secretId;//由腾讯云平台上申请的标识身份的 SecretId 和 SecretKey, 其中 SecretKey 会用来生成 Signature
+    private String Signature;//请求签名,用来验证此次请求的合法性
+}

+ 13 - 0
jkt-service/src/main/java/com/miaxis/feign/dto/Wa.java

@@ -0,0 +1,13 @@
+package com.miaxis.feign.dto;
+
+import lombok.Data;
+
+@Data
+public class Wa {
+    String appid;
+    String domain;
+    String format;
+    String time;
+    String sign;
+
+}

+ 13 - 0
jkt-service/src/main/java/com/miaxis/feign/dto/WaResult.java

@@ -0,0 +1,13 @@
+package com.miaxis.feign.dto;
+
+import lombok.Data;
+
+@Data
+public class WaResult {
+    String codeid;
+    String message;
+    WaRetData retdata;
+    String time;
+
+
+}

+ 12 - 0
jkt-service/src/main/java/com/miaxis/feign/dto/WaRetData.java

@@ -0,0 +1,12 @@
+package com.miaxis.feign.dto;
+
+import lombok.Data;
+
+@Data
+public class WaRetData {
+    private String bd_pr;
+    private String bd_date;
+
+
+
+}

+ 11 - 0
jkt-service/src/main/java/com/miaxis/feign/dto/WxGzhMini.java

@@ -0,0 +1,11 @@
+package com.miaxis.feign.dto;
+
+import lombok.Data;
+
+@Data
+public class WxGzhMini {
+
+    private String appid; //是 所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系,暂不支持小游戏)
+    private String pagepath; // 否	所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar),要求该小程序已发布,暂不支持小游戏
+
+}

+ 16 - 0
jkt-service/src/main/java/com/miaxis/feign/dto/WxGzhSend.java

@@ -0,0 +1,16 @@
+package com.miaxis.feign.dto;
+
+import lombok.Data;
+
+@Data
+public class WxGzhSend {
+
+
+    //公共参数
+    private String touser; //是	接收者(用户)的 openid
+    private String template_id;  // 是	所需下发的订阅模板id
+    private String url; // 否 模板跳转链接(海外帐号没有跳转能力)
+    private WxGzhMini miniprogram; //否	跳小程序所需数据,不需跳小程序可不用传该数据
+    private Object data; //是 模板数据
+
+}

+ 17 - 0
jkt-service/src/main/java/com/miaxis/feign/dto/WxSend.java

@@ -0,0 +1,17 @@
+package com.miaxis.feign.dto;
+
+import lombok.Data;
+
+@Data
+public class WxSend {
+
+    //公共参数
+    private String access_token;  //是	接口调用凭证
+    private String touser; //是	接收者(用户)的 openid
+    private String template_id;  // 是	所需下发的订阅模板id
+    private String page; //否	点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
+    private Object data; //是 模板内容,格式形如 { "key1": { "value": any }, "key2": { "value": any } }
+    private String miniprogram_state; //否	跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
+    private String lang;  //否 进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN
+
+}

+ 18 - 0
jkt-service/src/main/java/com/miaxis/feign/dto/fulu/FuluCommonApiDTO.java

@@ -0,0 +1,18 @@
+package com.miaxis.feign.dto.fulu;
+
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 福禄传输对象
+ */
+@Data
+public class FuluCommonApiDTO {
+    @ApiModelProperty(value = "接口方法名称",required = true)
+    String method;
+    @ApiModelProperty(value= "请求参数集合,该参数是以json字符串的形式传输",required = true)
+    String biz_content;
+}

+ 26 - 0
jkt-service/src/main/java/com/miaxis/feign/dto/fulu/FuluDTO.java

@@ -0,0 +1,26 @@
+package com.miaxis.feign.dto.fulu;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+
+/**
+ * 福禄传输对象
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class FuluDTO {
+    String app_key;
+    String method;
+    String timestamp;
+    String version;
+    String format;
+    String charset;
+    String sign_type;
+    String sign;
+    String app_auth_token;
+    String biz_content;
+}

+ 23 - 0
jkt-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;
+
+}

+ 20 - 0
jkt-service/src/main/java/com/miaxis/feign/dto/fulu/FuluResult.java

@@ -0,0 +1,20 @@
+package com.miaxis.feign.dto.fulu;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 福禄传输对象
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class FuluResult {
+    Integer code;
+    String message;
+    String result;
+    String sign;
+
+}

+ 40 - 0
jkt-service/src/main/java/com/miaxis/feign/service/IWxSendService.java

@@ -0,0 +1,40 @@
+package com.miaxis.feign.service;
+
+import com.miaxis.common.config.FeignConfig;
+import com.miaxis.feign.dto.WxGzhSend;
+import com.miaxis.feign.dto.WxSend;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ *
+ * 微信接口
+ */
+@FeignClient(name="wxSendService",
+        url = "https://api.weixin.qq.com/cgi-bin",configuration = FeignConfig.class)
+public interface IWxSendService {
+
+    @PostMapping(value = "/message/subscribe/send")
+    String sendMessage(@RequestParam("access_token") String accessToken, WxSend wxSend);
+
+    @PostMapping(value = "/message/template/send")
+    String sendGzhMessage(@RequestParam("access_token") String accessToken, WxGzhSend wxGzhSend);
+
+    @GetMapping(value = "/token")
+    String getAccessToken(@RequestParam("grant_type") String grant_type,
+                          @RequestParam("appid") String appid,
+                          @RequestParam("secret") String secret);
+
+    @GetMapping(value = "/user/get")
+    String getUser(@RequestParam("access_token") String access_token,
+                   @RequestParam("next_openid") String next_openid);
+
+    @GetMapping(value = "/user/info")
+    String getUserInfo(@RequestParam("access_token") String access_token,
+                       @RequestParam("openid") String openid,
+                       @RequestParam("lang") String lang);
+
+
+}

+ 22 - 0
jkt-service/src/main/java/com/miaxis/feign/utils/FeignUtils.java

@@ -0,0 +1,22 @@
+package com.miaxis.feign.utils;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class FeignUtils {
+
+    /**
+     * @Description: 将数据转换到相应的容器
+     * @return
+     * @throws
+     */
+    public static <T> T convertValue(Object bean, Class<T> clazz){
+        try{
+            ObjectMapper mapper = new ObjectMapper();
+            return mapper.convertValue(bean, clazz);
+        }catch(Exception e){
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+}

+ 141 - 0
jkt-service/src/main/java/com/miaxis/wx/domain/RefundRecord.java

@@ -0,0 +1,141 @@
+package com.miaxis.wx.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.miaxis.common.annotation.Excel;
+import com.miaxis.common.core.domain.BaseBusinessEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 微信退款记录对象 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 Integer total;
+
+    /** 退款标价金额,单位为分 */
+    @Excel(name = "退款标价金额,单位为分")
+    @TableField("refund")
+    @ApiModelProperty(value = "退款标价金额,单位为分")
+    private Integer refund;
+
+    /** 现金支付金额 */
+    @Excel(name = "现金支付金额")
+    @TableField("payer_total")
+    @ApiModelProperty(value = "现金支付金额")
+    private Integer payerTotal;
+
+    /** 退款给用户的金额,不包含所有优惠券金额 */
+    @Excel(name = "退款给用户的金额,不包含所有优惠券金额")
+    @TableField("payer_refund")
+    @ApiModelProperty(value = "退款给用户的金额,不包含所有优惠券金额")
+    private Integer payerRefund;
+
+    /** 去掉非充值代金券退款金额后的退款金额 */
+    @Excel(name = "去掉非充值代金券退款金额后的退款金额")
+    @TableField("settlement_refund")
+    @ApiModelProperty(value = "去掉非充值代金券退款金额后的退款金额")
+    private Integer settlementRefund;
+
+    /** 应结订单金额=订单金额-免充值代金券金额 */
+    @Excel(name = "应结订单金额=订单金额-免充值代金券金额")
+    @TableField("settlement_total")
+    @ApiModelProperty(value = "应结订单金额=订单金额-免充值代金券金额")
+    private Integer settlementTotal;
+
+    /** 优惠退款金额&lt;=退款金额,退款金额-代金券或立减优惠退款金额为现金,说明详见 */
+    @Excel(name = "优惠退款金额&lt;=退款金额,退款金额-代金券或立减优惠退款金额为现金,说明详见")
+    @TableField("discount_refund")
+    @ApiModelProperty(value = "优惠退款金额&lt;=退款金额,退款金额-代金券或立减优惠退款金额为现金,说明详见")
+    private Integer discountRefund;
+
+    /** 符合ISO 4217标准的三位字母代码,目前只支持人民币:CNY。 */
+    @Excel(name = "符合ISO 4217标准的三位字母代码,目前只支持人民币:CNY。")
+    @TableField("currency")
+    @ApiModelProperty(value = "符合ISO 4217标准的三位字母代码,目前只支持人民币:CNY。")
+    private String currency;
+
+}

+ 166 - 0
jkt-service/src/main/java/com/miaxis/wx/domain/WxOrder.java

@@ -0,0 +1,166 @@
+package com.miaxis.wx.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.miaxis.common.annotation.Excel;
+import com.miaxis.common.core.domain.BaseBusinessEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 电影订单对象 film_order
+ *
+ * @author miaxis
+ * @date 2021-05-07
+ */
+@Data
+@TableName("wx_order")
+@ApiModel(value = "WxOrder", description = "微信订单对象 wx_order")
+public class WxOrder extends BaseBusinessEntity {
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    @TableId(value = "id")
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    /** 商户订单号 */
+    @Excel(name = "商户订单号")
+    @TableField("out_trade_no")
+    @ApiModelProperty(value = "商户订单号")
+    private String outTradeNo;
+
+    /** 退款单号 */
+    @Excel(name = "退款单号")
+    @TableField("out_refund_no")
+    @ApiModelProperty(value = "退款单号")
+    private String outRefundNo;
+
+    /** 退款原因 */
+    @Excel(name = "退款原因")
+    @TableField("refund_reason")
+    @ApiModelProperty(value = "退款原因")
+    private String refundReason;
+
+
+    /** 微信支付系统生成的订单号 */
+    @Excel(name = "微信支付系统生成的订单号")
+    @TableField("transaction_id")
+    @ApiModelProperty(value = "微信支付系统生成的订单号")
+    private String transactionId;
+
+    /** 交易类型,枚举值 */
+    @Excel(name = "交易类型,枚举值")
+    @TableField("trade_type")
+    @ApiModelProperty(value = "交易类型,枚举值")
+    private String tradeType;
+
+    /** 交易状态,枚举值:
+        SUCCESS:支付成功
+        REFUND:转入退款
+        NOTPAY:未支付
+        CLOSED:已关闭
+        REVOKED:已撤销(付款码支付)
+        USERPAYING:用户支付中(付款码支付)
+        PAYERROR:支付失败(其他原因,如银行返回失败)
+        ACCEPT:已接收,等待扣款 */
+    @TableField("trade_state")
+    @ApiModelProperty(value = "交易状态,枚举值: SUCCESS:支付成功 REFUND:转入退款 NOTPAY:" +
+            "未支付 CLOSED:已关闭 REVOKED:已撤销(付款码支付) " +
+            "USERPAYING:用户支付中(付款码支付) PAYERROR:支付失败(其他原因,如银行返回失败) ACCEPT:已接收,等待扣款")
+    private String tradeState;
+    /** 交易状态描述 */
+    @Excel(name = "交易状态描述")
+    @TableField("trade_state_desc")
+    @ApiModelProperty(value = "交易状态描述")
+    private String tradeStateDesc;
+
+    /** 银行类型 */
+    @Excel(name = "银行类型")
+    @TableField("bank_type")
+    @ApiModelProperty(value = "银行类型")
+    private String bankType;
+
+    /** 附加数据 */
+    @Excel(name = "附加数据")
+    @TableField("attach")
+    @ApiModelProperty(value = "附加数据")
+    private String attach;
+
+    /** 支付完成时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "支付完成时间", width = 30, dateFormat = "yyyy-MM-dd")
+    @TableField("success_time")
+    @ApiModelProperty(value = "支付完成时间")
+    private Date successTime;
+
+    /** 用户在直连商户appid下的唯一标识 */
+    @Excel(name = "用户在直连商户appid下的唯一标识")
+    @TableField("openid")
+    @ApiModelProperty(value = "用户在直连商户appid下的唯一标识")
+    private String openid;
+
+    /** 商品名称 */
+    @Excel(name = "商品类型")
+    @TableField("goods_type")
+    @ApiModelProperty(value = "商品类型,具体查看字典定义.")
+    private String goodsType;
+
+    /** 商品名称 */
+    @Excel(name = "商品图片地址")
+    @TableField("goods_picture_url")
+    @ApiModelProperty(value = "商品图片地址")
+    private String goodsPictureUrl;
+
+    /** 订单总金额,单位为分。 */
+    @Excel(name = "订单总金额,单位为分。")
+    @TableField("total")
+    @ApiModelProperty(value = "订单总金额,单位为分。")
+    private Integer total;
+
+    /** 用户支付金额,单位为分。 */
+    @Excel(name = "用户支付金额,单位为分。")
+    @TableField("payer_total")
+    @ApiModelProperty(value = "用户支付金额,单位为分。")
+    private Integer payerTotal;
+
+    /** CNY:人民币,境内商户号仅支持人民币。 */
+    @Excel(name = "CNY:人民币,境内商户号仅支持人民币。")
+    @TableField("currency")
+    @ApiModelProperty(value = "CNY:人民币,境内商户号仅支持人民币。")
+    private String currency;
+
+    /** 用户支付币种 */
+    @Excel(name = "用户支付币种")
+    @TableField("payer_currency")
+    @ApiModelProperty(value = "用户支付币种")
+    private String payerCurrency;
+
+    /** 商户端设备号 */
+    @Excel(name = "商户端设备号")
+    @TableField("device_id")
+    @ApiModelProperty(value = "商户端设备号")
+    private String deviceId;
+
+
+    /** 商户端设备号 */
+    @Excel(name = "订单数据详情")
+    @TableField("order_data_json")
+    @ApiModelProperty(value = "订单数据详情")
+    private String orderDataJson;
+
+    /** 订单状态 */
+    @Excel(name = "订单数据详情")
+    @TableField("order_status")
+    @ApiModelProperty(value = "订单状态: 1 -进行中 2-购买成功 3-购买失败")
+    private String orderStatus;
+
+
+
+
+}

+ 10 - 0
jkt-service/src/main/java/com/miaxis/wx/dto/AiOrderNotifyDTO.java

@@ -0,0 +1,10 @@
+package com.miaxis.wx.dto;
+
+public class AiOrderNotifyDTO {
+
+    String time;
+    String appid;
+    String request;
+    String response;
+
+}

+ 27 - 0
jkt-service/src/main/java/com/miaxis/wx/dto/CinemaData.java

@@ -0,0 +1,27 @@
+package com.miaxis.wx.dto;
+
+
+import lombok.Data;
+
+
+/**
+ * 排期数据
+ */
+@Data
+public class CinemaData {
+    Integer netPrice;
+    String planType;
+    String showTime;
+    String language;
+    Integer duration;
+    String showId;
+    String stopSellTime;
+    Integer cinemaId;
+    String cinemaName;
+    Integer filmId;
+    String scheduleArea;
+    String filmName;
+    String hallName;
+    String showVersionType;
+
+}

+ 28 - 0
jkt-service/src/main/java/com/miaxis/wx/dto/FilmWxOrderJsonData.java

@@ -0,0 +1,28 @@
+package com.miaxis.wx.dto;
+
+import com.miaxis.feign.dto.FilmMcpData;
+import lombok.Data;
+
+/**
+ * 电影数据
+ */
+@Data
+public class FilmWxOrderJsonData {
+    private static final long serialVersionUID = 1L;
+    //电影下单信息
+    private  WxOrderCreateDTO wxOrderCreateDTO;
+    //电影排场信息
+    private CinemaData cinemaData;
+    //电影订单回调信息
+    private WxOrderNotifyDTO wxOrderNotifyDTO ;
+    //快速出票
+    private FilmMcpData filmMcpData;
+
+
+
+
+
+
+
+
+}

+ 50 - 0
jkt-service/src/main/java/com/miaxis/wx/dto/FilmWxpayRefundDTO.java

@@ -0,0 +1,50 @@
+package com.miaxis.wx.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;
+
+
+    }
+
+
+
+}

+ 22 - 0
jkt-service/src/main/java/com/miaxis/wx/dto/FuluWxOrderJsonData.java

@@ -0,0 +1,22 @@
+package com.miaxis.wx.dto;
+
+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;
+
+}

+ 46 - 0
jkt-service/src/main/java/com/miaxis/wx/dto/PcWxOrderListDTO.java

@@ -0,0 +1,46 @@
+package com.miaxis.wx.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class PcWxOrderListDTO {
+    private static final long serialVersionUID = 1L;
+
+
+
+    @ApiModelProperty(value = "商户订单号")
+    private String  outTradeNo;
+
+    @ApiModelProperty(value = "开始时间,格式yyyyMMdd")
+//    @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
+    private String startTime;
+
+
+    @ApiModelProperty(value = "结束时间,格式yyyyMMdd")
+//    @JsonFormat(pattern="yyyyMMdd",timezone = "GMT+8")
+    private String endTime;
+
+
+    @ApiModelProperty(value = "商品类型")
+    private String  goodsType;
+
+
+//
+//    @ApiModelProperty(value = "支付状态: 交易状态,枚举值:\n" +
+//            "SUCCESS:支付成功\n" +
+//            "REFUND:转入退款\n" +
+//            "NOTPAY:未支付\n" +
+//            "CLOSED:已关闭\n" +
+//            "REVOKED:已撤销(付款码支付)\n" +
+//            "USERPAYING:用户支付中(付款码支付)\n" +
+//            "PAYERROR:支付失败(其他原因,如银行返回失败)\n" +
+//            "ACCEPT:已接收,等待扣款")
+//    private String  tradeState;
+
+    @ApiModelProperty(value = "订单状态: 1 -进行中 2-购买成功 3-购买失败")
+    private String  orderStatus;
+
+
+
+}

+ 70 - 0
jkt-service/src/main/java/com/miaxis/wx/dto/WxFuluOrderDetailDTO.java

@@ -0,0 +1,70 @@
+package com.miaxis.wx.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 福禄订单详情
+ */
+@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
jkt-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;
+
+
+
+
+
+
+
+
+
+}

+ 9 - 0
jkt-service/src/main/java/com/miaxis/wx/dto/WxNotifyReturnDTO.java

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

+ 53 - 0
jkt-service/src/main/java/com/miaxis/wx/dto/WxOrderCreateDTO.java

@@ -0,0 +1,53 @@
+package com.miaxis.wx.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class WxOrderCreateDTO {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "购票类型: 1-竞价购票 2-秒出票" ,required=true,allowableValues ="1,2")
+    private int ticketType;
+
+    @ApiModelProperty(value = "总金额, 单位分")
+    private int total;
+
+    @ApiModelProperty(value = "排期的showId,由影院接口得来")
+    private String showId;
+
+    /** 商品名称 */
+//    @ApiModelProperty(value = "商品类型")
+//    private String goodsType;
+
+    /** 商品名称 */
+    @ApiModelProperty(value = "商品图片地址")
+    private String goodsPictureUrl;
+
+    @ApiModelProperty(value = "影院id")
+    private String cinemaId;
+
+    @ApiModelProperty(value = "用户所选的座位,例:1排1座,1排2座 以英文的逗号 “ , “隔开。 如果座位是情侣座,请传入 : 1排1座(情侣座),1排2座(情侣座)")
+    private String seat;
+
+    @ApiModelProperty(value = "商家订单id")
+    private String thirdOrderId;
+
+    @ApiModelProperty(value = "预留的手机号")
+    private String reservedPhone;
+
+
+    @ApiModelProperty(value = "是否允许调座,1-允许,0-不允许")
+    private Integer acceptChangeSeat;
+
+    @ApiModelProperty(value = "座位接口的seatId字段, 如果有多个,则以竖线分割")
+    private String seatId;
+
+
+    @ApiModelProperty(value = "座位接口的seatNo字段,如果有多个,则以竖线分割")
+    private String seatNo;
+
+
+
+
+}

+ 31 - 0
jkt-service/src/main/java/com/miaxis/wx/dto/WxOrderCreateFuluDTO.java

@@ -0,0 +1,31 @@
+package com.miaxis.wx.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+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;
+
+
+
+
+
+
+}

+ 28 - 0
jkt-service/src/main/java/com/miaxis/wx/dto/WxOrderCreatePhoneBillDTO.java

@@ -0,0 +1,28 @@
+package com.miaxis.wx.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class WxOrderCreatePhoneBillDTO {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "天猫订单号")
+    private String tmallNo;
+
+    @ApiModelProperty(value = "充值号码")
+    private String rechargePhoneNo;
+
+    @ApiModelProperty(value = "运营商:1-移动 2-联通 3-电信")
+    private Integer operators;
+
+
+    @ApiModelProperty(value = "商品图片地址")
+    private String goodsPictureUrl;
+
+
+
+
+
+
+}

+ 26 - 0
jkt-service/src/main/java/com/miaxis/wx/dto/WxOrderListDTO.java

@@ -0,0 +1,26 @@
+package com.miaxis.wx.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class WxOrderListDTO {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "近几天的天数")
+    private Integer days;
+
+
+    @ApiModelProperty(value = "openid",hidden = true)
+    private String  openid;
+
+    @ApiModelProperty(value = "商品类型",hidden = true)
+    private String  goodsType;
+
+
+    @ApiModelProperty(value = "订单状态: 1 -进行中 2-购买成功 3-购买失败")
+    private String  orderStatus;
+
+
+
+}

+ 55 - 0
jkt-service/src/main/java/com/miaxis/wx/dto/WxOrderNotifyDTO.java

@@ -0,0 +1,55 @@
+package com.miaxis.wx.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 微信支付回调 dto
+ */
+@Data
+public class WxOrderNotifyDTO {
+    private static final long serialVersionUID = 1L;
+
+
+
+    @ApiModelProperty(value = "时间戳")
+    private String time;
+
+
+    @ApiModelProperty(value = "订单状态发生变更时的事件如: ORDER_CLOSE")
+    private String eventName;
+
+
+    @ApiModelProperty(value = "接入方下单时的订单号")
+    private String thirdOrderId;
+
+    @ApiModelProperty(value = "回调地址,各个场景发生时,将通过此地址通知接入方")
+    private String notifyUrl;
+
+
+
+
+    @ApiModelProperty(value = "api下单成本价(竞价结束回调通知返回:WAIT_TICKET场景)")
+    private String orderPrice;
+
+
+    @ApiModelProperty(value = "如果事件为订单关闭 ORDER_CLOSE 则有此字段")
+    private String closeCause;
+
+    @ApiModelProperty(value = "实际出票座位,仅供参考,可能与票不一样,也可能为空,一般当实际座位与下单座位不一样时会有")
+    private String realSeat;
+
+
+
+    @ApiModelProperty(value = "取票码字符串如: “[\\”123123\\”,\\”4564357\\”]” 直接用json解析可得到数组,如取票失败则用使用原始截图")
+    private String ticketCode;
+
+    @ApiModelProperty(value = "取票码原始截图如: “[\\”http:\\\\/\\\\/shoutudyp.oss-cn-shenzhen.aliyuncs.com\\\\/b768007aa9071eba3e3018a27dcc47c0.png\\”,\\”http:\\\\/\\\\/shoutudyp.oss-cn-shenzhen.aliyuncs.com\\\\/f9774915e35fae41ae96ebf288477394.jpg\\”]” 直接用json解析可得到数组")
+    private String ticketImage;
+
+
+
+
+
+
+}

+ 52 - 0
jkt-service/src/main/java/com/miaxis/wx/dto/WxpayNotifyDTO.java

@@ -0,0 +1,52 @@
+package com.miaxis.wx.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 微信支付回调 dto
+ */
+@Data
+public class WxpayNotifyDTO {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "通知的唯一ID")
+    private String id;
+
+    @ApiModelProperty(value = "创建的时间,rfc3339标准格式")
+    private String create_time;
+
+    @ApiModelProperty(value = "通知的类型,支付成功通知的类型为TRANSACTION.SUCCESS")
+    private String event_type;
+
+
+    @ApiModelProperty(value = "通知的资源数据类型")
+    private String resource_type;
+
+
+    @ApiModelProperty(value = "数据资源")
+    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;
+
+
+    }
+
+
+
+}

+ 24 - 0
jkt-service/src/main/java/com/miaxis/wx/mapper/RefundRecordMapper.java

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

+ 30 - 0
jkt-service/src/main/java/com/miaxis/wx/mapper/WxOrderMapper.java

@@ -0,0 +1,30 @@
+package com.miaxis.wx.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.miaxis.wx.domain.WxOrder;
+import com.miaxis.wx.dto.PcWxOrderListDTO;
+import com.miaxis.wx.dto.WxOrderListDTO;
+
+import java.util.List;
+
+/**
+ * 电影订单Mapper接口
+ *
+ * @author miaxis
+ * @date 2021-05-07
+ */
+public interface WxOrderMapper extends BaseMapper<WxOrder> {
+    /**
+     * 查询电影订单列表
+     *
+     * @param wxOrder 电影订单
+     * @return 电影订单集合
+     */
+    public List<WxOrder> selectWxOrderList(WxOrder wxOrder);
+
+    WxOrder getByOutTradeNo(String outTradeNo);
+
+    List<WxOrder> selectOrderList(WxOrderListDTO wxOrderListDTO);
+
+    List<WxOrder> selectPcOrderList(PcWxOrderListDTO pcWxOrderListDTO);
+}

+ 28 - 0
jkt-service/src/main/java/com/miaxis/wx/service/IRefundRecordService.java

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

+ 23 - 0
jkt-service/src/main/java/com/miaxis/wx/service/IWxOrderService.java

@@ -0,0 +1,23 @@
+package com.miaxis.wx.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+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.miaxis.wx.dto.*;
+
+import java.util.List;
+
+/**
+ */
+public interface IWxOrderService extends IService<WxOrder>{
+
+
+
+    void createVipOrder(WxOrder order);
+
+    WxOrder getByOutTradeNo(String outTradeNo);
+
+
+}

+ 121 - 0
jkt-service/src/main/java/com/miaxis/wx/service/impl/RefundRecordServiceImpl.java

@@ -0,0 +1,121 @@
+package com.miaxis.wx.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+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.wx.domain.RefundRecord;
+import com.miaxis.wx.domain.WxOrder;
+import com.miaxis.wx.dto.WxNotifyReturnDTO;
+import com.miaxis.wx.mapper.RefundRecordMapper;
+import com.miaxis.wx.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.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+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(WxOrder wxOrder, String refundCode,String failCause) throws Exception{
+        if (failCause.length()>80){
+            failCause = "购买失败,详情请在小程序查看";
+        }
+        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", wxOrder.getOutTradeNo())
+                .put("out_refund_no", refundCode)
+                .put("reason", failCause)
+                .put("notify_url",wxpayConfig.getNotifyUrlRefund());
+        rootNode.putObject("amount")
+                .put("refund", wxOrder.getTotal())
+                .put("total", wxOrder.getTotal())
+                .put("currency", wxOrder.getCurrency());
+
+//        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+//        objectMapper.writeValue(bos, rootNode);
+        httpPost.setEntity(new StringEntity(rootNode.toString(), "utf-8"));
+        HttpResponse response = httpClient.execute(httpPost);
+        // 返回数据:
+        String bodyAsString = EntityUtils.toString(response.getEntity());
+        if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
+            //  保存退款数据到数据库
+            RefundRecord refundRecord = new RefundRecord();
+            JSONObject jsonObject = JSONObject.parseObject(bodyAsString);
+            refundRecord.setRefundId(jsonObject.getString("refund_id"));
+            refundRecord.setOutRefundNo(jsonObject.getString("out_refund_no"));
+            refundRecord.setTransactionId(jsonObject.getString("transaction_id"));
+            refundRecord.setOutTradeNo(jsonObject.getString("out_trade_no"));
+            refundRecord.setChannel(jsonObject.getString("channel"));
+            refundRecord.setUserReceivedAccount(jsonObject.getString("user_received_account"));
+            if (jsonObject.getString("success_time")!=null){
+                refundRecord.setSuccessTime(new DateTime(jsonObject.getString("success_time")).toDate());
+            }
+            refundRecord.setCreateTime(new DateTime(jsonObject.getString("create_time")).toDate());
+            refundRecord.setStatus(jsonObject.getString("status"));
+            refundRecord.setFundsAccount(jsonObject.getString("funds_account"));
+            JSONObject amount = jsonObject.getJSONObject("amount");
+            refundRecord.setTotal(amount.getInteger("total"));
+            refundRecord.setRefund(amount.getInteger("refund"));
+            refundRecord.setPayerTotal(amount.getInteger("payer_total"));
+            refundRecord.setPayerRefund(amount.getInteger("payer_refund"));
+            refundRecord.setSettlementRefund(amount.getInteger("settlement_refund"));
+            refundRecord.setSettlementTotal(amount.getInteger("settlement_total"));
+            refundRecord.setDiscountRefund(amount.getInteger("discount_refund"));
+            refundRecord.setCurrency(amount.getString("currency"));
+            this.save(refundRecord);
+
+            WxNotifyReturnDTO wxNotifyReturnDTO = new WxNotifyReturnDTO();
+            wxNotifyReturnDTO.setCode("SUCCESS");
+            wxNotifyReturnDTO.setMessage("成功");
+            return wxNotifyReturnDTO;
+        }else{
+            throw new CustomException(bodyAsString);
+        }
+
+    }
+
+    @Override
+    public RefundRecord getByRefundId(String refundId) {
+        return refundRecordMapper.getByRefundId(refundId);
+    }
+}

+ 46 - 0
jkt-service/src/main/java/com/miaxis/wx/service/impl/WxOrderServiceImpl.java

@@ -0,0 +1,46 @@
+package com.miaxis.wx.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.miaxis.common.enums.OrderStatusEnum;
+import com.miaxis.system.service.ISysConfigService;
+import com.miaxis.wx.domain.WxOrder;
+import com.miaxis.wx.mapper.WxOrderMapper;
+import com.miaxis.wx.service.IWxOrderService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+/**
+ * 电影订单Service业务层处理
+ *
+ * @author miaxis
+ * @date 2021-05-07
+ */
+@Service
+@Slf4j
+public class WxOrderServiceImpl extends ServiceImpl<WxOrderMapper, WxOrder> implements IWxOrderService {
+    @Resource
+    private WxOrderMapper wxOrderMapper;
+
+
+    @Autowired
+    private ISysConfigService configService;
+
+
+
+    @Override
+    public void createVipOrder(WxOrder wxOrder) {
+        String price = configService.selectConfigByKey("vip_price");
+        Double dprice = Double.valueOf(price);
+        Double v =dprice* 100;
+        wxOrder.setTotal(v.intValue());
+        wxOrder.setOrderStatus(OrderStatusEnum.PROCESSING.getCode());
+
+    }
+    @Override
+    public WxOrder getByOutTradeNo(String outTradeNo) {
+        return wxOrderMapper.getByOutTradeNo(outTradeNo);
+    }
+}