From 7e2eb8af7459da7a03a23606651dfbfb5a5f2cee Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期一, 29 十二月 2025 16:12:31 +0800
Subject: [PATCH] 文档调整

---
 ruoyi-applet/src/main/resources/application-prod.yml                             |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/UserInsuranceVo.java              |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/wxPay/utils/WxRefundUtil.java        |   35 +++++
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/InsuranceController.java |  121 ++++++++++++++++++--
 ruoyi-system/src/main/java/com/ruoyi/system/model/TInsuranceOrder.java           |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/wxPay/model/V3.java                  |   13 ++
 ruoyi-system/src/main/java/com/ruoyi/system/wxPay/utils/WxV3Pay.java             |   30 +++++
 ruoyi-admin/src/main/resources/application.yml                                   |    2 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxPayController.java     |  103 +++++++++++++++++
 9 files changed, 298 insertions(+), 16 deletions(-)

diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index e673e36..dcc106d 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -1,4 +1,4 @@
 # 项目相关配置
 spring:
   profiles:
-    active: prod
+    active: test
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/InsuranceController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/InsuranceController.java
index 2a7a876..59533b4 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/InsuranceController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/InsuranceController.java
@@ -1,22 +1,36 @@
 package com.ruoyi.web.controller.api;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.domain.BaseModel;
+import com.ruoyi.common.core.domain.BasePage;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.utils.OrderNos;
 import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.dto.BuyInsuranceDto;
-import com.ruoyi.system.model.TBanner;
-import com.ruoyi.system.model.TCourse;
-import com.ruoyi.system.model.TInsuranceOrder;
+import com.ruoyi.system.model.*;
 import com.ruoyi.system.query.GetCourseListQuery;
+import com.ruoyi.system.service.TAppUserService;
+import com.ruoyi.system.service.TBannerService;
 import com.ruoyi.system.service.TInsuranceOrderService;
+import com.ruoyi.system.service.TInsuranceService;
 import com.ruoyi.system.vo.UserInsuranceVo;
+import com.ruoyi.system.wxPay.utils.WxRefundUtil;
+import com.ruoyi.system.wxPay.utils.WxV3Pay;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.Map;
 import java.util.Objects;
 
 @Slf4j
@@ -27,10 +41,16 @@
 
     private final TInsuranceOrderService tInsuranceOrderService;
     private final TokenService tokenService;
+    private final TInsuranceService tInsuranceService;
+    private final WxV3Pay wxV3Pay;
+    private final TAppUserService  tAppUserService;
 
-    public InsuranceController(TInsuranceOrderService tInsuranceOrderService, TokenService tokenService) {
+    public InsuranceController(TInsuranceOrderService tInsuranceOrderService, TokenService tokenService, TInsuranceService tInsuranceService, WxV3Pay wxV3Pay, TAppUserService tAppUserService) {
         this.tInsuranceOrderService = tInsuranceOrderService;
         this.tokenService = tokenService;
+        this.tInsuranceService = tInsuranceService;
+        this.wxV3Pay = wxV3Pay;
+        this.tAppUserService = tAppUserService;
     }
 
 
@@ -55,12 +75,16 @@
 
     @PostMapping("/buyInsurance")
     @ApiOperation(value = "保险模块--购买保险")
-    public R<?> buyInsurance(@RequestBody BuyInsuranceDto dto) {
+    public R<?> buyInsurance(@RequestBody BuyInsuranceDto dto) throws ParseException {
         String userId = tokenService.getLoginUserApplet().getUserId();
+        TAppUser appUser = tAppUserService.getById(userId);
+
         // 查询保险订单
         TInsuranceOrder one = tInsuranceOrderService.getOne(Wrappers.<TInsuranceOrder>lambdaQuery().eq(TInsuranceOrder::getAppUserId, userId).eq(TInsuranceOrder::getStatus, 2).orderByDesc(BaseModel::getCreateTime).last("LIMIT 1"));
         if(one!=null){
-            return R.fail("您已购买保险");
+            if(one.getEndTime().after(new Date())){
+                return R.fail("您已购买保险");
+            }
         }
         TInsuranceOrder insuranceOrder = new TInsuranceOrder();
         insuranceOrder.setAppUserId(userId);
@@ -69,15 +93,86 @@
         insuranceOrder.setIdCard(dto.getIdCard());
         insuranceOrder.setImg(dto.getImg());
         insuranceOrder.setPayType(dto.getType());
-
-
-
-        boolean save = tInsuranceOrderService.save(insuranceOrder);
-        if(save){
-            return R.ok("购买成功");
+        TInsurance insurance = tInsuranceService.getOne(new LambdaQueryWrapper<TInsurance>().eq(TInsurance::getStatus, 1));
+        if(insurance==null){
+            return R.fail("保险已关闭");
         }
-        return R.fail("购买失败");
+        insuranceOrder.setInsuranceId(insurance.getId());
+        insuranceOrder.setPayMoney(BigDecimal.valueOf(insurance.getInsuranceMoney()).setScale(2, RoundingMode.HALF_UP));
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        Date date = simpleDateFormat.parse(insurance.getValidityTime());
+        insuranceOrder.setEndTime(date);
+
+        String payNo = OrderNos.getDid();
+        insuranceOrder.setPayNo(payNo);
+        boolean save = tInsuranceOrderService.save(insuranceOrder);
+        Map<String, Object> result = wxV3Pay.jsApiInsurance(payNo, insuranceOrder.getPayMoney().multiply(BigDecimal.valueOf(100)).longValue(), appUser.getOpenId(),"购买保险","");
+        return R.ok(result);
     }
 
 
+
+    @ApiOperation(value = "保险模块--缴费记录")
+    @PostMapping("/getInsuranceOrderList")
+    public R<?> getInsuranceOrderList(@RequestBody BasePage query) {
+        String userId = tokenService.getLoginUserApplet().getUserId();
+        Page<TInsuranceOrder> page = tInsuranceOrderService.page(new Page<>(query.getPageNum(), query.getPageSize()), Wrappers.<TInsuranceOrder>lambdaQuery().eq(TInsuranceOrder::getAppUserId, userId).ne(TInsuranceOrder::getStatus,0).orderByDesc(BaseModel::getCreateTime));
+        return R.ok(page);
+    }
+
+
+
+
+    @PostMapping("/refundOrder")
+    @ApiOperation(value = "保险模块--退款")
+    public R<?> refundOrder(@RequestBody TInsuranceOrder order) {
+        String userId = tokenService.getLoginUserApplet().getUserId();
+        TInsuranceOrder order1 = tInsuranceOrderService.getById(order.getId());
+        order1.setRefundReason(order.getRefundReason());
+        order1.setRefundReasonPictures(order.getRefundReasonPictures());
+
+        order1.setRequestRefundTime(new Date());
+        order1.setRefundMoney(order1.getPayMoney().doubleValue());
+
+        if(!userId.equals(order1.getAppUserId())){
+            return R.fail("无权限操作");
+        }
+        if(order1.getStatus()!=2){
+            return R.fail("状态不允许退款");
+        }
+        order1.setStatus(4);
+        LocalDateTime payTime = order1.getPayTime();
+        if(payTime==null){
+            return R.fail("状态不允许退款");
+        }
+        if(payTime.plusDays(2).isBefore(LocalDateTime.now())){
+            order1.setBankCardNumber(order.getBankCardNumber());
+            order1.setCardholderName(order.getCardholderName());
+            order1.setRefundStatus(1);
+            tInsuranceOrderService.updateById(order1);
+        }else {
+            String outRefundNo = OrderNos.getDid();
+            order1.setRefundNumber(outRefundNo);
+            tInsuranceOrderService.updateById(order1);
+//            tInsuranceOrderService refundModel = new WxPaymentRefundModel();
+////            refundModel.setSub_mchid(weixinPayProperties.getMchId());
+////            refundModel.setSp_appid(weixinPayProperties.getAppId());
+////            refundModel.setTransaction_id(courseOrder1.getTransactionId());
+//            refundModel.setOut_trade_no(courseOrder1.getOrderNumber());
+//            refundModel.setOut_refund_no(OrderNos.getDid());
+//            refundModel.setReason(courseOrder1.getRefundReason());
+//            refundModel.setGoods_detail(new ArrayList<>());
+//            refundModel.setAmount(new WxPaymentRefundModel.RefundAmount(courseOrder1.getPayMoney().multiply(BigDecimal.valueOf(100)).intValue(), "CNY", courseOrder1.getPayMoney().multiply(BigDecimal.valueOf(100)).intValue()));
+//            Map<String, Object> refund = wxV3Pay.refund(refundModel);
+//            System.out.println(refund);
+            String result = wxRefundUtil.refund(order1.getPayMoney().multiply(BigDecimal.valueOf(100)).intValue(), order1.getPayNo(),outRefundNo);
+            if(result!=null){
+                return R.fail(result);
+            }
+        }
+        return R.ok();
+    }
+
+    @Autowired
+    private WxRefundUtil wxRefundUtil;
 }
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxPayController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxPayController.java
index d8f3d6f..b3ca4a9 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxPayController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxPayController.java
@@ -7,7 +7,10 @@
 import com.ruoyi.common.utils.CodeGenerateUtils;
 import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.model.TCourseOrder;
+import com.ruoyi.system.model.TInsurance;
+import com.ruoyi.system.model.TInsuranceOrder;
 import com.ruoyi.system.service.TCourseOrderService;
+import com.ruoyi.system.service.TInsuranceOrderService;
 import com.ruoyi.system.wxPay.enums.RefundEnum;
 import com.ruoyi.system.wxPay.enums.TradeStateEnum;
 import com.ruoyi.system.wxPay.model.WeixinPayProperties;
@@ -28,6 +31,8 @@
 import java.io.PrintWriter;
 import java.math.BigDecimal;
 import java.nio.charset.StandardCharsets;
+import java.time.LocalDateTime;
+import java.util.Date;
 import java.util.Map;
 import java.util.Objects;
 
@@ -49,6 +54,9 @@
 
     @Autowired
     private TCourseOrderService courseOrderService;
+
+    @Autowired
+    private TInsuranceOrderService tInsuranceOrderService;
 
 
 
@@ -90,6 +98,55 @@
                 order.setPayTime(WxTimeUtils.dateToLocalDateTime(WxTimeUtils.toRfc3339Date(success_time)));
                 order.setTransactionId(transaction_id);
                 courseOrderService.updateById(order);
+
+                PrintWriter out = response.getWriter();
+                out.print("SUCCESS");
+                out.flush();
+                out.close();
+            }
+        } catch (Exception e) {
+            log.error("支付回调异常:{}", e, e);
+            wxV3Pay.ack(false, e.getMessage());
+        }
+    }
+    /**
+     * 支付回调
+     */
+    @PostMapping("pay/notifyInsurance")
+    @ApiOperation("保险订单回调")
+    public void notifyInsurance(HttpServletRequest request, HttpServletResponse response) throws Exception {
+        try {
+            System.err.println("微信回调");
+            BufferedReader reader = request.getReader();
+            StringBuilder requestBody = new StringBuilder();
+            String line;
+            while ((line = reader.readLine()) != null) {
+                requestBody.append(line);
+            }
+            System.err.println("全部请求体" + requestBody);
+            JSONObject jsonObject = JSONObject.parseObject(requestBody.toString());
+            JSONObject resource = jsonObject.getJSONObject("resource");
+
+            AesUtil aesUtil = new AesUtil(weixinPayProperties.getV3().getApiKey().getBytes(StandardCharsets.UTF_8));
+            String decryptedData = aesUtil.decryptToString(resource.getString("associated_data").getBytes(StandardCharsets.UTF_8), resource.getString("nonce").getBytes(StandardCharsets.UTF_8),
+                    resource.getString("ciphertext"));
+            System.err.println("微信解密的字符串信息" + decryptedData);
+            JSONObject jsonInfo = JSONObject.parse(decryptedData);
+            String out_trade_no = jsonInfo.getString("out_trade_no");
+            String transaction_id = jsonInfo.getString("transaction_id");
+            String trade_state = jsonInfo.getString("trade_state");
+            String success_time = jsonInfo.getString("success_time");
+            // 查询订单
+
+            TInsuranceOrder order = tInsuranceOrderService.getOne(Wrappers.lambdaQuery(TInsuranceOrder.class)
+                    .eq(TInsuranceOrder::getPayNo, out_trade_no).last("LIMIT 1"));
+            if (trade_state.equals(TradeStateEnum.SUCCESS.name())) {
+                log.info("回调成功");
+                // 订单号查询订单
+                order.setStatus(2);
+                order.setPayTime(LocalDateTime.now());
+                order.setTransactionId(transaction_id);
+                tInsuranceOrderService.updateById(order);
 
                 PrintWriter out = response.getWriter();
                 out.print("SUCCESS");
@@ -168,4 +225,50 @@
             wxV3Pay.ack(false, "不是成功的退款状态");
         }
     }
+
+
+    @PostMapping("refund/notifyInsurance")
+    public void notifyInsurance(HttpServletRequest request) throws IOException {
+        try {
+
+            System.err.println("微信退款回调");
+            BufferedReader reader = request.getReader();
+            StringBuilder requestBody = new StringBuilder();
+            String line;
+            while ((line = reader.readLine()) != null) {
+                requestBody.append(line);
+            }
+            System.err.println("全部请求体" + requestBody);
+            JSONObject jsonObject = JSONObject.parseObject(requestBody.toString());
+            JSONObject resource = jsonObject.getJSONObject("resource");
+
+            AesUtil aesUtil = new AesUtil(weixinPayProperties.getV3().getApiKey().getBytes(StandardCharsets.UTF_8));
+            String decryptedData = aesUtil.decryptToString(resource.getString("associated_data").getBytes(StandardCharsets.UTF_8), resource.getString("nonce").getBytes(StandardCharsets.UTF_8),
+                    resource.getString("ciphertext"));
+            System.err.println("微信解密的字符串信息" + decryptedData);
+
+            JSONObject params = JSONObject.parseObject(decryptedData);
+
+            // 商户订单号
+            String out_trade_no = params.get("out_trade_no").toString();
+            // 商户退款单号
+            String out_refund_no = params.get("out_refund_no").toString();
+            // 退款状态
+            String tradeState = params.get("refund_status").toString();
+            // 微信支付订单号
+            String transaction_id = params.get("transaction_id").toString();
+            if (tradeState.equals(RefundEnum.SUCCESS.name())) {
+                TInsuranceOrder order = tInsuranceOrderService.getOne(Wrappers.lambdaQuery(TInsuranceOrder.class)
+                        .eq(TInsuranceOrder::getRefundNumber, out_refund_no).last("LIMIT 1"));
+                order.setStatus(1);
+                order.setRefundStatus(2);
+                order.setRefundTransactionId(transaction_id);
+                tInsuranceOrderService.updateById(order);
+
+                wxV3Pay.ack();
+            }
+        }catch (Exception e){
+            wxV3Pay.ack(false, "不是成功的退款状态");
+        }
+    }
 }
diff --git a/ruoyi-applet/src/main/resources/application-prod.yml b/ruoyi-applet/src/main/resources/application-prod.yml
index 4a0a879..f4359a8 100644
--- a/ruoyi-applet/src/main/resources/application-prod.yml
+++ b/ruoyi-applet/src/main/resources/application-prod.yml
@@ -226,5 +226,9 @@
       mchSerialNo: 5ED4C99FE5657DA2579BE5E7AE4255C9468627D9
       # 支付成功回调地址
       notifyPayUrl: https://rhljsq.pzhsoar.com/applet/wx/pay/notify
+      # 保险支付成功回调地址
+      insuranceNotifyPayUrl: https://rhljsq.pzhsoar.com/applet/wx/pay/notifyInsurance
       # 支付退款回调地址
       notifyRefundUrl: https://rhljsq.pzhsoar.com/applet/wx/refund/notify
+      # 保险支付退款回调地址
+      notifyInsuranceRefundUrl: https://rhljsq.pzhsoar.com/applet/wx/refund/notifyInsurance
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TInsuranceOrder.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TInsuranceOrder.java
index 2ee35f4..3c5dec9 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/TInsuranceOrder.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TInsuranceOrder.java
@@ -15,6 +15,7 @@
 
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.Date;
 
 /**
@@ -81,7 +82,7 @@
     @TableField("pay_time")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @ApiModelProperty(value = "支付时间")
-    private Date payTime;
+    private LocalDateTime payTime;
     @TableField("end_time")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @ApiModelProperty(value = "截至时间")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/UserInsuranceVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/UserInsuranceVo.java
index eacfaf9..3d54b64 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/UserInsuranceVo.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/UserInsuranceVo.java
@@ -5,6 +5,7 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.time.LocalDateTime;
 import java.util.Date;
 
 @Data
@@ -16,7 +17,7 @@
 
     @ApiModelProperty("保险支付时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date payTime;
+    private LocalDateTime payTime;
 
     @ApiModelProperty("保险到期时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/wxPay/model/V3.java b/ruoyi-system/src/main/java/com/ruoyi/system/wxPay/model/V3.java
index 66909d5..130dcee 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/wxPay/model/V3.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/wxPay/model/V3.java
@@ -48,11 +48,24 @@
     private String notifyPayUrl;
 
     /**
+     * 支付回调地址 保险
+     *
+     * @return
+     */
+    private String insuranceNotifyPayUrl;
+
+    /**
      * 退款回调地址
      *
      * @return
      */
     private String notifyRefundUrl;
+    /**
+     * 退款回调地址
+     *
+     * @return
+     */
+    private String notifyInsuranceRefundUrl;
 
     /**
      * 退款回调地址
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/wxPay/utils/WxRefundUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/wxPay/utils/WxRefundUtil.java
index 82f6071..3a53939 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/wxPay/utils/WxRefundUtil.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/wxPay/utils/WxRefundUtil.java
@@ -80,6 +80,41 @@
       // TODO: 请求失败,根据状态码执行不同的逻辑
     }
   }
+  public String refundInsurance(int money,String outTradeNo,String outRefundNo) {
+    // TODO: 请准备商户开发必要参数,参考:https://pay.weixin.qq.com/doc/v3/merchant/4013070756
+    WxRefundUtil client = new WxRefundUtil(
+           this. wxV3Pay.getConfig().getMchId(),                    // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/merchant/4013070756
+            this. wxV3Pay.getConfig().getV3().getMchSerialNo(),         // 商户API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013053053
+            this. wxV3Pay.getConfig().getV3().getPrivateKeyPath() ,     // 商户API证书私钥文件路径,本地文件路径
+            this. wxV3Pay.getConfig().getV3().getPublicKeyId() ,      // 微信支付公钥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013038816
+            this. wxV3Pay.getConfig().getV3().getPublicKeyPath()         // 微信支付公钥文件路径,本地文件路径
+    );
+
+    CreateRequest request = new CreateRequest();
+    request.outTradeNo = outTradeNo;
+    request.reason = "退款";
+    request.fundsAccount = ReqFundsAccount.AVAILABLE;
+    request.notifyUrl =this.wxV3Pay.getConfig().getV3().getNotifyRefundUrl();
+    request.amount = new AmountReq();
+    request.amount.refund = money;
+    request.outRefundNo =outRefundNo;
+    request.amount.total = money;
+    request.amount.currency = "CNY";
+    request.goodsDetail = new ArrayList<>();
+    try {
+      Refund response = client.run(request);
+        // TODO: 请求成功,继续业务逻辑
+        System.out.println(response);
+        return null;
+    } catch (WXPayUtility.ApiException e) {
+      String body = e.getBody();
+      JSONObject jsonObject = JSONObject.parseObject(body);
+      String result = jsonObject.get("message").toString();
+      return result;
+
+      // TODO: 请求失败,根据状态码执行不同的逻辑
+    }
+  }
 
   public Refund run(CreateRequest request) {
     String uri = PATH;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/wxPay/utils/WxV3Pay.java b/ruoyi-system/src/main/java/com/ruoyi/system/wxPay/utils/WxV3Pay.java
index e34c2e8..1dc9b2f 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/wxPay/utils/WxV3Pay.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/wxPay/utils/WxV3Pay.java
@@ -138,6 +138,36 @@
             throw new RuntimeException("获取支付数据错误!");
         }
     }
+    public Map<String, Object> jsApiInsurance(String tradeNo, Long amount, String openid, String description,String attach) {
+        JsapiPrepay client = new JsapiPrepay(
+                this.config.getMchId(),                    // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/merchant/4013070756
+                this.config.getV3().getMchSerialNo(),         // 商户API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013053053
+                this.config.getV3().getPrivateKeyPath(),     // 商户API证书私钥文件路径,本地文件路径
+                this.config.getV3().getPublicKeyId(),      // 微信支付公钥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/merchant/4013038816
+                this.config.getV3().getPublicKeyPath()           // 微信支付公钥文件路径,本地文件路径
+        );
+        JsapiPrepay.DirectAPIv3JsapiPrepayRequest request = new JsapiPrepay.DirectAPIv3JsapiPrepayRequest();
+        request.appid = this.config.getAppId();
+        request.mchid = this.config.getMchId();
+        request.description = description;
+        request.outTradeNo = tradeNo;
+//        request.timeExpire = "2018-06-08T10:34:56+08:00";
+        request.attach = attach;
+        request.notifyUrl = this.config.getV3().getInsuranceNotifyPayUrl();
+        request.goodsTag = "WXG";
+        request.supportFapiao = false;
+        request.amount = new JsapiPrepay.CommonAmountInfo();
+        request.amount.total = amount;
+        request.amount.currency = "CNY";
+        request.payer = new JsapiPrepay.JsapiReqPayerInfo();
+        request.payer.openid = openid;
+        try {
+            JsapiPrepay.DirectAPIv3JsapiPrepayResponse response = client.run(request);
+            return wxTuneUp(this.privateKeySigner, this.config.getAppId(), response.prepayId);
+        } catch (WXPayUtility.ApiException e) {
+            throw new RuntimeException("获取支付数据错误!");
+        }
+    }
 //    /**
 //     * jsApi下单
 //     *

--
Gitblit v1.7.1