Althars123 3 anni fa
parent
commit
dcdf9af134
36 ha cambiato i file con 1747 aggiunte e 10 eliminazioni
  1. 201 0
      twzd-admin/src/main/java/com/miaxis/app/controller/wx/WxController.java
  2. 235 0
      twzd-admin/src/main/java/com/miaxis/app/controller/wx/WxNotifyController.java
  3. 6 6
      twzd-admin/src/main/java/com/miaxis/system/controller/system/SysLoginController.java
  4. 11 0
      twzd-admin/src/main/resources/application-dev.yml
  5. 10 0
      twzd-admin/src/main/resources/application-prod.yml
  6. BIN
      twzd-admin/src/main/resources/wechatpay/apiclient_cert.p12
  7. 24 0
      twzd-admin/src/main/resources/wechatpay/apiclient_cert.pem
  8. 28 0
      twzd-admin/src/main/resources/wechatpay/apiclient_key.pem
  9. 55 0
      twzd-common/src/main/java/com/miaxis/common/config/BeanConfig.java
  10. 37 0
      twzd-common/src/main/java/com/miaxis/common/config/WxVerifierConfig.java
  11. 22 0
      twzd-common/src/main/java/com/miaxis/common/config/WxpayConfig.java
  12. 18 0
      twzd-common/src/main/java/com/miaxis/common/core/domain/model/WxUserInfo.java
  13. 1 1
      twzd-generator/src/main/resources/vm/java/controller.java.vm
  14. 141 0
      twzd-service/src/main/java/com/miaxis/wx/domain/RefundRecord.java
  15. 166 0
      twzd-service/src/main/java/com/miaxis/wx/domain/WxOrder.java
  16. 10 0
      twzd-service/src/main/java/com/miaxis/wx/dto/AiOrderNotifyDTO.java
  17. 27 0
      twzd-service/src/main/java/com/miaxis/wx/dto/CinemaData.java
  18. 50 0
      twzd-service/src/main/java/com/miaxis/wx/dto/FilmWxpayRefundDTO.java
  19. 46 0
      twzd-service/src/main/java/com/miaxis/wx/dto/PcWxOrderListDTO.java
  20. 70 0
      twzd-service/src/main/java/com/miaxis/wx/dto/WxFuluOrderDetailDTO.java
  21. 55 0
      twzd-service/src/main/java/com/miaxis/wx/dto/WxFuluOrderNotifyDTO.java
  22. 9 0
      twzd-service/src/main/java/com/miaxis/wx/dto/WxNotifyReturnDTO.java
  23. 53 0
      twzd-service/src/main/java/com/miaxis/wx/dto/WxOrderCreateDTO.java
  24. 31 0
      twzd-service/src/main/java/com/miaxis/wx/dto/WxOrderCreateFuluDTO.java
  25. 28 0
      twzd-service/src/main/java/com/miaxis/wx/dto/WxOrderCreatePhoneBillDTO.java
  26. 26 0
      twzd-service/src/main/java/com/miaxis/wx/dto/WxOrderListDTO.java
  27. 55 0
      twzd-service/src/main/java/com/miaxis/wx/dto/WxOrderNotifyDTO.java
  28. 52 0
      twzd-service/src/main/java/com/miaxis/wx/dto/WxpayNotifyDTO.java
  29. 24 0
      twzd-service/src/main/java/com/miaxis/wx/mapper/RefundRecordMapper.java
  30. 30 0
      twzd-service/src/main/java/com/miaxis/wx/mapper/WxOrderMapper.java
  31. 28 0
      twzd-service/src/main/java/com/miaxis/wx/service/IRefundRecordService.java
  32. 17 0
      twzd-service/src/main/java/com/miaxis/wx/service/IWxOrderService.java
  33. 11 0
      twzd-service/src/main/java/com/miaxis/wx/service/WxService.java
  34. 121 0
      twzd-service/src/main/java/com/miaxis/wx/service/impl/RefundRecordServiceImpl.java
  35. 46 0
      twzd-service/src/main/java/com/miaxis/wx/service/impl/WxOrderServiceImpl.java
  36. 3 3
      twzd-system/src/main/java/com/miaxis/system/dto/system/TokenDTO.java

+ 201 - 0
twzd-admin/src/main/java/com/miaxis/app/controller/wx/WxController.java

@@ -0,0 +1,201 @@
+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.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.service.IWxOrderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.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.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.security.PrivateKey;
+import java.security.Signature;
+import java.util.Base64;
+
+import static com.miaxis.common.utils.OrderCodeFactory.getOrderCode;
+
+/**
+ * 【小程序-微信支付】Controller
+ *
+ * @author miaxis
+ * @date 2021-03-10
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(Constants.STUDENT_PREFIX+"/wx")
+@Api(tags = {"【H5-微信支付】"})
+@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<JSONObject> 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 JSONObject placeWxOrder(WxOrder order, String goodsName) throws Exception {
+        HttpPost httpPost = initHttpPost();
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        ObjectMapper objectMapper = new ObjectMapper();
+        ObjectNode rootNode = objectMapper.createObjectNode();
+        rootNode.put("mchid",wxpayConfig.getMerchantId())
+                .put("appid", appid)
+                .put("description", goodsName)
+                .put("notify_url", notifyUrl)
+                .put("out_trade_no", order.getOutTradeNo());
+        rootNode.putObject("amount")
+                .put("total", order.getTotal());
+        rootNode.putObject("payer")
+                .put("openid", order.getOpenid());
+        objectMapper.writeValue(bos, rootNode);
+        httpPost.setEntity(new StringEntity(rootNode.toString(), "utf-8"));
+        HttpResponse response = httpClient.execute(httpPost);
+        String bodyAsString = EntityUtils.toString(response.getEntity());
+        if (JSONObject.parseObject(bodyAsString).get("prepay_id") == null){
+            throw new CustomException(JSONObject.parseObject(bodyAsString).get("message").toString());
+        }
+        return getWxParamJson(bodyAsString,order.getOutTradeNo());
+
+    }
+
+    // 生成调用调起微信支付所需参数
+    private JSONObject getWxParamJson(String bodyAsString, String orderCode) throws Exception {
+        String  packageStr = "prepay_id="+JSONObject.parseObject(bodyAsString).get("prepay_id");
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("package",packageStr);
+        String nonce_str = RandomStringUtils.randomAlphanumeric(32);
+        jsonObject.put("nonceStr",nonce_str);
+        long timestamp =  System.currentTimeMillis()/1000;
+        jsonObject.put("timeStamp",String.valueOf(timestamp));
+        jsonObject.put("signType","RSA");
+        StringBuffer sb = new StringBuffer();
+        sb.append(appid + "\n");
+        sb.append(timestamp + "\n");
+        sb.append(nonce_str + "\n");
+        sb.append(packageStr+ "\n");
+        System.out.println(sb);
+
+        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);
+        jsonObject.put("paySign",base64Str);
+        jsonObject.put("outTradeNo",orderCode);
+        return jsonObject;
+    }
+
+    private HttpPost initHttpPost() {
+        HttpPost httpPost = new HttpPost(wxpayConfig.getV3url());
+        httpPost.addHeader("Accept", "application/json");
+        httpPost.addHeader("Content-type","application/json; charset=utf-8");
+        return httpPost;
+    }
+
+    @Data
+    class  WxParamEntity{
+        String appId;
+        String partnerId;
+        String prepayId;
+        String packageValue;
+        String nonceStr;
+        String timeStamp;
+        String sign;
+
+    }
+
+
+
+
+
+
+
+
+
+
+}

+ 235 - 0
twzd-admin/src/main/java/com/miaxis/app/controller/wx/WxNotifyController.java

@@ -0,0 +1,235 @@
+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.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+import java.util.Random;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(Constants.OPEN_PREFIX+"/wx/notify")
+@Api(tags = {"【H5-微信回调】"})
+@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);
+        //将回调数据写入数据库
+        String outTradeNo = 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);
+
+
+    }
+
+
+
+
+
+
+    public String 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"));
+        }
+        wxOrderService.updateById(wxOrder);
+        return outTradeNo;
+
+    }
+
+    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());
+    }
+
+    private String randomVipcode() {
+        String result = "";
+        Random random = new Random();
+        for(int i =0 ;i <11 ;i ++){
+            result+=random.nextInt(10);
+        }
+        return  result;
+
+
+    }
+
+
+
+
+
+
+
+}

+ 6 - 6
twzd-admin/src/main/java/com/miaxis/system/controller/system/SysLoginController.java

@@ -4,9 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.miaxis.common.core.domain.Response;
 import com.miaxis.common.core.domain.entity.SysMenu;
 import com.miaxis.common.core.domain.entity.SysUser;
-import com.miaxis.common.core.domain.model.LoginBody;
-import com.miaxis.common.core.domain.model.LoginBodyNoCode;
-import com.miaxis.common.core.domain.model.LoginUser;
+import com.miaxis.common.core.domain.model.*;
 import com.miaxis.common.enums.StudentLoginTypeEnum;
 import com.miaxis.common.exception.CustomException;
 import com.miaxis.common.utils.SecurityUtils;
@@ -18,7 +16,6 @@ import com.miaxis.system.dto.common.RouterDTO;
 import com.miaxis.system.dto.system.TokenDTO;
 import com.miaxis.system.dto.system.UserInfoDTO;
 import com.miaxis.system.service.ISysMenuService;
-import com.miaxis.common.core.domain.model.WxResult;
 import com.miaxis.wx.service.WxService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -124,10 +121,13 @@ public class SysLoginController
         if (wxResult.getErrcode() != null){
             throw new CustomException("微信授权无效,请重新授权");
         }
+        String userInfoStr = wxService.getUserInfo("zh_CN", wxResult.getAccess_token(), wxResult.getOpenid());
+        WxUserInfo wxUserInfo = JSONObject.parseObject(userInfoStr,WxUserInfo.class);
+
         String token = loginService.login(wxResult.getOpenid(),null, StudentLoginTypeEnum.AUTHORIZATION_CODE_LOGIN.getCode());
         TokenDTO tokenDTO = new TokenDTO();
         tokenDTO.setToken(token);
-        tokenDTO.setWxResult(wxResult);
+        tokenDTO.setWxUserInfo(wxUserInfo);
         return Response.success(tokenDTO) ;
 
 
@@ -136,7 +136,7 @@ public class SysLoginController
     @PostMapping("/login/code/test")
     @ApiOperation("用户授权码模式登录--测试")
     public Response<TokenDTO> testloginByAuthorizationCode(String authorizationCode ){
-        String token = loginService.login("oN0Np5sK6JeTRa06hlE4-OkHDlDY",null, StudentLoginTypeEnum.AUTHORIZATION_CODE_LOGIN.getCode());
+        String token = loginService.login("ovKTX5zYvp9OXE43ADwLa1RHna0g",null, StudentLoginTypeEnum.AUTHORIZATION_CODE_LOGIN.getCode());
         TokenDTO tokenDTO = new TokenDTO();
         tokenDTO.setToken(token);
         return Response.success(tokenDTO) ;

+ 11 - 0
twzd-admin/src/main/resources/application-dev.yml

@@ -85,4 +85,15 @@ app:
     appSecret: 8604f2a6eb6338cfa64e7df4ec2c08b3
 
 
+# 微信支付
+wxpay:
+    v3url: https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi
+    v3urlRefund: https://api.mch.weixin.qq.com/v3/refund/domestic/refunds
+    merchantId: 1615410794
+    serialNumber: 5F85D69504B3B33DAF5A7C5B86A3E93915D3D5B0
+    v3key: 8604f2a6eb6338cfa64e7df4ec2c08b3
+    notifyUrl: http://218.85.55.253:65535/twzd-admin/open-api/wx/notify/wxpay
+    notifyUrlRefund: http://218.85.55.253:65535/twzd-admin/open-api/wx/notify/refund
+
+
 

+ 10 - 0
twzd-admin/src/main/resources/application-prod.yml

@@ -79,3 +79,13 @@ spring:
 app:
     appId: wx67ca1b8c9816ef28
     appSecret: 8604f2a6eb6338cfa64e7df4ec2c08b3
+
+# 微信支付
+wxpay:
+    v3url: https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi
+    v3urlRefund: https://api.mch.weixin.qq.com/v3/refund/domestic/refunds
+    merchantId: 1615410794
+    serialNumber: 5F85D69504B3B33DAF5A7C5B86A3E93915D3D5B0
+    v3key: 8604f2a6eb6338cfa64e7df4ec2c08b3
+    notifyUrl: http://	jpcj-h5.zzxcx.net.zzxcx.net/prod-api/open-api/wx/notify/wxpay
+    notifyUrlRefund: http://	jpcj-h5.zzxcx.net.zzxcx.net/prod-api/open-api/wx/notify/refund

BIN
twzd-admin/src/main/resources/wechatpay/apiclient_cert.p12


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

@@ -0,0 +1,24 @@
+-----BEGIN CERTIFICATE-----
+MIID+TCCAuGgAwIBAgIUX4XWlQSzsz2vWnxbhqPpORXT1bAwDQYJKoZIhvcNAQEL
+BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
+FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
+Q0EwHhcNMjExMDIwMDkxOTA2WhcNMjYxMDE5MDkxOTA2WjCBijETMBEGA1UEAwwK
+MTYxNTQxMDc5NDEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMTYwNAYDVQQL
+DC3npo/lt57puL/nqIvlpKnlronpqb7pqbblkZjln7norq3mnInpmZDlhazlj7gx
+CzAJBgNVBAYMAkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAMwRV01WeeQ83V5siu6GFKN7j1yt7DnULtyv9JnbE14z
+WcKCd5L6nyVvWBBtCtjlOjZ9ZXhxS4HUyzy1TDzY/gcVrpLwiV73Mvcjpe643Kax
++tGlfWTcFTEw/eFNzQyj+jaTvYvHqW5iJibNECVbPnkeDiT3M2yB9z6iyIwibKth
+cLXvBqPUkIv/xPRZPjOJvenW64J62whGv8aG/5+dY+lrpKkZlO6P5bEwCZvEd7K5
+F3wf08F8rSE2OTUzzc84I19hNFkKy8iapkw1gKC6y8SLrHvMmiGZhcdo5dG4h5Wr
+vKrkMsXjSq7Zu6RRYDY6d+xr9ZRxWI2iR68A9/fTfsECAwEAAaOBgTB/MAkGA1Ud
+EwQCMAAwCwYDVR0PBAQDAgTwMGUGA1UdHwReMFwwWqBYoFaGVGh0dHA6Ly9ldmNh
+Lml0cnVzLmNvbS5jbi9wdWJsaWMvaXRydXNjcmw/Q0E9MUJENDIyMEU1MERCQzA0
+QjA2QUQzOTc1NDk4NDZDMDFDM0U4RUJEMjANBgkqhkiG9w0BAQsFAAOCAQEAi0Yj
+8PTQOy+kocAvZmWJwZIzvkDSO05nT5HbUhpc83eXBxXLq2PdWlZ0g4dWzoB7eumv
+68nTQ3ohV86vK++J0itaNkXteQVJFSk89OvH7rYfFaUloi6bYFKmuB7Rddu2nkUo
+qMpE6l41MhISe/F7KK1lGP1AgEQIVYcNrMgphlvCTh6KCwRsa2BmdsuG5AeLtnln
+dRuo1Y4dRa/1DyCG8Pi3UsDcCciff6KZXomSoTQy578NV5ApNCAV3v2DPW/8YcWk
+CCon7krnxtJMAeCkZRVzt/HI0HMRzQk6B/oGuBDUlDwdNKnXXyZ36WGelD94WIQ4
+kWNf7oZ4wMDbK0MJ/Q==
+-----END CERTIFICATE-----

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

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDMEVdNVnnkPN1e
+bIruhhSje49crew51C7cr/SZ2xNeM1nCgneS+p8lb1gQbQrY5To2fWV4cUuB1Ms8
+tUw82P4HFa6S8Ile9zL3I6XuuNymsfrRpX1k3BUxMP3hTc0Mo/o2k72Lx6luYiYm
+zRAlWz55Hg4k9zNsgfc+osiMImyrYXC17waj1JCL/8T0WT4zib3p1uuCetsIRr/G
+hv+fnWPpa6SpGZTuj+WxMAmbxHeyuRd8H9PBfK0hNjk1M83POCNfYTRZCsvImqZM
+NYCgusvEi6x7zJohmYXHaOXRuIeVq7yq5DLF40qu2bukUWA2Onfsa/WUcViNokev
+APf3037BAgMBAAECggEBAIrAy7yRLQYMgHRgl0LBtizGqd7Zf0J+zHJPzaADfrLR
+dZm0/jrY3/cjMxzQF80MZ71/G8x+NFoN5zbbCwBghrEog+/zT2Rb7rJt8bhUx+ss
+HyAHRzCaGGq/JhDYxrBumoYbhIkTdFfSsqA1VGIiHWNbFUD7OGLyJ7vWEUh/a6ZG
+vt5+qsWLk9ioih06zWeaNXfulovmavZ0vvljhNXj2H83H/E1/3daVrYxuhk63WBm
+x2XJUNL9U8+yqW1WqPRw9u35TV34yoAJSoRbGWcAaJejfrBa6KS815NNJb6dT9Vi
+2cEl6R4YloT3rd/unXTgWMiHVQ+L8StYfB6RellbrDECgYEA6sCKK5h91+5AD39T
++jRt7Rgu7GyW0JI9ev/aT4xdIU2daP0P+YdPzSvvoaje9iknTfLkBJ9mNZDtwUHO
+LWxG5lKYYlXCOlCbVtUSYq8OPthJFo18VOFz7kSigvoS/VGUtTm/QB8soXf8GFf2
+QKdLui9tAFDHUOboXkgR1/Gu6q0CgYEA3onPrmBPYHtYkkJcuoSWsw28hqy0/ZrJ
+yN/Ss2M+zHsefSmPFjGKx5DKZ0bjPTA5Ly2NR78MyzFFSP9XFxOE4wter74i9BTe
+osNhYceWdTIv2vUIHTjOyjKTx1nyeUNAxV0ekce1V4Smql9c9ZybTb9LEb4eD9vw
+EoG8jBNeGuUCgYEA0jZEBDHzTq8cUkRUsNLONOfY7QF4M6EgyMnfdihdJPtZn7As
+4+eVQEa9uOd9cLT9a0G7iaAraIA1Rz9kHyy8eHcx2ayt1oZj8+etJQ1ZFlGbcUSV
+N3UD2TNAy0SgSJMLNRVW+1ZvItBMwIfUDaVBnKHnW8b6FKoRHowu3k6fsakCgYB+
+aXJb78GnYOnTS3c5TI/+blMlfX3igccWIG6kEEBgD6AmITFyvfnDm3Aecpoq6/XP
+4uRaWSB/XCGrccCbDy9xecfztOJOHHzLoIj07ld9g2DD1GUjlF2DZm+j0mh2kcl9
+U4RF81gDuwqhxUIdEzT1WTDfh0u0Xo9lM+VS/L18MQKBgAPHeSoKzFb3bPlAaAN4
+DxyBilpCsq6x0ebXjLj01wqaXT3g2XQqpcgN2QnYQw4pC30lEpP8LhdkEint86Ag
+SwMjtGVUz29fncxcd5tiAVf4+r5azdGcpN0Y0ZC1G20TbMolIyXFet/VbhSYxdop
+I0CuiwRTRJVwH3qRYbkUmM0x
+-----END PRIVATE KEY-----

+ 55 - 0
twzd-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
twzd-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
twzd-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;
+
+}

+ 18 - 0
twzd-common/src/main/java/com/miaxis/common/core/domain/model/WxUserInfo.java

@@ -0,0 +1,18 @@
+package com.miaxis.common.core.domain.model;
+
+
+import lombok.Data;
+
+@Data
+public class WxUserInfo {
+     String openid;
+     String nickname;
+     String sex;
+     String province;
+     String city;
+     String country;
+     String headimgurl;
+     String[] privilege;
+     String unionid;
+
+}

+ 1 - 1
twzd-generator/src/main/resources/vm/java/controller.java.vm

@@ -35,7 +35,7 @@ import com.miaxis.common.core.page.ResponsePageInfo;
  */
 @RestController
 @RequestMapping("/${moduleName}/${businessName}")
-@Api(tags={"【小程序-${functionName}】"})
+@Api(tags={"【H5-${functionName}】"})
 public class ${ClassName}Controller extends BaseController{
     @Autowired
     private I${ClassName}Service ${className}Service;

+ 141 - 0
twzd-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
twzd-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
twzd-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
twzd-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;
+
+}

+ 50 - 0
twzd-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;
+
+
+    }
+
+
+
+}

+ 46 - 0
twzd-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
twzd-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
twzd-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
twzd-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
twzd-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
twzd-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
twzd-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
twzd-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
twzd-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
twzd-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
twzd-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
twzd-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
twzd-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;
+}

+ 17 - 0
twzd-service/src/main/java/com/miaxis/wx/service/IWxOrderService.java

@@ -0,0 +1,17 @@
+package com.miaxis.wx.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.miaxis.wx.domain.WxOrder;
+
+/**
+ */
+public interface IWxOrderService extends IService<WxOrder>{
+
+
+
+    void createVipOrder(WxOrder order);
+
+    WxOrder getByOutTradeNo(String outTradeNo);
+
+
+}

+ 11 - 0
twzd-service/src/main/java/com/miaxis/wx/service/WxService.java

@@ -30,4 +30,15 @@ public interface WxService {
             @RequestParam("code") String code,
             @RequestParam("grant_type") String grantType);
 
+
+    /**
+     * 获取用户信息
+     */
+    @GetMapping(value = "/sns/userinfo")
+    String getUserInfo(
+            @RequestParam("lang") String lang,
+            @RequestParam("access_token") String accessToken,
+            @RequestParam("openid") String openid
+    );
+
 }

+ 121 - 0
twzd-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
twzd-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);
+    }
+}

+ 3 - 3
twzd-system/src/main/java/com/miaxis/system/dto/system/TokenDTO.java

@@ -1,6 +1,6 @@
 package com.miaxis.system.dto.system;
 
-import com.miaxis.common.core.domain.model.WxResult;
+import com.miaxis.common.core.domain.model.WxUserInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -17,6 +17,6 @@ public class TokenDTO {
     private static final long serialVersionUID = 1L;
     @ApiModelProperty(value = "令牌")
     private String token;
-    @ApiModelProperty(value = "微信返回数据")
-    private WxResult wxResult;
+    @ApiModelProperty(value = "微信返回用户数据")
+    private WxUserInfo wxUserInfo;
 }