.Net实现简单微信SDK

DotNet实现简单微信SDK

概述

上一篇文章C#实现微信扫码登录(绕过微信开发平台) - ihuadz 提到封装微信接口,本篇文章将从以下方面介绍如何使用C#实现简单的微信SDK。

仓库地址:https://github.com/ihuadz/QI.WxSdk.git

  • 核心类库
  • 配置
  • 具体实现
  • 如何使用

核心类库介绍

  • WebApiClient

WebApiClient 是一个集高性能高可扩展性于一体的声明式http客户端库,具体使用方法可以查看一下官方文档

其他的都是使用dotnet提供的类库

配置

配置文件长这样,可配置多个小程序

# 微信应用(公众号/小程序)
WeixinSetting:
  # 应用配置数组,可配置多个
  App:
  - AppId: xxxxxxxxxxxxxx
    AppSecret: xxxxxxxxxxxxxxxxxxxxxxx
    Name: xxxxxxxxxxxxxxx
  - AppId: xxxxxxxxxxxxxx
    AppSecret: xxxxxxxxxxxxxxxxxxxxxxx
    Name: xxxxxxxxxxxxxxx

具体实现

封装代码太多,文章内就放出核心代码,全部sdk查看概述

  • IWxApiBase
/// <summary>
/// 微信接口映射API
/// </summary>

[JsonNetReturn(EnsureMatchAcceptContentType = false)]
public interface IWxApiBase
{
}
  • 获取Access Token
// <summary>
    /// 获取全局接口调用凭据, 用于小程序和公众号
    /// </summary>
    [HttpHost("https://api.weixin.qq.com/cgi-bin/")]
    public interface IWxTokenApi : IWxApiBase
    {
        /// <summary>
        /// 获取全局接口调用 Access token
        /// </summary>
        /// <remarks>
        /// 用于小程序和公众号
        /// https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html
        /// https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-access-token/getAccessToken.html
        /// </remarks>
        /// <param name="appId">公众号或小程序的应用id</param>
        /// <param name="secret">应用密钥,即appsecret</param>
        /// <param name="grant_type">授权类型,获取access_token填写client_credential</param>
        /// <returns></returns>
        [HttpGet("token")]
        Task<TokenApiResult> GetAsync([Required] string appId, [Required] string secret, string grant_type = "client_credential");

    }
  • 将AccessToken缓存
    /// <summary>
    /// 检查应用配置数据
    /// </summary>
    protected virtual void CheckAppSetting()
    {
        if (CurApp == null) throw new WxException("应用配置不能空");
        if (string.IsNullOrEmpty(CurApp.AppId)) throw new WxException("应用AppId能空");
        if (string.IsNullOrEmpty(CurApp.AppSecret)) throw new WxException("应用AppSecret能空");
    }

    /// <summary>
    /// 获取Access Token
    /// </summary>
    /// <remarks>如果可能,会进行缓存</remarks>
    /// <returns></returns>
    public virtual async Task<string> GetAccessTokenAsync()
    {   
        CheckAppSetting();

        //获取token,先查询缓存
        string token = await GetAccessTokenFromCacheAsync();
        if (!string.IsNullOrEmpty(token)) return token;

        //如果缓存中没有,调用Wx Api获取Token
        IWxTokenApi tokenApi = GetService<IWxTokenApi>();
        TokenApiResult result = await tokenApi.GetAsync(CurApp.AppId, CurApp.AppSecret);

        //缓存token
        await SetAccessTokenToCacheAsync(result.AccessToken, result.Expires);

        return result.AccessToken;
    }
  • 最主要的是这一步,使用WebApiClient过滤器将access_token设置到每次请求微信的url中
/// <summary>
/// WebApiClient过滤器,自动设置url的access_token请求参数
/// </summary>
public class AccessTokenApiFilter : ApiFilterAttribute
{
    /// <summary>
    /// 请求
    /// </summary>
    /// <param name="context"></param>
    /// <returns></returns>
    public override async Task OnRequestAsync(ApiRequestContext context)
    {
        var tokenManager = context.HttpContext.ServiceProvider.GetRequiredService<ITokenManager>();
        string accessToken = await tokenManager.GetAccessTokenAsync();
        context.HttpContext.RequestMessage.AddUrlQuery("access_token", accessToken);
    }

    /// <summary>
    /// 响应
    /// </summary>
    /// <param name="context"></param>
    /// <returns></returns>
    public override Task OnResponseAsync(ApiResponseContext context)
    {
        if(context.Result is ApiResultBase apiResult && apiResult!=null)
        {
            //如果请求的accesstoken过期,清除当前缓存的过期token
            if (apiResult.IsAccessTokenInvalid)
            {
                var tokenManager = context.HttpContext.ServiceProvider.GetRequiredService<ITokenManager>();
                tokenManager.ClearAccessTokenAsync();
            }
        }

        return Task.CompletedTask;
    }
}

以上次文章中使用到的请求短链为例,实现请求微信端。

/// <summary>
/// 小程序 URL Link, URL Scheme 接口
/// </summary>
public interface IWxMpUrllinkApi : IWxApiWithAccessTokenFilter
{
    /// <summary>
    /// 获取小程序 URL Link
    /// </summary>
    /// <remarks>
    /// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-link/urllink.generate.html
    /// https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/url-link.html
    /// </remarks>
    /// <param name="input">请求数据</param>
    /// <returns></returns>
    [HttpPost("https://api.weixin.qq.com/wxa/generate_urllink")]
    ITask<GenerateUrlLinkResult> GenerateUrllinkAsync([JsonNetContent] GenerateUrlLinkInput input);
}

IWxApiWithAccessTokenFilter

/// <summary>
/// WebApiClient过滤器,自动设置url的access_token请求参数
/// </summary>
[JsonNetReturn(EnsureMatchAcceptContentType = false)]
[AccessTokenApiFilter]
public interface IWxApiWithAccessTokenFilter
{
}

然后就是WxMpApiService,这里就只放短链相关

/// <summary>
/// 微信小程序接口聚合服务, 生命周期为Scoped
/// </summary>
public class WxMpApiService : WxApiServiceBase
{
    /// <summary>
    /// 小程序 URL Link, URL Scheme 接口
    /// </summary>
    public IWxMpUrllinkApi IUrllinkApi => GetService<IWxMpUrllinkApi>();
}

WxApiServiceBase 接口聚合服务 基类

/// <summary>
/// Wx接口聚合服务 基类
/// </summary>
public class WxApiServiceBase
{
    /// <summary>
    /// 微信接口集合服务
    /// </summary>
    /// <param name="tokenManager"></param>
    public WxApiServiceBase(ITokenManager tokenManager)
    {
        TokenManager = tokenManager;
    }

    /// <summary>
    /// 微信AccessToken管理器
    /// </summary>
    public virtual ITokenManager TokenManager { get; }

    /// <summary>
    /// 得到服务对象
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    protected virtual T GetService<T>()
    {
        return TokenManager.GetService<T>();
    }

    /// <summary>
    /// 设置当前的应用
    /// </summary>
    /// <param name="wxApp"></param>
    public virtual void SetCurApp(WxAppSetting wxApp)
    {
        TokenManager.SetCurApp(wxApp);
    }

    /// <summary>
    /// 设置当前的应用,根据Appid从WxContext中查找
    /// </summary>
    /// <param name="appId"></param>
    public virtual void SetCurApp(string appId)
    {
        TokenManager.SetCurApp(appId);
    }

    /// <summary>
    /// 得到会话当前AppId
    /// </summary>
    /// <returns></returns>
    public virtual string GetCurAppId()
    {
        return TokenManager?.GetCurAppId() ?? string.Empty;
    }

    /// <summary>
    /// 当前应用
    /// </summary>
    /// <returns></returns>
    public virtual WxAppSetting GetCurApp()
    {
        return TokenManager.GetCurApp();
    }
}

至于ITokenManager,自己设计一下就好,都是读取配置和缓存AccessToken的一些操作,也可以查看源码概述

最后就是如何使用了。添加一个扩展类,将封装好的Api注册

/// <summary>
/// 添加WxSdk 接口、服务,IWxSession会话
/// </summary>
/// <param name="services"></param>
/// <returns></returns>
public static IServiceCollection AddWxSdkAll(this IServiceCollection services)
{
    //注册接口,服务
    services.AddWxSdkApiAndServices();
    //注册token管理器
    services.AddWxSdkTokenManager();

    return services;
}

/// <summary>
/// 注册token管理器,会话服务
/// </summary>
/// <param name="services"></param>
/// <returns></returns>
public static IServiceCollection AddWxSdkTokenManager(this IServiceCollection services)
{
    //添加WxSession
    services.AddScoped<ITokenManager, TokenManager>();

    return services;
}

/// <summary>
/// 添加WxSdk 接口、服务
/// </summary>
/// <param name="services"></param>
/// <returns></returns>
public static IServiceCollection AddWxSdkApiAndServices(this IServiceCollection services)
{
    services
        .AddWebApiClient()
        .UseJsonFirstApiActionDescriptor();

    //添加Wx上下文
    services.AddSingleton<WxConfig>();

    //添加微信API映射
    //公众接口
    services.AddHttpApi<IWxTokenApi>();

    //注册聚合/扩展服务 -公众号
    services.AddScoped<WxPaApiService>();

    //小程序接口
    services.AddHttpApi<IWxMpUrllinkApi>();


    //注册聚合/扩展服务 -小程序
    services.AddScoped<WxMpApiService>();

    return services;
}

如何使用

在你的应用中添加注册

//注册微信Sdk集成
services.AddWxSdkAll();

在service里注入后调用

//请求微信短链接口
    var urlResult = await _wxMpService.IUrllinkApi.GenerateUrllinkAsync(new GenerateUrlLinkInput()
    {
        Path = path,
        Query = query,
        EnvironmentVersion = environmentVersion,
        ExpireTimestamp = DateTime.Now.AddMinutes(10).ConvertToTimeStamp()
    });
  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要调起微信的扫一扫功能,可以使用C#语言编写的.net平台上的代码。首先,需要引用微信提供的开放接口,可以通过访问微信开放平台的文档来获取相关接口信息。 在代码中,可以使用微信提供的SDK或API来调用微信的扫一扫功能。首先,需要引入相应的命名空间以便使用微信的相关类和方法。 接下来,通过创建一个按钮或者其他控件,并通过相应的事件响应让用户触发调起扫一扫功能的代码。可以使用微信的接口方法来实现这一功能,例如调用LaunchScan方法。 在调起扫一扫功能前,需要确保用户已经安装并登录了微信客户端。可以通过判断微信客户端是否已安装和是否已登录来提醒用户安装或者登录微信。 在代码中,可能还需要配置一些相关参数,例如设置扫一扫的模式(例如扫描条形码、二维码、图片等),设置是否允许从相册选取图片进行扫描等。 最后,执行调起扫一扫功能的代码,并等待微信返回扫码结果。可以通过回调函数或者异步方法来获取扫码结果,并对结果进行处理。 需要注意的是,在调用微信的API时,可能需要提供相应的权限和密钥等信息,以确保接口调用的安全和有效。 总之,通过以上的步骤和实现方法,可以借助.net平台调起微信的扫一扫功能,实现对二维码、条形码等信息的扫描。 ### 回答2: 要使用.NET调起微信的扫一扫功能,可以通过使用微信提供的开放接口来实现。具体实现步骤如下: 1. 首先,需要使用微信开放平台申请一个开发者账号,创建一个应用,并获取到应用的AppID。 2. 在.NET项目中,引入微信开放平台提供的SDK,并在项目中添加对微信SDK的引用。 3. 在.NET项目中,编写代码来实现调起微信的扫一扫功能。实现的代码可以大致如下: ```csharp using System; using System.Diagnostics; using System.Windows.Forms; using 微信SDK; namespace 调起微信扫一扫功能的.NET项目 { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void ScanButton_Click(object sender, EventArgs e) { try { WeChatAPI weChatAPI = new WeChatAPI(); // 创建微信API对象 weChatAPI.Init("YourAppID"); // 初始化微信API,传入你的AppID // 调起微信的扫一扫功能 string result = weChatAPI.InvokeScanQRCode(); MessageBox.Show("扫描结果:" + result, "扫一扫结果"); } catch (Exception ex) { Debug.WriteLine(ex.Message); MessageBox.Show("调起微信扫一扫功能失败!", "错误"); } } } } ``` 需要注意的是,该示例代码中的"YourAppID"应替换为你在微信开放平台申请的应用的AppID。 4. 在.NET项目中,设计主窗体,并添加一个按钮控件,将按钮的Click事件绑定到上述代码中的ScanButton_Click方法上。 5. 构建和运行.NET项目,当点击按钮时,调起微信的扫一扫功能,并可以获取到扫描结果。 总结起来,要在.NET项目中调起微信的扫一扫功能,首先需要申请微信开放平台账号和应用,获取到AppID,并使用微信SDK来调起扫一扫功能,最后在.NET项目中添加相关代码并进行功能测试。 ### 回答3: 要通过.NET调起微信的扫一扫功能,可以使用微信开放平台提供的开发工具包。具体流程如下: 首先,你需要在微信开放平台上注册并创建一个应用,并获得相应的AppId。然后,下载并安装微信开放平台提供的开发工具包。 接下来,在你的.NET项目中引入微信开放平台的开发工具包。可以通过NuGet包管理器来安装相应的包。 一旦工具包安装完成,你就可以使用微信开放平台的API来调起微信的扫一扫功能了。 在.NET代码中,你可以通过调用相应的API方法来实现扫一扫功能。具体代码如下: ``` using WeChatSDK; public class WeChatHelper { public static void ScanQRCode() { WeChatSDK.WeChat.Init("YourAppId"); // 替换为你的AppId // 调起微信的扫一扫功能 WeChatSDK.WeChat.ScanQRCode(); } } ``` 在这个示例代码中,我们先通过`WeChatSDK.WeChat.Init()`方法设置AppId,然后通过`WeChatSDK.WeChat.ScanQRCode()`方法调起扫一扫功能。 当用户使用你的.NET应用点击相应的按钮或触发事件时,可以调用`WeChatHelper.ScanQRCode()`方法来唤起微信的扫一扫功能。 需要注意的是,为了确保你的.NET项目能够正常调起微信的扫一扫功能,你需要在微信开放平台的应用设置中进行相应的配置,如设置合法的域名、授权回调页面等。 以上就是使用.NET调起微信扫一扫功能的一般步骤和代码示例。希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值