Magicodes.WxMiniProgram.Sdk
輕量級微信小程序SDK,支持.NET Framework以及.NET Core。目前已提供Abp模塊的封裝,支持開箱即用。
Nuget
新的包
主要功能
輕量級微信小程序SDK,以便於簡單方便的實現小程序服務端API的調用。具體見單元測試。
RoadMap
- 完善接口
- 登錄
- 用戶信息
- 接口調用憑證
- 數據分析
- 客服消息
- 模板消息
- 統一服務消息
- 動態消息
- 插件管理
- 附近的小程序
- 小程序碼
- 內容安全
- 廣告
- 圖像處理
- OCR
- 運維中心
- 搜索
- 生物認證
- 訂閱消息
- AccessToken自動傳參,無需顯式指定
- 方法參數改成類參數,並且支持通過特性校驗
更新歷史
0.0.5
- 重構AccessToken管理
- 添加對分布式架構支持(使用分布式緩存)
- 重構Http請求模塊,移除HttpClient
- 添加獲取二維碼接口(Create、Get、GetUnlimited),詳見單元測試
開始使用
如果使用Abp相關模塊,則使用起來比較簡單,具體您可以參考相關單元測試的編寫。主要有以下步驟:
- 引用對應的Abp的Nuget包
如果僅需某個支付,僅需引用該支付的包。下面以通聯支付為例,我們需要在工程中引用此包:
- 添加模塊依賴
在對應工程的Abp的模塊(AbpModule)中,添加對“WxMiniProgramSdkModule”的依賴,如:
[DependsOn(typeof(WxMiniProgramSdkModule))]
- 直接使用
通過構造函數或者屬性注入相關服務,即可直接使用。
如何配置?
對於ABP集成,則可以通過以下方式獲取配置:
- 配置文件,如:
"App_MiniProgram": { "MiniProgramAppId": "wx25fa5d55ef27e086", "MiniProgramAppSecret": "ab02ac4499c9764108a78e19476d7101" }
以上為個人小程序號配置,僅用於測試,請勿亂搞!
- 配置管理器
需存儲JSON對象,對應的key為“App_MiniProgram”。
對於非ABP集成,則需要自己實例化或注入配置類對象,可以參考單元測試的編寫。
非ABP集成
請參考Abp相關模塊的封裝或者相關的單元測試代碼,目前“Test”工程對應非ABP集成方式的使用,“Abp.Test”工程對應集成ABP之后的使用。
分布式緩存配置
為了支持分布式架構,已引入IDistributedCache來支持分布式緩存,在開發測試或單主機服務中,需使用以下代碼進行注入:
services.AddDistributedMemoryCache();
如需使用Redis,請參考下面代碼:
services.AddDistributedRedisCache(options => { options.Configuration = "localhost"; options.InstanceName = "SampleInstance"; });
如何添加API?(PR)
由於作者精力有限,非常歡迎各位參與共建。主體步驟如下所示:
1.添加目錄
在工程【Magicodes.WxMiniProgram.Sdk】下的【Services】目錄下添加對應業務模塊目錄,比如二維碼為“QRCode”。
2.添加對應接口的AppService
例如添加QRCodeAppService,繼承自ServiceBase
3.基於ServiceBase提供的封裝來編寫接口邏輯
例如以下代碼,獲取永久二維碼:
/// <summary> /// 獲取小程序碼,適用於需要的碼數量較少的業務場景。通過該接口生成的小程序碼,永久有效,有數量限制 /// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.get.html /// </summary> /// <param name="path">掃碼進入的小程序頁面路徑,最大長度 128 字節,不能為空;對於小游戲,可以只傳入 query 部分,來實現傳參效果,如:傳入 "?foo=bar",即可在 wx.getLaunchOptionsSync 接口中的 query 參數獲取到 {foo:"bar"}。</param> /// <param name="autoColor">自動配置線條顏色,如果顏色依然是黑色,則說明不建議配置主色調</param> /// <param name="lineColor">auto_color 為 false 時生效,使用 rgb 設置顏色 例如 {"r":"xxx","g":"xxx","b":"xxx"} 十進制表示</param> /// <param name="isHyaline">是否需要透明底色,為 true 時,生成透明底色的小程序碼</param> /// <param name="width">二維碼的寬度,單位 px。最小 280px,最大 1280px</param> /// <returns></returns> public async Task<byte[]> Get(string path, bool autoColor = false, object lineColor = null, bool isHyaline = false, int width = 430) { if (string.IsNullOrWhiteSpace(path)) throw new ArgumentException("參數不能為空!", nameof(path)); return await DownloadData("wxa/getwxacode?access_token={ACCESS_TOKEN}", RestSharp.Method.POST, new { path, width, auto_color = autoColor, line_color = lineColor ?? new { r = 0, g = 0, b = 0 }, is_hyaline = isHyaline }); }
如上述代碼所示,注意事項如下:
- 通過DownloadData函數下載二維碼
- 如需使用access_token,請在Url添加access_token={ACCESS_TOKEN}【后續將進一步優化】
如需返回JSON對象,示例如下所示:
public class SnsAppService : ServiceBase { private const string ApiName = "sns"; private readonly IMiniProgramConfig _config; public SnsAppService(IMiniProgramConfig config) { _config = config; } /// <summary> /// 根據登錄憑證獲取Sns信息(openid、session_key、unionid) /// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html /// </summary> /// <param name="code">登錄時獲取的 code</param> public async Task<GetSnsInfoByCodeOutput> JscodeToSession(string code) { if (string.IsNullOrWhiteSpace(code)) throw new ArgumentException("參數不能為空!", nameof(code)); //獲取api請求url var url = $"{ApiName}/jscode2session?appid={_config.MiniProgramAppId}&secret={_config.MiniProgramAppSecret}&js_code={code}&grant_type=authorization_code"; return await HttpGet<GetSnsInfoByCodeOutput>(url); } }
注意事項如下:
-
添加GetSnsInfoByCodeOutput,需繼承自ServiceOutputBase
-
使用HttpGet或HttpPost方法來完成請求
-
Output類中的屬性請遵守C#命名規范,可以使用“JsonProperty”特性進行配置
/// <summary> /// 憑證有效時間,單位:秒 /// </summary> [JsonProperty("expires_in")] public int Expires { get; set; } /// <summary> /// access_token /// </summary> [JsonProperty("access_token")] public string AccessToken { get; set; }
4.編寫相關單元測試,並確保通過
單元測試請參考工程【Test】和【Abp.Test】,可以通過ServiceOutputBase的IsSuccess方法來判斷是否成功:
public class TokenTest : AbpTestBase { public TokenTest(ITestOutputHelper testOutputHelper) { _testOutputHelper = testOutputHelper; _tokenAppService = Resolve<TokenAppService>(); } private readonly ITestOutputHelper _testOutputHelper; private readonly TokenAppService _tokenAppService; [Fact] public async Task Get_Test() { var result = await _tokenAppService.GetAsync(); _testOutputHelper.WriteLine(JsonConvert.SerializeObject(result)); result.IsSuccess().ShouldBe(true); result.AccessToken.ShouldNotBeNullOrWhiteSpace(); } }
官方訂閱號
關注“麥扣聊技術”訂閱號免費獲取:
- 最新文章、教程、文檔
- 視頻教程
- 基礎版免費授權
- 模板
- 解決方案
- 編程心得和理念