using System.Security.Cryptography; using System.Text; using System.Text.Json; using System.Text.Json.Serialization; namespace CampusErrand.Services; /// /// 微信开放平台服务实现 /// public class WeChatService : IWeChatService { private readonly HttpClient _httpClient; private readonly string _appId; private readonly string _appSecret; public WeChatService(HttpClient httpClient, IConfiguration configuration) { _httpClient = httpClient; var weChatConfig = configuration.GetSection("WeChat"); _appId = weChatConfig["AppId"]!; _appSecret = weChatConfig["AppSecret"]!; } /// public async Task Code2SessionAsync(string code) { var url = $"https://api.weixin.qq.com/sns/jscode2session?appid={_appId}&secret={_appSecret}&js_code={code}&grant_type=authorization_code"; var response = await _httpClient.GetAsync(url); if (!response.IsSuccessStatusCode) { return new WeChatSessionResult { Success = false, ErrorMessage = "微信接口调用失败" }; } var json = await response.Content.ReadAsStringAsync(); Console.WriteLine($"[WeChat] code2session 响应: {json}"); var result = JsonSerializer.Deserialize(json); if (result == null || result.ErrCode != 0) { Console.WriteLine($"[WeChat] code2session 失败: errcode={result?.ErrCode}, errmsg={result?.ErrMsg}"); return new WeChatSessionResult { Success = false, ErrorMessage = result?.ErrMsg ?? "微信接口返回异常" }; } return new WeChatSessionResult { Success = true, SessionKey = result.SessionKey, OpenId = result.OpenId }; } /// public string DecryptPhoneNumber(string sessionKey, string encryptedData, string iv) { var keyBytes = Convert.FromBase64String(sessionKey); var ivBytes = Convert.FromBase64String(iv); var dataBytes = Convert.FromBase64String(encryptedData); using var aes = Aes.Create(); aes.Key = keyBytes; aes.IV = ivBytes; aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.PKCS7; using var decryptor = aes.CreateDecryptor(); var decryptedBytes = decryptor.TransformFinalBlock(dataBytes, 0, dataBytes.Length); var decryptedJson = Encoding.UTF8.GetString(decryptedBytes); var phoneInfo = JsonSerializer.Deserialize(decryptedJson); return phoneInfo?.PhoneNumber ?? throw new InvalidOperationException("解密手机号失败"); } } /// /// 微信 code2Session 响应 /// internal class WeChatCode2SessionResponse { [JsonPropertyName("session_key")] public string? SessionKey { get; set; } [JsonPropertyName("openid")] public string? OpenId { get; set; } [JsonPropertyName("errcode")] public int ErrCode { get; set; } [JsonPropertyName("errmsg")] public string? ErrMsg { get; set; } } /// /// 微信解密后的手机号信息 /// internal class WeChatPhoneInfo { [JsonPropertyName("phoneNumber")] public string? PhoneNumber { get; set; } [JsonPropertyName("purePhoneNumber")] public string? PurePhoneNumber { get; set; } [JsonPropertyName("countryCode")] public string? CountryCode { get; set; } }