浏览代码

新增生成带页面参数的小程序二维码接口

LiuQiang 1 年之前
父节点
当前提交
5c6ddcef68

+ 2 - 1
Admin.NET/Admin.NET.Application/Configuration/Wechat.json

@@ -11,7 +11,8 @@
     "WxOpenAppId": "",
     "WxOpenAppSecret": "",
     "WxToken": "", // 小程序消息推送中的令牌(Token)
-    "WxEncodingAESKey": "" // 小程序消息推送中的消息加解密密钥(EncodingAESKey)
+    "WxEncodingAESKey": "", // 小程序消息推送中的消息加解密密钥(EncodingAESKey)
+    "QRImagePath": "" //小程序生成带参数二维码保存位置(绝对路径 eg: d:\\Web\\wwwroot\\Upload\\QRImage)
   },
   // 微信支付
   "WechatPay": {

+ 22 - 1
Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WxOpenInput.cs

@@ -115,4 +115,25 @@ public class AddSubscribeMessageTemplateInput
     /// </summary>
     [Required(ErrorMessage = "服务场景描述不能为空")]
     public string SceneDescription { get; set; }
-}
+}
+
+/// <summary>
+/// 生成带参数小程序二维码
+/// </summary>
+public class GenerateQRImageInput
+{
+    /// <summary>
+    /// 扫码进入的小程序页面路径,最大长度 128 个字符,不能为空; eg: pages/index?id=0001
+    /// </summary>
+    public string PagePath { get; set; }
+    /// <summary>
+    /// 文件保存的名称
+    /// </summary>
+    public string ImageName { get; set; }
+
+    /// <summary>
+    /// 图片宽度 默认430
+    /// </summary>
+    public int Width { get; set; } = 430;
+}
+

+ 7 - 0
Admin.NET/Admin.NET.Core/Service/Wechat/Dto/WxOpenOutput.cs

@@ -14,4 +14,11 @@ public class WxOpenIdOutput
 public class WxPhoneOutput
 {
     public string PhoneNumber { get; set; }
+}
+
+public class GenerateQRImageOutput
+{
+    public bool Success { get; set; }
+    public string ImgPath { get; set; }
+    public string Message { get; set; }
 }

+ 66 - 0
Admin.NET/Admin.NET.Core/Service/Wechat/SysWxOpenService.cs

@@ -4,6 +4,9 @@
 //
 // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
 
+using Furion.LinqBuilder;
+using System;
+
 namespace Admin.NET.Core.Service;
 
 /// <summary>
@@ -192,6 +195,69 @@ public class SysWxOpenService : IDynamicApiController, ITransient
         return resTemplate;
     }
 
+    /// <summary>
+    /// 生成二维码
+    /// </summary>
+    /// <param name="input"> 扫码进入的小程序页面路径,最大长度 128 个字符,不能为空; eg: pages / index ? id = AY000001 </param>
+    /// <returns></returns>
+    [DisplayName("生成小程序二维码")]
+    [ApiDescriptionSettings(Name = "GenerateQRImage")]
+    public async Task<GenerateQRImageOutput> GenerateQRImageAsync(GenerateQRImageInput input)
+    {
+        GenerateQRImageOutput generateQRImageOutInput = new GenerateQRImageOutput();
+        if (input.PagePath.IsNullOrEmpty())
+        {
+            generateQRImageOutInput.Success = false;
+            generateQRImageOutInput.ImgPath = "";
+            generateQRImageOutInput.Message = $"生成失败 页面路径不能为空";
+            return generateQRImageOutInput;
+        }
+
+        if (input.ImageName.IsNullOrEmpty())
+        {
+            input.ImageName = DateTime.Now.ToString("yyyyMMddHHmmss");
+        }
+
+        var accessToken = await GetCgibinToken();
+        var request = new CgibinWxaappCreateWxaQrcodeRequest
+        {
+            AccessToken = accessToken,
+            Path = input.PagePath,
+            Width = input.Width
+        };
+        var response = await _wechatApiClient.ExecuteCgibinWxaappCreateWxaQrcodeAsync(request);
+
+        if (response.IsSuccessful())
+        {
+            var QRImagePath = App.GetConfig<string>("Wechat:QRImagePath");
+            //判断文件存放路径是否存在
+            if (!Directory.Exists(QRImagePath))
+            {
+                Directory.CreateDirectory(QRImagePath);
+            }
+            // 将二维码图片数据保存为文件
+            var filePath = QRImagePath + $"\\{input.ImageName.ToUpper()}.png";
+            if (File.Exists(filePath))
+            {
+                File.Delete(filePath);
+            }
+            File.WriteAllBytes(filePath, response.GetRawBytes());
+
+            generateQRImageOutInput.Success = true;
+            generateQRImageOutInput.ImgPath = filePath;
+            generateQRImageOutInput.Message = "生成成功";
+        }
+        else
+        {
+            // 处理错误情况
+            generateQRImageOutInput.Success = false;
+            generateQRImageOutInput.ImgPath = "";
+            generateQRImageOutInput.Message = $"生成失败 错误代码:{response.ErrorCode}  错误描述:{response.ErrorMessage}";
+        }
+        return generateQRImageOutInput;
+    }
+
+
     /// <summary>
     /// 获取Access_token
     /// </summary>