From 7fd053651ac11db87fe4f6c57e65eed3b9a59452 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期三, 23 七月 2025 10:47:24 +0800
Subject: [PATCH] yml活动管理代码

---
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/Md5_Sign.java                   |   27 +
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/Base64.java                     |  118 ++++++
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargeOrderController.java    |    4 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/HttpClientPayUtil.java          |   39 ++
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/PayDto.java                           |   14 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/HttpRequester.java              |  204 +++++++++++
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/ChargeOrderService.java          |    4 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TServiceController.java       |    1 
 ruoyi-service/ruoyi-other/pom.xml                                                                |    5 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralController.java      |   73 +++
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/WXCallBackController.java     |   91 ++--
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/CreateLinkStringByGet1.java     |   37 ++
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/RSAUtils.java                   |  229 ++++++++++++
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/HttpRespons.java                |  184 ++++++++++
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ChargeOrderServiceImpl.java |   18 
 15 files changed, 986 insertions(+), 62 deletions(-)

diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargeOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargeOrderController.java
index 418894b..1bfd56d 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargeOrderController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargeOrderController.java
@@ -30,8 +30,8 @@
         if (file.isEmpty()) {
             return R.fail("请选择要上传的文件");
         }
-        chargeOrderService.importExpress(file);
-        return R.ok();
+
+        return chargeOrderService.importExpress(file);
     }
 
     /**
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/ChargeOrderService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/ChargeOrderService.java
index 6f6c6cc..cec3f87 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/ChargeOrderService.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/ChargeOrderService.java
@@ -1,6 +1,8 @@
 package com.ruoyi.order.service;
 
+import cn.hutool.json.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.web.page.PageInfo;
 import com.ruoyi.order.dto.GetImportOrderDTO;
 import com.ruoyi.order.model.ChargeOrder;
@@ -8,7 +10,7 @@
 import org.springframework.web.multipart.MultipartFile;
 
 public interface ChargeOrderService extends IService<ChargeOrder> {
-    void importExpress(MultipartFile file);
+    R<JSONObject> importExpress(MultipartFile file);
 
     PageInfo<ChargeOrder> getUserPointPageList(GetImportOrderDTO getImportOrderDTO);
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ChargeOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ChargeOrderServiceImpl.java
index dc3b6ed..5027c93 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ChargeOrderServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ChargeOrderServiceImpl.java
@@ -1,7 +1,7 @@
 package com.ruoyi.order.service.impl;
 
 import cn.hutool.core.util.IdUtil;
-import com.alibaba.fastjson2.JSONObject;
+import cn.hutool.json.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.account.api.feignClient.AppUserClient;
@@ -68,7 +68,7 @@
 
 
     @Override
-    public void importExpress(MultipartFile file) {
+    public R<JSONObject> importExpress(MultipartFile file) {
  /*       System.out.println("导入订单url:"+url);
         URL url1 = null;
         try {
@@ -80,7 +80,7 @@
             throw new RuntimeException(e);
         }*/
         List<String> orderNumberList=new ArrayList<>();
-
+        JSONObject result = new JSONObject();
         try (InputStream inputStream = file.getInputStream();
              Workbook workbook = new XSSFWorkbook(inputStream)) {
 //            Workbook workbook = new XSSFWorkbook(fileInputStream);
@@ -238,14 +238,18 @@
 
                 //检查订单号是否重复
                 if (orderNumberList.contains(orderNum)) {
-                    throw new ServiceException("订单号重复:" + orderNum, 500);
+//                    throw new ServiceException("订单号重复:" + orderNum, 500);
+                    result.append("订单号:[", orderNum+"]重复");
+                    continue;
                 }
                 //数据库中是否存在
                 ChargeOrder order = chargeOrderService.getOne(new LambdaQueryWrapper<ChargeOrder>()
                         .eq(ChargeOrder::getOrderNumber, orderNum)
                 );
                 if (order != null) {
-                    throw new ServiceException("数据库中订单已存在:" + orderNum, 500);
+//                    throw new ServiceException("数据库中订单已存在:" + orderNum, 500);
+                    result.append("订单号:[", orderNum+"]数据库中订单已存在");
+                    continue;
                 }
                 orderNumberList.add(orderNum);//添加到订单集合中
 
@@ -279,6 +283,10 @@
             e.printStackTrace();
             throw new ServiceException(e.getMessage());
         }
+        if(!result.isEmpty()){
+            return R.ok(result);
+        }
+        return R.ok();
     }
 
     @Override
diff --git a/ruoyi-service/ruoyi-other/pom.xml b/ruoyi-service/ruoyi-other/pom.xml
index fc02643..2750aaa 100644
--- a/ruoyi-service/ruoyi-other/pom.xml
+++ b/ruoyi-service/ruoyi-other/pom.xml
@@ -15,6 +15,11 @@
     </description>
 
     <dependencies>
+        <dependency>
+            <groupId>commons-httpclient</groupId>
+            <artifactId>commons-httpclient</artifactId>
+            <version>3.1</version>
+        </dependency>
         <!-- SpringCloud Alibaba Nacos -->
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralController.java
index 21f2f8a..b9fd638 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralController.java
@@ -1,5 +1,6 @@
 package com.ruoyi.other.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.web.page.PageInfo;
@@ -16,9 +17,14 @@
 import com.ruoyi.other.util.ObsUploadUtil;
 import com.ruoyi.other.util.QRCodeUtil;
 import com.ruoyi.other.util.UUIDUtil;
+import com.ruoyi.other.util.pay.CreateLinkStringByGet1;
+import com.ruoyi.other.util.pay.HttpRequester;
+import com.ruoyi.other.util.pay.HttpRespons;
+import com.ruoyi.other.util.pay.Md5_Sign;
 import com.ruoyi.other.util.payment.wx.WechatPayService;
 import com.ruoyi.other.vo.IntegralListVO;
 import com.ruoyi.other.vo.IntegralVO;
+import com.ruoyi.other.vo.PayDto;
 import com.ruoyi.system.api.domain.SysUser;
 import com.ruoyi.system.api.feignClient.SysUserClient;
 import io.swagger.annotations.ApiOperation;
@@ -38,6 +44,7 @@
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -78,23 +85,23 @@
         integralVO.setIntegral(integral);
         return R.ok(integralVO);
     }
-    @PostMapping("/queryPayStatus")
+
     @ApiOperation(tags = {"2.0-积分钱包"},value = "查询支付结果 true成功 false失败")
-    public R<Boolean> integralPageList(@RequestParam("code") String code) throws Exception {
-        Map<String, String> resMap = wechatPayService.queryOrder(code);
-        if("SUCCESS".equals(resMap.get("return_code"))){
+    @PostMapping(value = "/queryPayStatus")
+    public R buy(@RequestParam Integer id)  {
+        IntegralPay integralPay = integralPayService.getById(id);
+        if (integralPay.getPayStatus()==2){
             return R.ok(true);
-        }else{
+        }else {
             return R.ok(false);
         }
     }
-
     @PostMapping("/nativePay")
     @ApiOperation(tags = {"2.0-积分钱包"},value = "获取支付二维码")
-    public R nativePay(@RequestParam("amount") String amount) throws Exception {
+    public R<PayDto> nativePay(@RequestParam("amount") String amount) throws Exception {
         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
         String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
-        Map<String, String> res =  wechatPayService.unifiedOrder(code, amount, "积分充值", "/other/wx/integralCallback");
+//        Map<String, String> res =  wechatPayService.unifiedOrder(code, amount, "积分充值", "/other/wx/integralCallback");
         Long userid = tokenService.getLoginUser().getUserid();
         R<SysUser> sysUser = sysUserClient.getSysUser(userid);
         SysUser data = sysUser.getData();
@@ -119,14 +126,50 @@
         integralPay.setDelFlag(0);
         integralPay.setCreateTime(LocalDateTime.now());
         integralPayService.save(integralPay);
-        String codeUrl = res.get("code_url");
-        MyQrCodeUtil.createCodeToFile(codeUrl);
-        BufferedImage blueImage = QRCodeUtil.createImage(codeUrl);
-        MultipartFile blueFile = convert(blueImage, new Date().getTime() + UUIDUtil.getRandomCode(3) + ".PNG");
-        String s = ObsUploadUtil.obsUpload(blueFile);
-        System.err.println(s);
-        return R.ok(s);
+//        String codeUrl = res.get("code_url");
+//        MyQrCodeUtil.createCodeToFile(codeUrl);
+//        BufferedImage blueImage = QRCodeUtil.createImage(codeUrl);
+//        MultipartFile blueFile = convert(blueImage, new Date().getTime() + UUIDUtil.getRandomCode(3) + ".PNG");
+//        String s = ObsUploadUtil.obsUpload(blueFile);
+//        System.err.println(s);
+        int money = new BigDecimal(amount).multiply(BigDecimal.valueOf(100)).intValue();
+        String key = "ad273ceb5e1b49e68d5c565d28d1d305";/** md5密钥商户后台-商户中心-商户设置-密钥管理获取 必填!*/
+        Map<String, String> map = new HashMap<String, String>();
+        map.put("p0_Version", "2.5");/** 版本号 */
+        map.put("p1_MerchantNo", "888122400007793");/** 商户编号 */
+        map.put("p2_OrderNo", code); /**商户订单号*/
+        map.put("p3_Amount", String.valueOf(money));/**订单金额*/
+        map.put("p4_Cur", "1"); /**交易币种 */
+        map.put("p5_ProductName", "充值"); /** 商品名称 */
+        map.put("p6_ProductDesc", "积分充值"); /** 商品名称 */
+//        map.put("p7_Mp", ""); /** 如果商户请求时传递了该参数,则返回给商户时会原值传 回。 */
+        map.put("p9_NotifyUrl", "http://221.182.45.100:8084/other/wx/integralCallback"); /** 服务器异步通知地址 */
+        map.put("q1_FrpCode", "WEIXIN_NATIVE"); /** 微信扫码(主扫)【注:此为用户主扫,商户被扫】*/
+        map.put("q4_IsShowPic", "1"); /** 是否展示二 维码图片 1表示输出*/
+        map.put("q7_AppId", "wx1a4a7760be53a835"); /** 交易类型*/
+        map.put("qa_TradeMerchantNo", "777165000859101"); /** 777开头的报备商户号   必填!*/
+        map.put("qi_FqSellerPercen", "0"); /** 卖家承担收 费比例 目前仅支持传入 0 ,即用户承 担手续费!*/
+        String Strmap = CreateLinkStringByGet1.createLinkStringByGet(map);
+        // 签名
+        String sign = "";
+        sign = Md5_Sign.SignByMD5(Strmap, key);
+        map.put("hmac", sign);/** 签名数据 */
+        System.out.println("发送:" + JSON.toJSONString(map).toString());
+
+        // post请求参数内容
+        HttpRequester hr = new HttpRequester();
+        HttpRespons HP = hr.sendPost("https://trade.joinpay.com/tradeRt/uniPay", map);
+        System.out.println("接收返回参数:" + HP.getContent());
+        JSONObject resPay = JSONObject.parseObject(HP.getContent());
+        String rcResult = resPay.getString("rd_Pic");
+        Map<String, Object> map2 = new HashMap<>();
+        map2.put("rcResult", rcResult);
+        PayDto payDto = new PayDto();
+        payDto.setId(integralPay.getId());
+        payDto.setQrCode(rcResult);
+        return R.ok(payDto);
     }
+
     public static MultipartFile convert(BufferedImage bufferedImage, String fileName) throws IOException {
         // 将 BufferedImage 转换为字节数组
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TServiceController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TServiceController.java
index 6e3d633..a4de64a 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TServiceController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TServiceController.java
@@ -106,6 +106,7 @@
     @PostMapping("/nativePay")
     @ApiOperation(tags = {"2.0-服务费"},value = "获取支付二维码")
     public R nativePay(@RequestParam("amount") String amount) throws Exception {
+        // todo 查询每个站点的年服务费
         Long userid = tokenService.getLoginUser().getUserid();
         R<SysUser> sysUser = sysUserClient.getSysUser(userid);
         SysUser data = sysUser.getData();
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/WXCallBackController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/WXCallBackController.java
index 5b6e1fd..8b3dbc9 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/WXCallBackController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/WXCallBackController.java
@@ -20,6 +20,7 @@
 import com.ruoyi.system.api.feignClient.SysUserClient;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -34,7 +35,7 @@
 
 /**
  * <p>
- *  微信回调
+ * 微信回调
  * </p>
  *
  * @author 无关风月
@@ -59,22 +60,41 @@
     private WechatPayService wechatPayService;
     @Resource
     private TServicePayService servicePayService;
+
     @ResponseBody
     @PostMapping("/integralCallback")
-    public void integralCallback(HttpServletRequest request, HttpServletResponse response){
-        System.err.println("积分充值回调");
-        PayResult payResult= null;
-        try {
-            payResult = wechatPayService.processNotify(request);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
+    public R integralCallback(HttpServletRequest request, String r2_OrderNo) {
+//        System.err.println("积分充值回调");
+//        PayResult payResult= null;
+//        try {
+//            payResult = wechatPayService.processNotify(request);
+//        } catch (Exception e) {
+//            throw new RuntimeException(e);
+//        }
+        System.err.println("======积分充值回调");
+        System.err.println("======积分充值回调单号" + r2_OrderNo);
+        System.err.println("请求" + request.getParameterMap());
+        Map<String, String[]> parameterMap = request.getParameterMap();
+        String r6Status = request.getParameter("r6_Status");
+        if (org.springframework.util.StringUtils.hasLength(r6Status)) {
+            if (r6Status.equals("101")) {
+                return R.fail("支付失败");
+            }
         }
-        IntegralPay integralPay = integralPayService.lambdaQuery().eq(IntegralPay::getCode, payResult.getOrderNumber()).one();
-        if (integralPay != null && integralPay.getPayStatus() == 1){
+        // 循环打印
+        for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
+            String key = entry.getKey();
+            String[] values = entry.getValue();
+            for (String value : values) {
+                System.err.println("======回调开始" + key + ":" + value);
+            }
+        }
+        IntegralPay integralPay = integralPayService.lambdaQuery().eq(IntegralPay::getCode, r2_OrderNo).one();
+        if (integralPay != null && integralPay.getPayStatus() == 1) {
             SysUser data = sysUserClient.getSysUser(integralPay.getUserId()).getData();
             integralPay.setPayStatus(2);
             integralPay.setPayTime(LocalDateTime.now());
-            integralPay.setOrderNumber(payResult.getTransactionId());
+//            integralPay.setOrderNumber(payResult.getTransactionId());
             integralPayService.updateById(integralPay);
             IntegralRecord integralRecord = new IntegralRecord();
             integralRecord.setPayId(integralPay.getId());
@@ -85,42 +105,36 @@
             integralRecord.setDelFlag(0);
             integralRecord.setCreateTime(LocalDateTime.now());
             integralRecordService.save(integralRecord);
-            data.setIntegral(data.getIntegral()+integralPay.getIntegralCount());
+            data.setIntegral(data.getIntegral() + integralPay.getIntegralCount());
             sysUserClient.updateSysUser(data);
+            return R.ok(null, "success");
         }
-            response.setStatus(200);
-            PrintWriter out = null;
-            try {
-                out = response.getWriter();
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            }
-            out.println("success");
-            out.flush();
-            out.close();
+        return R.ok(null, "error");
+
     }
+
     @ResponseBody
     @PostMapping("/serviceCallback")
-    public void serviceCallback(HttpServletRequest request, HttpServletResponse response){
+    public void serviceCallback(HttpServletRequest request, HttpServletResponse response) {
         System.err.println("服务费缴纳回调");
-        PayResult payResult= null;
+        PayResult payResult = null;
         try {
             payResult = wechatPayService.processNotify(request);
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
         ServicePay servicePay = servicePayService.lambdaQuery().eq(ServicePay::getCode, payResult.getOrderNumber()).one();
-        if (servicePay != null && servicePay.getPayStatus() == 1){
+        if (servicePay != null && servicePay.getPayStatus() == 1) {
             servicePay.setPayStatus(2);
             ServicePay servicePayBefore = servicePayService.lambdaQuery()
                     .eq(ServicePay::getUserId, servicePay.getUserId())
-                    .eq(ServicePay::getPayStatus,2)
+                    .eq(ServicePay::getPayStatus, 2)
                     .orderByDesc(ServicePay::getCreateTime)
                     .last("limit 1")
                     .one();
-            if (servicePayBefore!=null){
+            if (servicePayBefore != null) {
                 servicePay.setEndTime(servicePayBefore.getEndTime().plusDays(365));
-            }else{
+            } else {
                 servicePay.setEndTime(LocalDateTime.now().plusDays(365));
 
             }
@@ -130,18 +144,17 @@
             servicePay.setOrderNumber(payResult.getTransactionId());
             servicePayService.updateById(servicePay);
         }
-            response.setStatus(200);
-            PrintWriter out = null;
-            try {
-                out = response.getWriter();
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            }
-            out.println("success");
-            out.flush();
-            out.close();
+        response.setStatus(200);
+        PrintWriter out = null;
+        try {
+            out = response.getWriter();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        out.println("success");
+        out.flush();
+        out.close();
     }
-
 
 
 }
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/Base64.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/Base64.java
new file mode 100644
index 0000000..6955b2e
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/Base64.java
@@ -0,0 +1,118 @@
+package com.ruoyi.other.util.pay;
+
+import java.io.ByteArrayOutputStream;
+
+/**
+ * base64 format encoding & decoding
+ */
+public class Base64 {
+
+	private static char[] base64EncodeChars = new char[] { 'A', 'B', 'C', 'D',
+			'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
+			'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
+			'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
+			'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3',
+			'4', '5', '6', '7', '8', '9', '+', '/' };
+
+	private static byte[] base64DecodeChars = new byte[] { -1, -1, -1, -1, -1,
+			-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+			-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+			-1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59,
+			60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+			10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1,
+			-1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
+			38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1,
+			-1, -1 };
+
+	private Base64(){
+	}
+
+	public static String encode(byte[] data){
+		StringBuffer sb = new StringBuffer();
+		int len = data.length;
+		int i = 0;
+		int b1, b2, b3;
+
+		while (i < len) {
+			b1 = data[i++] & 0xff;
+			if (i == len) {
+				sb.append(base64EncodeChars[b1 >>> 2]);
+				sb.append(base64EncodeChars[(b1 & 0x3) << 4]);
+				sb.append("==");
+				break;
+			}
+			b2 = data[i++] & 0xff;
+			if (i == len) {
+				sb.append(base64EncodeChars[b1 >>> 2]);
+				sb.append(base64EncodeChars[((b1 & 0x03) << 4)
+						| ((b2 & 0xf0) >>> 4)]);
+				sb.append(base64EncodeChars[(b2 & 0x0f) << 2]);
+				sb.append("=");
+				break;
+			}
+			b3 = data[i++] & 0xff;
+			sb.append(base64EncodeChars[b1 >>> 2]);
+			sb.append(base64EncodeChars[((b1 & 0x03) << 4)
+					| ((b2 & 0xf0) >>> 4)]);
+			sb.append(base64EncodeChars[((b2 & 0x0f) << 2)
+					| ((b3 & 0xc0) >>> 6)]);
+			sb.append(base64EncodeChars[b3 & 0x3f]);
+		}
+		return sb.toString();
+	}
+
+	public static byte[] decode(String str){
+		byte[] data = str.getBytes();
+		int len = data.length;
+		ByteArrayOutputStream buf = new ByteArrayOutputStream(len);
+		int i = 0;
+		int b1, b2, b3, b4;
+
+		while (i < len) {
+
+			/* b1 */
+			do {
+				b1 = base64DecodeChars[data[i++]];
+			} while (i < len && b1 == -1);
+			if (b1 == -1) {
+				break;
+			}
+
+			/* b2 */
+			do {
+				b2 = base64DecodeChars[data[i++]];
+			} while (i < len && b2 == -1);
+			if (b2 == -1) {
+				break;
+			}
+			buf.write(((b1 << 2) | ((b2 & 0x30) >>> 4)));
+
+			/* b3 */
+			do {
+				b3 = data[i++];
+				if (b3 == 61) {
+					return buf.toByteArray();
+				}
+				b3 = base64DecodeChars[b3];
+			} while (i < len && b3 == -1);
+			if (b3 == -1) {
+				break;
+			}
+			buf.write((((b2 & 0x0f) << 4) | ((b3 & 0x3c) >>> 2)));
+
+			/* b4 */
+			do {
+				b4 = data[i++];
+				if (b4 == 61) {
+					return buf.toByteArray();
+				}
+				b4 = base64DecodeChars[b4];
+			} while (i < len && b4 == -1);
+			if (b4 == -1) {
+				break;
+			}
+			buf.write((((b3 & 0x03) << 6) | b4));
+		}
+		return buf.toByteArray();
+	}
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/CreateLinkStringByGet1.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/CreateLinkStringByGet1.java
new file mode 100644
index 0000000..84b7f4d
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/CreateLinkStringByGet1.java
@@ -0,0 +1,37 @@
+package com.ruoyi.other.util.pay;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 参数的拼接整理
+ * @author Lori
+ * @version 2018年6月04日
+ */
+public class CreateLinkStringByGet1 {
+	public static String createLinkStringByGet(Map<String, String> params){
+		List<String> keys = new ArrayList<String>(params.keySet());
+		Collections.sort(keys);
+		String str1 ="";
+		for(int i=0;i<keys.size();i++) {
+			String key = keys.get(i);
+			
+			
+			Object value = params.get(key);//(String) 强制类型转换
+			if(value instanceof Integer) {
+				value = (Integer)value;
+			}
+			if(i==keys.size()-1) {
+				
+				str1 = str1+value.toString();
+			}else {
+				
+				str1 = str1+value;
+			}
+		}
+		System.out.println("整理"+str1);
+		return str1;
+	}
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/HttpClientPayUtil.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/HttpClientPayUtil.java
new file mode 100644
index 0000000..e940cf6
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/HttpClientPayUtil.java
@@ -0,0 +1,39 @@
+package com.ruoyi.other.util.pay;
+
+/**
+ * 类HttpClientUtil
+ * 
+ * @author Lori 2018年6月04日 下午16:10:04
+ */
+
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+
+public class HttpClientPayUtil {
+	public static String sendHttpPost(String url, String body) throws Exception {
+		CloseableHttpClient httpClient = HttpClients.createDefault();
+		HttpPost httpPost = new HttpPost(url);
+		httpPost.addHeader("Content-Type","application/json;charset=UTF-8");
+		//UrlEncodedFormEntity setEntity = new UrlEncodedFormEntity(body, HTTP.UTF_8);
+		StringEntity setEntity = new StringEntity(body,"utf-8");
+		setEntity.setContentType("application/json");
+		setEntity.setContentEncoding("UTF-8");
+		httpPost.setEntity(setEntity);
+		
+
+		CloseableHttpResponse response = httpClient.execute(httpPost);
+		System.out.println(response.getStatusLine().getStatusCode() + "\n");
+		HttpEntity entity = response.getEntity();
+		String responseContent = EntityUtils.toString(entity, "UTF-8"); 
+		System.out.println(responseContent);
+
+		response.close();
+		httpClient.close();
+		return responseContent;
+    }
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/HttpRequester.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/HttpRequester.java
new file mode 100644
index 0000000..b7dfba2
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/HttpRequester.java
@@ -0,0 +1,204 @@
+package com.ruoyi.other.util.pay;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.nio.charset.Charset;
+import java.util.Map;
+import java.util.Vector;
+
+public class HttpRequester {
+	private String defaultContentEncoding;  
+	   
+    public HttpRequester() {  
+        this.defaultContentEncoding = Charset.defaultCharset().name();  
+    }  
+	
+    /** 
+     * 发送POST请求 
+     *  
+     * @param urlString 
+     *            URL地址 
+     * @return 响应对象 
+     * @throws IOException 
+     */  
+    public HttpRespons sendPost(String urlString) throws IOException {  
+        return this.send(urlString, "POST", null, null);  
+    }  
+   
+    /** 
+     * 发送POST请求 
+     *  
+     * @param urlString 
+     *            URL地址 
+     * @param params 
+     *            参数集合 
+     * @return 响应对象 
+     * @throws IOException 
+     */  
+    public HttpRespons sendPost(String urlString, Map<String, String> params)  
+            throws IOException {  
+    	
+    	for(String key : params.keySet()) {
+			if(params.get(key)!=null&&!"".equals(params.get(key))) {
+				params.put(key, (String)URLEncoder.encode(params.get(key),"utf-8")) ;//(String) 强制类型转换
+			}
+    	}
+    	
+
+    	
+        return this.send(urlString, "POST", params, null);  
+    }  
+   
+    /** 
+     * 发送POST请求 
+     *  
+     * @param urlString 
+     *            URL地址 
+     * @param params 
+     *            参数集合 
+     * @param propertys 
+     *            请求属性 
+     * @return 响应对象 
+     * @throws IOException 
+     */  
+    public HttpRespons sendPost(String urlString, Map<String, String> params,  
+            Map<String, String> propertys) throws IOException {  
+        return this.send(urlString, "POST", params, propertys);  
+    }  
+   
+    /** 
+     * 发送HTTP请求 
+     *  
+     * @param urlString 
+     * @return 响映对象 
+     * @throws IOException 
+     */  
+    private HttpRespons send(String urlString, String method,  
+            Map<String, String> parameters, Map<String, String> propertys)  
+            throws IOException {  
+        HttpURLConnection urlConnection = null;  
+   
+        if (method.equalsIgnoreCase("GET") && parameters != null) {  
+            StringBuffer param = new StringBuffer();  
+            int i = 0;  
+            for (String key : parameters.keySet()) {  
+                if (i == 0)  
+                    param.append("?");  
+                else  
+                    param.append("&");  
+                param.append(key).append("=").append(parameters.get(key));  
+                i++;  
+            }  
+            urlString += param;  
+        }  
+        URL url = new URL(urlString);  
+        urlConnection = (HttpURLConnection) url.openConnection();  
+   
+        urlConnection.setRequestMethod(method);  
+        urlConnection.setDoOutput(true);  
+        urlConnection.setDoInput(true);  
+        urlConnection.setUseCaches(false);  
+   
+        if (propertys != null)  
+            for (String key : propertys.keySet()) {  
+                urlConnection.addRequestProperty(key, propertys.get(key));  
+            }  
+   
+        if (method.equalsIgnoreCase("POST") && parameters != null) {  
+            StringBuffer param = new StringBuffer();  
+            for (String key : parameters.keySet()) {  
+                param.append("&");  
+                param.append(key).append("=").append(parameters.get(key));  
+            }  
+            urlConnection.getOutputStream().write(param.toString().getBytes());  
+            urlConnection.getOutputStream().flush();  
+            urlConnection.getOutputStream().close();  
+        }  
+   
+        return this.makeContent(urlString, urlConnection);  
+    }  
+   
+    /** 
+     * 得到响应对象 
+     *  
+     * @param urlConnection 
+     * @return 响应对象 
+     * @throws IOException 
+     */  
+    private HttpRespons makeContent(String urlString,  
+            HttpURLConnection urlConnection) throws IOException {  
+        HttpRespons httpResponser = new HttpRespons();  
+        try {  
+            InputStream in = urlConnection.getInputStream();  
+            BufferedReader bufferedReader = new BufferedReader(  
+                    new InputStreamReader(in));  
+            httpResponser.contentCollection = new Vector<String>();  
+            StringBuffer temp = new StringBuffer();  
+            String line = bufferedReader.readLine();  
+            while (line != null) {  
+                httpResponser.contentCollection.add(line);  
+                temp.append(line).append("\r\n");  
+                line = bufferedReader.readLine();  
+            }  
+            bufferedReader.close();  
+   
+            String ecod = urlConnection.getContentEncoding();  
+            if (ecod == null)  
+                ecod = this.defaultContentEncoding;  
+   
+            httpResponser.urlString = urlString;  
+   
+            httpResponser.defaultPort = urlConnection.getURL().getDefaultPort();  
+            httpResponser.file = urlConnection.getURL().getFile();  
+            httpResponser.host = urlConnection.getURL().getHost();  
+            httpResponser.path = urlConnection.getURL().getPath();  
+            httpResponser.port = urlConnection.getURL().getPort();  
+            httpResponser.protocol = urlConnection.getURL().getProtocol();  
+            httpResponser.query = urlConnection.getURL().getQuery();  
+            httpResponser.ref = urlConnection.getURL().getRef();  
+            httpResponser.userInfo = urlConnection.getURL().getUserInfo();  
+   
+            httpResponser.content = new String(temp.toString().getBytes(), ecod);  
+            httpResponser.contentEncoding = ecod;  
+            httpResponser.code = urlConnection.getResponseCode();  
+            httpResponser.message = urlConnection.getResponseMessage();  
+            httpResponser.contentType = urlConnection.getContentType();  
+            httpResponser.method = urlConnection.getRequestMethod();  
+            httpResponser.connectTimeout = urlConnection.getConnectTimeout();  
+            httpResponser.readTimeout = urlConnection.getReadTimeout();  
+   
+            return httpResponser;  
+        } catch (IOException e) {  
+            throw e;  
+        } finally {  
+            if (urlConnection != null)  
+                urlConnection.disconnect();  
+        }  
+    }  
+   
+    /** 
+     * 默认的响应字符集 
+     */  
+    public String getDefaultContentEncoding() {  
+        return this.defaultContentEncoding;  
+    }  
+   
+    /** 
+     * 设置默认的响应字符集 
+     */  
+    public void setDefaultContentEncoding(String defaultContentEncoding) {  
+        this.defaultContentEncoding = defaultContentEncoding;  
+    }  
+
+}
+       
+       
+       
+       
+       
+
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/HttpRespons.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/HttpRespons.java
new file mode 100644
index 0000000..b82bb11
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/HttpRespons.java
@@ -0,0 +1,184 @@
+package com.ruoyi.other.util.pay;
+
+
+
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.RequestEntity;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Vector;
+
+
+
+public class HttpRespons {
+	  String urlString;     
+      
+	    int defaultPort;     
+	      
+	    String file;     
+	      
+	    String host;     
+	      
+	    String path;     
+	      
+	    int port;     
+	      
+	    String protocol;     
+	      
+	    String query;     
+	      
+	    String ref;     
+	      
+	    String userInfo;     
+	      
+	    String contentEncoding;     
+	      
+	    String content;     
+	      
+	    String contentType;     
+	      
+	    int code;     
+	      
+	    String message;     
+	      
+	    String method;     
+	      
+	    int connectTimeout;     
+	      
+	    int readTimeout;     
+	      
+	    Vector<String> contentCollection;     
+	      
+	    public String getContent() {     
+	        return content;     
+	    }     
+	      
+	    public String getContentType() {     
+	        return contentType;     
+	    }     
+	      
+	    public int getCode() {     
+	        return code;     
+	    }     
+	      
+	    public String getMessage() {     
+	        return message;     
+	    }     
+	      
+	    public Vector<String> getContentCollection() {     
+	        return contentCollection;     
+	    }     
+	      
+	    public String getContentEncoding() {     
+	        return contentEncoding;     
+	    }     
+	      
+	    public String getMethod() {     
+	        return method;     
+	    }     
+	      
+	    public int getConnectTimeout() {     
+	        return connectTimeout;     
+	    }     
+	      
+	    public int getReadTimeout() {     
+	        return readTimeout;     
+	    }     
+	      
+	    public String getUrlString() {     
+	        return urlString;     
+	    }     
+	      
+	    public int getDefaultPort() {     
+	        return defaultPort;     
+	    }     
+	      
+	    public String getFile() {     
+	        return file;     
+	    }     
+	      
+	    public String getHost() {     
+	        return host;     
+	    }     
+	      
+	    public String getPath() {     
+	        return path;     
+	    }     
+	      
+	    public int getPort() {     
+	        return port;     
+	    }     
+	      
+	    public String getProtocol() {     
+	        return protocol;     
+	    }     
+	      
+	    public String getQuery() {     
+	        return query;     
+	    }     
+	      
+	    public String getRef() {     
+	        return ref;     
+	    }     
+	      
+	    public String getUserInfo() {     
+	        return userInfo;     
+	    } 
+	    
+	    
+	    public static String post(String params,String requestUrl) throws IOException {  
+//	        try {
+	           //HttpRequester request = new HttpRequester();  
+	           // request.setDefaultContentEncoding("utf-8"); 	
+	            byte[] requestBytes = params.getBytes("utf-8"); // 将参数转为二进制流
+	                   HttpClient httpClient = new HttpClient(); // 客户端实例化
+	                   PostMethod postMethod = new PostMethod(requestUrl);
+	                   //设置请求头Authorization
+//	                   postMethod.setRequestHeader("Authorization", "Basic " + authorization);
+	                   // 设置请求头  Content-Type
+	                   postMethod.setRequestHeader("Content-Type", "application/json");
+	                   InputStream inputStream = new ByteArrayInputStream(requestBytes, 0,requestBytes.length);
+	                   RequestEntity requestEntity = new InputStreamRequestEntity(inputStream,
+	                             requestBytes.length, "application/json; charset=utf-8"); // 请求体
+	                   postMethod.setRequestEntity(requestEntity);
+	                   httpClient.executeMethod(postMethod);// 执行请求
+	                   InputStream soapResponseStream = postMethod.getResponseBodyAsStream();// 获取返回的流
+	                   byte[] datas = null;
+	                    try {
+	                        datas = readInputStream(soapResponseStream);// 从输入流中读取数据
+	                    } catch (Exception e) {
+	                        e.printStackTrace();
+	                     }
+	                    String result = new String(datas, "UTF-8");// 将二进制流转为String
+	                     // 打印返回结果
+	                     // System.out.println(result);
+	             
+	                     return result;   
+	    }  
+	    
+	    
+	    /**
+	          * 从输入流中读取数据
+	          * 
+	          * @param inStream
+	          * @return
+	          * @throws Exception
+	    */
+	    public static byte[] readInputStream(InputStream inStream) throws Exception {
+	    	         ByteArrayOutputStream outStream = new ByteArrayOutputStream();
+	    	         byte[] buffer = new byte[1024];
+	    	         int len = 0;
+	    	         while ((len = inStream.read(buffer)) != -1) {
+	    	            outStream.write(buffer, 0, len);
+	    	         }
+	    	         byte[] data = outStream.toByteArray();
+	    	         outStream.close();
+	    	         inStream.close();
+	    	        return data;
+	    	     }
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/Md5_Sign.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/Md5_Sign.java
new file mode 100644
index 0000000..00c1bbb
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/Md5_Sign.java
@@ -0,0 +1,27 @@
+package com.ruoyi.other.util.pay;
+
+import org.apache.commons.codec.digest.DigestUtils;
+
+/**
+ * 类MD5_Sign:MD5签名和验签
+ * 
+ * @author Lori 2018年6月04日 下午16:10:04
+ */
+public class Md5_Sign {
+
+	/**
+	 * MD5签名
+	 * 
+	 * @param requestSign 请求签名串
+	 * @param merchantKey 商户秘钥
+	 */
+	public static String SignByMD5(String requestSign, String merchantKey) {
+		
+		String reqHmac = "";
+		try {
+			reqHmac = DigestUtils.md5Hex(requestSign + merchantKey).toUpperCase();
+		} catch (Exception e) {}
+		
+		return reqHmac;
+	}
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/RSAUtils.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/RSAUtils.java
new file mode 100644
index 0000000..eff336d
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/pay/RSAUtils.java
@@ -0,0 +1,229 @@
+
+package com.ruoyi.other.util.pay;
+
+import java.io.*;
+import java.security.*;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Enumeration;
+
+/** */
+/**
+ * <p>
+ * RSA公钥/私钥/签名工具包
+ * </p>
+ * <p>
+ * 罗纳德·李维斯特(Ron [R]ivest)、阿迪·萨莫尔(Adi [S]hamir)和伦纳德·阿德曼(Leonard [A]dleman)
+ * </p>
+ * <p>
+ * 字符串格式的密钥在未在特殊说明情况下都为BASE64编码格式<br/>
+ * 由于非对称加密速度极其缓慢,一般文件不使用它来加密而是使用对称加密,<br/>
+ * 非对称加密算法可以用来对对称加密的密钥加密,这样保证密钥的安全也就保证了数据的安全
+ * </p>
+ * 
+ * @author IceWee
+ * @date 2012-4-26
+ * @version 1.0
+ */
+public class RSAUtils {
+	
+    /** */
+    /**
+     * 加密算法RSA
+     */
+    public static final String KEY_ALGORITHM = "RSA";
+
+    /** */
+    /**
+     * 签名算法
+     */
+    public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
+    
+    /**
+	 * 获取RSA私钥串
+	 * 
+	 * @param in
+	 *            RSA私钥证书文件流
+	 * @param fileSuffix
+	 *            RSA私钥名称,决定编码类型|PFX、JKS、PEM...
+	 * @param password
+	 *            RSA私钥保护密钥|口令
+	 * @param keyAlgorithm
+	 *            密钥算法
+	 * @return RSA私钥对象
+	 * @throws ServiceException
+	 */
+	public static String getRSAPrivateKeyByFileSuffix(InputStream in, String fileSuffix, String password, String keyAlgorithm)
+			throws Exception {
+		String keyType = "";
+		if ("keystore".equalsIgnoreCase(fileSuffix)) {
+			keyType = "JKS";
+		} else if ("pfx".equalsIgnoreCase(fileSuffix) || "p12".equalsIgnoreCase(fileSuffix)) {
+			keyType = "PKCS12";
+		} else if ("jck".equalsIgnoreCase(fileSuffix)) {
+			keyType = "JCEKS";
+		} else if ("pem".equalsIgnoreCase(fileSuffix) || "pkcs8".equalsIgnoreCase(fileSuffix)) {
+			keyType = "PKCS8";
+		} /*else if ("pkcs1".equalsIgnoreCase(fileSuffix)) {
+			keyType = "PKCS1";
+		} */else {
+			keyType = "JKS";
+		}
+
+		try {
+			PrivateKey priKey = null;
+			if ("JKS".equals(keyType) || "PKCS12".equals(keyType) || "JCEKS".equals(keyType)) {
+				KeyStore ks = KeyStore.getInstance(keyType);
+				if (password != null) {
+					char[] cPasswd = password.toCharArray();
+					ks.load(in, cPasswd);
+					Enumeration<String> aliasenum = ks.aliases();
+					String keyAlias = null;
+					while (aliasenum.hasMoreElements()) {
+						keyAlias = (String) aliasenum.nextElement();
+						priKey = (PrivateKey) ks.getKey(keyAlias, cPasswd);
+						if (priKey != null)
+							break;
+					}
+				}
+			} else {
+				BufferedReader br = new BufferedReader(new InputStreamReader(in));
+				StringBuilder sb = new StringBuilder();
+				String readLine = null;
+				while ((readLine = br.readLine()) != null) {
+					if (readLine.charAt(0) == '-') {
+						continue;
+					} else {
+						sb.append(readLine);
+						sb.append('\r');
+					}
+				}
+				
+				if ("PKCS8".equals(keyType)) {
+					System.out.println("1");
+					PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decode(sb.toString()));
+					System.out.println("2");
+					KeyFactory keyFactory = KeyFactory.getInstance(keyAlgorithm);
+					System.out.println("3");
+					priKey = keyFactory.generatePrivate(priPKCS8);
+					System.out.println("4");
+					
+					
+				} /*else if ("PKCS1".equals(keyType)) {
+					RSAPrivateKeyStructure asn1PrivKey = new RSAPrivateKeyStructure((ASN1Sequence) ASN1Sequence.fromByteArray(sb.toString().getBytes()));
+					KeySpec rsaPrivKeySpec = new RSAPrivateKeySpec(asn1PrivKey.getModulus(), asn1PrivKey.getPrivateExponent());
+					KeyFactory keyFactory = KeyFactory.getInstance(keyAlgorithm);
+					priKey = keyFactory.generatePrivate(rsaPrivKeySpec);
+				}*/
+			}
+
+            if (priKey != null) {
+                return Base64.encode(priKey.getEncoded());
+            }
+            else {
+                return null;
+            }
+		} catch (FileNotFoundException e) {
+			throw new FileNotFoundException("私钥路径文件不存在");
+		} catch (KeyStoreException e) {
+			throw new KeyStoreException("获取KeyStore对象异常");
+		} catch (IOException e) {
+			throw new IOException("读取私钥异常");
+		} catch (NoSuchAlgorithmException e) {
+			throw new NoSuchAlgorithmException("生成私钥对象异常");
+		} catch (CertificateException e) {
+			throw new CertificateException("加载私钥密码异常");
+		} catch (UnrecoverableKeyException e) {
+			throw new UnrecoverableKeyException("生成私钥对象异常");
+		} catch (InvalidKeySpecException e) {
+			throw new InvalidKeySpecException("生成私钥对象异常");
+		} finally {
+			try {
+				if (in != null) {
+					in.close();
+				}
+			} catch (IOException e) {
+			}
+		}
+	}
+    
+    /** */
+    /**
+     * <p>
+     * 用私钥对信息生成数字签名
+     * </p>
+     * 
+     * @param data 已加密数据
+     * @param privateKey 私钥(BASE64编码)
+     * @return
+     * @throws Exception
+     */
+    public static String sign(byte[] data, String privateKey) throws Exception {
+        byte[] keyBytes = Base64.decode(privateKey);
+        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
+        PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);
+        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
+        signature.initSign(privateK);
+        signature.update(data);
+        return Base64.encode(signature.sign());
+    }
+    
+    /** */
+    /**
+     * <p>
+     * 校验数字签名
+     * </p>
+     * 
+     * @param data 已加密数据
+     * @param publicKey 公钥(BASE64编码)
+     * @param sign 数字签名
+     * @param keyType 编码格式
+     * @return
+     * @throws Exception
+     */
+    public static boolean verify(byte[] data, String publicKey, String sign, String keyType)
+            throws Exception {
+		if ("PKCS12".equals(keyType)) {
+			return verify(data, publicKey, sign);
+		} else if ("X.509".equals(keyType)) {
+			byte[] keyBytes = Base64.decode(publicKey);
+			CertificateFactory factory = CertificateFactory.getInstance(keyType);
+			Certificate cert = factory.generateCertificate(new ByteArrayInputStream(keyBytes));
+			PublicKey pubKey = cert.getPublicKey();
+			Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
+	        signature.initVerify(pubKey);
+	        signature.update(data);
+	        return signature.verify(Base64.decode(sign));
+		}
+		throw new Exception("==>校验数字签名:未知的证书公钥编码格式!");
+    }
+
+    /** */
+    /**
+     * <p>
+     * 校验数字签名
+     * </p>
+     * 
+     * @param data 已加密数据
+     * @param publicKey 公钥(BASE64编码)
+     * @param sign 数字签名
+     * @return
+     * @throws Exception
+     */
+    public static boolean verify(byte[] data, String publicKey, String sign)
+            throws Exception {
+        byte[] keyBytes = Base64.decode(publicKey);
+        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
+        PublicKey publicK = keyFactory.generatePublic(keySpec);
+        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
+        signature.initVerify(publicK);
+        signature.update(data);
+        return signature.verify(Base64.decode(sign));
+    }
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/PayDto.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/PayDto.java
new file mode 100644
index 0000000..46476e2
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/PayDto.java
@@ -0,0 +1,14 @@
+package com.ruoyi.other.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("积分支付获取支付二维码")
+public class PayDto {
+    @ApiModelProperty("用于支付后轮询支付状态的id")
+    private Integer id;
+    @ApiModelProperty("二维码支付链接")
+    private String qrCode;
+}

--
Gitblit v1.7.1