Prechádzať zdrojové kódy

feat : 支配置获取小程序二维码获取接口提交

bilingfeng 2 rokov pred
rodič
commit
764205537d

+ 8 - 4
game-module/game-manage/src/main/java/com/zanxiang/manage/controller/PayApplicationController.java

@@ -15,10 +15,7 @@ import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -56,4 +53,11 @@ public class PayApplicationController {
     public ResultVo<List<PayApplicationVO>> listNoPage(@Validated @RequestBody PayApplicationListNoPageParam param) {
         return ResultVo.ok(payApplicationService.listNoPage(param));
     }
+
+    @ApiOperation(value = "获取小程序二维码")
+    @GetMapping(value = "/qr/code")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = String.class)})
+    public ResultVo<String> getQrCode(@RequestParam Long id) {
+        return new ResultVo<>(payApplicationService.getQrCode(id));
+    }
 }

+ 3 - 85
game-module/game-manage/src/main/java/com/zanxiang/manage/service/Impl/GameAppletServiceImpl.java

@@ -1,33 +1,23 @@
 package com.zanxiang.manage.service.Impl;
 
-import cn.hutool.http.HttpUtil;
-import cn.hutool.json.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.common.exception.BaseException;
-import com.zanxiang.common.utils.URIUtil;
 import com.zanxiang.common.utils.bean.BeanUtils;
 import com.zanxiang.manage.domain.dto.GameDTO;
 import com.zanxiang.manage.domain.params.GameAccountUpdateParam;
 import com.zanxiang.manage.domain.vo.GameAccountVO;
 import com.zanxiang.manage.service.GameAppletService;
 import com.zanxiang.manage.service.GameService;
-import com.zanxiang.module.oss.service.IOssService;
+import com.zanxiang.manage.service.api.MiniAppletApiService;
 import com.zanxiang.mybatis.entity.GameApplet;
 import com.zanxiang.mybatis.mapper.GameAppletMapper;
-import com.zanxiangnet.module.util.JsonUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.io.BufferedInputStream;
-import java.io.PrintWriter;
-import java.net.HttpURLConnection;
-import java.net.URL;
 import java.time.LocalDateTime;
-import java.util.HashMap;
-import java.util.Map;
 
 /**
  * @author : lingfeng
@@ -39,7 +29,7 @@ import java.util.Map;
 public class GameAppletServiceImpl extends ServiceImpl<GameAppletMapper, GameApplet> implements GameAppletService {
 
     @Autowired
-    private IOssService ossService;
+    private MiniAppletApiService miniAppletApiService;
 
     @Autowired
     private GameService gameService;
@@ -105,78 +95,6 @@ public class GameAppletServiceImpl extends ServiceImpl<GameAppletMapper, GameApp
         if (gameApplet == null || Strings.isBlank(gameApplet.getAppId()) || Strings.isBlank(gameApplet.getAppSecret())) {
             throw new BaseException("该游戏未设置小程序信息");
         }
-        String token = this.getAppletTokenApi(gameApplet.getAppId(), gameApplet.getAppSecret());
-        return this.getQrCodeApi(token, gameDTO.getName() + ".jpg");
-    }
-
-    /**
-     * 获取小程序token
-     *
-     * @param appId  : 小程序appId
-     * @param secret : 小程序密钥
-     * @return : 返回小程token
-     */
-    private String getAppletTokenApi(String appId, String secret) {
-        Map<String, String> paramMap = new HashMap<>(3);
-        paramMap.put("grant_type", "client_credential");
-        paramMap.put("appid", appId);
-        paramMap.put("secret", secret);
-        String url = "https://api.weixin.qq.com/cgi-bin/token";
-        //拼接url请求参数
-        String uri = URIUtil.fillUrlParams(url, paramMap, Boolean.TRUE);
-        // 带参GET请求
-        Map<String, String> resultMap = new HashMap<>(4);
-        try {
-            String result = HttpUtil.get(uri);
-            if (Strings.isNotBlank(result)) {
-                resultMap = JsonUtil.toMap(result, Map.class, String.class, String.class);
-            }
-        } catch (Exception e) {
-            log.error("获取小程序token出现异常, appId : {},secret: {} e : {}", appId, secret, e.getMessage());
-            throw new BaseException("获取小程序token出现异常");
-        }
-        //返回token
-        if (resultMap.containsKey("access_token")) {
-            return resultMap.get("access_token");
-        }
-        //没有拿到token
-        log.error("获取token发生错误, appId : {}, secret: {}, errcode : {}, errmsg : {}", appId, secret,
-                resultMap.get("errcode"), resultMap.get("errmsg"));
-        throw new BaseException("http状态正确, 获取token发生错误");
-    }
-
-    /**
-     * 生成微信小程序二维码
-     *
-     * @param accessToken : 接口调用凭证
-     */
-    private String getQrCodeApi(String accessToken, String appletName) {
-        try {
-            //调用微信接口生成二维码
-            URL url = new URL("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken);
-            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
-            connection.setRequestMethod("POST");
-            //连接超时 单位毫秒
-            connection.setConnectTimeout(10000);
-            //读取超时 单位毫秒
-            connection.setReadTimeout(2000);
-            // 发送POST请求必须设置如下两行
-            connection.setDoOutput(true);
-            connection.setDoInput(true);
-            // 获取URLConnection对象对应的输出流
-            PrintWriter printWriter = new PrintWriter(connection.getOutputStream());
-            // 发送请求参数
-            JSONObject paramJson = new JSONObject();
-            //这就是你二维码里携带的参数 String型  名称不可变
-            paramJson.set("scene", "a=1");
-            printWriter.write(paramJson.toString());
-            // flush输出流的缓冲
-            printWriter.flush();
-            //开始获取数据
-            BufferedInputStream inputStream = new BufferedInputStream(connection.getInputStream());
-            return ossService.upload(appletName, inputStream);
-        } catch (Exception e) {
-            throw new BaseException("生成微信小程序二维码异常");
-        }
+        return miniAppletApiService.getQrCode(gameApplet.getAppId(), gameApplet.getAppSecret(), gameDTO.getName());
     }
 }

+ 21 - 0
game-module/game-manage/src/main/java/com/zanxiang/manage/service/Impl/PayApplicationServiceImpl.java

@@ -5,14 +5,17 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.common.enums.DeleteEnum;
 import com.zanxiang.common.enums.StatusEnum;
+import com.zanxiang.common.exception.BaseException;
 import com.zanxiang.common.utils.bean.BeanUtils;
 import com.zanxiang.manage.domain.bo.PayApplicationBO;
 import com.zanxiang.manage.domain.params.PayApplicationListNoPageParam;
 import com.zanxiang.manage.domain.params.PayApplicationListParam;
 import com.zanxiang.manage.domain.vo.PayApplicationVO;
 import com.zanxiang.manage.service.PayApplicationService;
+import com.zanxiang.manage.service.api.MiniAppletApiService;
 import com.zanxiang.mybatis.entity.PayApplication;
 import com.zanxiang.mybatis.mapper.PayApplicationMapper;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -27,6 +30,9 @@ import java.util.Objects;
 @Service
 public class PayApplicationServiceImpl extends ServiceImpl<PayApplicationMapper, PayApplication> implements PayApplicationService {
 
+    @Autowired
+    private MiniAppletApiService miniAppletApiService;
+
     @Override
     public Boolean saveOrUpdate(PayApplicationBO bo) {
         PayApplication app = BeanUtils.copy(bo, PayApplication.class);
@@ -60,4 +66,19 @@ public class PayApplicationServiceImpl extends ServiceImpl<PayApplicationMapper,
         return BeanUtils.copy(payApplication, PayApplicationVO.class);
     }
 
+    /**
+     * 获取游戏应用二维码图片地址
+     *
+     * @param id : 应用id
+     * @return : 返回游戏二维码
+     */
+    @Override
+    public String getQrCode(Long id) {
+        PayApplication payApplication = super.getById(id);
+        if (payApplication == null) {
+            throw new BaseException("应用信息不存在");
+        }
+        return miniAppletApiService.getQrCode(payApplication.getAppId(), payApplication.getAppSecret(), payApplication.getName());
+    }
+
 }

+ 8 - 0
game-module/game-manage/src/main/java/com/zanxiang/manage/service/PayApplicationService.java

@@ -40,4 +40,12 @@ public interface PayApplicationService extends IService<PayApplication> {
      * @return
      */
     List<PayApplicationVO> listNoPage(PayApplicationListNoPageParam bo);
+
+    /**
+     * 获取游戏应用二维码图片地址
+     *
+     * @param id : 应用id
+     * @return : 返回游戏二维码
+     */
+    String getQrCode(Long id);
 }

+ 127 - 0
game-module/game-manage/src/main/java/com/zanxiang/manage/service/api/MiniAppletApiService.java

@@ -0,0 +1,127 @@
+package com.zanxiang.manage.service.api;
+
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import com.zanxiang.common.exception.BaseException;
+import com.zanxiang.common.text.UUID;
+import com.zanxiang.common.utils.URIUtil;
+import com.zanxiang.module.oss.service.IOssService;
+import com.zanxiangnet.module.util.JsonUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.logging.log4j.util.Strings;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.BufferedInputStream;
+import java.io.PrintWriter;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-07-13
+ * @description : 微信小程序相关接口
+ */
+@Slf4j
+@Service
+public class MiniAppletApiService {
+
+    @Autowired
+    private IOssService ossService;
+
+    /**
+     * 获取游戏小程序二维码
+     *
+     * @param appId       : 小程序appId
+     * @param appSecret   : 小程序密钥
+     * @param ossFileName : oss文件名
+     * @return : 返回oss二维码图片地址
+     */
+    public String getQrCode(String appId, String appSecret, String ossFileName) {
+        if (Strings.isBlank(appId) || Strings.isBlank(appSecret)) {
+            throw new BaseException("参数错误, 缺少小程序信息");
+        }
+        //oss文件名
+        ossFileName = Strings.isBlank(ossFileName) ? UUID.randomUUID().toString() + ".jpg" : ossFileName + ".jpg";
+        //获取小程序token
+        String token = this.getAppletTokenApi(appId, appSecret);
+        //获取小程序二维码
+        BufferedInputStream inputStream = this.getQrCodeApi(null, token);
+        //二维码上传到oss, 返回网络地址
+        return ossService.upload(ossFileName, inputStream);
+    }
+
+    /**
+     * 获取小程序token
+     *
+     * @param appId  : 小程序appId
+     * @param secret : 小程序密钥
+     * @return : 返回小程token
+     */
+    private String getAppletTokenApi(String appId, String secret) {
+        Map<String, String> paramMap = new HashMap<>(3);
+        paramMap.put("grant_type", "client_credential");
+        paramMap.put("appid", appId);
+        paramMap.put("secret", secret);
+        String url = "https://api.weixin.qq.com/cgi-bin/token";
+        //拼接url请求参数
+        String uri = URIUtil.fillUrlParams(url, paramMap, Boolean.TRUE);
+        // 带参GET请求
+        Map<String, String> resultMap = new HashMap<>(4);
+        try {
+            String result = HttpUtil.get(uri);
+            if (Strings.isNotBlank(result)) {
+                resultMap = JsonUtil.toMap(result, Map.class, String.class, String.class);
+            }
+        } catch (Exception e) {
+            log.error("获取小程序token出现异常, appId : {},secret: {} e : {}", appId, secret, e.getMessage());
+            throw new BaseException("获取小程序token出现异常");
+        }
+        //返回token
+        if (resultMap.containsKey("access_token")) {
+            return resultMap.get("access_token");
+        }
+        //没有拿到token
+        log.error("获取token发生错误, appId : {}, secret: {}, errcode : {}, errmsg : {}", appId, secret,
+                resultMap.get("errcode"), resultMap.get("errmsg"));
+        throw new BaseException("http状态正确, 获取token发生错误");
+    }
+
+    /**
+     * 生成微信小程序二维码
+     *
+     * @param scene       : 二维码携带的参数
+     * @param accessToken : 小程序密钥
+     * @return : 返回二维码文件流
+     */
+    private BufferedInputStream getQrCodeApi(String scene, String accessToken) {
+        try {
+            //调用微信接口生成二维码
+            URL url = new URL("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken);
+            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+            connection.setRequestMethod("POST");
+            //连接超时 单位毫秒
+            connection.setConnectTimeout(10000);
+            //读取超时 单位毫秒
+            connection.setReadTimeout(2000);
+            // 发送POST请求必须设置如下两行
+            connection.setDoOutput(true);
+            connection.setDoInput(true);
+            // 获取URLConnection对象对应的输出流
+            PrintWriter printWriter = new PrintWriter(connection.getOutputStream());
+            // 发送请求参数
+            JSONObject paramJson = new JSONObject();
+            //这就是你二维码里携带的参数 String型  名称不可变
+            paramJson.set("scene", Strings.isBlank(scene) ? "a=1" : scene);
+            printWriter.write(paramJson.toString());
+            // flush输出流的缓冲
+            printWriter.flush();
+            //返回数据流
+            return new BufferedInputStream(connection.getInputStream());
+        } catch (Exception e) {
+            throw new BaseException("获取小程序二维码异常");
+        }
+    }
+}