移动系统liao
2024-08-15 d6e560e1d30bd6af259b0c07ffb51b9caf8ab925
cylsg/EzWechat/WechatService.cs
@@ -1,26 +1,35 @@
using Furion;
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
    public class WechatService:IWechatService ,IScoped
    {
        private readonly WechatApiClient _client;
        private readonly IEzCoreNetRedisService _redisService;
        public WechatService() {
        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,不用则不填",
@@ -28,9 +37,73 @@
                //MidasAppKey = "米大师 1.0 相关服务 AppKey,不用则不填",
                //MidasOfferIdV2 = "米大师 2.0 相关服务 OfferId,不用则不填",
                //MidasAppKeyV2 = "米大师 2.0 相关服务 AppKey,不用则不填"
            };
            _client = WechatApiClientBuilder.Create(request).Build();
            _redisService = ezCoreNetRedis;
        }
        public async Task<string> GetOpenID(string jscode)
        {
            var reques = new SnsComponentJsCode2SessionRequest()
            {
                AppId = App.Configuration["WechatAPP:AppId"],
                JsCode = jscode
            };
          var a= await _client.ExecuteSnsComponentJsCode2SessionAsync(reques);
            if(a.IsSuccessful())
            {
                return a.OpenId;
            }
            else
            {
                throw Oops.Oh($"{a.ErrorCode}+++{a.ErrorMessage}");
            }
        }
        public async Task<string> 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}");
            }
        }
        /// <summary>
        /// 获取AccToken
        /// </summary>
        /// <returns></returns>
         private  async Task<string> GetAccessToken()
        {
            string key = _redisService.Get<string>("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<string>("WxAccessToken", a.AccessToken, 7000);
            }
            return key;
        }
    }
}