Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
M
mall.oytour.com
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
黄奎
mall.oytour.com
Commits
90111eb5
Commit
90111eb5
authored
May 27, 2020
by
liudong1993
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
http://gitlab.oytour.com/Kui2/mall.oytour.com
parents
df5b4a86
47b327de
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
449 additions
and
233 deletions
+449
-233
OrderPayTypeEnum.cs
Mall.Common/Enum/Goods/OrderPayTypeEnum.cs
+22
-0
RequestHandler.cs
Mall.Common/Pay/WeChatPat/RequestHandler.cs
+50
-9
RB_Goods_Order_Extend.cs
Mall.Model/Extend/Product/RB_Goods_Order_Extend.cs
+19
-1
MiniProgramModule.cs
Mall.Module.User/MiniProgramModule.cs
+1
-0
PayUtil.cs
Mall.WebApi/App_Code/PayUtil.cs
+97
-158
WeChatNotifyController.cs
...WebApi/Controllers/AppletWeChat/WeChatNotifyController.cs
+14
-65
WeChatPayController.cs
Mall.WebApi/Controllers/AppletWeChat/WeChatPayController.cs
+246
-0
No files found.
Mall.Common/Enum/Goods/OrderPayTypeEnum.cs
0 → 100644
View file @
90111eb5
using
Mall.Common.Plugin
;
using
System
;
using
System.Collections.Generic
;
using
System.Text
;
namespace
Mall.Common.Enum.Goods
{
public
enum
OrderPayTypeEnum
{
/// <summary>
/// 微信
/// </summary>
[
EnumField
(
"微信"
)]
WeChatPay
=
1
,
/// <summary>
/// 支付宝
/// </summary>
[
EnumField
(
"支付宝"
)]
Alipay
=
2
}
}
Mall.Common/Pay/WeChatPat/RequestHandler.cs
View file @
90111eb5
...
...
@@ -14,13 +14,6 @@ namespace Mall.Common.Pay.WeChatPat
/// </summary>
public
class
RequestHandler
{
private
IHttpContextAccessor
_accessor
;
public
RequestHandler
(
IHttpContextAccessor
accessor
)
{
_accessor
=
accessor
;
}
/// <summary>
/// 请求的参数
/// </summary>
...
...
@@ -171,6 +164,35 @@ namespace Mall.Common.Pay.WeChatPat
var
sign
=
Plugin
.
SecurityHelper
.
MD5EncryptWeChat
(
sb
.
ToString
(),
GetCharset
()).
ToUpper
();
return
sign
;
}
/// <summary>
/// 创建package签名,按参数名称a-z排序,遇到空值的参数不参加签名。
/// </summary>
/// <returns></returns>
public
string
CreateMd5Sign
(
IHttpContextAccessor
accessor
)
{
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
(
accessor
)).
ToUpper
();
return
sign
;
}
/// <summary>
/// 创建sha1签名
/// </summary>
...
...
@@ -269,18 +291,37 @@ namespace Mall.Common.Pay.WeChatPat
/// 获取编号
/// </summary>
/// <returns></returns>
protected
virtual
string
GetCharset
()
protected
virtual
string
GetCharset
(
IHttpContextAccessor
accessor
)
{
//return "UTF-8";
try
{
return
HttpHelper
.
GetRequestEncoding
(
_
accessor
.
HttpContext
.
Request
).
BodyName
;
// HttpContext.Current.Request.ContentEncoding.BodyName;
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";
//}
}
}
}
Mall.Model/Extend/Product/RB_Goods_Order_Extend.cs
View file @
90111eb5
...
...
@@ -3,6 +3,7 @@ using System;
using
System.Collections.Generic
;
using
System.Text
;
using
Mall.Model.Entity.Product
;
using
Mall.Common.Enum.Goods
;
namespace
Mall.Model.Extend.Product
{
...
...
@@ -108,6 +109,21 @@ namespace Mall.Model.Extend.Product
/// </summary>
public
int
?
User_Coupon_Id
{
get
;
set
;
}
/// <summary>
/// 支付方式
/// </summary>
public
OrderPayTypeEnum
?
OrderPayType
{
get
;
set
;
}
/// <summary>
/// 唯一识别码
/// </summary>
public
string
OpenId
{
get
;
set
;
}
#
region
订单导入
/// <summary>
...
...
@@ -156,12 +172,14 @@ namespace Mall.Model.Extend.Product
public
string
DName
{
get
;
set
;
}
#
endregion
>>>>>>>
61
e2df8d6e7f6e7b0ef4482885c6e6b79d1870e7
}
/// <summary>
/// 订单优惠金额
/// </summary>
public
class
RB_Goods_CouponModel
{
public
class
RB_Goods_CouponModel
{
/// <summary>
/// 商品id
/// </summary>
...
...
Mall.Module.User/MiniProgramModule.cs
View file @
90111eb5
...
...
@@ -561,6 +561,7 @@ namespace Mall.Module.User
{
nameof
(
RB_MiniProgram_Extend
.
WeChatApiSecret
),
extModel
.
WeChatApiSecret
},
{
nameof
(
RB_MiniProgram_Extend
.
WeChatPayCertificate
),
extModel
.
WeChatPayCertificate
},
{
nameof
(
RB_MiniProgram_Extend
.
WeChatPayPrivateKey
),
extModel
.
WeChatPayPrivateKey
},
{
nameof
(
RB_MiniProgram_Extend
.
WeChatPayCertificateUrl
),
extModel
.
WeChatPayCertificateUrl
},
};
flag
=
programRepository
.
Update
(
fileds
,
new
WhereHelper
(
nameof
(
RB_MiniProgram_Extend
.
MallBaseId
),
extModel
.
MallBaseId
));
}
...
...
Mall.WebApi/App_Code/PayUtil.cs
View file @
90111eb5
...
...
@@ -15,6 +15,7 @@ using Mall.Common.Plugin;
using
Mall.Model.Entity.User
;
using
Mall.Common
;
using
Mall.Model.Extend.User
;
using
NPOI.SS.Formula.Functions
;
namespace
Mall.WebApi.App_Code
{
...
...
@@ -39,6 +40,98 @@ namespace Mall.WebApi.App_Code
public
PayUtil
()
{
}
// <summary>
/// 传入订单号OrderNumber,RefundNumber,总金额total_fee(分),RefundFee退款金额(分),
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
public
BaseResult
Refund
(
PayParam
param
)
{
if
(
param
.
TotalFee
==
null
||
param
.
RefundFee
==
null
||
string
.
IsNullOrWhiteSpace
(
param
.
OrderNumber
)
||
string
.
IsNullOrWhiteSpace
(
param
.
RefundNumber
))
{
return
new
BaseResult
()
{
IsSuccess
=
false
,
Message
=
"参数错误!"
};
}
#
region
财付通退款,已
OK
//var packageReq = new RequestHandler(context);
//packageReq.SetKey(Key);
//packageReq.SetParameter("partner", "1225604801");
//packageReq.SetParameter("out_trade_no", param.OrderNumber);
//packageReq.SetParameter("out_refund_no", param.OrderNumber);
//packageReq.SetParameter("total_fee", param.TotalFee.Value.ToString(CultureInfo.InvariantCulture));
//packageReq.SetParameter("refund_fee", param.RefundFee.Value.ToString(CultureInfo.InvariantCulture));
//packageReq.SetParameter("op_user_id", "1225604801");
//packageReq.SetParameter("op_user_passwd", "111111");
//packageReq.SetParameter("sign", packageReq.CreateSign());
//var httpClient = new HttpUtil();
////httpClient.SetCharset(context.Request.ContentEncoding.BodyName);
////这里很神奇,必须要用 GB2312编码,不能通过 context.Request.ContentEncoding.BodyName获取编码
//httpClient.SetCharset("gb2312");
//httpClient.SetCertInfo(WeChatCertPath, WeChatCertPwd);
//var reqXml = packageReq.GetRequestURL();
//var result = httpClient.Send(reqXml, "https://mch.tenpay.com/refundapi/gateway/refund.xml");
//var xe = XElement.Parse(result, LoadOptions.SetLineInfo);
//return new BaseResult() { IsSuccess = false };
#
endregion
#
region
微信退款
RB_MiniProgram
model
=
new
RB_MiniProgram
();
var
packageReq
=
new
RequestHandler
();
packageReq
.
SetKey
(
model
.
WeChatApiSecret
);
packageReq
.
SetParameter
(
"appid"
,
model
.
MiniAppId
);
packageReq
.
SetParameter
(
"mch_id"
,
model
.
WeChatPayMerchants
);
packageReq
.
SetParameter
(
"nonce_str"
,
GetNoncestr
());
//packageReq.SetParameter("transaction_id", param.OrderNumber);
packageReq
.
SetParameter
(
"out_trade_no"
,
param
.
OrderNumber
);
packageReq
.
SetParameter
(
"out_refund_no"
,
param
.
RefundNumber
);
packageReq
.
SetParameter
(
"total_fee"
,
(
param
.
TotalFee
.
Value
).
ToString
(
CultureInfo
.
InvariantCulture
));
packageReq
.
SetParameter
(
"refund_fee"
,
param
.
RefundFee
.
Value
.
ToString
(
CultureInfo
.
InvariantCulture
));
//packageReq.SetParameter("op_user_id", param.WeChatType.Equals(WeChatType.Public) ? EheMall.WeChat.Common.WeChatConfig.GetMchId() : EheMall.WeChat.Common.WeChatConfig.GetOpenMchID());//操作员,默认为商户号
packageReq
.
SetParameter
(
"sign"
,
packageReq
.
CreateMd5Sign
());
var
reqXml
=
packageReq
.
ParseXml
();
var
result
=
Common
.
Pay
.
WeChatPat
.
HttpHelper
.
Post
(
new
HttpParam
()
{
Url
=
"https://api.mch.weixin.qq.com/secapi/pay/refund"
,
PostParam
=
reqXml
,
Encoding
=
Common
.
Pay
.
WeChatPat
.
HttpHelper
.
GetRequestEncoding
(
_accessor
.
HttpContext
.
Request
),
//HttpContext.Current.Request.ContentEncoding,
CertPath
=
model
.
WeChatPayCertificateUrl
,
//Path.Combine(AppDomain.CurrentDomain.BaseDirectory, param.WeChatType.Equals(WeChatType.Public) ? EheMall.WeChat.Common.WeChatConfig.GetCertPath() : EheMall.WeChat.Common.WeChatConfig.GetOpenCertPath()),
CertPwd
=
model
.
WeChatApiSecret
// param.WeChatType.Equals(WeChatType.Public) ? EheMall.WeChat.Common.WeChatConfig.GetCertPwd() : EheMall.WeChat.Common.WeChatConfig.GetOpenCertPwd()
});
var
xe
=
XElement
.
Parse
(
result
,
LoadOptions
.
SetLineInfo
);
var
returnCode
=
xe
.
GetElement
(
"return_code"
).
Value
;
//退款成功
if
(
returnCode
.
Equals
(
"SUCCESS"
))
{
var
resultCode
=
xe
.
GetElement
(
"result_code"
).
Value
;
if
(
resultCode
.
Equals
(
"SUCCESS"
))
{
var
outTradeNo
=
xe
.
GetElement
(
"out_trade_no"
).
Value
;
//在外面回写订单
return
new
BaseResult
()
{
IsSuccess
=
true
,
Data
=
new
Dictionary
<
string
,
string
>
{
{
"OrderNumber"
,
outTradeNo
}
}
};
}
}
var
errCodeDes
=
xe
.
GetElement
(
"err_code_des"
)
==
null
?
""
:
xe
.
GetElement
(
"err_code_des"
).
Value
;
var
returnMsg
=
xe
.
GetElement
(
"return_msg"
)
==
null
?
""
:
xe
.
GetElement
(
"return_msg"
).
Value
;
return
new
BaseResult
()
{
IsSuccess
=
false
,
Message
=
returnMsg
+
errCodeDes
};
#
endregion
}
/// <summary>
/// 支付
/// </summary>
...
...
@@ -139,173 +232,19 @@ namespace Mall.WebApi.App_Code
/// <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
string
GetMinUnifiedOrder
(
string
sOrderNo
,
string
sProductName
,
decimal
dPrice
,
string
CustomerId
,
string
openid
,
RB_MiniProgram
model
)
{
var
req
=
new
RequestHandler
();
req
.
SetKey
(
model
.
WeChatApiSecret
);
//
req
.
SetParameter
(
"appid"
,
model
.
MiniAppId
);
//微信开放平台审核通过的应用APPID
req
.
SetParameter
(
"mch_id"
,
model
.
WeChatPayMerchants
);
//微信支付分配的商户号
req
.
SetParameter
(
"nonce_str"
,
GetNoncestr
());
//随机字符串,不长于32位
req
.
SetParameter
(
"body"
,
sProductName
);
req
.
SetParameter
(
"attach"
,
CustomerId
);
req
.
SetParameter
(
"out_trade_no"
,
sOrderNo
);
req
.
SetParameter
(
"total_fee"
,
(
dPrice
*
100
).
ToString
(
"f0"
));
req
.
SetParameter
(
"spbill_create_ip"
,
_accessor
.
HttpContext
.
Connection
.
RemoteIpAddress
.
ToString
());
//req.SetParameter("spbill_create_ip",IPHelper.GetClientIP());
req
.
SetParameter
(
"spbill_create_ip"
,
""
);
req
.
SetParameter
(
"time_start"
,
DateTime
.
Now
.
ToString
(
"yyyyMMddHHmmss"
));
req
.
SetParameter
(
"time_expire"
,
DateTime
.
Now
.
AddMinutes
(
10
).
ToString
(
"yyyyMMddHHmmss"
));
req
.
SetParameter
(
"notify_url"
,
Config
.
sTenpayNotify
);
req
.
SetParameter
(
"trade_type"
,
"JSAPI"
);
req
.
SetParameter
(
"openid"
,
openid
);
req
.
SetParameter
(
"sign"
,
req
.
CreateMd5Sign
());
var
reqXml
=
req
.
ParseXml
();
var
result
=
Common
.
Pay
.
WeChatPat
.
HttpHelper
.
Post
(
new
HttpParam
()
{
Url
=
Mall
.
Common
.
Pay
.
WeChatPat
.
Model
.
ApiList
.
UnifiedOrderUrl
,
PostParam
=
reqXml
,
Encoding
=
Encoding
.
UTF8
// Encoding = HttpContext.Current.Request.ContentEncoding
});
var
xe
=
XElement
.
Parse
(
result
,
LoadOptions
.
SetLineInfo
);
LogHelper
.
Write
(
null
,
"订单号【"
+
sOrderNo
+
"】支付错误:"
+
xe
);
try
{
var
prepayId
=
xe
.
GetElement
(
"prepay_id"
).
Value
;
var
payReq
=
new
RequestHandler
();
payReq
.
SetKey
(
model
.
WeChatApiSecret
);
payReq
.
SetParameter
(
"appId"
,
model
.
MiniAppId
);
// req.SetParameter("mch_id", EheMall.WeChat.Common.WeChatConfig.GetOpenMchID());//微信支付分配的商户号
payReq
.
SetParameter
(
"timeStamp"
,
PayUtil
.
GetTimestamp
());
payReq
.
SetParameter
(
"nonceStr"
,
PayUtil
.
GetNoncestr
());
payReq
.
SetParameter
(
"package"
,
"prepay_id="
+
prepayId
);
payReq
.
SetParameter
(
"signType"
,
"MD5"
);
//创建签名
payReq
.
SetParameter
(
"sign"
,
payReq
.
CreateMd5Sign
());
var
payReqXml
=
payReq
.
ParseXml
();
var
payReqJson
=
payReq
.
ParseJson
();
return
payReqJson
;
}
catch
(
Exception
)
{
var
returnCode
=
xe
.
GetElement
(
"return_code"
).
Value
;
var
returnMsg
=
xe
.
GetElement
(
"return_msg"
).
Value
;
return
"{Error:'"
+
returnCode
+
returnMsg
+
"'}"
;
}
}
/// <summary>
/// 传入ProductName,OrderNumber,TotalFee,TimeExpire,OpenId(可选),TradeType,NotifyUrl(可选)
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
public
string
GetUnifiedOrder
(
RB_MiniProgram_Extend
model
,
PayParam
param
=
null
)
{
if
(
param
.
TotalFee
==
null
||
string
.
IsNullOrWhiteSpace
(
param
.
ProductName
)
||
string
.
IsNullOrWhiteSpace
(
param
.
OrderNumber
)
||
param
.
TradeType
==
null
||
param
.
MallBaseId
==
0
||
param
.
TenantId
==
0
)
{
return
"参数错误"
;
}
var
req
=
new
RequestHandler
();
req
.
SetKey
(
model
.
WeChatApiSecret
);
req
.
SetParameter
(
"appid"
,
model
.
MiniAppId
);
//微信开放平台审核通过的应用APPID
req
.
SetParameter
(
"mch_id"
,
model
.
WeChatPayMerchants
);
//微信支付分配的商户号
req
.
SetParameter
(
"nonce_str"
,
GetNoncestr
());
req
.
SetParameter
(
"body"
,
param
.
ProductName
);
req
.
SetParameter
(
"attach"
,
param
.
IsRecharge
.
ToString
());
req
.
SetParameter
(
"out_trade_no"
,
param
.
OrderNumber
);
req
.
SetParameter
(
"total_fee"
,
param
.
TotalFee
.
ToString
());
req
.
SetParameter
(
"spbill_create_ip"
,
_accessor
.
HttpContext
.
Connection
.
RemoteIpAddress
.
ToString
());
// req.SetParameter("spbill_create_ip", IPHelper.GetClientIP());
req
.
SetParameter
(
"time_start"
,
DateTime
.
Now
.
ToString
(
"yyyyMMddHHmmss"
));
req
.
SetParameter
(
"time_expire"
,
DateTime
.
Now
.
AddMinutes
(
10
).
ToString
(
"yyyyMMddHHmmss"
));
req
.
SetParameter
(
"notify_url"
,
string
.
IsNullOrWhiteSpace
(
param
.
NotifyUrl
)
?
Config
.
sTenpayNotify
:
param
.
NotifyUrl
);
req
.
SetParameter
(
"trade_type"
,
param
.
TradeType
.
ToString
());
if
(!
string
.
IsNullOrWhiteSpace
(
param
.
OpenId
))
{
req
.
SetParameter
(
"openid"
,
param
.
OpenId
);
}
req
.
SetParameter
(
"sign"
,
req
.
CreateMd5Sign
());
var
reqXml
=
req
.
ParseXml
();
var
result
=
Common
.
Pay
.
WeChatPat
.
HttpHelper
.
Post
(
new
HttpParam
()
{
Url
=
ApiList
.
UnifiedOrderUrl
,
PostParam
=
reqXml
,
Encoding
=
Common
.
Pay
.
WeChatPat
.
HttpHelper
.
GetRequestEncoding
(
_accessor
.
HttpContext
.
Request
),
//HttpContext.Current.Request.ContentEncoding
});
return
result
;
}
/// <summary>
/// 传入 OpenId,订单Id,金额(分),过期时间(20141010121314),商品名称。
/// </summary>
/// <returns></returns>
public
string
CreateJSAPIPayJson
(
PayParam
param
)
{
if
(
param
.
TotalFee
==
null
||
string
.
IsNullOrWhiteSpace
(
param
.
ProductName
)
||
string
.
IsNullOrWhiteSpace
(
param
.
OrderNumber
)
||
param
.
TradeType
==
null
||
param
.
MallBaseId
==
0
||
param
.
TenantId
==
0
)
{
return
"参数错误"
;
}
//根据订单号获取微信支付配置信息
RB_MiniProgram_Extend
model
=
new
RB_MiniProgram_Extend
();
//2020年5月26号新增
model
=
programModule
.
GetMiniProgramModule
(
new
RB_MiniProgram_Extend
{
MallBaseId
=
param
.
MallBaseId
,
TenantId
=
param
.
TenantId
});
param
.
TradeType
=
TradeType
.
JSAPI
;
var
result
=
GetUnifiedOrder
(
model
,
param
);
var
xe
=
XElement
.
Parse
(
result
,
LoadOptions
.
SetLineInfo
);
try
{
var
prepayId
=
xe
.
GetElement
(
"prepay_id"
).
Value
;
var
payReq
=
new
RequestHandler
();
payReq
.
SetKey
(
model
.
WeChatApiSecret
);
payReq
.
SetParameter
(
"appId"
,
model
.
MiniAppId
);
payReq
.
SetParameter
(
"timeStamp"
,
PayUtil
.
GetTimestamp
());
payReq
.
SetParameter
(
"nonceStr"
,
PayUtil
.
GetNoncestr
());
payReq
.
SetParameter
(
"package"
,
"prepay_id="
+
prepayId
);
payReq
.
SetParameter
(
"signType"
,
"MD5"
);
//创建签名
payReq
.
SetParameter
(
"sign"
,
payReq
.
CreateMd5Sign
());
var
payReqXml
=
payReq
.
ParseXml
();
var
payReqJson
=
payReq
.
ParseJson
();
return
payReqJson
;
}
catch
(
Exception
ex
)
{
var
returnCode
=
xe
.
GetElement
(
"return_code"
).
Value
;
var
returnMsg
=
xe
.
GetElement
(
"return_msg"
).
Value
;
LogHelper
.
Write
(
ex
,
"订单号支付错误:"
+
xe
);
return
"{Error:'"
+
returnCode
+
returnMsg
+
"'}"
;
}
}
/// <summary>
/// 获取随机字符串
/// </summary>
/// <returns></returns>
public
static
string
GetNoncestr
()
public
string
GetNoncestr
()
{
var
random
=
new
Random
();
return
SecurityHelper
.
MD5EncryptWeChat
(
random
.
Next
(
1000
).
ToString
(
CultureInfo
.
InvariantCulture
),
"GBK"
);
...
...
@@ -315,7 +254,7 @@ namespace Mall.WebApi.App_Code
/// 获取时间戳
/// </summary>
/// <returns></returns>
public
static
string
GetTimestamp
()
public
string
GetTimestamp
()
{
var
ts
=
DateTime
.
UtcNow
-
new
DateTime
(
1970
,
1
,
1
,
0
,
0
,
0
,
0
);
return
Convert
.
ToInt64
(
ts
.
TotalSeconds
).
ToString
(
CultureInfo
.
InvariantCulture
);
...
...
@@ -327,7 +266,7 @@ namespace Mall.WebApi.App_Code
/// <param name="instr"></param>
/// <param name="charset">默认值:utf-8</param>
/// <returns></returns>
public
static
string
UrlEncode
(
string
instr
,
string
charset
)
public
string
UrlEncode
(
string
instr
,
string
charset
)
{
if
(
instr
==
null
||
instr
.
Trim
()
==
""
)
return
""
;
...
...
Mall.WebApi/Controllers/AppletWeChat/WeChatNotifyController.cs
View file @
90111eb5
...
...
@@ -9,78 +9,16 @@ using Mall.Common.Plugin;
using
Mall.WebApi.Filter
;
using
Microsoft.AspNetCore.Cors
;
using
Microsoft.AspNetCore.Mvc
;
using
Newtonsoft.Json.Linq
;
namespace
Mall.WebApi.Controllers.AppletWeChat
{
[
Route
(
"api/[controller]/[action]"
)]
[
ApiExceptionFilter
]
[
ApiController
]
[
EnableCors
(
"AllowCors"
)]
public
class
WeChatNotifyController
:
BaseController
public
class
WeChatNotifyController
:
Controller
{
private
static
object
_lock
=
new
object
();
/// <summary>
/// 微信支付方法
/// </summary>
/// <param name="sOrderNo"></param>
/// <param name="sCurOpenID"></param>
/// <returns></returns>
[
HttpGet
]
[
HttpPost
]
public
ApiResult
DoPay
(
string
sOrderNo
,
string
sCurOpenID
=
""
)
{
if
(
string
.
IsNullOrWhiteSpace
(
sCurOpenID
))
{
return
ApiResult
.
Failed
(
"OpenId不能为空!"
);
}
string
result
=
""
;
//判断订单信息
//var model = new REBORN.Module.SellModule.CounponOrderModule().GetEntity(Convert.ToInt32(sOrderNo));
//if (model == null)
//{
// return ApiResult.Failed("订单信息不存在!");
//}
//if (model.OrderState == 2)
//{
// return ApiResult.Failed("订单已支付");
//}
//if (model.OrderState == 3)
//{
// return ApiResult.Failed("订单已取消");
//}
var
payParam
=
new
Common
.
Pay
.
WeChatPat
.
PayParam
()
{
TotalFee
=
1
,
// Convert.ToInt32(model.PreferPrice * 100),//总价,单位:分。2500即25元
OpenId
=
sCurOpenID
,
//支付用户的OpenId
OrderNumber
=
(
System
.
DateTime
.
Now
.
ToString
(
"yyyyMMddHHmmssfff"
))
+
sOrderNo
,
ProductName
=
"测试商品名称"
,
//model.ProductName,
IsRecharge
=
false
};
try
{
LogHelper
.
Write
(
null
,
"DoPay-H5:"
+
payParam
);
App_Code
.
PayUtil
PayUtil
=
new
App_Code
.
PayUtil
();
result
=
PayUtil
.
CreateJSAPIPayJson
(
payParam
);
return
ApiResult
.
Success
(
""
,
result
);
}
catch
(
Exception
ex
)
{
if
(
ex
.
Message
.
Contains
(
"timed out"
))
{
App_Code
.
PayUtil
PayUtil
=
new
App_Code
.
PayUtil
();
var
json
=
PayUtil
.
CreateJSAPIPayJson
(
payParam
);
return
ApiResult
.
Success
(
""
,
json
);
}
}
return
ApiResult
.
Success
();
}
/// <summary>
...
...
@@ -157,5 +95,16 @@ namespace Mall.WebApi.Controllers.AppletWeChat
//告诉微信我们处理失败,请继续调用我们的接口。好像是会重试8次。
}
}
}
\ No newline at end of file
Mall.WebApi/Controllers/AppletWeChat/WeChatPayController.cs
0 → 100644
View file @
90111eb5
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Threading.Tasks
;
using
System.Xml.Linq
;
using
Mall.Common
;
using
Mall.Common.API
;
using
Mall.Common.Pay.WeChatPat
;
using
Mall.Common.Pay.WeChatPat.Model
;
using
Mall.Common.Plugin
;
using
Mall.Model.Extend.Product
;
using
Mall.Model.Extend.User
;
using
Mall.Module.User
;
using
Mall.WebApi.Filter
;
using
Mall.WeChat.Helper
;
using
Microsoft.AspNetCore.Cors
;
using
Microsoft.AspNetCore.Http
;
using
Microsoft.AspNetCore.Mvc
;
using
Newtonsoft.Json
;
using
Newtonsoft.Json.Linq
;
namespace
Mall.WebApi.Controllers.AppletWeChat
{
[
Route
(
"api/[controller]/[action]"
)]
[
ApiExceptionFilter
]
[
ApiController
]
[
EnableCors
(
"AllowCors"
)]
public
class
WeChatPayController
:
BaseController
{
private
IHttpContextAccessor
_accessor
;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="accessor"></param>
public
WeChatPayController
(
IHttpContextAccessor
accessor
)
{
_accessor
=
accessor
;
}
/// <summary>
/// 商户小程序处理类
/// </summary>
private
Module
.
User
.
MiniProgramModule
programModule
=
new
Module
.
User
.
MiniProgramModule
();
private
readonly
UserModule
userModule
=
new
UserModule
();
/// <summary>
/// 微信支付
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public
ApiResult
GetPayInfo
()
{
var
request
=
RequestParm
;
var
userInfo
=
AppletUserInfo
;
var
userModel
=
userModule
.
GetMemberUserInfo
(
21233
);
if
(
userInfo
==
null
)
{
userInfo
=
new
Common
.
AppletUserInfo
();
userInfo
.
TenantId
=
userModel
.
TenantId
;
userInfo
.
MallBaseId
=
userModel
.
MallBaseId
;
userInfo
.
UserId
=
userModel
.
Id
;
}
RB_Goods_Order_Extend
demodel
=
JsonConvert
.
DeserializeObject
<
RB_Goods_Order_Extend
>(
request
.
msg
.
ToString
());
string
sPayInfo
=
string
.
Empty
;
if
(!
demodel
.
OrderPayType
.
HasValue
)
{
return
ApiResult
.
Failed
(
"请选择支付方式!"
);
}
var
model
=
new
Module
.
Product
.
OrderModule
().
GetOrderInfo
(
demodel
.
OrderId
);
if
(
model
==
null
)
{
return
ApiResult
.
Failed
(
"订单信息不存在!"
);
}
if
(
model
.
OrderStatus
==
Common
.
Enum
.
Goods
.
OrderStatusEnum
.
Cancel
)
{
return
ApiResult
.
Failed
(
"订单已取消"
);
}
if
((
int
)
model
.
OrderStatus
>
1
)
{
return
ApiResult
.
Failed
(
"订单已支付"
);
}
string
sOrderNo
=
(
System
.
DateTime
.
Now
.
ToString
(
"yyyyMMddHHmmssfff"
))
+
model
.
OrderId
;
//根据订单号获取微信支付配置信息
RB_MiniProgram_Extend
miniProgram
=
new
RB_MiniProgram_Extend
();
//2020年5月26号新增
miniProgram
=
programModule
.
GetMiniProgramModule
(
new
RB_MiniProgram_Extend
{
MallBaseId
=
userInfo
.
MallBaseId
,
TenantId
=
userInfo
.
TenantId
});
App_Code
.
PayUtil
payUtil
=
new
App_Code
.
PayUtil
();
switch
((
int
)
demodel
.
OrderPayType
)
{
case
1
:
//微信支付
sPayInfo
=
GetMinUnifiedOrder
(
sOrderNo
,
demodel
.
GoodsName
,
model
.
Income
.
Value
,
model
.
UserId
.
ToString
(),
demodel
.
OpenId
,
miniProgram
);
break
;
default
:
break
;
}
return
ApiResult
.
Success
(
""
,
sPayInfo
);
}
/// <summary>
/// 微信小程序支付
/// </summary>
/// <param name="sOrderNo"></param>
/// <param name="sProductName"></param>
/// <param name="dPrice"></param>
/// <param name="CustomerId"></param>
/// <param name="openid"></param>
/// <returns></returns>
private
string
GetMinUnifiedOrder
(
string
sOrderNo
,
string
sProductName
,
decimal
dPrice
,
string
CustomerId
,
string
openid
,
RB_MiniProgram_Extend
model
)
{
App_Code
.
PayUtil
payUtil
=
new
App_Code
.
PayUtil
();
var
req
=
new
Common
.
Pay
.
WeChatPat
.
RequestHandler
();
req
.
SetKey
(
model
.
WeChatApiSecret
);
//
req
.
SetParameter
(
"appid"
,
model
.
MiniAppId
);
//微信开放平台审核通过的应用APPID
req
.
SetParameter
(
"mch_id"
,
model
.
WeChatPayMerchants
);
//微信支付分配的商户号
req
.
SetParameter
(
"nonce_str"
,
payUtil
.
GetNoncestr
());
//随机字符串,不长于32位
req
.
SetParameter
(
"body"
,
sProductName
);
req
.
SetParameter
(
"attach"
,
CustomerId
);
req
.
SetParameter
(
"out_trade_no"
,
sOrderNo
);
req
.
SetParameter
(
"total_fee"
,
(
dPrice
*
100
).
ToString
(
"f0"
));
req
.
SetParameter
(
"spbill_create_ip"
,
_accessor
.
HttpContext
.
Connection
.
RemoteIpAddress
.
ToString
());
req
.
SetParameter
(
"time_start"
,
DateTime
.
Now
.
ToString
(
"yyyyMMddHHmmss"
));
req
.
SetParameter
(
"time_expire"
,
DateTime
.
Now
.
AddMinutes
(
10
).
ToString
(
"yyyyMMddHHmmss"
));
req
.
SetParameter
(
"notify_url"
,
Config
.
sTenpayNotify
);
req
.
SetParameter
(
"trade_type"
,
"JSAPI"
);
req
.
SetParameter
(
"openid"
,
openid
);
req
.
SetParameter
(
"sign"
,
req
.
CreateMd5Sign
(
_accessor
));
var
reqXml
=
req
.
ParseXml
();
var
result
=
Common
.
Pay
.
WeChatPat
.
HttpHelper
.
Post
(
new
HttpParam
()
{
Url
=
Mall
.
Common
.
Pay
.
WeChatPat
.
Model
.
ApiList
.
UnifiedOrderUrl
,
PostParam
=
reqXml
,
Encoding
=
Common
.
Pay
.
WeChatPat
.
HttpHelper
.
GetRequestEncoding
(
_accessor
.
HttpContext
.
Request
),
// Encoding = HttpContext.Current.Request.ContentEncoding
});
var
xe
=
XElement
.
Parse
(
result
,
LoadOptions
.
SetLineInfo
);
LogHelper
.
Write
(
null
,
"订单号【"
+
sOrderNo
+
"】支付错误:"
+
xe
);
try
{
var
prepayId
=
xe
.
GetElement
(
"return_code"
).
Value
;
var
payReq
=
new
RequestHandler
();
payReq
.
SetParameter
(
"appId"
,
model
.
MiniAppId
);
//创建签名
payReq
.
SetParameter
(
"sign"
,
payReq
.
CreateMd5Sign
(
_accessor
));
var
payReqXml
=
payReq
.
ParseXml
();
var
payReqJson
=
payReq
.
ParseJson
();
return
payReqJson
;
}
catch
(
Exception
)
{
var
returnCode
=
xe
.
GetElement
(
"return_code"
).
Value
;
var
returnMsg
=
xe
.
GetElement
(
"return_msg"
).
Value
;
return
"{Error:'"
+
returnCode
+
returnMsg
+
"'}"
;
}
}
/// <summary>
/// 企业付款
/// </summary>
/// <param name="sOrderNo"></param>
/// <param name="sProductName"></param>
/// <param name="dPrice"></param>
/// <param name="CustomerId"></param>
/// <param name="openid"></param>
/// <returns></returns>
private
string
GetTransfersOrder
(
string
sOrderNo
,
string
sProductName
,
decimal
dPrice
,
string
CustomerId
,
string
openid
,
RB_MiniProgram_Extend
model
)
{
App_Code
.
PayUtil
payUtil
=
new
App_Code
.
PayUtil
();
var
req
=
new
Common
.
Pay
.
WeChatPat
.
RequestHandler
();
req
.
SetKey
(
model
.
WeChatApiSecret
);
//
req
.
SetParameter
(
"mch_appid"
,
model
.
MiniAppId
);
//微信开放平台审核通过的应用APPID
req
.
SetParameter
(
"mchid"
,
model
.
WeChatPayMerchants
);
//微信支付分配的商户号
req
.
SetParameter
(
"nonce_str"
,
payUtil
.
GetNoncestr
());
//随机字符串,不长于32位
req
.
SetParameter
(
"sign"
,
req
.
CreateMd5Sign
(
_accessor
));
req
.
SetParameter
(
"partner_trade_no"
,
sProductName
);
//商户订单号,需保持唯一性(只能是字母或者数字,不能包含有其它字符)
req
.
SetParameter
(
"openid"
,
openid
);
req
.
SetParameter
(
"check_name"
,
"NO_CHECK"
);
req
.
SetParameter
(
"out_trade_no"
,
sOrderNo
);
req
.
SetParameter
(
"amount"
,
(
dPrice
*
100
).
ToString
(
"f0"
));
req
.
SetParameter
(
"spbill_create_ip"
,
_accessor
.
HttpContext
.
Connection
.
RemoteIpAddress
.
ToString
());
req
.
SetParameter
(
"time_start"
,
DateTime
.
Now
.
ToString
(
"yyyyMMddHHmmss"
));
req
.
SetParameter
(
"time_expire"
,
DateTime
.
Now
.
AddMinutes
(
10
).
ToString
(
"yyyyMMddHHmmss"
));
req
.
SetParameter
(
"desc"
,
"赞羊商城佣金提现"
);
req
.
SetParameter
(
"trade_type"
,
"JSAPI"
);
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
=
model
.
WeChatPayCertificateUrl
,
CertPwd
=
model
.
WeChatApiSecret
});
var
xe
=
XElement
.
Parse
(
result
,
LoadOptions
.
SetLineInfo
);
LogHelper
.
Write
(
null
,
"订单号【"
+
sOrderNo
+
"】支付错误:"
+
xe
);
try
{
var
prepayId
=
xe
.
GetElement
(
"prepay_id"
).
Value
;
var
payReq
=
new
RequestHandler
();
payReq
.
SetKey
(
model
.
WeChatApiSecret
);
payReq
.
SetParameter
(
"appId"
,
model
.
MiniAppId
);
// req.SetParameter("mch_id", EheMall.WeChat.Common.WeChatConfig.GetOpenMchID());//微信支付分配的商户号
payReq
.
SetParameter
(
"timeStamp"
,
payUtil
.
GetTimestamp
());
payReq
.
SetParameter
(
"nonceStr"
,
payUtil
.
GetNoncestr
());
payReq
.
SetParameter
(
"package"
,
"prepay_id="
+
prepayId
);
payReq
.
SetParameter
(
"signType"
,
"MD5"
);
//创建签名
payReq
.
SetParameter
(
"sign"
,
payReq
.
CreateMd5Sign
(
_accessor
));
var
payReqXml
=
payReq
.
ParseXml
();
var
payReqJson
=
payReq
.
ParseJson
();
return
payReqJson
;
}
catch
(
Exception
)
{
var
returnCode
=
xe
.
GetElement
(
"return_code"
).
Value
;
var
returnMsg
=
xe
.
GetElement
(
"return_msg"
).
Value
;
return
"{Error:'"
+
returnCode
+
returnMsg
+
"'}"
;
}
}
}
}
\ No newline at end of file
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