WeChatPayController.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  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. return Redirect(response.MwebUrl);
  191. }
  192. /// <summary>
  193. /// 小程序支付
  194. /// </summary>
  195. [HttpGet]
  196. public IActionResult LiteAppPay()
  197. {
  198. return View();
  199. }
  200. /// <summary>
  201. /// 小程序支付
  202. /// </summary>
  203. /// <param name="viewModel"></param>
  204. [HttpPost]
  205. public async Task<IActionResult> LiteAppPay(WeChatPayLiteAppPayViewModel viewModel)
  206. {
  207. var request = new WeChatPayUnifiedOrderRequest
  208. {
  209. Body = viewModel.Body,
  210. OutTradeNo = viewModel.OutTradeNo,
  211. TotalFee = viewModel.TotalFee,
  212. SpBillCreateIp = viewModel.SpBillCreateIp,
  213. NotifyUrl = viewModel.NotifyUrl,
  214. TradeType = viewModel.TradeType,
  215. OpenId = viewModel.OpenId
  216. };
  217. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  218. if (response.ReturnCode == WeChatPayCode.Success && response.ResultCode == WeChatPayCode.Success)
  219. {
  220. var req = new WeChatPayLiteAppSdkRequest
  221. {
  222. Package = "prepay_id=" + response.PrepayId
  223. };
  224. var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value);
  225. // 将参数(parameter)给 小程序前端 让他调起支付API(https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=5)
  226. ViewData["parameter"] = JsonSerializer.Serialize(parameter);
  227. ViewData["response"] = response.Body;
  228. return View();
  229. }
  230. ViewData["response"] = response.Body;
  231. return View();
  232. }
  233. /// <summary>
  234. /// 查询订单
  235. /// </summary>
  236. [HttpGet]
  237. public IActionResult OrderQuery()
  238. {
  239. return View();
  240. }
  241. /// <summary>
  242. /// 查询订单
  243. /// </summary>
  244. /// <param name="viewModel"></param>
  245. [HttpPost]
  246. public async Task<IActionResult> OrderQuery(WeChatPayOrderQueryViewModel viewModel)
  247. {
  248. var request = new WeChatPayOrderQueryRequest
  249. {
  250. TransactionId = viewModel.TransactionId,
  251. OutTradeNo = viewModel.OutTradeNo
  252. };
  253. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  254. ViewData["response"] = response.Body;
  255. return View();
  256. }
  257. /// <summary>
  258. /// 撤销订单
  259. /// </summary>
  260. [HttpGet]
  261. public IActionResult Reverse()
  262. {
  263. return View();
  264. }
  265. /// <summary>
  266. /// 撤销订单
  267. /// </summary>
  268. /// <param name="viewModel"></param>
  269. [HttpPost]
  270. public async Task<IActionResult> Reverse(WeChatPayReverseViewModel viewModel)
  271. {
  272. var request = new WeChatPayReverseRequest
  273. {
  274. TransactionId = viewModel.TransactionId,
  275. OutTradeNo = viewModel.OutTradeNo
  276. };
  277. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  278. ViewData["response"] = response.Body;
  279. return View();
  280. }
  281. /// <summary>
  282. /// 关闭订单
  283. /// </summary>
  284. [HttpGet]
  285. public IActionResult CloseOrder()
  286. {
  287. return View();
  288. }
  289. /// <summary>
  290. /// 关闭订单
  291. /// </summary>
  292. /// <param name="viewModel"></param>
  293. [HttpPost]
  294. public async Task<IActionResult> CloseOrder(WeChatPayCloseOrderViewModel viewModel)
  295. {
  296. var request = new WeChatPayCloseOrderRequest
  297. {
  298. OutTradeNo = viewModel.OutTradeNo
  299. };
  300. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  301. ViewData["response"] = response.Body;
  302. return View();
  303. }
  304. /// <summary>
  305. /// 申请退款
  306. /// </summary>
  307. [HttpGet]
  308. public IActionResult Refund()
  309. {
  310. return View();
  311. }
  312. /// <summary>
  313. /// 申请退款
  314. /// </summary>
  315. /// <param name="viewModel"></param>
  316. [HttpPost]
  317. public async Task<IActionResult> Refund(WeChatPayRefundViewModel viewModel)
  318. {
  319. var request = new WeChatPayRefundRequest
  320. {
  321. OutRefundNo = viewModel.OutRefundNo,
  322. TransactionId = viewModel.TransactionId,
  323. OutTradeNo = viewModel.OutTradeNo,
  324. TotalFee = viewModel.TotalFee,
  325. RefundFee = viewModel.RefundFee,
  326. RefundDesc = viewModel.RefundDesc,
  327. NotifyUrl = viewModel.NotifyUrl
  328. };
  329. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  330. ViewData["response"] = response.Body;
  331. return View();
  332. }
  333. /// <summary>
  334. /// 查询退款
  335. /// </summary>
  336. [HttpGet]
  337. public IActionResult RefundQuery()
  338. {
  339. return View();
  340. }
  341. /// <summary>
  342. /// 查询退款
  343. /// </summary>
  344. /// <param name="viewModel"></param>
  345. [HttpPost]
  346. public async Task<IActionResult> RefundQuery(WeChatPayRefundQueryViewModel viewModel)
  347. {
  348. var request = new WeChatPayRefundQueryRequest
  349. {
  350. RefundId = viewModel.RefundId,
  351. OutRefundNo = viewModel.OutRefundNo,
  352. TransactionId = viewModel.TransactionId,
  353. OutTradeNo = viewModel.OutTradeNo
  354. };
  355. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  356. ViewData["response"] = response.Body;
  357. return View();
  358. }
  359. /// <summary>
  360. /// 下载对账单
  361. /// </summary>
  362. [HttpGet]
  363. public IActionResult DownloadBill()
  364. {
  365. return View();
  366. }
  367. /// <summary>
  368. /// 下载对账单
  369. /// </summary>
  370. /// <param name="viewModel"></param>
  371. [HttpPost]
  372. public async Task<IActionResult> DownloadBill(WeChatPayDownloadBillViewModel viewModel)
  373. {
  374. var request = new WeChatPayDownloadBillRequest
  375. {
  376. BillDate = viewModel.BillDate,
  377. BillType = viewModel.BillType,
  378. TarType = viewModel.TarType
  379. };
  380. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  381. ViewData["response"] = response.Body;
  382. return View();
  383. }
  384. /// <summary>
  385. /// 下载资金账单
  386. /// </summary>
  387. [HttpGet]
  388. public IActionResult DownloadFundFlow()
  389. {
  390. return View();
  391. }
  392. /// <summary>
  393. /// 下载资金账单
  394. /// </summary>
  395. /// <param name="viewModel"></param>
  396. [HttpPost]
  397. public async Task<IActionResult> DownloadFundFlow(WeChatPayDownloadFundFlowViewModel viewModel)
  398. {
  399. var request = new WeChatPayDownloadFundFlowRequest
  400. {
  401. BillDate = viewModel.BillDate,
  402. AccountType = viewModel.AccountType,
  403. TarType = viewModel.TarType
  404. };
  405. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  406. ViewData["response"] = response.Body;
  407. return View();
  408. }
  409. /// <summary>
  410. /// 企业付款到零钱
  411. /// </summary>
  412. [HttpGet]
  413. public IActionResult Transfers()
  414. {
  415. return View();
  416. }
  417. /// <summary>
  418. /// 企业付款到零钱
  419. /// </summary>
  420. /// <param name="viewModel"></param>
  421. [HttpPost]
  422. public async Task<IActionResult> Transfers(WeChatPayTransfersViewModel viewModel)
  423. {
  424. var request = new WeChatPayPromotionTransfersRequest
  425. {
  426. PartnerTradeNo = viewModel.PartnerTradeNo,
  427. OpenId = viewModel.OpenId,
  428. CheckName = viewModel.CheckName,
  429. ReUserName = viewModel.ReUserName,
  430. Amount = viewModel.Amount,
  431. Desc = viewModel.Desc,
  432. SpBillCreateIp = viewModel.SpBillCreateIp
  433. };
  434. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  435. ViewData["response"] = response.Body;
  436. return View();
  437. }
  438. /// <summary>
  439. /// 查询企业付款
  440. /// </summary>
  441. [HttpGet]
  442. public IActionResult GetTransferInfo()
  443. {
  444. return View();
  445. }
  446. /// <summary>
  447. /// 查询企业付款
  448. /// </summary>
  449. /// <param name="viewModel"></param>
  450. [HttpPost]
  451. public async Task<IActionResult> GetTransferInfo(WeChatPayGetTransferInfoViewModel viewModel)
  452. {
  453. var request = new WeChatPayGetTransferInfoRequest
  454. {
  455. PartnerTradeNo = viewModel.PartnerTradeNo
  456. };
  457. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  458. ViewData["response"] = response.Body;
  459. return View();
  460. }
  461. /// <summary>
  462. /// 企业付款到银行卡
  463. /// </summary>
  464. [HttpGet]
  465. public IActionResult PayBank()
  466. {
  467. return View();
  468. }
  469. /// <summary>
  470. /// 企业付款到银行卡
  471. /// </summary>
  472. /// <param name="viewModel"></param>
  473. [HttpPost]
  474. public async Task<IActionResult> PayBank(WeChatPayPayBankViewModel viewModel)
  475. {
  476. var request = new WeChatPayPayBankRequest
  477. {
  478. PartnerTradeNo = viewModel.PartnerTradeNo,
  479. EncBankNo = viewModel.EncBankNo,
  480. EncTrueName = viewModel.EncTrueName,
  481. BankCode = viewModel.BankCode,
  482. Amount = viewModel.Amount,
  483. Desc = viewModel.Desc
  484. };
  485. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  486. ViewData["response"] = response.Body;
  487. return View();
  488. }
  489. /// <summary>
  490. /// 查询企业付款银行卡
  491. /// </summary>
  492. [HttpGet]
  493. public IActionResult QueryBank()
  494. {
  495. return View();
  496. }
  497. /// <summary>
  498. /// 查询企业付款银行卡
  499. /// </summary>
  500. /// <param name="viewModel"></param>
  501. [HttpPost]
  502. public async Task<IActionResult> QueryBank(WeChatPayQueryBankViewModel viewModel)
  503. {
  504. var request = new WeChatPayQueryBankRequest
  505. {
  506. PartnerTradeNo = viewModel.PartnerTradeNo
  507. };
  508. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  509. ViewData["response"] = response.Body;
  510. return View();
  511. }
  512. /// <summary>
  513. /// 获取RSA加密公钥
  514. /// </summary>
  515. [HttpGet]
  516. [HttpPost]
  517. public async Task<IActionResult> GetPublicKey()
  518. {
  519. if (Request.Method == "POST")
  520. {
  521. var request = new WeChatPayRiskGetPublicKeyRequest();
  522. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  523. ViewData["response"] = response.Body;
  524. return View();
  525. }
  526. return View();
  527. }
  528. }
  529. }