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
c6d00769
Commit
c6d00769
authored
May 14, 2021
by
吴春
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
提交代码
parent
752e5c15
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
84 additions
and
140 deletions
+84
-140
WeChatPayController.cs
Edu.WebApi/Controllers/WeChatPay/WeChatPayController.cs
+84
-140
No files found.
Edu.WebApi/Controllers/WeChatPay/WeChatPayController.cs
View file @
c6d00769
...
...
@@ -59,6 +59,10 @@ namespace Edu.WebApi.Controllers.WeChatPay
JObject
jobj
=
JObject
.
Parse
(
RequestParm
.
Msg
.
ToString
());
int
contractId
=
jobj
.
GetInt
(
"contractId"
);
var
orderModle
=
educationContractModule
.
GetEducationContractModule
(
contractId
);
if
(
orderModle
.
Status
==
4
)
{
return
ApiResult
.
Failed
(
"合同已取消"
);
}
var
orderNumber
=
$"
{
DateTime
.
Now
:
yyyyMMddHHmmssfff
}{
contractId
}
"
;
LogHelper
.
WriteInfo
(
"合同Id:"
+
contractId
+
" 商户订单号:"
+
orderNumber
);
var
helper
=
new
WxPayHelper
(
WxPayConst
.
appid
,
WxPayConst
.
mchid
,
WxPayConst
.
serialNo
,
WxPayConst
.
privateKey
);
...
...
@@ -66,7 +70,7 @@ namespace Edu.WebApi.Controllers.WeChatPay
Task
<
WxPayRespModel
>
payodel
=
helper
.
UnionGenerateOrder
(
orderModle
.
CourseName
,
Convert
.
ToInt32
(
orderModle
.
Money
*
100
),
orderNumber
,
notify_url
,
orderModle
.
OrderId
.
ToString
());
#
region
为
APP
生成下单所需的参数,看个人实际需求,也可以
APP
自己生成所需的参数
#
region
调用微信支付
var
signModel
=
WxPayForAppHelper
.
GetSign
(
WxPayConst
.
appid
,
payodel
.
Result
.
code_url
,
WxPayConst
.
privateKey
);
...
...
@@ -125,7 +129,7 @@ namespace Edu.WebApi.Controllers.WeChatPay
return
viewModel
;
}
/// <summary>
/// 生成财务单据以及生成支付记录
/// </summary>
...
...
@@ -268,18 +272,24 @@ namespace Edu.WebApi.Controllers.WeChatPay
};
}
bool
result
=
educationContractModule
.
SetEducationContractFinance
(
model
,
orderRecordModel
);
Cache
.
User
.
UserReidsCache
.
Set
(
Cache
.
CacheKey
.
WeChatPay_Callback_Key
+
payModel
.
out_trade_no
,
payModel
.
out_trade_no
,
1
);
}
Cache
.
User
.
UserReidsCache
.
Set
(
Cache
.
CacheKey
.
WeChatPay_Callback_Key
+
payModel
.
out_trade_no
,
payModel
.
out_trade_no
,
1
);
}
else
{
else
{
LogHelper
.
WriteInfo
(
"存在Key"
+
System
.
DateTime
.
Now
);
}
}
/// <summary>
/// 根据商户订单号查询订单支付信息
/// </summary>
/// <param name="orderNumber"></param>
/// <returns></returns>
[
AllowAnonymous
]
public
async
Task
<
WxPayStatusRespModel
>
QueryOrder
(
string
orderNumber
)
{
...
...
@@ -291,7 +301,11 @@ namespace Edu.WebApi.Controllers.WeChatPay
/// <summary>
/// 申请支付退款
/// </summary>
/// <param name="orderNumber"></param>
/// <returns></returns>
[
HttpPost
]
[
AllowAnonymous
]
public
async
Task
<
RefundsRespModel
>
Refunds
(
string
orderNumber
)
...
...
@@ -324,7 +338,6 @@ namespace Edu.WebApi.Controllers.WeChatPay
[
AllowAnonymous
]
public
async
Task
<
RefundsCallbackRespModel
>
RefundsCallback
(
RefundsCallbackModel
wxPayNotifyModel
)
{
//我没有使用官方的那种验证数据安全性的方法,我解密出来数据之后,直接拿着商户退款订单号再去查询一下订单状态,然后再更新到数据库中。我嫌麻烦……
var
resource
=
wxPayNotifyModel
?.
resource
??
new
RefundsCallbackResourceModel
();
var
decryptStr
=
AesGcmHelper
.
AesGcmDecrypt
(
resource
.
associated_data
,
resource
.
nonce
,
resource
.
ciphertext
,
WxPayConst
.
APIV3Key
);
...
...
@@ -341,11 +354,66 @@ namespace Edu.WebApi.Controllers.WeChatPay
// var payModel = await QueryRefunds(decryptModel.out_refund_no);
if
(
payModel
!=
null
&&
payModel
.
refund_status
==
"SUCCESS"
)
//生成财务单据
{
int
contractId
=
Convert
.
ToInt32
(
payModel
.
out_trade_no
[
17.
.]);
UpdateRefundsCallbackFinance
(
payModel
);
//int contractId = Convert.ToInt32(payModel.out_trade_no[17..]);
//var orderModle = educationContractModule.GetEducationContractModule(contractId);
//var orderModel = orderModule.GetClassOrderInfo(orderModle.OrderId);
//var oldOrderRecordModel = educationContractModule.GetOrderRecordList(new RB_Finance_OrderRecord { ContractId = contractId, OutTradeNo = payModel.out_trade_no }).FirstOrDefault();
//var userInfo = employeeModule.GetEmployeeListModule(new Model.ViewModel.User.Employee_ViewModel { Id = orderModel.EnterID, Group_Id = orderModel.Group_Id }).ToList().FirstOrDefault();
//var OriginalFee = Math.Round(Convert.ToDecimal((Convert.ToDecimal(Config.SettlementRate) / 100) * (Convert.ToDecimal(payModel.amount.payer_total) / 100)), 2, MidpointRounding.AwayFromZero);//手续费
//RB_Online_Trade_Detail model = new RB_Online_Trade_Detail();
//RB_Finance_OrderRecord orderRecordModel = new RB_Finance_OrderRecord
//{
// ID = 0,
// Type = 2,
// FinanceId = 0,
// OrderId = orderModle.OrderId,
// ContractId = orderModle.Id,
// CreateDate = System.DateTime.Now,
// RB_Group_Id = orderModle.Group_Id,
// RB_School_Id = orderModle.School_Id,
// OutTradeNo = payModel.out_refund_no,
// OrderRecordId = oldOrderRecordModel?.ID ?? 0,
// TransactionId = payModel.refund_id,
// TotalPrice = Convert.ToDecimal(payModel.amount.payer_total) / 100,
// ServiceFee = OriginalFee
//};
//bool result = educationContractModule.SetEducationContractFinance(model, orderRecordModel);
viewModel
.
code
=
"SUCCESS"
;
viewModel
.
message
=
""
;
}
//然后进行数据库更新处理……等等其他操作
}
return
viewModel
;
}
[
AllowAnonymous
]
public
async
Task
UpdateRefundsCallbackFinance
(
RefundsCallbackDecryptModel
payModel
)
{
int
contractId
=
Convert
.
ToInt32
(
payModel
.
out_trade_no
[
17.
.]);
bool
isAdd
=
false
;
if
(!
Cache
.
User
.
UserReidsCache
.
Exists
(
Cache
.
CacheKey
.
WeChatPay_Callback_Key
+
payModel
.
out_trade_no
))
{
LogHelper
.
WriteInfo
(
payModel
.
out_trade_no
+
"我是回调:"
+
System
.
DateTime
.
Now
);
Cache
.
User
.
UserReidsCache
.
Set
(
Cache
.
CacheKey
.
WeChatPay_Callback_Key
+
payModel
.
out_trade_no
,
payModel
.
out_trade_no
,
1800
);
isAdd
=
true
;
Cache
.
User
.
UserReidsCache
.
Set
(
Cache
.
CacheKey
.
WeChatPay_Callback_Key
+
payModel
.
out_trade_no
,
payModel
.
out_trade_no
,
1800
);
var
oldOrderRecordModel
=
educationContractModule
.
GetOrderRecordList
(
new
RB_Finance_OrderRecord
{
ContractId
=
contractId
,
OutTradeNo
=
payModel
.
out_trade_no
}).
FirstOrDefault
();
if
(
oldOrderRecordModel
==
null
||
oldOrderRecordModel
.
ID
==
0
)
{
isAdd
=
true
;
}
if
(
isAdd
)
{
var
orderModle
=
educationContractModule
.
GetEducationContractModule
(
contractId
);
var
orderModel
=
orderModule
.
GetClassOrderInfo
(
orderModle
.
OrderId
);
var
oldOrderRecordModel
=
educationContractModule
.
GetOrderRecordList
(
new
RB_Finance_OrderRecord
{
ContractId
=
contractId
,
OutTradeNo
=
payModel
.
out_trade_no
}).
FirstOrDefault
();
var
payOrderRecordModel
=
educationContractModule
.
GetOrderRecordList
(
new
RB_Finance_OrderRecord
{
ContractId
=
contractId
,
OutTradeNo
=
payModel
.
out_trade_no
}).
FirstOrDefault
();
var
userInfo
=
employeeModule
.
GetEmployeeListModule
(
new
Model
.
ViewModel
.
User
.
Employee_ViewModel
{
Id
=
orderModel
.
EnterID
,
Group_Id
=
orderModel
.
Group_Id
}).
ToList
().
FirstOrDefault
();
var
OriginalFee
=
Math
.
Round
(
Convert
.
ToDecimal
((
Convert
.
ToDecimal
(
Config
.
SettlementRate
)
/
100
)
*
(
Convert
.
ToDecimal
(
payModel
.
amount
.
payer_total
)
/
100
)),
2
,
MidpointRounding
.
AwayFromZero
);
//手续费
RB_Online_Trade_Detail
model
=
new
RB_Online_Trade_Detail
();
...
...
@@ -360,20 +428,20 @@ namespace Edu.WebApi.Controllers.WeChatPay
RB_Group_Id
=
orderModle
.
Group_Id
,
RB_School_Id
=
orderModle
.
School_Id
,
OutTradeNo
=
payModel
.
out_refund_no
,
OrderRecordId
=
old
OrderRecordModel
?.
ID
??
0
,
OrderRecordId
=
pay
OrderRecordModel
?.
ID
??
0
,
TransactionId
=
payModel
.
refund_id
,
TotalPrice
=
Convert
.
ToDecimal
(
payModel
.
amount
.
payer_total
)
/
100
,
ServiceFee
=
OriginalFee
};
bool
result
=
educationContractModule
.
SetEducationContractFinance
(
model
,
orderRecordModel
);
viewModel
.
code
=
"SUCCESS"
;
viewModel
.
message
=
""
;
Cache
.
User
.
UserReidsCache
.
Set
(
Cache
.
CacheKey
.
WeChatPay_Callback_Key
+
payModel
.
out_trade_no
,
payModel
.
out_trade_no
,
1
);
}
//然后进行数据库更新处理……等等其他操作
}
else
{
LogHelper
.
WriteInfo
(
"存在Key"
+
System
.
DateTime
.
Now
);
}
return
viewModel
;
}
/// <summary>
...
...
@@ -389,131 +457,7 @@ namespace Edu.WebApi.Controllers.WeChatPay
return
payModel
;
}
[
AllowAnonymous
]
public
ApiResult
TestQueryOrder
()
{
var
payModel
=
Common
.
Plugin
.
JsonHelper
.
DeserializeObject
<
WxPayStatusRespModel
>(
RequestParm
.
Msg
.
ToString
());
int
contractId
=
Convert
.
ToInt32
(
payModel
.
out_trade_no
[
17.
.]);
var
orderModle
=
educationContractModule
.
GetEducationContractModule
(
contractId
);
var
orderModel
=
orderModule
.
GetClassOrderInfo
(
orderModle
.
OrderId
);
var
financeConfig
=
educationContractModule
.
GetFinanceConfigList
(
new
Model
.
ViewModel
.
Course
.
RB_Finance_Config_ViewModel
{
Group_Id
=
orderModle
.
Group_Id
,
Type
=
Common
.
Enum
.
Course
.
FinanceConfigTypeEnum
.
Tuition
}).
FirstOrDefault
();
if
(
financeConfig
==
null
)
{
financeConfig
=
new
Model
.
ViewModel
.
Course
.
RB_Finance_Config_ViewModel
();
}
var
userInfo
=
employeeModule
.
GetEmployeeListModule
(
new
Model
.
ViewModel
.
User
.
Employee_ViewModel
{
Id
=
orderModel
.
EnterID
,
Group_Id
=
orderModel
.
Group_Id
}).
ToList
().
FirstOrDefault
();
var
OriginalFee
=
Math
.
Round
((
Convert
.
ToDecimal
(
Config
.
SettlementRate
)
/
100
)
*
(
Convert
.
ToDecimal
(
payModel
.
amount
.
payer_total
)
/
100
),
2
,
MidpointRounding
.
AwayFromZero
);
//手续费
RB_Online_Trade_Detail
model
=
new
RB_Online_Trade_Detail
();
RB_Finance_OrderRecord
orderRecordModel
=
new
RB_Finance_OrderRecord
{
ID
=
0
,
Type
=
1
,
FinanceId
=
0
,
OrderId
=
orderModle
.
OrderId
,
ContractId
=
orderModle
.
Id
,
CreateDate
=
System
.
DateTime
.
Now
,
RB_Group_Id
=
orderModle
.
Group_Id
,
RB_School_Id
=
orderModle
.
School_Id
,
OutTradeNo
=
payModel
.
out_trade_no
,
TransactionId
=
payModel
.
transaction_id
,
TotalPrice
=
Convert
.
ToDecimal
(
payModel
.
amount
.
payer_total
)
/
100
,
ServiceFee
=
OriginalFee
};
var
detailList
=
new
List
<
object
>();
detailList
.
Add
(
new
{
CostTypeId
=
financeConfig
?.
CostTypeId
??
533
,
Number
=
1
,
OriginalMoney
=
Convert
.
ToDecimal
((
payModel
.
amount
.
payer_total
/
100
)),
UnitPrice
=
Convert
.
ToDecimal
((
payModel
.
amount
.
payer_total
/
100
)),
Remark
=
orderModle
.
StudentName
+
orderModle
.
CourseName
+
payModel
.
out_trade_no
});
var
financeObj
=
new
{
IsPublic
=
1
,
BType
=
1
,
//item.AccountType,
AccountId
=
financeConfig
?.
ClientID
??
54
,
WBMoney
=
Convert
.
ToDecimal
((
payModel
.
amount
.
payer_total
/
100
)),
TradeDate
=
System
.
DateTime
.
Now
.
AddDays
(-
1
).
ToString
(
"yyyy-MM-dd"
),
AccountNumber
=
System
.
DateTime
.
Now
.
AddDays
(-
1
).
ToString
(
"yyyyMMdd"
),
TemplateId
=
financeConfig
?.
TempleteId
??
139
,
OrderSource
=
17
,
Remark
=
System
.
DateTime
.
Now
.
ToString
(
"yyyy年MM月dd日"
)
+
"自动生成财务单据"
,
detailList
,
OriginalFee
,
CreateBy
=
userInfo
.
Id
,
RemitterName
=
orderModle
.
StudentName
,
RB_Branch_Id
=
userInfo
.
School_Id
,
RB_Group_Id
=
userInfo
.
Group_Id
,
RB_Depart_Id
=
userInfo
.
Dept_Id
,
RB_CreateByName
=
userInfo
.
EmployeeName
,
RB_DepartName
=
userInfo
.
DeptName
,
RB_BranchName
=
userInfo
.
SchoolName
,
RB_GroupName
=
userInfo
.
GroupName
,
FinanceType
=
2
,
GuestId
=
orderModle
.
GuestId
,
OrderId
=
orderModle
.
OrderId
,
TCIDList
=
orderModel
.
ClassId
>
0
?
new
List
<
int
>()
{
orderModel
.
ClassId
}
:
new
List
<
int
>(),
};
string
sign
=
EncryptionHelper
.
AesEncrypt
(
JsonHelper
.
Serialize
(
financeObj
),
Config
.
FinanceKey
);
var
resultInfo
=
new
{
msg
=
sign
,
};
string
apiResult
=
Common
.
Plugin
.
HttpHelper
.
HttpPost
(
Config
.
ReadConfigKey
(
"PaymentFinanceApi"
),
JsonHelper
.
Serialize
(
resultInfo
),
""
);
JObject
parmsJob
=
JObject
.
Parse
(
apiResult
);
string
resultCode
=
parmsJob
.
GetStringValue
(
"resultCode"
);
int
frid
=
parmsJob
.
GetInt
(
"data"
,
0
);
if
(
resultCode
==
"1"
&&
frid
>
0
)
//新增记录
{
orderRecordModel
.
FinanceId
=
frid
;
// var Pay_Date = !string.IsNullOrWhiteSpace(payModel?.success_time ?? "") ? Convert.ToDateTime(payModel.success_time) : Convert.ToDateTime("1990-01-01");
DateTime
myDt
=
DateTime
.
SpecifyKind
(
Convert
.
ToDateTime
(
payModel
.
success_time
),
DateTimeKind
.
Utc
);
model
=
new
RB_Online_Trade_Detail
{
ID
=
0
,
Type
=
1
,
OrderSource
=
18
,
OrderId
=
orderModle
.
OrderId
,
Pay_Order
=
""
,
Trade_Order
=
payModel
.
out_trade_no
,
Third_Order
=
payModel
.
transaction_id
,
Money
=
Convert
.
ToDecimal
((
payModel
.
amount
.
payer_total
/
100
)),
Pay_Way
=
1
,
Interface_Company
=
0
,
Version
=
""
,
Mch_Id
=
WxPayConst
.
mchid
,
User_Id
=
orderModle
.
GuestId
.
ToString
(),
Is_follow
=
0
,
AppId
=
WxPayConst
.
appid
,
OpenId
=
payModel
?.
payer
?.
openid
??
""
,
Currency_Type
=
payModel
.
amount
.
payer_currency
,
Institution_Type
=
""
,
Card_Type
=
0
,
Remarks
=
"教育订单信息财务单据:"
+
frid
,
Pay_Result
=
0
,
Pay_Date
=
myDt
,
Payer_Id
=
orderModle
.
GuestId
,
Payer_Type
=
0
,
Data_Source
=
frid
,
RB_Group_Id
=
orderModle
.
Group_Id
,
RB_Branch_Id
=
orderModle
.
School_Id
,
IsRefund
=
0
,
RefundTrade_Order
=
""
,
RefundMoney
=
0
,
RefundStatus
=
0
,
FinanceId
=
0
,
};
}
bool
result
=
educationContractModule
.
SetEducationContractFinance
(
model
,
orderRecordModel
);
return
result
?
ApiResult
.
Success
(
""
)
:
ApiResult
.
Failed
(
"失败"
);
}
}
...
...
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