Kaynağa Gözat

fix:微信用户优化

wrj 1 yıl önce
ebeveyn
işleme
582636b4d6

+ 53 - 6
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/PayController.java

@@ -11,8 +11,6 @@ import cn.hutool.json.JSONUtil;
 import com.ijpay.core.IJPayHttpResponse;
 import com.ijpay.core.enums.AuthTypeEnum;
 import com.ijpay.core.enums.RequestMethodEnum;
-import com.ijpay.core.enums.SignType;
-import com.ijpay.core.enums.TradeType;
 import com.ijpay.core.kit.AesUtil;
 import com.ijpay.core.kit.HttpKit;
 import com.ijpay.core.kit.PayKit;
@@ -22,11 +20,12 @@ import com.ijpay.wxpay.WxPayApi;
 import com.ijpay.wxpay.enums.WxDomainEnum;
 import com.ijpay.wxpay.enums.v3.BasePayApiEnum;
 import com.ijpay.wxpay.enums.v3.CertAlgorithmTypeEnum;
-import com.ijpay.wxpay.model.v3.Amount;
-import com.ijpay.wxpay.model.v3.Payer;
-import com.ijpay.wxpay.model.v3.UnifiedOrderModel;
+import com.ijpay.wxpay.enums.v3.TransferApiEnum;
+import com.ijpay.wxpay.model.v3.*;
 import com.ylx.common.config.WxPayConfig;
 import com.ylx.common.core.domain.R;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -35,9 +34,9 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.ByteArrayInputStream;
-import java.math.BigDecimal;
 import java.nio.charset.StandardCharsets;
 import java.security.cert.X509Certificate;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -51,6 +50,7 @@ import static com.ylx.common.constant.HttpStatus.SUCCESS;
 
 @RestController
 @Slf4j
+@Api(tags = {"微信支付"})
 public class PayController {
 
 
@@ -64,6 +64,7 @@ public class PayController {
      * 小程序微信支付的第一步,统一下单
      */
     @GetMapping("/pay")
+    @ApiOperation("AIPV3微信支付")
     public R createUnifiedOrder(@RequestParam(value = "openId") String openId) throws Exception {
         String timeExpire = DateTimeZoneUtil.dateToTimeZone(System.currentTimeMillis() + 1000 * 60 * 3);
         UnifiedOrderModel unifiedOrderModel = new UnifiedOrderModel()
@@ -140,6 +141,7 @@ public class PayController {
 
     @RequestMapping(value = "/payNotify", method = {org.springframework.web.bind.annotation.RequestMethod.POST, org.springframework.web.bind.annotation.RequestMethod.GET})
     @ResponseBody
+    @ApiOperation("微信支付回调接口")
     public void payNotify(HttpServletRequest request, HttpServletResponse response) {
         Map<String, String> map = new HashMap<>(12);
         try {
@@ -260,6 +262,51 @@ public class PayController {
         }
     }
 
+    @RequestMapping("/batchTransfer")
+    @ApiOperation("微信批量提现")
+    @ResponseBody
+    public String batchTransfer(@RequestParam(value = "openId", required = false, defaultValue = "o-_-itxuXeGW3O1cxJ7FXNmq8Wf8") String openId) {
+        try {
+            BatchTransferModel batchTransferModel = new BatchTransferModel()
+                    .setAppid(wxPayProperties.getAppId())
+                    .setOut_batch_no(PayKit.generateStr())
+                    .setBatch_name("IJPay 测试微信转账到零钱")
+                    .setBatch_remark("IJPay 测试微信转账到零钱")
+                    .setTotal_amount(1)
+                    .setTotal_num(1)
+                    .setTransfer_detail_list(Collections.singletonList(
+                            new TransferDetailInput()
+                                    .setOut_detail_no(PayKit.generateStr())
+                                    .setTransfer_amount(1)
+                                    .setTransfer_remark("IJPay 测试微信转账到零钱")
+                                    .setOpenid(openId)));
+
+            log.info("发起商家转账请求参数 {}", JSONUtil.toJsonStr(batchTransferModel));
+            IJPayHttpResponse response = WxPayApi.v3(
+                    RequestMethodEnum.POST,
+                    WxDomainEnum.CHINA.toString(),
+                    TransferApiEnum.TRANSFER_BATCHES.toString(),
+                    wxPayProperties.getMchId(),
+                    getSerialNumber(),
+                    null,
+                    wxPayProperties.getCertKeyPath(),
+                    JSONUtil.toJsonStr(batchTransferModel)
+            );
+            log.info("发起商家转账响应 {}", response);
+            // 根据证书序列号查询对应的证书来验证签名结果
+            boolean verifySignature = WxPayKit.verifySignature(response, wxPayProperties.getPlatFormPath());
+            log.info("verifySignature: {}", verifySignature);
+            if (response.getStatus() == SUCCESS && verifySignature) {
+                return response.getBody();
+            }
+            return JSONUtil.toJsonStr(response);
+        } catch (Exception e) {
+            log.error("系统异常", e);
+            return e.getMessage();
+        }
+    }
+
+
 
 
 

+ 1 - 1
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/TJsController.java

@@ -54,7 +54,7 @@ public class TJsController extends BaseController {
      * @param js
      * @return
      */
-    @Log(title = "技师管理", businessType = BusinessType.INSERT)
+//    @Log(title = "技师管理", businessType = BusinessType.INSERT)
     @RequestMapping(value = "wx/add", method = RequestMethod.POST)
     @ApiOperation("添加技师申请")
     public R add(@RequestBody TJs js) {

+ 9 - 0
nightFragrance-common/src/main/java/com/ylx/common/core/redis/RedisCache.java

@@ -6,6 +6,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
+
+import com.ylx.common.exception.ServiceException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.BoundSetOperations;
 import org.springframework.data.redis.core.HashOperations;
@@ -265,4 +267,11 @@ public class RedisCache
     {
         return redisTemplate.keys(pattern);
     }
+
+    public long incr(String key, long delta) {
+        if (delta < 0) {
+            throw new ServiceException("递增因子必须大于0");
+        }
+        return redisTemplate.opsForValue().increment(key, delta);
+    }
 }

+ 2 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TJsServiceImpl.java

@@ -22,6 +22,7 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -51,7 +52,7 @@ public class TJsServiceImpl extends ServiceImpl<TJsMapper, TJs> implements TJsSe
         }
 
         //缓存技师位置
-        locationUtil.geoAdd(js.getcOpenId(), js.getLongitude().doubleValue(), js.getLatitude().doubleValue());
+//        locationUtil.geoAdd(js.getcOpenId(), js.getLongitude().doubleValue(), js.getLatitude().doubleValue());
         extracted(js);
         return this.save(js);
     }

+ 84 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/utils/BillNoUtil.java

@@ -0,0 +1,84 @@
+package com.ylx.massage.utils;
+
+
+import com.ylx.common.core.redis.RedisCache;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.annotation.Resource;
+import java.text.DateFormat;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author jianlong
+ * @date 2024-04-15 14:38
+ */
+public class BillNoUtil {
+
+    @Resource
+    private RedisCache redisCache;
+
+    public static final String NIGHT_FRAGRANCE_KEY_PREFIX = "NIGHT:codegenrator:";
+    /**
+     * 从Redis中获取某种类型的自增值
+     * 生成规则 年(两位)+月(两位)+流水码(五位)
+     * @param type
+     * @return
+     */
+//    public String getAutoNumber(String type) {
+//        String autoKeyFlag = ""; //定义接收用于自增的value
+//        String autoKey = type+"tableAutoKey";
+//        Boolean exists = redisCache.exists(autoKey);
+//        long time = 2505600;//一个月时间
+//        if(exists) {
+//            autoKeyFlag = String.valueOf(redisCache.incr(autoKey));
+//        }else {
+//            redisService.set(autoKey, "0", "NX", "EX", time);
+//            autoKeyFlag = String.valueOf(redisCache.incr(autoKey));
+//        }
+//        DecimalFormat df = new DecimalFormat("00000");
+//        autoKeyFlag = df.format(Integer.parseInt(autoKeyFlag));
+//        autoKeyFlag = String.valueOf(new SimpleDateFormat("yyMM").format(new Date()))+autoKeyFlag;
+//        return autoKeyFlag;
+//    }
+////
+////    public List<String> fun() {
+////        return batchGenerateCode("JSIRTP", new SimpleDateFormat("yyMMdd"), 3, 4);
+////    }
+//
+//    /**
+//     * 批量获取Code
+//     *
+//     * @param prefix:业务场景,比如     PAYEE 表示收款
+//     * @param sdf:               日期格式化方式,如 yyyyMMdd
+//     * @param batchNum:          批量生成多少条,如 1000条
+//     * @param increaseFormatNum: 自增数格式化成多少位,如 5位
+//     * @return 生成的编码列表, 如[]
+//     */
+//    public List<String> batchGenerateCode(String prefix, DateFormat sdf, int batchNum, int increaseFormatNum) {
+//        if (null == prefix || sdf == null || batchNum <= 0) {
+//            return null;
+//        }
+//        //构造key
+//        Date date = Calendar.getInstance().getTime();
+//        String formatDate = sdf.format(date);
+//        String redisKey = new StringBuffer(NIGHT_FRAGRANCE_KEY_PREFIX).append(prefix).append(":").append(formatDate).toString();
+//        //批量生成no
+//        Long finalNum = redisCache.incr(redisKey, batchNum);
+//        //设置过期时间
+//        redisCache.expire(redisKey, DateUtils.getCurrent2TodayEndMillisTime() / SysConstant.ONE_THOUSAND);
+//        //获取自增位格式化位数
+//        DecimalFormat df = new DecimalFormat(StringUtils.repeat("0", increaseFormatNum));
+//
+//        //构造结果
+//        List<String> result = new ArrayList<>(batchNum);
+//        for (long num = finalNum - batchNum + 1; num <= finalNum; num++) {
+//            result.add(new StringBuffer(prefix).append(formatDate).append(df.format(num)).toString());
+//        }
+//        return result;
+//    }
+}