WeChatPayController.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691
  1. using System.Collections.Generic;
  2. using System.Text.Json;
  3. using System.Threading.Tasks;
  4. using Essensoft.AspNetCore.Payment.WeChatPay;
  5. using Essensoft.AspNetCore.Payment.WeChatPay.Domain;
  6. using Essensoft.AspNetCore.Payment.WeChatPay.Request;
  7. using Microsoft.AspNetCore.Mvc;
  8. using Microsoft.Extensions.Options;
  9. using WebApplicationSample.Models;
  10. namespace WebApplicationSample.Controllers
  11. {
  12. public class WeChatPayController : Controller
  13. {
  14. private readonly IWeChatPayClient _client;
  15. private readonly IOptions<WeChatPayOptions> _optionsAccessor;
  16. public WeChatPayController(IWeChatPayClient client, IOptions<WeChatPayOptions> optionsAccessor)
  17. {
  18. _client = client;
  19. _optionsAccessor = optionsAccessor;
  20. }
  21. /// <summary>
  22. /// 微信支付指引页
  23. /// </summary>
  24. public IActionResult Index()
  25. {
  26. return View();
  27. }
  28. /// <summary>
  29. /// 刷卡支付
  30. /// </summary>
  31. [HttpGet]
  32. public IActionResult MicroPay()
  33. {
  34. return View();
  35. }
  36. /// <summary>
  37. /// 刷卡支付
  38. /// </summary>
  39. /// <param name="viewModel"></param>
  40. [HttpPost]
  41. public async Task<IActionResult> MicroPay(WeChatPayMicroPayViewModel viewModel)
  42. {
  43. var request = new WeChatPayMicroPayRequest
  44. {
  45. Body = viewModel.Body,
  46. OutTradeNo = viewModel.OutTradeNo,
  47. TotalFee = viewModel.TotalFee,
  48. SpBillCreateIp = viewModel.SpBillCreateIp,
  49. AuthCode = viewModel.AuthCode
  50. };
  51. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  52. ViewData["response"] = response.Body;
  53. return View();
  54. }
  55. /// <summary>
  56. /// 公众号支付
  57. /// </summary>
  58. [HttpGet]
  59. public IActionResult PubPay()
  60. {
  61. return View();
  62. }
  63. /// <summary>
  64. /// 公众号支付
  65. /// </summary>
  66. /// <param name="viewModel"></param>
  67. [HttpPost]
  68. public async Task<IActionResult> PubPay(WeChatPayPubPayViewModel viewModel)
  69. {
  70. var request = new WeChatPayUnifiedOrderRequest
  71. {
  72. Body = viewModel.Body,
  73. OutTradeNo = viewModel.OutTradeNo,
  74. TotalFee = viewModel.TotalFee,
  75. SpBillCreateIp = viewModel.SpBillCreateIp,
  76. NotifyUrl = viewModel.NotifyUrl,
  77. TradeType = viewModel.TradeType,
  78. OpenId = viewModel.OpenId
  79. };
  80. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  81. if (response.ReturnCode == WeChatPayCode.Success && response.ResultCode == WeChatPayCode.Success)
  82. {
  83. var req = new WeChatPayJsApiSdkRequest
  84. {
  85. Package = "prepay_id=" + response.PrepayId
  86. };
  87. var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value);
  88. // 将参数(parameter)给 公众号前端 让他在微信内H5调起支付(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6)
  89. ViewData["parameter"] = JsonSerializer.Serialize(parameter);
  90. ViewData["response"] = response.Body;
  91. return View();
  92. }
  93. ViewData["response"] = response.Body;
  94. return View();
  95. }
  96. /// <summary>
  97. /// 扫码支付
  98. /// </summary>
  99. [HttpGet]
  100. public IActionResult QrCodePay()
  101. {
  102. return View();
  103. }
  104. /// <summary>
  105. /// 扫码支付
  106. /// </summary>
  107. /// <param name="viewModel"></param>
  108. [HttpPost]
  109. public async Task<IActionResult> QrCodePay(WeChatPayQrCodePayViewModel viewModel)
  110. {
  111. var request = new WeChatPayUnifiedOrderRequest
  112. {
  113. Body = viewModel.Body,
  114. OutTradeNo = viewModel.OutTradeNo,
  115. TotalFee = viewModel.TotalFee,
  116. SpBillCreateIp = viewModel.SpBillCreateIp,
  117. NotifyUrl = viewModel.NotifyUrl,
  118. TradeType = viewModel.TradeType
  119. };
  120. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  121. // response.CodeUrl 给前端生成二维码
  122. ViewData["qrcode"] = response.CodeUrl;
  123. ViewData["response"] = response.Body;
  124. return View();
  125. }
  126. /// <summary>
  127. /// APP支付
  128. /// </summary>
  129. [HttpGet]
  130. public IActionResult AppPay()
  131. {
  132. return View();
  133. }
  134. /// <summary>
  135. /// APP支付
  136. /// </summary>
  137. /// <param name="viewModel"></param>
  138. [HttpPost]
  139. public async Task<IActionResult> AppPay(WeChatPayAppPayViewModel viewModel)
  140. {
  141. var request = new WeChatPayUnifiedOrderRequest
  142. {
  143. Body = viewModel.Body,
  144. OutTradeNo = viewModel.OutTradeNo,
  145. TotalFee = viewModel.TotalFee,
  146. SpBillCreateIp = viewModel.SpBillCreateIp,
  147. NotifyUrl = viewModel.NotifyUrl,
  148. TradeType = viewModel.TradeType
  149. };
  150. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  151. if (response.ReturnCode == WeChatPayCode.Success && response.ResultCode == WeChatPayCode.Success)
  152. {
  153. var req = new WeChatPayAppSdkRequest
  154. {
  155. PrepayId = response.PrepayId
  156. };
  157. var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value);
  158. // 将参数(parameter)给 ios/android端 让他调起微信APP(https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5)
  159. ViewData["parameter"] = JsonSerializer.Serialize(parameter);
  160. ViewData["response"] = response.Body;
  161. return View();
  162. }
  163. ViewData["response"] = response.Body;
  164. return View();
  165. }
  166. /// <summary>
  167. /// H5支付
  168. /// </summary>
  169. [HttpGet]
  170. public IActionResult H5Pay()
  171. {
  172. return View();
  173. }
  174. /// <summary>
  175. /// H5支付
  176. /// </summary>
  177. /// <param name="viewModel"></param>
  178. [HttpPost]
  179. public async Task<IActionResult> H5Pay(WeChatPayH5PayViewModel viewModel)
  180. {
  181. var request = new WeChatPayUnifiedOrderRequest
  182. {
  183. Body = viewModel.Body,
  184. OutTradeNo = viewModel.OutTradeNo,
  185. TotalFee = viewModel.TotalFee,
  186. SpBillCreateIp = viewModel.SpBillCreateIp,
  187. NotifyUrl = viewModel.NotifyUrl,
  188. TradeType = viewModel.TradeType
  189. };
  190. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  191. // mweb_url为拉起微信支付收银台的中间页面,可通过访问该url来拉起微信客户端,完成支付,mweb_url的有效期为5分钟。
  192. return Redirect(response.MwebUrl);
  193. }
  194. /// <summary>
  195. /// 小程序支付
  196. /// </summary>
  197. [HttpGet]
  198. public IActionResult LiteAppPay()
  199. {
  200. return View();
  201. }
  202. /// <summary>
  203. /// 小程序支付
  204. /// </summary>
  205. /// <param name="viewModel"></param>
  206. [HttpPost]
  207. public async Task<IActionResult> LiteAppPay(WeChatPayLiteAppPayViewModel viewModel)
  208. {
  209. var request = new WeChatPayUnifiedOrderRequest
  210. {
  211. Body = viewModel.Body,
  212. OutTradeNo = viewModel.OutTradeNo,
  213. TotalFee = viewModel.TotalFee,
  214. SpBillCreateIp = viewModel.SpBillCreateIp,
  215. NotifyUrl = viewModel.NotifyUrl,
  216. TradeType = viewModel.TradeType,
  217. OpenId = viewModel.OpenId
  218. };
  219. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  220. if (response.ReturnCode == WeChatPayCode.Success && response.ResultCode == WeChatPayCode.Success)
  221. {
  222. var req = new WeChatPayLiteAppSdkRequest
  223. {
  224. Package = "prepay_id=" + response.PrepayId
  225. };
  226. var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value);
  227. // 将参数(parameter)给 小程序前端 让他调起支付API(https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=5)
  228. ViewData["parameter"] = JsonSerializer.Serialize(parameter);
  229. ViewData["response"] = response.Body;
  230. return View();
  231. }
  232. ViewData["response"] = response.Body;
  233. return View();
  234. }
  235. /// <summary>
  236. /// 查询订单
  237. /// </summary>
  238. [HttpGet]
  239. public IActionResult OrderQuery()
  240. {
  241. return View();
  242. }
  243. /// <summary>
  244. /// 查询订单
  245. /// </summary>
  246. /// <param name="viewModel"></param>
  247. [HttpPost]
  248. public async Task<IActionResult> OrderQuery(WeChatPayOrderQueryViewModel viewModel)
  249. {
  250. var request = new WeChatPayOrderQueryRequest
  251. {
  252. TransactionId = viewModel.TransactionId,
  253. OutTradeNo = viewModel.OutTradeNo
  254. };
  255. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  256. ViewData["response"] = response.Body;
  257. return View();
  258. }
  259. /// <summary>
  260. /// 撤销订单
  261. /// </summary>
  262. [HttpGet]
  263. public IActionResult Reverse()
  264. {
  265. return View();
  266. }
  267. /// <summary>
  268. /// 撤销订单
  269. /// </summary>
  270. /// <param name="viewModel"></param>
  271. [HttpPost]
  272. public async Task<IActionResult> Reverse(WeChatPayReverseViewModel viewModel)
  273. {
  274. var request = new WeChatPayReverseRequest
  275. {
  276. TransactionId = viewModel.TransactionId,
  277. OutTradeNo = viewModel.OutTradeNo
  278. };
  279. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  280. ViewData["response"] = response.Body;
  281. return View();
  282. }
  283. /// <summary>
  284. /// 关闭订单
  285. /// </summary>
  286. [HttpGet]
  287. public IActionResult CloseOrder()
  288. {
  289. return View();
  290. }
  291. /// <summary>
  292. /// 关闭订单
  293. /// </summary>
  294. /// <param name="viewModel"></param>
  295. [HttpPost]
  296. public async Task<IActionResult> CloseOrder(WeChatPayCloseOrderViewModel viewModel)
  297. {
  298. var request = new WeChatPayCloseOrderRequest
  299. {
  300. OutTradeNo = viewModel.OutTradeNo
  301. };
  302. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  303. ViewData["response"] = response.Body;
  304. return View();
  305. }
  306. /// <summary>
  307. /// 申请退款
  308. /// </summary>
  309. [HttpGet]
  310. public IActionResult Refund()
  311. {
  312. return View();
  313. }
  314. /// <summary>
  315. /// 申请退款
  316. /// </summary>
  317. /// <param name="viewModel"></param>
  318. [HttpPost]
  319. public async Task<IActionResult> Refund(WeChatPayRefundViewModel viewModel)
  320. {
  321. var request = new WeChatPayRefundRequest
  322. {
  323. OutRefundNo = viewModel.OutRefundNo,
  324. TransactionId = viewModel.TransactionId,
  325. OutTradeNo = viewModel.OutTradeNo,
  326. TotalFee = viewModel.TotalFee,
  327. RefundFee = viewModel.RefundFee,
  328. RefundDesc = viewModel.RefundDesc,
  329. NotifyUrl = viewModel.NotifyUrl
  330. };
  331. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  332. ViewData["response"] = response.Body;
  333. return View();
  334. }
  335. /// <summary>
  336. /// 查询退款
  337. /// </summary>
  338. [HttpGet]
  339. public IActionResult RefundQuery()
  340. {
  341. return View();
  342. }
  343. /// <summary>
  344. /// 查询退款
  345. /// </summary>
  346. /// <param name="viewModel"></param>
  347. [HttpPost]
  348. public async Task<IActionResult> RefundQuery(WeChatPayRefundQueryViewModel viewModel)
  349. {
  350. var request = new WeChatPayRefundQueryRequest
  351. {
  352. RefundId = viewModel.RefundId,
  353. OutRefundNo = viewModel.OutRefundNo,
  354. TransactionId = viewModel.TransactionId,
  355. OutTradeNo = viewModel.OutTradeNo
  356. };
  357. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  358. ViewData["response"] = response.Body;
  359. return View();
  360. }
  361. /// <summary>
  362. /// 下载对账单
  363. /// </summary>
  364. [HttpGet]
  365. public IActionResult DownloadBill()
  366. {
  367. return View();
  368. }
  369. /// <summary>
  370. /// 下载对账单
  371. /// </summary>
  372. /// <param name="viewModel"></param>
  373. [HttpPost]
  374. public async Task<IActionResult> DownloadBill(WeChatPayDownloadBillViewModel viewModel)
  375. {
  376. var request = new WeChatPayDownloadBillRequest
  377. {
  378. BillDate = viewModel.BillDate,
  379. BillType = viewModel.BillType,
  380. TarType = viewModel.TarType
  381. };
  382. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  383. ViewData["response"] = response.Body;
  384. return View();
  385. }
  386. /// <summary>
  387. /// 下载资金账单
  388. /// </summary>
  389. [HttpGet]
  390. public IActionResult DownloadFundFlow()
  391. {
  392. return View();
  393. }
  394. /// <summary>
  395. /// 下载资金账单
  396. /// </summary>
  397. /// <param name="viewModel"></param>
  398. [HttpPost]
  399. public async Task<IActionResult> DownloadFundFlow(WeChatPayDownloadFundFlowViewModel viewModel)
  400. {
  401. var request = new WeChatPayDownloadFundFlowRequest
  402. {
  403. BillDate = viewModel.BillDate,
  404. AccountType = viewModel.AccountType,
  405. TarType = viewModel.TarType
  406. };
  407. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  408. ViewData["response"] = response.Body;
  409. return View();
  410. }
  411. /// <summary>
  412. /// 企业付款到零钱
  413. /// </summary>
  414. [HttpGet]
  415. public IActionResult Transfers()
  416. {
  417. return View();
  418. }
  419. /// <summary>
  420. /// 企业付款到零钱
  421. /// </summary>
  422. /// <param name="viewModel"></param>
  423. [HttpPost]
  424. public async Task<IActionResult> Transfers(WeChatPayTransfersViewModel viewModel)
  425. {
  426. var request = new WeChatPayPromotionTransfersRequest
  427. {
  428. PartnerTradeNo = viewModel.PartnerTradeNo,
  429. OpenId = viewModel.OpenId,
  430. CheckName = viewModel.CheckName,
  431. ReUserName = viewModel.ReUserName,
  432. Amount = viewModel.Amount,
  433. Desc = viewModel.Desc,
  434. SpBillCreateIp = viewModel.SpBillCreateIp
  435. };
  436. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  437. ViewData["response"] = response.Body;
  438. return View();
  439. }
  440. /// <summary>
  441. /// 查询企业付款
  442. /// </summary>
  443. [HttpGet]
  444. public IActionResult GetTransferInfo()
  445. {
  446. return View();
  447. }
  448. /// <summary>
  449. /// 查询企业付款
  450. /// </summary>
  451. /// <param name="viewModel"></param>
  452. [HttpPost]
  453. public async Task<IActionResult> GetTransferInfo(WeChatPayGetTransferInfoViewModel viewModel)
  454. {
  455. var request = new WeChatPayGetTransferInfoRequest
  456. {
  457. PartnerTradeNo = viewModel.PartnerTradeNo
  458. };
  459. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  460. ViewData["response"] = response.Body;
  461. return View();
  462. }
  463. /// <summary>
  464. /// 企业付款到银行卡
  465. /// </summary>
  466. [HttpGet]
  467. public IActionResult PayBank()
  468. {
  469. return View();
  470. }
  471. /// <summary>
  472. /// 企业付款到银行卡
  473. /// </summary>
  474. /// <param name="viewModel"></param>
  475. [HttpPost]
  476. public async Task<IActionResult> PayBank(WeChatPayPayBankViewModel viewModel)
  477. {
  478. var request = new WeChatPayPayBankRequest
  479. {
  480. PartnerTradeNo = viewModel.PartnerTradeNo,
  481. BankNo = viewModel.BankNo,
  482. TrueName = viewModel.TrueName,
  483. BankCode = viewModel.BankCode,
  484. Amount = viewModel.Amount,
  485. Desc = viewModel.Desc
  486. };
  487. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  488. ViewData["response"] = response.Body;
  489. return View();
  490. }
  491. /// <summary>
  492. /// 查询企业付款银行卡
  493. /// </summary>
  494. [HttpGet]
  495. public IActionResult QueryBank()
  496. {
  497. return View();
  498. }
  499. /// <summary>
  500. /// 查询企业付款银行卡
  501. /// </summary>
  502. /// <param name="viewModel"></param>
  503. [HttpPost]
  504. public async Task<IActionResult> QueryBank(WeChatPayQueryBankViewModel viewModel)
  505. {
  506. var request = new WeChatPayQueryBankRequest
  507. {
  508. PartnerTradeNo = viewModel.PartnerTradeNo
  509. };
  510. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  511. ViewData["response"] = response.Body;
  512. return View();
  513. }
  514. /// <summary>
  515. /// 获取RSA加密公钥
  516. /// </summary>
  517. [HttpGet]
  518. [HttpPost]
  519. public async Task<IActionResult> GetPublicKey()
  520. {
  521. if (Request.Method == "POST")
  522. {
  523. var request = new WeChatPayRiskGetPublicKeyRequest();
  524. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  525. ViewData["response"] = response.Body;
  526. return View();
  527. }
  528. return View();
  529. }
  530. /// <summary>
  531. /// 获取平台证书列表
  532. /// </summary>
  533. [HttpGet]
  534. [HttpPost]
  535. public async Task<IActionResult> GetCertificates()
  536. {
  537. if (Request.Method == "POST")
  538. {
  539. var request = new WeChatPayCertificatesRequest();
  540. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  541. ViewData["response"] = response.Body;
  542. return View();
  543. }
  544. return View();
  545. }
  546. /// <summary>
  547. /// 扫码支付-Native下单API
  548. /// </summary>
  549. [HttpGet]
  550. public IActionResult QrCodePayV3()
  551. {
  552. return View();
  553. }
  554. /// <summary>
  555. /// 扫码支付-Native下单API
  556. /// </summary>
  557. /// <param name="viewModel"></param>
  558. [HttpPost]
  559. public async Task<IActionResult> QrCodePayV3(WeChatPayQrCodePayV3ViewModel viewModel)
  560. {
  561. var model = new WeChatPayTransactionsNativeModel
  562. {
  563. AppId = _optionsAccessor.Value.AppId,
  564. MchId = _optionsAccessor.Value.MchId,
  565. Amount = new Amount { Total = viewModel.Total, Currency = "CNY" },
  566. Description = viewModel.Description,
  567. NotifyUrl = viewModel.NotifyUrl,
  568. OutTradeNo = viewModel.OutTradeNo,
  569. };
  570. var request = new WeChatPayTransactionsNativeRequest();
  571. request.SetBizModel(model);
  572. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  573. // response.CodeUrl 给前端生成二维码
  574. ViewData["qrcode"] = response.CodeUrl;
  575. ViewData["response"] = response.Body;
  576. return View();
  577. }
  578. /// <summary>
  579. /// APP支付V3
  580. /// </summary>
  581. [HttpGet]
  582. public IActionResult AppPayV3()
  583. {
  584. return View();
  585. }
  586. /// <summary>
  587. /// APP支付V3
  588. /// </summary>
  589. /// <param name="viewModel"></param>
  590. [HttpPost]
  591. public async Task<IActionResult> AppPayV3(WeChatPayAppPayV3ViewModel viewModel)
  592. {
  593. var model = new WeChatPayTransactionsAppModel
  594. {
  595. AppId = _optionsAccessor.Value.AppId,
  596. MchId = _optionsAccessor.Value.MchId,
  597. Amount = new Amount { Total = viewModel.Total, Currency = "CNY" },
  598. Description = viewModel.Description,
  599. NotifyUrl = viewModel.NotifyUrl,
  600. OutTradeNo = viewModel.OutTradeNo,
  601. };
  602. var request = new WeChatPayTransactionsAppRequest();
  603. request.SetBizModel(model);
  604. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  605. if (!string.IsNullOrEmpty(response.PrepayId))
  606. {
  607. var req = new WeChatPayAppSdkRequest
  608. {
  609. PrepayId = response.PrepayId
  610. };
  611. var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value);
  612. // 将参数(parameter)给 ios/android端 让他调起微信APP(https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5)
  613. ViewData["parameter"] = JsonSerializer.Serialize(parameter);
  614. ViewData["response"] = response.Body;
  615. return View();
  616. }
  617. ViewData["response"] = response.Body;
  618. return View();
  619. }
  620. }
  621. }