Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
E
Education
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
黄奎
Education
Commits
65780320
Commit
65780320
authored
Sep 24, 2020
by
罗超
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
删除问题文件
parent
f13e0519
Show whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
0 additions
and
2024 deletions
+0
-2024
PayUtil.cs
Edu.Common/Pay/PayUtil.cs
+0
-105
HttpHelper.cs
Edu.Common/Pay/WeChatPat/HttpHelper.cs
+0
-178
ApiList.cs
Edu.Common/Pay/WeChatPat/Model/ApiList.cs
+0
-108
BaseResult.cs
Edu.Common/Pay/WeChatPat/Model/BaseResult.cs
+0
-131
HttpParam.cs
Edu.Common/Pay/WeChatPat/Model/HttpParam.cs
+0
-115
JsonProp.cs
Edu.Common/Pay/WeChatPat/Model/JsonProp.cs
+0
-32
TokenResult.cs
Edu.Common/Pay/WeChatPat/Model/TokenResult.cs
+0
-22
UserInfoResult.cs
Edu.Common/Pay/WeChatPat/Model/UserInfoResult.cs
+0
-81
WeChatResult.cs
Edu.Common/Pay/WeChatPat/Model/WeChatResult.cs
+0
-95
PayParam.cs
Edu.Common/Pay/WeChatPat/PayParam.cs
+0
-93
RequestHandler.cs
Edu.Common/Pay/WeChatPat/RequestHandler.cs
+0
-370
ResponseHandler.cs
Edu.Common/Pay/WeChatPat/ResponseHandler.cs
+0
-163
Sha1Util.cs
Edu.Common/Pay/WeChatPat/Sha1Util.cs
+0
-33
TokenHelper.cs
Edu.Common/Pay/WeChatPat/TokenHelper.cs
+0
-92
WeChatParam.cs
Edu.Common/Pay/WeChatPat/WeChatParam.cs
+0
-76
XLinqHelper.cs
Edu.Common/Pay/WeChatPat/XLinqHelper.cs
+0
-330
No files found.
Edu.Common/Pay/PayUtil.cs
deleted
100644 → 0
View file @
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
;
}
}
}
Edu.Common/Pay/WeChatPat/HttpHelper.cs
deleted
100644 → 0
View file @
f13e0519
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
;
}
}
}
Edu.Common/Pay/WeChatPat/Model/ApiList.cs
deleted
100644 → 0
View file @
f13e0519
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
}
}
Edu.Common/Pay/WeChatPat/Model/BaseResult.cs
deleted
100644 → 0
View file @
f13e0519
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
);
}
}
}
Edu.Common/Pay/WeChatPat/Model/HttpParam.cs
deleted
100644 → 0
View file @
f13e0519
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
}
}
Edu.Common/Pay/WeChatPat/Model/JsonProp.cs
deleted
100644 → 0
View file @
f13e0519
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
Edu.Common/Pay/WeChatPat/Model/TokenResult.cs
deleted
100644 → 0
View file @
f13e0519
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
;
}
}
}
Edu.Common/Pay/WeChatPat/Model/UserInfoResult.cs
deleted
100644 → 0
View file @
f13e0519
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
;
}
}
}
Edu.Common/Pay/WeChatPat/Model/WeChatResult.cs
deleted
100644 → 0
View file @
f13e0519
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
;
}
}
}
}
Edu.Common/Pay/WeChatPat/PayParam.cs
deleted
100644 → 0
View file @
f13e0519
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
}
}
Edu.Common/Pay/WeChatPat/RequestHandler.cs
deleted
100644 → 0
View file @
f13e0519
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";
//}
}
}
}
Edu.Common/Pay/WeChatPat/ResponseHandler.cs
deleted
100644 → 0
View file @
f13e0519
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";
// }
//}
}
}
Edu.Common/Pay/WeChatPat/Sha1Util.cs
deleted
100644 → 0
View file @
f13e0519
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
;
}
}
}
Edu.Common/Pay/WeChatPat/TokenHelper.cs
deleted
100644 → 0
View file @
f13e0519
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
;
}
}
}
Edu.Common/Pay/WeChatPat/WeChatParam.cs
deleted
100644 → 0
View file @
f13e0519
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
}
}
Edu.Common/Pay/WeChatPat/XLinqHelper.cs
deleted
100644 → 0
View file @
f13e0519
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
();
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment