using EzCoreNet.Redis; using Furion; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using Microsoft.Extensions.Options; using SKIT.FlurlHttpClient.Wechat.Api; using SKIT.FlurlHttpClient.Wechat.Api.Models; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; namespace EzWechat { public class WechatService:IWechatService ,IScoped { private readonly WechatApiClient _client; private readonly IEzCoreNetRedisService _redisService; public WechatService(IEzCoreNetRedisService ezCoreNetRedis) { /* 以公众号获取用户信息接口为例 */ var request = new WechatApiClientOptions() { AppId = App.Configuration["WechatAPP:AppId"], AppSecret = App.Configuration["WechatAPP:AppSecret"], Timeout=3000, //ImmeDeliveryAppKey = "即时配送相关服务 AppKey,不用则不填", //ImmeDeliveryAppSecret = "即时配送相关服务 AppSecret,不用则不填", //VirtualPaymentAppKey = "虚拟支付相关服务 AppKey,不用则不填", //MidasOfferId = "米大师 1.0 相关服务 OfferId,不用则不填", //MidasAppKey = "米大师 1.0 相关服务 AppKey,不用则不填", //MidasOfferIdV2 = "米大师 2.0 相关服务 OfferId,不用则不填", //MidasAppKeyV2 = "米大师 2.0 相关服务 AppKey,不用则不填" }; _client = WechatApiClientBuilder.Create(request).Build(); _redisService = ezCoreNetRedis; } public async Task GetOpenID(string jscode) { var reques = new SnsJsCode2SessionRequest() { JsCode = jscode }; var a= await _client.ExecuteSnsJsCode2SessionAsync(reques); if(a.IsSuccessful()) { return a.OpenId; } else { throw Oops.Oh($"{a.ErrorCode}+++{a.ErrorMessage}"); } } public async Task GetPhone( string bindgetphonenumber) { var requs = new WxaBusinessGetUserPhoneNumberRequest() { AccessToken = await GetAccessToken(), Code= bindgetphonenumber }; var a= await _client.ExecuteWxaBusinessGetUserPhoneNumberAsync(requs); if (a.IsSuccessful()) return a.PhoneInfo.PurePhoneNumber; else { throw Oops.Oh($"{a.ErrorCode}+++{a.ErrorMessage}"); } } /// /// 获取AccToken /// /// private async Task GetAccessToken() { string key = _redisService.Get("WxAccessToken"); if(string.IsNullOrEmpty(key)) { var a = await _client.ExecuteCgibinTokenAsync(new CgibinTokenRequest { }); if(!a.IsSuccessful()) { throw Oops.Oh($"{a.ErrorCode}+++{a.ErrorMessage}"); } key=a.AccessToken; _redisService.Add("WxAccessToken", a.AccessToken, 7000); } return key; } } }