WeChatPayController.cs 19 KB

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