Commit 65780320 authored by 罗超's avatar 罗超

删除问题文件

parent f13e0519

using Mall.WeChat.Helper;
using Edu.Common.Pay.WeChatPat.Model;
using System;
using System.Globalization;
using System.IO;
using System.Text;
using System.Web;
using System.Xml.Linq;
using Microsoft.AspNetCore.Http;
using Edu.Common.Plugin;
namespace Edu.Common.Pay
{
/// <summary>
/// 支付帮助类
/// </summary>
public class PayUtilWeiXin
{
public PayUtilWeiXin() { }
/// <summary>
/// 企业付款
/// </summary>
/// <param name="sOrderNo"></param>
/// <param name="sProductName"></param>
/// <param name="dPrice"></param>
/// <param name="CustomerId"></param>
/// <param name="openid"></param>
/// <returns></returns>
public static bool GetTransfersOrder(string sOrderNo, decimal dPrice, string openid, string WeChatPayCertificateUrl,string WeChatApiSecret,string WeChatPayMerchants, string MiniAppId, IHttpContextAccessor _accessor, string Remark = "")
{
if (!System.IO.File.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data/Certs/WeChatApp/" + WeChatPayCertificateUrl)))
{
return false;
}
var req = new Common.Pay.WeChatPat.RequestHandler();
req.SetKey(WeChatApiSecret);
//
req.SetParameter("mch_appid", MiniAppId);//微信开放平台审核通过的应用APPID
req.SetParameter("mchid", WeChatPayMerchants);//微信支付分配的商户号
req.SetParameter("nonce_str", GetNoncestr());//随机字符串,不长于32位
req.SetParameter("partner_trade_no", sOrderNo);//商户订单号,需保持唯一性(只能是字母或者数字,不能包含有其它字符)
req.SetParameter("openid", openid);
req.SetParameter("check_name", "NO_CHECK");
req.SetParameter("amount", (dPrice * 100).ToString("f0"));
req.SetParameter("desc", Remark == "" ? "赞羊商城佣金提现" : Remark);
req.SetParameter("sign", req.CreateMd5Sign(_accessor, WeChatApiSecret));
var reqXml = req.ParseXml();
var result = Common.Pay.WeChatPat.HttpHelper.Post(new HttpParam()
{
Url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers",
PostParam = reqXml,
Encoding = Common.Pay.WeChatPat.HttpHelper.GetRequestEncoding(_accessor.HttpContext.Request),
CertPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data/Certs/WeChatApp/" + WeChatPayCertificateUrl),//"App_Data/Certs/WeChatApp/apiclient_cert.p12"),// model.WeChatPayCertificateUrl,
CertPwd = WeChatPayMerchants//证书密码默认为您的商户ID
});
var xe = XElement.Parse(result, LoadOptions.SetLineInfo);
var returnCode = xe.GetElement("return_code").Value;
var resultCode = xe.GetElement("result_code").Value;
if (returnCode.Equals("SUCCESS") && resultCode.Equals("SUCCESS"))
{
return true;
}
return false;
}
/// <summary>
/// 获取随机字符串
/// </summary>
/// <returns></returns>
public static string GetNoncestr()
{
var random = new Random();
return SecurityHelper.MD5EncryptWeChat(random.Next(1000).ToString(CultureInfo.InvariantCulture), "GBK");
}
/// <summary>
/// 获取时间戳
/// </summary>
/// <returns></returns>
public static string GetTimestamp()
{
var ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString(CultureInfo.InvariantCulture);
}
/// <summary>
/// 对字符串进行URL编码
/// </summary>
/// <param name="instr"></param>
/// <param name="charset">默认值:utf-8</param>
/// <returns></returns>
public static string UrlEncode(string instr, string charset)
{
if (instr == null || instr.Trim() == "")
return "";
var res = HttpUtility.UrlEncode(instr, !string.IsNullOrWhiteSpace(charset)
? Encoding.GetEncoding(charset)
: Encoding.GetEncoding("utf-8"));
return res;
}
}
}
using Edu.Common.Pay.WeChatPat.Model;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Formatters;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
namespace Edu.Common.Pay.WeChatPat
{
/// <summary>
///
/// </summary>
public class HttpHelper
{
/// <summary>
/// 获取响应流
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
public static Stream RequestStream(HttpParam param)
{
#region 处理地址栏参数
var getParamSb = new StringBuilder();
if (param.GetParam != null)
{
if (param.GetParam is string)
{
getParamSb.Append(param.GetParam.ToString());
}
else
{
param.GetParam.GetType().GetProperties().ToList().ForEach(d =>
{
getParamSb.AppendFormat("{0}={1}&", d.Name, d.GetValue(param.GetParam, null));
});
}
}
if (!string.IsNullOrWhiteSpace(getParamSb.ToString().TrimEnd('&')))
{
param.Url = string.Format("{0}?{1}", param.Url, getParamSb.ToString().TrimEnd('&'));
}
#endregion
var r = WebRequest.Create(param.Url) as HttpWebRequest;
if (!string.IsNullOrWhiteSpace(param.CertPath) && !string.IsNullOrWhiteSpace(param.CertPwd))
{
ServicePointManager.ServerCertificateValidationCallback = CheckValidationResult;
var cer = new X509Certificate2(param.CertPath, param.CertPwd, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);
r.ClientCertificates.Add(cer);
#region 暂时不要的
//ServicePointManager.Expect100Continue = true;
//ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
//req.ProtocolVersion = HttpVersion.Version11;
//req.UserAgent = SUserAgent;
//req.KeepAlive = false;
//var cookieContainer = new CookieContainer();
//req.CookieContainer = cookieContainer;
//req.Timeout = 1000 * 60;
//req.Headers.Add("x-requested-with", "XMLHttpRequest");
#endregion
}
r.Timeout = param.TimeOut * 1000;
r.UserAgent = param.UserAgent;
r.Method = param.Method ?? "POST";
r.Referer = param.Referer;
r.CookieContainer = param.CookieContainer;
r.ContentType = param.ContentType;
if (param.PostParam != null)
{
var postParamString = "";
if (param.PostParam is string)
{
postParamString = param.PostParam.ToString();
}
else if (param.ParamType == HttpParamType.Form)
{
var dicParam = Common.Plugin.JsonHelper.DeserializeObject< Dictionary<string, string>>(Common.Plugin.JsonHelper.Serialize(param.PostParam));
postParamString = dicParam.Aggregate(postParamString, (current, dic) => current + (dic.Key + "=" + dic.Value + "&")).TrimEnd('&');
}
else
{
postParamString = Common.Plugin.JsonHelper.Serialize(param.PostParam);
}
var bs = param.Encoding.GetBytes(postParamString);
r.ContentLength = bs.Length;
using var rs = r.GetRequestStream();
rs.Write(bs, 0, bs.Length);
}
return r.GetResponse().GetResponseStream();
}
/// <summary>
/// 获取请求参数
/// </summary>
/// <param name="param"></param>
public static string RequestString(HttpParam param)
{
var result = "";
using (var reader = new StreamReader(RequestStream(param), param.Encoding))
{
result = reader.ReadToEnd();
}
return result;
}
#region Get请求
/// <summary>
///
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
public static string Get(HttpParam param)
{
param.Method = "GET";
return RequestString(param);
}
/// <summary>
/// 获取请求参数
/// </summary>
/// <typeparam name="T">泛型约束</typeparam>
/// <param name="url">地址</param>
/// <param name="getParam">参数</param>
/// <returns></returns>
public static T Get<T>(string url, object getParam)
{
var param = new HttpParam
{
Url = url,
Method = "GET",
GetParam = getParam
};
var str = Get(param);
return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(str);
}
#endregion
#region Post 请求
/// <summary>
///
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
public static string Post(HttpParam param)
{
param.Method = "POST";
var str = RequestString(param);
return str;
}
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true;
}
#endregion
public static Encoding GetRequestEncoding(HttpRequest request)
{
var requestContentType = request.ContentType;
var requestMediaType = requestContentType == null ? default : new MediaType(requestContentType);
var requestEncoding = requestMediaType.Encoding;
if (requestEncoding == null)
{
requestEncoding = Encoding.UTF8;
}
return requestEncoding;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Edu.Common.Pay.WeChatPat.Model
{
/// <summary>
/// 微信接口列表。
/// </summary>
public static class ApiList
{
#region 公众号接口
/// <summary>
/// 发送客服消息
/// </summary>
public static string MessageCustomSendUrl = "https://api.weixin.qq.com/cgi-bin/message/custom/send";
/// <summary>
/// 发送模板消息
/// </summary>
public static string MessageTemplateSendUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send";
/// <summary>
/// 获取access_token的接口地址
/// </summary>
public static string GetTokenUrl = "https://api.weixin.qq.com/cgi-bin/token";
/// <summary>
/// 获取jsapi_ticket的接口地址
/// </summary>
public static string GetticketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";
/// <summary>
///
/// </summary>
public static string MenuCreateUrl = "https://api.weixin.qq.com/cgi-bin/menu/create";
/// <summary>
/// 查询菜单接口地址
/// </summary>
public static string MenuGetUrl = "https://api.weixin.qq.com/cgi-bin/menu/get";
/// <summary>
/// 删除菜单接口地址
/// </summary>
public static string MenuDeleteUrl = "https://api.weixin.qq.com/cgi-bin/menu/delete";
/// <summary>
///
/// </summary>
public static string MediaUploadUrl = "http://file.api.weixin.qq.com/cgi-bin/media/upload";
/// <summary>
///
/// </summary>
public static string MediaGet = "http://file.api.weixin.qq.com/cgi-bin/media/get";
/// <summary>
/// 网页授权获取用户信息
/// </summary>
public static string SnsUserInfo = "https://api.weixin.qq.com/sns/userinfo";
/// <summary>
/// 获取用户信息
/// </summary>
public static string GetUserInfo = "https://api.weixin.qq.com/cgi-bin/user/info";
/// <summary>
/// 需要 access_token
/// </summary>
public static string QrcodeCreateUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create";
/// <summary>
///
/// </summary>
public static string ShowQrcodeUrl = "https://mp.weixin.qq.com/cgi-bin/showqrcode";
/// <summary>
///
/// </summary>
public static string DownloadBillUrl = "https://api.mch.weixin.qq.com/pay/downloadbill";
/// <summary>
///
/// </summary>
public static string UnifiedOrderUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";
/// <summary>
///
/// </summary>
public static string GetOauth2AccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token";
/// <summary>
/// 获取永久素材的列表。地址栏需要access_token参数。
/// </summary>
public static string BatchgetMaterial = "https://api.weixin.qq.com/cgi-bin/material/batchget_material";
#endregion
#region 开放平台接口
/// <summary>
/// 该API用于获取第三方平台令牌(component_access_token)
/// </summary>
public static string ApiComponentToken = "https://api.weixin.qq.com/cgi-bin/component/api_component_token";
/// <summary>
/// 该API用于获取预授权码。预授权码用于公众号授权时的第三方平台方安全验证。地址栏需要component_access_token参数。
/// </summary>
public static string ApiCreatePreauthcode = "https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode";
/// <summary>
/// 使用授权码换取公众号的接口调用凭据和授权信息。地址栏需要component_access_token参数。
/// </summary>
public static string ApiQueryAuth = "https://api.weixin.qq.com/cgi-bin/component/api_query_auth";
/// <summary>
/// 获取(刷新)授权公众号的接口调用凭据(令牌)。地址栏需要component_access_token参数。
/// </summary>
public static string ApiAuthorizerToken = "https://api.weixin.qq.com/cgi-bin/component/api_authorizer_token";
/// <summary>
/// 获取授权方的公众号帐号基本信息。该API用于获取授权方的公众号基本信息,包括头像、昵称、帐号类型、认证类型、微信号、原始ID和二维码图片URL。地址栏需要component_access_token参数。
/// </summary>
public static string ApiGetAuthorizerInfo = "https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info";
#endregion
}
}
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
namespace Edu.Common.Pay.WeChatPat.Model
{
/// <summary>
///
/// </summary>
//[Serializable]
[DataContract]
//[CollectionDataContractAttribute]
public class BaseResult : DynamicObject
{
/// <summary>
/// 构造函数
/// </summary>
public BaseResult()
{
this.IsSuccess = true;
this.Data = null;
this.Message = null;
}
/// <summary>
/// 构造函数
/// </summary>
/// <Param name="isSuccess"></Param>
public BaseResult(bool isSuccess)
{
this.IsSuccess = isSuccess;
this.Data = null;
this.Message = null;
}
/// <summary>
/// 构造函数
/// </summary>
/// <Param name="isSuccess"></Param>
/// <Param name="data"></Param>
public BaseResult(bool isSuccess, object data)
{
this.IsSuccess = isSuccess;
this.Data = data;
this.Message = null;
}
/// <summary>
/// 构造函数
/// </summary>
/// <Param name="isSuccess"></Param>
/// <Param name="data"></Param>
/// <Param name="message"></Param>
public BaseResult(bool isSuccess, object data, string message)
{
this.IsSuccess = isSuccess;
this.Data = data;
this.Message = message;
}
/// <summary>
/// 构造函数
/// </summary>
/// <Param name="isSuccess"></Param>
/// <Param name="data"></Param>
/// <Param name="message"></Param>
/// <Param name="dataCount"></Param>
public BaseResult(bool isSuccess, object data, string message, int dataCount)
{
this.IsSuccess = isSuccess;
this.Data = data;
this.Message = message;
this.DataCount = dataCount;
}
/// <summary>
/// 是否成功
/// </summary>
[DataMember]
public bool IsSuccess { get; set; }
/// <summary>
/// 错误信息
/// </summary>
[DataMember]
public string Message { get; set; }
/// <summary>
/// 返回数据
/// </summary>
[DataMember]
public object Data { get; set; }
/// <summary>
/// 数量数量
/// </summary>
[DataMember]
public int? DataCount { get; set; }
/// <summary>
/// 属性字典
/// </summary>
public Dictionary<string, object> Properties = new Dictionary<string, object>();
/// <summary>
/// 设置属性
/// </summary>
/// <param name="binder"></param>
/// <param name="value"></param>
/// <returns></returns>
public override bool TrySetMember(SetMemberBinder binder, object value)
{
if (!Properties.Keys.Contains(binder.Name))
{
Properties.Add(binder.Name, value.ToString());
}
return true;
}
/// <summary>
/// 获取属性
/// </summary>
/// <param name="binder"></param>
/// <param name="result"></param>
/// <returns></returns>
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
return Properties.TryGetValue(binder.Name, out result);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Edu.Common.Pay.WeChatPat.Model
{
/// <summary>
///
/// </summary>
public class HttpParam
{
/// <summary>
/// GET/POST
/// </summary>
public string Method { get; set; }
/// <summary>
///
/// </summary>
public string Url { get; set; }
/// <summary>
/// 参数类型。可选:Json、Form。默认Json。传入Form则会将new { Key1 = Value1, Key2 = Value2}转换成"key1=value1&key2=value2"形式。
/// </summary>
public HttpParamType ParamType { get; set; }
/// <summary>
/// Post参数。
/// <para>可以传入Json对像:new { Key1 = Value1, Key2 = Value2}</para>
/// <para>可以传入Json字符串:{"Key1":"Value1","Key2":"Value2"}</para>
/// <para>可以传入key/value字符串:"key1=value1&key2=value2"</para>
/// <para>可以传入xml字符串等等</para>
/// </summary>
public object PostParam { get; set; }
/// <summary>
/// Get参数
/// <para>可以传入Json对像:new { Key1 = Value1, Key2 = Value2}</para>
/// <para>可以传入Json字符串:{"Key1":"Value1","Key2":"Value2"}</para>
/// </summary>
public object GetParam { get; set; }
private int _timeOut = 10;
/// <summary>
/// 请求超时时间。单位:秒。默认值5秒。
/// </summary>
public int TimeOut
{
get { return _timeOut; }
set { _timeOut = value; }
}
private Encoding _encoding = Encoding.UTF8;
/// <summary>
///
/// </summary>
public Encoding Encoding
{
get { return _encoding; }
set { _encoding = value; }
}
/// <summary>
///
/// </summary>
public System.Net.CookieContainer CookieContainer { get; set; }
/// <summary>
///
/// </summary>
public string Referer { get; set; }
/// <summary>
///
/// </summary>
public string CertPath { get; set; }
/// <summary>
///
/// </summary>
public string CertPwd { get; set; }
private string _contentType = "application/x-www-form-urlencoded";
/// <summary>
///
/// </summary>
public string ContentType
{
get { return _contentType; }
set { _contentType = value; }
}
private string _userAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Maxthon/4.1.2.4000 Chrome/26.0.1410.43 Safari/537.1";
/// <summary>
///
/// </summary>
public string UserAgent
{
get { return _userAgent; }
set { _userAgent = value; }
}
/// <summary>
///
/// </summary>
// public System.Web.HttpPostedFileBase PostedFile { get; set; }
}
/// <summary>
/// Http请求参数类型枚举
/// </summary>
public enum HttpParamType
{
/// <summary>
/// json数据。默认值。
/// </summary>
Json,
/// <summary>
/// 形如:key=value&key=value&key=value
/// </summary>
Form
}
}
using System;
namespace Edu.Common.Pay.WeChatPat.Model
{
/// <summary>
///
/// </summary>
//[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter, AllowMultiple = false)]
public sealed class JsonProp : Attribute
{
/// <summary>
/// Gets or sets the name of the property.
/// </summary>
/// <value>The name of the property.</value>
public string PropertyName { get; set; }
/// <summary>
/// Initializes a new instance of the <see cref="JsonProp"/> class.
/// </summary>
public JsonProp()
{
}
/// <summary>
/// Initializes a new instance of the <see cref="JsonProp"/> class with the specified name.
/// </summary>
/// <param name="propertyName">Name of the property.</param>
public JsonProp(string propertyName)
{
PropertyName = propertyName;
}
}
}
\ No newline at end of file
using Mall.WeChat.Common;
namespace Edu.Common.Pay.WeChatPat.Model
{
/// <summary>
/// Token结果实体类
/// </summary>
public class TokenResult : WeChatResult
{
/// <summary>
/// 获取到的凭证
/// </summary>
public string access_token { get; set; }
/// <summary>
/// 凭证有效时间,单位:秒
/// </summary>
public int expires_in { get; set; }
}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Edu.Common.Pay.WeChatPat.Model
{
/// <summary>
///
/// </summary>
public class UserInfoResult
{
/// <summary>
/// 用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。
/// </summary>
[JsonProp(PropertyName = "subscribe")]
public string Subscribe { get; set; }
/// <summary>
/// 用户的标识,对当前公众号唯一
/// </summary>
[JsonProp(PropertyName = "openid")]
public string OpenId { get; set; }
/// <summary>
/// 用户的昵称
/// </summary>
[JsonProp(PropertyName = "nickname")]
public string NickName { get; set; }
/// <summary>
/// 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
/// </summary>
[JsonProp(PropertyName = "sex")]
public string Sex { get; set; }
/// <summary>
/// 用户所在城市
/// </summary>
[JsonProp(PropertyName = "city")]
public string City { get; set; }
/// <summary>
/// 用户所在国家
/// </summary>
[JsonProp(PropertyName = "country")]
public string Country { get; set; }
/// <summary>
/// 用户所在省份
/// </summary>
[JsonProp(PropertyName = "province")]
public string Province { get; set; }
/// <summary>
/// 用户的语言,简体中文为zh_CN
/// </summary>
[JsonProp(PropertyName = "language")]
public string Language { get; set; }
/// <summary>
/// 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。
/// </summary>
[JsonProp(PropertyName = "headimgurl")]
public string HeadImgUrl { get; set; }
/// <summary>
///用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间
/// </summary>
[JsonProp(PropertyName = "subscribe_time")]
public string SubscribeTime { get; set; }
/// <summary>
///只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。
/// </summary>
[JsonProp(PropertyName = "unionid")]
public string UnionId { get; set; }
/// <summary>
///错误时微信会返回错误码等信息
/// </summary>
[JsonProp(PropertyName = "errcode")]
public string Errcode { get; set; }
/// <summary>
///错误时微信会返回错误码等信息
/// </summary>
[JsonProp(PropertyName = "errmsg")]
public string ErrMsg { get; set; }
}
}

using Edu.Common.Pay.WeChatPat.Model;
namespace Mall.WeChat.Common
{
/// <summary>
/// 微信结果码
/// </summary>
public class WeChatResult
{
/// <summary>
///
/// </summary>
public WeChatResult()
{
}
/// <summary>
/// ErrCode传入0表示成功
/// </summary>
public WeChatResult(int errCode)
{
_errCode = errCode;
}
/// <summary>
/// ErrCode传入0表示成功
/// </summary>
public WeChatResult(int errCode, string errMsg)
{
_errMsg = errMsg;
_errCode = errCode;
}
/// <summary>
///
/// </summary>
private int _errCode;
/// <summary>
/// 结果码
/// </summary>
[JsonProp(PropertyName = "errcode")]
public int ErrCode
{
get { return _errCode; }
set { _errCode = value; }
}
/// <summary>
///
/// </summary>
private string _errMsg;
/// <summary>
/// 结果文本说明
/// </summary>
[JsonProp(PropertyName = "errmsg")]
public string ErrMsg
{
get { return _errMsg; }
set
{
switch (ErrCode)
{
case -1:
_errMsg = ErrCode + "系统繁忙,请稍候再试_" + value;
break;
case 61003:
_errMsg = ErrCode + "该公众号已取消授权_" + value;
break;
default:
if (ErrCode == 0)
_errMsg = value;
else
_errMsg = ErrCode + value;
break;
}
}
}
private bool? _isSuccess;
/// <summary>
/// 是否成功
/// </summary>
public bool IsSuccess
{
get
{
if (_isSuccess == null)
{
return ErrCode == 0;
}
return _isSuccess.Value;
}
set { _isSuccess = value; }
}
}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Edu.Common.Pay.WeChatPat
{
/// <summary>
/// 支付参数实体
/// </summary>
public class PayParam : WeChatParam
{
/// <summary>
/// 订单号
/// </summary>
public string OrderNumber { get; set; }
/// <summary>
/// 退款订单号
/// </summary>
public string RefundNumber { get; set; }
/// <summary>
/// 金额(分)
/// </summary>
public int? TotalFee { get; set; }
/// <summary>
/// 退款金额
/// </summary>
public int? RefundFee { get; set; }
/// <summary>
/// 过期时间,格式(20141010121314)
/// </summary>
public string TimeExpire { get; set; }
/// <summary>
/// 商品名称
/// </summary>
public string ProductName { get; set; }
/// <summary>
/// 支付成功回调地址
/// </summary>
public string NotifyUrl { get; set; }
/// <summary>
/// 支付方式
/// </summary>
public TradeType? TradeType { get; set; }
/// <summary>
/// 是否充值订单
/// </summary>
public bool IsRecharge { get; set; }
/// <summary>
/// 小程序id
/// </summary>
public int MallBaseId { get; set; }
/// <summary>
/// 商户ID
/// </summary>
public int TenantId { get; set; }
}
/// <summary>
/// 支付方式
/// </summary>
public enum TradeType
{
/// <summary>
/// JSAPI
/// </summary>
JSAPI,
/// <summary>
/// NATIVE
/// </summary>
NATIVE,
/// <summary>
/// APP
/// </summary>
APP
}
}

using Microsoft.AspNetCore.Http;
using System;
using System.Collections;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
namespace Edu.Common.Pay.WeChatPat
{
/// <summary>
/// 微信请求处理类
/// </summary>
public class RequestHandler
{
/// <summary>
/// 请求的参数
/// </summary>
protected Hashtable Parameters;
/// <summary>
/// 密钥
/// </summary>
private string _key;
/// <summary>
/// debug信息
/// </summary>
private readonly string _debugInfo;
/// <summary>
/// 构造函数
/// </summary>
public RequestHandler()
{
this._debugInfo = "";
Parameters = new Hashtable();
}
/// <summary>
/// 初始化函数
/// </summary>
public virtual void Init()
{
}
/// <summary>
/// 获取debug信息
/// </summary>
/// <returns></returns>
public String GetDebugInfo()
{
return _debugInfo;
}
/// <summary>
/// 获取密钥
/// </summary>
/// <returns></returns>
public string GetKey()
{
return _key;
}
/// <summary>
/// 设置密钥
/// </summary>
/// <param name="key"></param>
public void SetKey(string key)
{
this._key = key;
}
/// <summary>
/// 设置参数值
/// </summary>
/// <param name="parameter"></param>
/// <param name="parameterValue"></param>
public void SetParameter(string parameter, string parameterValue)
{
if (!string.IsNullOrEmpty(parameter))
{
if (Parameters.Contains(parameter))
{
Parameters.Remove(parameter);
}
Parameters.Add(parameter, parameterValue);
}
}
///// <summary>
///// 获取package带参数的签名包
///// </summary>
///// <returns></returns>
//public string GetRequestURL()
//{
// this.CreateMd5Sign();
// var sb = new StringBuilder();
// var akeys = new ArrayList(Parameters.Keys);
// akeys.Sort();
// foreach (string k in akeys)
// {
// var v = (string)Parameters[k];
// if (null != v && String.Compare("key", k, StringComparison.Ordinal) != 0)
// {
// sb.Append(k + "=" + UrlEncode(v, GetCharset()) + "&");
// }
// }
// //去掉最后一个&
// if (sb.Length > 0)
// {
// sb.Remove(sb.Length - 1, 1);
// }
// return sb.ToString();
//}
/// <summary>
/// 对字符串进行URL编码
/// </summary>
/// <param name="instr"></param>
/// <param name="charset">默认值:utf-8</param>
/// <returns></returns>
public static string UrlEncode(string instr, string charset)
{
if (instr == null || instr.Trim() == "")
return "";
var res = HttpUtility.UrlEncode(instr, !string.IsNullOrWhiteSpace(charset)
? Encoding.GetEncoding(charset)
: Encoding.GetEncoding("utf-8"));
return res;
}
/// <summary>
/// 创建package签名,按参数名称a-z排序,遇到空值的参数不参加签名。
/// </summary>
/// <returns></returns>
public string CreateMd5Sign()
{
var sb = new StringBuilder();
var akeys = new ArrayList(Parameters.Keys);
akeys.Sort();
foreach (string k in akeys)
{
var v = (string)Parameters[k];
if (null != v && String.Compare("", v, StringComparison.Ordinal) != 0
&& String.Compare("sign", k, StringComparison.Ordinal) != 0 && String.Compare("key", k, StringComparison.Ordinal) != 0)
{
sb.Append(k + "=" + v + "&");
}
}
sb.Append("key=" + GetKey());
var sign = Plugin.SecurityHelper.MD5EncryptWeChat(sb.ToString(), GetCharset()).ToUpper();
return sign;
}
/// <summary>
/// 创建package签名,按参数名称a-z排序,遇到空值的参数不参加签名。
/// </summary>
/// <returns></returns>
public string CreateMd5Sign(IHttpContextAccessor accessor, string WeChatApiSecret)
{
var sb = new StringBuilder();
var akeys = new ArrayList(Parameters.Keys);
akeys.Sort();
foreach (string k in akeys)
{
var v = (string)Parameters[k];
if (null != v && String.Compare("", v, StringComparison.Ordinal) != 0
&& String.Compare("sign", k, StringComparison.Ordinal) != 0 && String.Compare("key", k, StringComparison.Ordinal) != 0)
{
sb.Append(k + "=" + v + "&");
}
}
// sb.Append("key=" + GetKey());
sb.Append("key=" + WeChatApiSecret);
var sign = Plugin.SecurityHelper.MD5EncryptWeChat(sb.ToString(), GetCharset(accessor)).ToUpper();
return sign;
}
/// <summary>
/// 创建package签名,按参数名称a-z排序,遇到空值的参数不参加签名。
/// </summary>
/// <returns></returns>
public string CreateMd5Sign_V2( string WeChatApiSecret)
{
var sb = new StringBuilder();
var akeys = new ArrayList(Parameters.Keys);
akeys.Sort();
foreach (string k in akeys)
{
var v = (string)Parameters[k];
if (null != v && String.Compare("", v, StringComparison.Ordinal) != 0
&& String.Compare("sign", k, StringComparison.Ordinal) != 0 && String.Compare("key", k, StringComparison.Ordinal) != 0)
{
sb.Append(k + "=" + v + "&");
}
}
// sb.Append("key=" + GetKey());
sb.Append("key=" + WeChatApiSecret);
var sign = Plugin.SecurityHelper.MD5EncryptWeChat(sb.ToString(), GetCharset_V2()).ToUpper();
return sign;
}
/// <summary>
/// 创建sha1签名
/// </summary>
/// <returns></returns>
public string CreateSHA1Sign()
{
var sb = new StringBuilder();
var akeys = new ArrayList(Parameters.Keys);
akeys.Sort();
foreach (string k in akeys)
{
var v = (string)Parameters[k];
if (null != v && String.Compare("", v, StringComparison.Ordinal) != 0
&& String.Compare("sign", k, StringComparison.Ordinal) != 0 && String.Compare("key", k, StringComparison.Ordinal) != 0)
{
if (sb.Length == 0)
{
sb.Append(k + "=" + v);
}
else
{
sb.Append("&" + k + "=" + v);
}
}
}
var paySign = Sha1Util.GetSha1(sb.ToString()).ToLower();
return paySign;
}
/// <summary>
/// 输出XML
/// </summary>
/// <returns></returns>
public string ParseXml()
{
var sb = new StringBuilder();
sb.Append("<xml>");
foreach (string k in Parameters.Keys)
{
var v = (string)Parameters[k];
if (Regex.IsMatch(v, @"^[0-9.]$"))
{
sb.Append("<" + k + ">" + v + "</" + k + ">");
}
else
{
sb.Append("<" + k + "><![CDATA[" + v + "]]></" + k + ">");
}
}
sb.Append("</xml>");
return sb.ToString();
}
/// <summary>
/// 输出XML
/// </summary>
/// <returns></returns>
public string ParseXmlNoCdata()
{
var sb = new StringBuilder();
sb.Append("<xml>");
foreach (string k in Parameters.Keys)
{
var v = (string)Parameters[k];
sb.Append("<" + k + ">" + v + "</" + k + ">");
}
sb.Append("</xml>");
return sb.ToString();
}
/// <summary>
/// 输出JSON
/// </summary>
/// <returns></returns>
public string ParseJson()
{
var sb = new StringBuilder();
sb.Append("{");
foreach (string k in Parameters.Keys)
{
var v = (string)Parameters[k];
sb.Append("\"" + k + "\":\"" + v + "\",");
}
var str = sb.ToString().TrimEnd(',');
str += "}";
return str;
}
/// <summary>
/// 获取所有参数
/// </summary>
/// <returns></returns>
public Hashtable GetAllParameters()
{
return this.Parameters;
}
/// <summary>
/// 获取编号
/// </summary>
/// <returns></returns>
protected virtual string GetCharset(IHttpContextAccessor accessor)
{
//return "UTF-8";
try
{
return HttpHelper.GetRequestEncoding(accessor.HttpContext.Request).BodyName; // HttpContext.Current.Request.ContentEncoding.BodyName;
}
catch (Exception)
{
return "UTF-8";
}
}
/// <summary>
/// 获取编号
/// </summary>
/// <returns></returns>
protected virtual string GetCharset_V2()
{
try
{
return "UTF-8";
//return HttpHelper.GetRequestEncoding(accessor.HttpContext.Request).BodyName; // HttpContext.Current.Request.ContentEncoding.BodyName;
}
catch (Exception)
{
return "UTF-8";
}
}
/// <summary>
/// 获取编号
/// </summary>
/// <returns></returns>
protected virtual string GetCharset()
{
return "UTF-8";
//try
//{
// return HttpHelper.GetRequestEncoding(accessor.HttpContext.Request).BodyName; // HttpContext.Current.Request.ContentEncoding.BodyName;
//}
//catch (Exception)
//{
// return "UTF-8";
//}
}
}
}
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Xml;
namespace Edu.Common.Pay.WeChatPat
{
/// <summary>
/// 微信支付响应类
/// </summary>
public class ResponseHandler
{
/// <summary>
/// 密钥
/// </summary>
private string _key;
/// <summary>
/// 微信服务器编码方式
/// </summary>
private const string Charset = "utf-8";
public Hashtable XmlMap { get; }
/// <summary>
/// 获取页面提交的参数
/// </summary>
/// <param name="_accessor"></param>
public ResponseHandler(IHttpContextAccessor _accessor)
{
XmlMap = new Hashtable();
#region
//注意:如果用以下读取流的方法,.net core 3.0 以后一定要加下边那段
//.net core 3.0以后需加下边这段,否则Stream会报错
var syncIOFeature = _accessor.HttpContext.Features.Get<IHttpBodyControlFeature>();
if (syncIOFeature != null)
{
syncIOFeature.AllowSynchronousIO = true;
}
#endregion
//接收从微信后台POST过来的数据
System.IO.Stream s = _accessor.HttpContext.Request.Body;
byte[] buffer = new byte[1024];
StringBuilder builder = new StringBuilder();
int count;
while ((count = s.Read(buffer, 0, 1024)) > 0)
{
builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
}
s.Flush();
s.Close();
s.Dispose();
Plugin.LogHelper.WriteInfo($"GetNotifyData Receive data from WeChat :{builder.ToString()}");
//转换数据格式并验证签名
// WxPayData data = new WxPayData();
try
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(builder.ToString());
XmlNode xmlNode = xmlDoc.FirstChild;//获取到根节点<xml>
XmlNodeList nodes = xmlNode.ChildNodes;
foreach (XmlNode xn in nodes)
{
XmlMap.Add(xn.Name, xn.InnerText);
}
}
catch (Exception ex)
{
//若签名错误,则立即返回结果给微信支付后台
Common.Plugin.LogHelper.Write(ex, "ResponseHandler");
}
Plugin.LogHelper.WriteInfo($"GetNotifyData Check sign success");
}
/// <summary>
/// 初始化加载
/// </summary>
public virtual void Init()
{
}
/// <summary>
/// 获取密钥
/// </summary>
/// <returns></returns>
public string GetKey()
{
return _key;
}
/// <summary>
/// 设置密钥
/// </summary>
/// <param name="key"></param>
public void SetKey(string key)
{
this._key = key;
}
/// <summary>
/// 获取参数值
/// </summary>
/// <param name="parameter"></param>
/// <returns></returns>
public string GetParameter(string parameter)
{
var s = (string)XmlMap[parameter];
return s ?? "";
}
/// <summary>
/// 判断微信签名
/// </summary>
/// <returns></returns>
public virtual bool IsWXsign(out string error)
{
var sb = new StringBuilder();
var signMap = new Hashtable();
foreach (string k in XmlMap.Keys)
{
if (k != "sign")
{
signMap.Add(k.ToLower(), XmlMap[k]);
}
}
var akeys = new ArrayList(signMap.Keys);
akeys.Sort();
foreach (string k in akeys)
{
var v = (string)signMap[k];
sb.Append(k + "=" + v + "&");
}
sb.Append("key=" + this._key);
var sign = Plugin.SecurityHelper.MD5EncryptWeChat(sb.ToString(), Charset).ToUpper();
error = "sign = " + sign + "\r\n xmlMap[sign]=" + XmlMap["sign"].ToString();
return sign.Equals(XmlMap["sign"]);
}
///// <summary>
///// 获取编码方式
///// </summary>
///// <returns></returns>
//protected virtual string GetCharset()
//{
// //return "UTF-8";
// try
// {
// return HttpHelper.GetRequestEncoding(_accessor.HttpContext.Request).BodyName;
// }
// catch (Exception)
// {
// return "UTF-8";
// }
//}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace Edu.Common.Pay.WeChatPat
{
/// <summary>
/// 签名帮助类
/// </summary>
public class Sha1Util
{
/// <summary>
/// 获取sha1签名
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static String GetSha1(String str)
{
//建立SHA1对象
SHA1 sha = new SHA1CryptoServiceProvider();
//将mystr转换成byte[]
var enc = new ASCIIEncoding();
var dataToHash = enc.GetBytes(str);
//Hash运算
var dataHashed = sha.ComputeHash(dataToHash);
//将运算结果转换成string
var hash = BitConverter.ToString(dataHashed).Replace("-", "");
return hash;
}
}
}
using System;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
namespace Edu.Common.Pay.WeChatPat
{
/// <summary>
/// Token帮助类
/// </summary>
public class TokenHelper
{
/// <summary>
/// 获取token
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
public static string GetLXYToken(string token, string Appid, string Secret)
{
//向微信服务端 获取token
string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + Appid + "&secret=" + Secret;
string type = "utf-8";
Common.Plugin.GetUsersHelper GetUsersHelper = new Edu.Common.Plugin.GetUsersHelper();
string wenXinResult = string.Empty;
try
{
wenXinResult = GetUsersHelper.GetUrltoHtml(url, type);
JObject jo = (JObject)JsonConvert.DeserializeObject(wenXinResult);
token = jo["access_token"].ToString();
}
catch (Exception ex)
{
Plugin.LogHelper.Write(ex, string.Format("GetWx:wenXinResult:{0}", wenXinResult));
}
return token;
}
/// <summary>
/// 获取微信用户头像
/// </summary>
/// <param name="access_token"></param>
/// <param name="openid"></param>
/// <returns></returns>
public static string GetWeiXinUserPhoto(string access_token, string openid)
{
openid = openid.Replace("/t", "");
string url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + access_token + "&openid=" + openid + "&lang=zh_CN";
string type = "utf-8";
Edu.Common.Plugin.GetUsersHelper GetUsersHelper = new Edu.Common.Plugin.GetUsersHelper();
string wenXinResult = string.Empty;
string Photo = "";
try
{
wenXinResult = GetUsersHelper.GetUrltoHtml(url, type);
var jo = (JObject)JsonConvert.DeserializeObject(wenXinResult);
Photo = jo["headimgurl"].ToString();
}
catch (Exception ex)
{
Plugin.LogHelper.Write(ex, string.Format("GetWx:GetWeiXinUserPhoto:{0}", wenXinResult));
}
return Photo;
}
/// <summary>
/// 获取赞羊下级用户
/// </summary>
/// <param name="UserId"></param>
/// <returns></returns>
public static string GetZYUserInfo(int UserId,string cookie)
{
string url = "http://wx.weibaoge.cn/web/index.php?r=mall%2Fshare%2Fteam&status=1&id=" + UserId;
string wenXinResult = string.Empty;
string data = "";
try
{
wenXinResult = Edu.Common.Plugin.HttpHelper.HttpGet(url, System.Text.Encoding.UTF8, "", cookie);
var jo = (JObject)JsonConvert.DeserializeObject(wenXinResult);
if (jo["code"].ToString() == "0") {
data = jo["data"].ToString();
}
}
catch (Exception ex)
{
Plugin.LogHelper.Write(ex, string.Format("GetZYUserInfo:{0}", wenXinResult));
}
return data;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Edu.Common.Pay.WeChatPat
{
/// <summary>
/// 微信支付参数实体
/// </summary>
public class WeChatParam
{
/// <summary>
/// 微信接入方式
/// </summary>
public WeChatType WeChatType { get; set; }
#region 常用
/// <summary>
/// 微信OpenId
/// </summary>
public string OpenId { get; set; }
/// <summary>
/// UUID
/// </summary>
public string Unionid { get; set; }
/// <summary>
/// Token
/// </summary>
public string AccessToken { get; set; }
/// <summary>
///
/// </summary>
public string WeChatPublic { get; set; }
/// <summary>
///
/// </summary>
public bool Debug { get; set; }
/// <summary>
///
/// </summary>
public string Url { get; set; }
/// <summary>
///
/// </summary>
public string Content { get; set; }
/// <summary>
///
/// </summary>
public string Code { get; set; }
#endregion
}
/// <summary>
/// 微信接入方式
/// </summary>
public enum WeChatType
{
/// <summary>
/// 公众号
/// </summary>
Public = 1,
/// <summary>
/// 开放平台
/// </summary>
Open = 2
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
namespace Mall.WeChat.Helper
{
/// <summary>
///
/// </summary>
public static class XLinqHelper
{
/// <summary>
///
/// </summary>
public static IEnumerable<XElement> AllElements(this XElement element, string name)
{
List<XElement> list = new List<XElement>();
if (element != null)
{
list.AddRange(element.Nodes().Where(node => node.NodeType == XmlNodeType.Element).Select(node => (XElement)node).Where(item => item.Name.LocalName == name));
}
return list;
}
/// <summary>
///
/// </summary>
public static IEnumerable<XElement> AllElements(this IEnumerable<XElement> elements, string name)
{
var list = new List<XElement>();
foreach (XElement element in elements)
{
list.AddRange(element.AllElements(name));
}
return list;
}
/// <summary>
///
/// </summary>
public static XAttribute AnyAttribute(this XElement element, string name)
{
return element != null ? element.Attributes().FirstOrDefault(attribute => attribute.Name.LocalName == name) : null;
}
/// <summary>
///
/// </summary>
public static XElement AnyElement(this IEnumerable<XElement> elements, string name)
{
return elements.FirstOrDefault(element => element.Name.LocalName == name);
}
/// <summary>
///
/// </summary>
public static XElement AnyElement(this XElement element, string name)
{
return element != null ? (from node in element.Nodes() where node.NodeType == XmlNodeType.Element select (XElement)node).FirstOrDefault(element2 => element2.Name.LocalName == name) : null;
}
/// <summary>
///
/// </summary>
public static void AssertElementHasValue(this XElement element, string name)
{
if (element == null)
{
throw new ArgumentNullException("element");
}
if (name == null)
{
throw new ArgumentNullException("name");
}
var element2 = element.AnyElement(name);
if ((element2 == null) || string.IsNullOrEmpty(element2.Value))
{
throw new ArgumentNullException(name, string.Format("{0} is required", name));
}
}
/// <summary>
///
/// </summary>
public static XElement FirstElement(this XElement element)
{
if (element.FirstNode.NodeType == XmlNodeType.Element)
{
return (XElement)element.FirstNode;
}
return null;
}
/// <summary>
///
/// </summary>
public static bool GetBool(this XElement el, string name)
{
el.AssertElementHasValue(name);
return (bool)el.GetElement(name);
}
/// <summary>
///
/// </summary>
public static bool GetBoolOrDefault(this XElement el, string name)
{
return el.GetElementValueOrDefault<bool>(name, x => ((bool)x));
}
/// <summary>
///
/// </summary>
public static DateTime GetDateTime(this XElement el, string name)
{
el.AssertElementHasValue(name);
return (DateTime)el.GetElement(name);
}
/// <summary>
///
/// </summary>
public static DateTime GetDateTimeOrDefault(this XElement el, string name)
{
return el.GetElementValueOrDefault<DateTime>(name, x => ((DateTime)x));
}
/// <summary>
///
/// </summary>
public static decimal GetDecimal(this XElement el, string name)
{
el.AssertElementHasValue(name);
return (decimal)el.GetElement(name);
}
/// <summary>
///
/// </summary>
public static decimal GetDecimalOrDefault(this XElement el, string name)
{
return el.GetElementValueOrDefault<decimal>(name, x => ((decimal)x));
}
/// <summary>
///
/// </summary>
public static XElement GetElement(this XElement element, string name)
{
if (element == null)
{
throw new ArgumentNullException("element");
}
if (name == null)
{
throw new ArgumentNullException("name");
}
return element.AnyElement(name);
}
/// <summary>
///
/// </summary>
public static T GetElementValueOrDefault<T>(this XElement element, string name, Func<XElement, T> converter)
{
if (converter == null)
{
throw new ArgumentNullException("converter");
}
var element2 = element.GetElement(name);
if ((element2 != null) && !string.IsNullOrEmpty(element2.Value))
{
return converter(element2);
}
return default(T);
}
/// <summary>
///
/// </summary>
public static Guid GetGuid(this XElement el, string name)
{
el.AssertElementHasValue(name);
return (Guid)el.GetElement(name);
}
/// <summary>
///
/// </summary>
public static Guid GetGuidOrDefault(this XElement el, string name)
{
return el.GetElementValueOrDefault<Guid>(name, x => ((Guid)x));
}
/// <summary>
///
/// </summary>
public static int GetInt(this XElement el, string name)
{
el.AssertElementHasValue(name);
return (int)el.GetElement(name);
}
/// <summary>
///
/// </summary>
public static int GetIntOrDefault(this XElement el, string name)
{
return el.GetElementValueOrDefault<int>(name, x => ((int)x));
}
/// <summary>
///
/// </summary>
public static long GetLong(this XElement el, string name)
{
el.AssertElementHasValue(name);
return (long)el.GetElement(name);
}
/// <summary>
///
/// </summary>
public static long GetLongOrDefault(this XElement el, string name)
{
return el.GetElementValueOrDefault<long>(name, x => ((long)x));
}
/// <summary>
///
/// </summary>
public static bool? GetNullableBool(this XElement el, string name)
{
var element = el.GetElement(name);
if ((element != null) && !string.IsNullOrEmpty(element.Value))
{
return (bool?)element;
}
return null;
}
/// <summary>
///
/// </summary>
public static DateTime? GetNullableDateTime(this XElement el, string name)
{
var element = el.GetElement(name);
if ((element != null) && !string.IsNullOrEmpty(element.Value))
{
return (DateTime?)element;
}
return null;
}
/// <summary>
///
/// </summary>
public static decimal? GetNullableDecimal(this XElement el, string name)
{
var element = el.GetElement(name);
if ((element != null) && !string.IsNullOrEmpty(element.Value))
{
return (decimal?)element;
}
return null;
}
/// <summary>
///
/// </summary>
public static Guid? GetNullableGuid(this XElement el, string name)
{
var element = el.GetElement(name);
if ((element != null) && !string.IsNullOrEmpty(element.Value))
{
return (Guid?)element;
}
return null;
}
/// <summary>
///
/// </summary>
public static int? GetNullableInt(this XElement el, string name)
{
var element = el.GetElement(name);
if ((element != null) && !string.IsNullOrEmpty(element.Value))
{
return (int?)element;
}
return null;
}
/// <summary>
///
/// </summary>
public static long? GetNullableLong(this XElement el, string name)
{
var element = el.GetElement(name);
if ((element != null) && !string.IsNullOrEmpty(element.Value))
{
return (long?)element;
}
return null;
}
/// <summary>
///
/// </summary>
public static TimeSpan? GetNullableTimeSpan(this XElement el, string name)
{
var element = el.GetElement(name);
if ((element != null) && !string.IsNullOrEmpty(element.Value))
{
return (TimeSpan?)element;
}
return null;
}
/// <summary>
///
/// </summary>
public static string GetString(this XElement el, string name)
{
if (el == null)
{
return null;
}
return el.GetElementValueOrDefault<string>(name, x => x.Value);
}
/// <summary>
///
/// </summary>
public static TimeSpan GetTimeSpan(this XElement el, string name)
{
el.AssertElementHasValue(name);
return (TimeSpan)el.GetElement(name);
}
/// <summary>
///
/// </summary>
public static TimeSpan GetTimeSpanOrDefault(this XElement el, string name)
{
return el.GetElementValueOrDefault<TimeSpan>(name, x => ((TimeSpan)x));
}
/// <summary>
///
/// </summary>
public static List<string> GetValues(this IEnumerable<XElement> els)
{
return els.Select(element => element.Value).ToList();
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment