C#微信登录支付Api > 微信返回的结果可能的运行结果


微信返回的结果可能的运行结果


using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace ZmjWxApi
{
    /// <summary>
    /// 微信返回的结果可能的运行结果
    /// </summary>
    public enum EWxResultType
    {
        /// <summary>
        /// 成功
        /// </summary>
        SUCCESS,
        /// <summary>
        /// 失败
        /// </summary>
        FAIL,
    }
    /// <summary>
    /// 微信返回的结果中可能存在的两个错误信息提示
    /// </summary>
    public interface IWxResponseError
    {
        /// <summary>
        /// 错误码
        /// </summary>
        int ErrCode { get; set; }
        /// <summary>
        /// 错误的中文解释
        /// </summary>
        string ErrMessage { get; set; }
    }
    /// <summary>
    /// 微信返回的结果的错误信息,大部分结果中都含有的两个json内容,尤其是错误结果中
    /// </summary>
    public class WxResponseErrors : IWxResponseError
    {
        /// <summary>
        /// 可能的错误代码
        /// </summary>
        [System.Text.Json.Serialization.JsonPropertyName("errcode")]
        public int ErrCode { get; set; }
        /// <summary>
        /// 可能的错误信息
        /// </summary>
        [System.Text.Json.Serialization.JsonPropertyName("errmsg")]
        public string ErrMessage { get; set; }
    }
    /// <summary>
    /// 微信通知返回的时候返回成功与否的结果
    /// 这是给微信返回处理结果的
    /// </summary>
    public class WxResultk
    {
        /// <summary>
        /// 返回状态码,成功与否
        /// </summary>
        [System.Text.Json.Serialization.JsonPropertyName("code")]
        public WxResultType ErrCode { get; set; }
        /// <summary>
        /// 返回失败的原因或者成功
        /// </summary>
        [System.Text.Json.Serialization.JsonPropertyName("message")]
        public string ErrMessage { get; set; }
    }
    /// <summary>
    /// 微信的基本请求结果
    /// </summary>
    public interface IWxHttpResponse1
    {
        /// <summary>
        /// 反应当前请求是否成功
        /// </summary>
        bool IsSuccess { get; }
        /// <summary>
        /// 原始的http请求结果
        /// </summary>
        HttpResponseMessage Response { get; }
        /// <summary>
        /// 请求结果的json原始内容
        /// </summary>
        string JsonResult { get; }
        /// <summary>
        /// 将http请求到的结果转化为指定的格式
        /// </summary>
        /// <typeparam name="WxResponse"></typeparam>
        /// <returns></returns>
        WxResponse JsonReadAsResponse<WxResponse>() where WxResponse : IWxResponseError;
        /// <summary>
        /// 验证响应的合法性,即验证是否是微信发来的请求
        /// </summary>
        /// <param name="manager"></param>
        /// <returns></returns>
        bool RSAVerifyOk(WxApiCertManager manager);
    }
    /// <summary>
    /// 微信的最基本请求结果
    /// </summary>
    public class WxHttpResponse : IWxHttpResponse
    {
        /// <summary>
        /// 表示结果是否是成功的
        /// </summary>
        public bool IsSuccess => (Response?.StatusCode == System.Net.HttpStatusCode.OK || Response?.StatusCode == System.Net.HttpStatusCode.Accepted);
        /// <summary>
        /// http返回的结果,包含http头部等信息
        /// </summary>
        public HttpResponseMessage Response { get; set; }
        /// <summary>
        /// 这是解析前的json完整内容
        /// </summary>
        public string JsonResult { get; set; }
        /// <summary>
        /// 应答时间戳
        /// </summary>
        public string WxTimeStamp => Response?.Headers.GetValues("Wechatpay-Timestamp").FirstOrDefault(x => !string.IsNullOrEmpty(x));
        /// <summary>
        /// 应答随机串
        /// </summary>
        public string WxNonce => Response?.Headers.GetValues("Wechatpay-Nonce").FirstOrDefault(x => !string.IsNullOrEmpty(x));
        /// <summary>
        /// 应答签名串,待验证的字符串
        /// </summary>
        public string WxSignature => Response?.Headers.GetValues("Wechatpay-Signature").FirstOrDefault(x => !string.IsNullOrEmpty(x));
        /// <summary>
        /// 使用的公钥ID,用于从公钥集中取出公钥
        /// </summary>
        public string WxSerial => Response?.Headers.GetValues("Wechatpay-Serial").FirstOrDefault(x => !string.IsNullOrEmpty(x));
        /// <summary>
        /// 将JsonResult序列化为指定的格式
        /// </summary>
        /// <returns></returns>
        public WxResponse JsonReadAsResponse<WxResponse>() where WxResponse : IWxResponseError
        {
            return System.Text.Json.JsonSerializer.Deserialize<WxResponse>(JsonResult ?? "");
        }
        /// <summary>
        /// 对请求的结果进行签名验证,如果验证失败,则说明可能不是微信发的
        /// </summary>
        /// <returns></returns>
        public bool RSAVerify(WxApiCertManager manager)
        {
            if (Response is null) throw new NullReferenceException("不能对空的请求验证!");
            if (WxSerial is null) throw new NullReferenceException("请求结果中不包含公钥ID");
            if (WxSignature is null) throw new NullReferenceException("请求结果中不包含应答签名");
            var pubkey = manager.GetPublicKey(WxSerial) ?? throw new NullReferenceException("无法获取到指定的公钥!");//获取公钥
            var sstr = $"{WxTimeStamp}\n{WxNonce}\n{JsonResult}\n";
            return WxHttpHandler.RSAVerifyData(sstr, WxSignature, pubkey);
        }
    }
}