From 64dedbb2395adcea7bef6a73b9949e390f8dedb5 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期一, 25 八月 2025 11:29:08 +0800
Subject: [PATCH] PC跳转小程序支付

---
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralController.java |  167 ++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 132 insertions(+), 35 deletions(-)

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 83af682..5929a93 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
@@ -6,23 +6,23 @@
 import com.ruoyi.chargingPile.api.model.Site;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.core.web.domain.AjaxResult;
 import com.ruoyi.common.core.web.page.PageInfo;
 import com.ruoyi.common.log.annotation.Log;
 import com.ruoyi.common.log.enums.BusinessType;
+import com.ruoyi.common.redis.service.RedisService;
 import com.ruoyi.common.security.service.TokenService;
 import com.ruoyi.other.api.domain.IntegralPay;
 import com.ruoyi.other.api.domain.IntegralRecord;
 import com.ruoyi.other.api.domain.ServicePay;
 import com.ruoyi.other.api.domain.TIntegralRule;
+import com.ruoyi.other.api.dto.NativePayDTO;
 import com.ruoyi.other.query.IntegralListQuery;
 import com.ruoyi.other.service.TIntegralPayService;
 import com.ruoyi.other.service.TIntegralRecordService;
 import com.ruoyi.other.service.TIntegralRuleService;
 import com.ruoyi.other.service.TServicePayService;
-import com.ruoyi.other.util.MyQrCodeUtil;
-import com.ruoyi.other.util.ObsUploadUtil;
-import com.ruoyi.other.util.QRCodeUtil;
-import com.ruoyi.other.util.UUIDUtil;
+import com.ruoyi.other.util.*;
 import com.ruoyi.other.util.pay.CreateLinkStringByGet1;
 import com.ruoyi.other.util.pay.HttpRequester;
 import com.ruoyi.other.util.pay.HttpRespons;
@@ -37,12 +37,20 @@
 import com.ruoyi.system.api.domain.SysUser;
 import com.ruoyi.system.api.feignClient.SysConfigClient;
 import com.ruoyi.system.api.feignClient.SysUserClient;
+import com.ruoyi.system.api.model.LoginUser;
 import io.swagger.annotations.ApiOperation;
 import org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.ByteArrayResource;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
 import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.client.RestTemplate;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
@@ -55,6 +63,7 @@
 import java.net.URL;
 import java.security.KeyFactory;
 import java.security.PrivateKey;
+import java.security.SecureRandom;
 import java.security.Signature;
 import java.security.spec.PKCS8EncodedKeySpec;
 import java.text.SimpleDateFormat;
@@ -82,6 +91,15 @@
     @Autowired
     private SysConfigClient sysConfigClient;
 
+
+
+
+    @Autowired
+    private WxAppletTools wxAppletTools;
+
+
+    @Autowired
+    private RestTemplate restTemplate;
     @Autowired
     private TokenService tokenService;
     @Autowired
@@ -122,13 +140,25 @@
         ServicePay one = servicePayService.lambdaQuery().eq(ServicePay::getPayStatus, 2)
                 .eq(ServicePay::getUserId, userid).orderByDesc(ServicePay::getCreateTime)
                 .last("limit 1").one();
-        if (one!=null){
+        ServicePay servicePayBefore = servicePayService.lambdaQuery()
+                .eq(ServicePay::getUserId, userid)
+                .eq(ServicePay::getPayStatus,2)
+                .eq(ServicePay::getDelFlag,0)
+                .orderByDesc(ServicePay::getCreateTime)
+                .last("limit 1")
+                .one();
+        if (servicePayBefore==null){
             workPlatformVO.setServiceStatus(1);
-            workPlatformVO.setEndTime(one.getEndTime());
+        } else if (servicePayBefore.getEndTime().isBefore(LocalDateTime.now())) {
+            workPlatformVO.setServiceStatus(2);
+            workPlatformVO.setEndTime(servicePayBefore.getEndTime());
+
         }else{
-            workPlatformVO.setServiceStatus(0);
-            workPlatformVO.setEndTime(null);
+            workPlatformVO.setServiceStatus(3);
+            workPlatformVO.setEndTime(servicePayBefore.getEndTime());
+
         }
+
 
 
         return R.ok(workPlatformVO);
@@ -146,7 +176,12 @@
         integralVO.setIntegral(integral);
         return R.ok(integralVO);
     }
-
+    @ApiOperation(tags = {"2.0-积分钱包"}, value = "获取积分充值比例")
+    @PostMapping(value = "/getPointPercent")
+    public R getPointPercent() {
+        SysConfig data1 = sysConfigClient.getInfo(8L).getData();
+        return R.ok(data1.getConfigValue());
+    }
     @ApiOperation(tags = {"2.0-积分钱包"}, value = "查询支付结果 true成功 false失败")
     @PostMapping(value = "/queryPayStatus")
     public R buy(@RequestParam Integer id) {
@@ -157,15 +192,68 @@
             return R.ok(false);
         }
     }
-
+    @ApiOperation(tags = {"2.0-积分钱包"}, value = "获取小程序二维码")
+    @PostMapping(value = "/getQrCode")
+    public R getQrCode() {
+        LoginUser loginUser = tokenService.getLoginUser();
+        SysUser data = sysUserClient.getSysUser(loginUser.getUserid()).getData();
+        // 充值手机号
+        String phonenumber = data.getPhonenumber();
+        InputStream inputStream = null;
+        OutputStream outputStream = null;
+        String accessToken = wxAppletTools.getAccessToken();
+        try {
+            String url = "https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=" + accessToken;
+            Map<String, Object> param = new HashMap<>();
+            param.put("scene", "phone=" + phonenumber);
+            param.put("check_path", false);
+            param.put("env_version", "trial");
+            param.put("width", 200); //二维码尺寸
+            param.put("is_hyaline", true); // 是否需要透明底色, is_hyaline 为true时,生成透明底色的小程序码 参数仅对小程序码生效
+            param.put("auto_color", true); // 自动配置线条颜色,如果颜色依然是黑色,则说明不建议配置主色调 参数仅对小程序码生效
+            Map<String, Object> line_color = new HashMap<>();
+            line_color.put("r", 0);
+            line_color.put("g", 0);
+            line_color.put("b", 0);
+            param.put("line_color", line_color);
+            System.err.println("调用生成微信URL接口传参:" + param);
+            MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
+            HttpEntity requestEntity = new HttpEntity(param, headers);
+            ResponseEntity<byte[]> entity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]);
+            System.err.println("调用小程序生成微信永久小程序码URL接口返回结果:" + entity.getBody());
+            byte[] result = entity.getBody();
+            inputStream = new ByteArrayInputStream(result);
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+            // 最后上传生成的文件名
+            String finalFileName = System.currentTimeMillis() + "" + new SecureRandom().nextInt(0x0400) + ".jpg";
+            // oss中的文件夹名
+            String objectName = sdf.format(new Date()) + "/" + finalFileName;
+            // 上传oss
+            String s = ObsUploadUtil.obsUpload(objectName, inputStream);
+            return R.ok(s);
+        }catch (Exception e){
+            return R.fail(e.getMessage());
+        }
+    }
+    @Resource
+    private WeChatUtil weChatUtil;
     @PostMapping("/nativePay")
     @ApiOperation(tags = {"2.0-积分钱包"}, value = "获取支付二维码")
-    public R nativePay(@RequestParam("amount") String amount) throws Exception {
-        BigDecimal bigDecimal = new BigDecimal(amount);
-        BigDecimal money = bigDecimal.setScale(2, RoundingMode.HALF_UP);
-        Long userid = tokenService.getLoginUser().getUserid();
-        R<SysUser> sysUser = sysUserClient.getSysUser(userid);
-        SysUser data = sysUser.getData();
+    public R nativePay(@RequestBody @Validated NativePayDTO dto) throws Exception {
+
+        R<SysUser> sysUserR = sysUserClient.queryUserByPhone(dto.getPhone());
+        SysUser data = sysUserR.getData();
+        //使用jscode获取微信openid
+        Map<String, Object> map = weChatUtil.code2Session(dto.getJsCode());
+        Integer errcode = Integer.valueOf(map.get("errcode").toString());
+        if(0 != errcode){
+            return R.fail(map.get("msg").toString());
+        }
+        String openid = map.get("openid").toString();
+        data.setOpenId(openid);
+        BigDecimal amount = dto.getAmount();
+        BigDecimal money = amount.setScale(2, RoundingMode.HALF_UP);
+
         List<Site> sites = siteClient.getSiteAll().getData();
         Site site = sites.stream().filter(e -> e.getId().equals(data.getSiteId())).findFirst().orElse(null);
         if (site==null){
@@ -173,15 +261,19 @@
         }
         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
         String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
-        ServicePay servicePay = new ServicePay();
-        servicePay.setUserId(data.getUserId());
-        servicePay.setAmount(site.getAnnualServiceFee());
-        servicePay.setCode(code);
-        servicePay.setPayStatus(1);
-        servicePay.setPayType(1);
-        servicePay.setDelFlag(0);
-        servicePay.setCreateTime(LocalDateTime.now());
-        servicePayService.save(servicePay);
+        IntegralPay integralPay = new IntegralPay();
+        integralPay.setUserId(data.getUserId());
+        SysConfig data1 = sysConfigClient.getInfo(8L).getData();
+        BigDecimal bigDecimal = amount.multiply(new BigDecimal(data1.getConfigValue())).setScale(2, RoundingMode.HALF_DOWN);
+        integralPay.setIntegralCount(bigDecimal.intValue());
+        integralPay.setAmount(amount);
+        integralPay.setCode(code);
+        integralPay.setPayStatus(1);
+        integralPay.setDelFlag(0);
+        integralPay.setCreateTime(LocalDateTime.now());
+
+
+        integralPayService.save(integralPay);
 
 
 //        return wechatPayService.unifiedOrderApplet(servicePay.getId()+"",code, site.getAnnualServiceFee()+"", "服务费缴纳",data.getOpenId(), "/other/wx/serviceCallback");
@@ -264,6 +356,7 @@
         }
 
         System.out.println("接收返回参数:" + response.toString());
+        sysUserClient.updateSysUser(data);
         return R.ok(response.toString());
     }
     @Autowired
@@ -282,15 +375,19 @@
         }
         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
         String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
-        ServicePay servicePay = new ServicePay();
-        servicePay.setUserId(data.getUserId());
-        servicePay.setAmount(site.getAnnualServiceFee());
-        servicePay.setCode(code);
-        servicePay.setPayStatus(1);
-        servicePay.setPayType(1);
-        servicePay.setDelFlag(0);
-        servicePay.setCreateTime(LocalDateTime.now());
-        servicePayService.save(servicePay);
+        IntegralPay integralPay = new IntegralPay();
+        integralPay.setUserId(data.getUserId());
+        SysConfig data1 = sysConfigClient.getInfo(8L).getData();
+        BigDecimal bigDecimal = amount.multiply(new BigDecimal(data1.getConfigValue())).setScale(2, RoundingMode.HALF_DOWN);
+        integralPay.setIntegralCount(bigDecimal.intValue());
+        integralPay.setAmount(amount);
+        integralPay.setCode(code);
+        integralPay.setPayStatus(1);
+        integralPay.setDelFlag(0);
+        integralPay.setCreateTime(LocalDateTime.now());
+
+
+        integralPayService.save(integralPay);
 
 
 //        return wechatPayService.unifiedOrderApplet(servicePay.getId()+"",code, site.getAnnualServiceFee()+"", "服务费缴纳",data.getOpenId(), "/other/wx/serviceCallback");
@@ -523,7 +620,7 @@
                 tIntegralRule.setContent(data1.getRemark());
                 tIntegralRule.setSiteId(0);
                 return R.ok(tIntegralRule);
-            } else if (data.getRoleType() == 3 ){
+            } else if (data.getRoleType() == 2){
                 TIntegralRule res = integralRuleService.lambdaQuery().eq(TIntegralRule::getSiteId, data.getSiteId()).one();
                 return R.ok(res);
             }else{

--
Gitblit v1.7.1