From e96f7638e74cc24c075636c37e7ca5e713cd8742 Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Wed, 26 Jul 2023 12:35:50 +0800
Subject: [PATCH] 短信认证

---
 src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java |    9 ++
 src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java         |    3 
 src/test/java/cc/mrbird/febs/ProfitTest.java                         |    8 +
 src/main/java/cc/mrbird/febs/pay/model/WxGenerateQrCodeDto.java      |    2 
 src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java |   22 +++++
 src/main/java/cc/mrbird/febs/pay/util/WechatEventUtil.java           |  100 +++++++++++++++++++++++++
 src/main/resources/application-dev.yml                               |    2 
 src/test/java/cc/mrbird/febs/PayTest.java                            |   54 +++++++------
 src/main/java/cc/mrbird/febs/mall/dto/WxUpCodeDto.java               |   10 ++
 9 files changed, 182 insertions(+), 28 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java
index ff89401..331d094 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiLoginController.java
@@ -118,6 +118,15 @@
     }
 
     /**
+     * 获取分享二维码
+     */
+    @ApiOperation(value = "获取上级二维码", notes = "获取上级二维码")
+    @GetMapping(value = "/getUpCode")
+    public FebsResponse getUpCode(@RequestBody WxUpCodeDto wxUpCodeDto){
+        return iXcxPayService.getUpCode(wxUpCodeDto);
+    }
+
+    /**
      * 获取ACCESS_TOKEN
      */
     @ApiOperation(value = "获取ACCESS_TOKEN", notes = "获取ACCESS_TOKEN")
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/WxUpCodeDto.java b/src/main/java/cc/mrbird/febs/mall/dto/WxUpCodeDto.java
new file mode 100644
index 0000000..8e33486
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/WxUpCodeDto.java
@@ -0,0 +1,10 @@
+package cc.mrbird.febs.mall.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "WxUpCodeDto", description = "接收参数类")
+public class WxUpCodeDto {
+    private String inviteId;
+}
diff --git a/src/main/java/cc/mrbird/febs/pay/model/WxGenerateQrCodeDto.java b/src/main/java/cc/mrbird/febs/pay/model/WxGenerateQrCodeDto.java
index 6fa01a2..e2817c7 100644
--- a/src/main/java/cc/mrbird/febs/pay/model/WxGenerateQrCodeDto.java
+++ b/src/main/java/cc/mrbird/febs/pay/model/WxGenerateQrCodeDto.java
@@ -17,7 +17,7 @@
     @ApiModelProperty(value = "参数 订单id 例如 15")
     private String scene;
 
-    @ApiModelProperty(value = "1:商品分享 2:团长分享")
+    @ApiModelProperty(value = "1:商品分享 2:邀请码")
     private Integer type;
 
     @ApiModelProperty(value = "商品分享传商品ID,团长分享放图章特征码")
diff --git a/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java b/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java
index fe0ec26..682e841 100644
--- a/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java
+++ b/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java
@@ -3,6 +3,7 @@
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.mall.dto.ApiRechargeWalletDto;
 import cc.mrbird.febs.mall.dto.RechargeWalletMessageSendDto;
+import cc.mrbird.febs.mall.dto.WxUpCodeDto;
 import cc.mrbird.febs.mall.entity.MallOrderInfo;
 import cc.mrbird.febs.pay.model.BrandWCPayRequestData;
 import cc.mrbird.febs.pay.model.MemberWithdrawalDto;
@@ -55,4 +56,6 @@
     Boolean memberWithdrawal(MemberWithdrawalDto info);
 
     FebsResponse getQrCode(WxGenerateQrCodeDto wxGenerateQrCodeDto);
+
+    FebsResponse getUpCode(WxUpCodeDto wxUpCodeDto);
 }
diff --git a/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java b/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java
index 69527a8..4b721d4 100644
--- a/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java
@@ -8,6 +8,7 @@
 import cc.mrbird.febs.common.utils.*;
 import cc.mrbird.febs.mall.dto.ApiRechargeWalletDto;
 import cc.mrbird.febs.mall.dto.RechargeWalletMessageSendDto;
+import cc.mrbird.febs.mall.dto.WxUpCodeDto;
 import cc.mrbird.febs.mall.entity.*;
 import cc.mrbird.febs.mall.mapper.*;
 import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
@@ -15,6 +16,7 @@
 import cc.mrbird.febs.pay.model.*;
 import cc.mrbird.febs.pay.service.IXcxPayService;
 import cc.mrbird.febs.pay.util.WechatConfigure;
+import cc.mrbird.febs.pay.util.WechatEventUtil;
 import cc.mrbird.febs.pay.util.WeixinServiceUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.text.StrFormatter;
@@ -64,6 +66,8 @@
     @Autowired
     private MallMemberWithdrawMapper mallMemberWithdrawMapper;
     private final IMallMoneyFlowService mallMoneyFlowService;
+    @Autowired
+    WechatEventUtil wechatEventUtil;
     @Autowired
     RedisUtils redisUtils;
 
@@ -184,6 +188,24 @@
 //        }
         return new FebsResponse().success();
     }
+    @Override
+    public FebsResponse getUpCode(WxUpCodeDto wxUpCodeDto) {
+        if(ObjectUtil.isEmpty(wxUpCodeDto.getInviteId())){
+            return new FebsResponse().fail().message("邀请码不存在");
+        }
+        String inviteId = wxUpCodeDto.getInviteId();
+        MallMember mallMember = mallMemberMapper.selectInfoByInviteId(inviteId);
+        if(ObjectUtil.isEmpty(mallMember)){
+            return new FebsResponse().fail().message("邀请码不存在");
+        }
+        //前两个参数没用
+        String ticket = wechatEventUtil.getTicket(inviteId);
+        if(StrUtil.isEmpty(ticket)){
+            return new FebsResponse().fail().message("临时带参二维码ticket失败");
+        }
+        String qRcode = wechatEventUtil.getQRcode(ticket);
+        return new FebsResponse().success().data(qRcode);
+    }
 
     @Override
     public BrandWCPayRequestData startPayment(MallOrderInfo mallOrderInfo) throws Exception {
diff --git a/src/main/java/cc/mrbird/febs/pay/util/WechatEventUtil.java b/src/main/java/cc/mrbird/febs/pay/util/WechatEventUtil.java
index d6ed6aa..b4fa899 100644
--- a/src/main/java/cc/mrbird/febs/pay/util/WechatEventUtil.java
+++ b/src/main/java/cc/mrbird/febs/pay/util/WechatEventUtil.java
@@ -1,10 +1,23 @@
 package cc.mrbird.febs.pay.util;
 
+import cc.mrbird.febs.common.utils.MallUtils;
+import cc.mrbird.febs.common.utils.RedisUtils;
 import cc.mrbird.febs.rabbit.producter.AgentProducer;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.text.StrFormatter;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import org.dom4j.io.SAXReader;
 
 import javax.servlet.http.HttpServletRequest;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.Arrays;
@@ -15,6 +28,7 @@
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
 
 import java.io.InputStream;
 import java.util.*;
@@ -211,4 +225,90 @@
         return "";
     }
 
+
+    @Autowired
+    RedisUtils redisUtils;
+
+    /**
+     * 获取ticket
+     *
+     * @param qrCodeParam
+     * @return
+     */
+    public String getTicket(String qrCodeParam) {
+        RestTemplate restTemplate = new RestTemplate();
+        String ticket = null;
+        // 拼接请求地址
+        String CREATE_QRCODE_URL = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN";
+        String requestUrl = CREATE_QRCODE_URL.replace("TOKEN", "70_ECdQaX-QtNXZP9ugU_JEJGRYEADWrlQZNYrT2I2IRHsx6hx4_O8RY4VasWI97_ixia8vANTdnNRI_cT00toK7CX98513sQI8535eTFw3b-VQChEFZrRqTfNPdSoGYXgAIAVNM");
+//        String requestUrl = CREATE_QRCODE_URL.replace("TOKEN", redisUtils.get(WechatConfigure.WX_ACCESS_TOKEN_REDIS_KEY).toString());
+        // 创建临时带参二维码
+
+        JSONObject jsonObject = restTemplate.postForObject(requestUrl,
+                "{\"expire_seconds\": 604800, \"action_name\": \"QR_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": "+qrCodeParam+"}}}",
+                JSONObject.class);
+//        JSONObject jsonObject = HttpsUtil.request(requestUrl, "POST", "{\"expire_seconds\": 604800, \"action_name\": \"QR_SCENE\", \"action_info\": {\"scene\": {\"scene_id\": 123}}}");
+        if (ObjectUtil.isNotEmpty(jsonObject)) {
+            String response = JSON.toJSONString(jsonObject);
+            if (!jsonObject.containsKey("errcode")) {
+                ticket = jsonObject.getString("ticket");
+                System.out.println("临时带参二维码ticket成功" + response);
+            } else {
+                log.error("临时带参二维码ticket失败:" + response);
+            }
+        }
+        return ticket;
+    }
+
+    /**
+     * 通过ticket换取二维码并保存二维码图片
+     *
+     * @param ticket
+     * @param savePath
+     * @return
+     */
+    //图片上传路径
+    public  static  final String IMG_UPLOAD_PATH="/home/javaweb/webresource/ywg/wxcode";
+    public String getQRcode(String ticket) {
+
+        String SHOW_QRCODE_URL = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET";
+        String requestUrl = SHOW_QRCODE_URL.replace("TICKET", ticket);
+
+        String randomNum = MallUtils.getRandomNum(5);
+        String imgName="/user_" + randomNum + "_acode_1.jpg";
+        String urlPrefix="https://ywgpzapi.meiao.biz/ywg/wxcode";
+        String imgPath=IMG_UPLOAD_PATH+imgName;
+        if(!FileUtil.exist(imgPath)){
+            try {
+                HttpResponse execute = HttpRequest.get(requestUrl).execute();
+                InputStream inputStream = execute.bodyStream();
+                File file = new File(imgPath);
+                FileUtil.writeFromStream(inputStream, file);
+                long uploadUrl = FileUtil.size(file);
+                //小于10kb重新生成
+                if(uploadUrl<=10240){
+                    log.error("生成微信小程序码失败:图片大小异常:{}",uploadUrl);
+                    return null;
+                }
+            } catch (Exception e) {
+                log.error("生成微信小程序码失败",e);
+                return null;
+            }
+        }else{
+
+            //判断文件是否正常 不正常 删除
+            File file = new File(imgPath);
+            long uploadUrl = FileUtil.size(file);
+            if(uploadUrl<=10240){
+                FileUtil.del(file);
+                return null;
+            }
+        }
+        System.out.println("根据ticket换取二维码成功,路径:" + imgPath);
+        return urlPrefix+"/"+imgName;
+
+    }
+
+    public static void main(String[] args) {
+    }
 }
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 5d8132b..3b930fd 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -70,7 +70,7 @@
 xcx:
   wechar_login_url: https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code
   xcx_appid: wx052716b1a388b13c
-  xcx_secret: e7cf355e7234f035d8fea6a3a19513b9
+  xcx_secret: a217fd6bd36b4939e29a052fd5ba6984
   debug: false
   wecharPaynotifyUrl: https://ywgpzapi.meiao.biz/api/xcxPay/wxpayCallback
   wecharRechargePaynotifyUrl: https://ywgpzapi.meiao.biz/api/xcxPay/rechargeCallBack
diff --git a/src/test/java/cc/mrbird/febs/PayTest.java b/src/test/java/cc/mrbird/febs/PayTest.java
index 01314e0..ab2f52b 100644
--- a/src/test/java/cc/mrbird/febs/PayTest.java
+++ b/src/test/java/cc/mrbird/febs/PayTest.java
@@ -4,6 +4,7 @@
 import cc.mrbird.febs.common.utils.RedisUtils;
 import cc.mrbird.febs.common.utils.SpringContextHolder;
 import cc.mrbird.febs.pay.util.WechatConfigure;
+import cc.mrbird.febs.pay.util.WechatEventUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.alipay.api.AlipayApiException;
@@ -27,36 +28,41 @@
 @SpringBootTest
 public class PayTest {
 
-
     @Autowired
     private RedisUtils redisUtils;
     @Resource
     RestTemplate restTemplate;
+    @Resource
+    WechatEventUtil wechatEventUtil;
     @Test
     public void aliPay(){
+        //前两个参数没用
+        String ticket = wechatEventUtil.getTicket("123456");
+        String qRcode = wechatEventUtil.getQRcode(ticket);
+        System.out.println(qRcode);
 
-        String appId = "wxfb1acf504eb9d058";
-        String appSecret = "7ee226a964b1be7cfb96f5e0dc739c44";
-        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;
-        String jsonStr = restTemplate.getForObject(url, String.class);
-
-        /**
-         * 返回结果
-         * {"access_token":"ACCESS_TOKEN","expires_in":7200}
-         */
-        if (!jsonStr.contains("access_token")) {
-            System.out.println("获取微信access_token失败");
-        }
-
-        String accessTokenKey = WechatConfigure.WX_ACCESS_TOKEN_REDIS_KEY;
-        JSONObject jsonObject = JSONObject.parseObject(jsonStr);
-        String accessToken = jsonObject.getString(accessTokenKey);
-        if (StrUtil.isEmpty(accessToken)) {
-            log.error("获取access token失败: {}" , jsonObject.getString("errmsg"));
-            throw new ApiException("获取access token失败");
-        } else {
-            log.info("wx access_token : {}",accessToken);
-            redisUtils.set(accessTokenKey,accessToken);
-        }
+//        String appId = "wxfb1acf504eb9d058";
+//        String appSecret = "7ee226a964b1be7cfb96f5e0dc739c44";
+//        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;
+//        String jsonStr = restTemplate.getForObject(url, String.class);
+//
+//        /**
+//         * 返回结果
+//         * {"access_token":"ACCESS_TOKEN","expires_in":7200}
+//         */
+//        if (!jsonStr.contains("access_token")) {
+//            System.out.println("获取微信access_token失败");
+//        }
+//
+//        String accessTokenKey = WechatConfigure.WX_ACCESS_TOKEN_REDIS_KEY;
+//        JSONObject jsonObject = JSONObject.parseObject(jsonStr);
+//        String accessToken = jsonObject.getString(accessTokenKey);
+//        if (StrUtil.isEmpty(accessToken)) {
+//            log.error("获取access token失败: {}" , jsonObject.getString("errmsg"));
+//            throw new ApiException("获取access token失败");
+//        } else {
+//            log.info("wx access_token : {}",accessToken);
+//            redisUtils.set(accessTokenKey,accessToken);
+//        }
     }
 }
diff --git a/src/test/java/cc/mrbird/febs/ProfitTest.java b/src/test/java/cc/mrbird/febs/ProfitTest.java
index fa3a8ef..98a4691 100644
--- a/src/test/java/cc/mrbird/febs/ProfitTest.java
+++ b/src/test/java/cc/mrbird/febs/ProfitTest.java
@@ -136,11 +136,15 @@
     @Test
     public void getWeChatAccessToken() {
 
-        String appId = "wx5cc58f796224af61";
-        String appSecret = "71403646f666f9b9dca308d4f357765c";
+
+        // 第三方用户唯一凭证
+        String appId = "wx052716b1a388b13c";
+        // 第三方用户唯一凭证密钥
+        String appSecret = "a217fd6bd36b4939e29a052fd5ba6984";
         String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;
         String jsonStr = restTemplate.getForObject(url, String.class);
 
+
         /**
          * 返回结果
          * {"access_token":"ACCESS_TOKEN","expires_in":7200}

--
Gitblit v1.9.1