微信返回的结果可能的运行结果
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);
}
}
}