WeChatPayController.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  1. using System.Text.Json;
  2. using System.Threading.Tasks;
  3. using Essensoft.AspNetCore.Payment.WeChatPay;
  4. using Essensoft.AspNetCore.Payment.WeChatPay.V2;
  5. using Essensoft.AspNetCore.Payment.WeChatPay.V2.Request;
  6. using Microsoft.AspNetCore.Mvc;
  7. using Microsoft.Extensions.Options;
  8. using WebApplicationSample.Models;
  9. namespace WebApplicationSample.Controllers
  10. {
  11. public class WeChatPayController : Controller
  12. {
  13. private readonly IWeChatPayClient _client;
  14. private readonly IOptions<WeChatPayOptions> _optionsAccessor;
  15. public WeChatPayController(IWeChatPayClient client, IOptions<WeChatPayOptions> optionsAccessor)
  16. {
  17. _client = client;
  18. _optionsAccessor = optionsAccessor;
  19. }
  20. /// <summary>
  21. /// 微信支付指引页
  22. /// </summary>
  23. public IActionResult Index()
  24. {
  25. return View();
  26. }
  27. /// <summary>
  28. /// 刷卡支付
  29. /// </summary>
  30. [HttpGet]
  31. public IActionResult MicroPay()
  32. {
  33. return View();
  34. }
  35. /// <summary>
  36. /// 刷卡支付
  37. /// </summary>
  38. /// <param name="viewModel"></param>
  39. [HttpPost]
  40. public async Task<IActionResult> MicroPay(WeChatPayMicroPayViewModel viewModel)
  41. {
  42. var request = new WeChatPayMicroPayRequest
  43. {
  44. Body = viewModel.Body,
  45. OutTradeNo = viewModel.OutTradeNo,
  46. TotalFee = viewModel.TotalFee,
  47. SpBillCreateIp = viewModel.SpBillCreateIp,
  48. AuthCode = viewModel.AuthCode
  49. };
  50. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  51. ViewData["response"] = response.Body;
  52. return View();
  53. }
  54. /// <summary>
  55. /// 公众号支付
  56. /// </summary>
  57. [HttpGet]
  58. public IActionResult PubPay()
  59. {
  60. return View();
  61. }
  62. /// <summary>
  63. /// 公众号支付
  64. /// </summary>
  65. /// <param name="viewModel"></param>
  66. [HttpPost]
  67. public async Task<IActionResult> PubPay(WeChatPayPubPayViewModel viewModel)
  68. {
  69. var request = new WeChatPayUnifiedOrderRequest
  70. {
  71. Body = viewModel.Body,
  72. OutTradeNo = viewModel.OutTradeNo,
  73. TotalFee = viewModel.TotalFee,
  74. SpBillCreateIp = viewModel.SpBillCreateIp,
  75. NotifyUrl = viewModel.NotifyUrl,
  76. TradeType = viewModel.TradeType,
  77. OpenId = viewModel.OpenId
  78. };
  79. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  80. if (response.ReturnCode == WeChatPayCode.Success && response.ResultCode == WeChatPayCode.Success)
  81. {
  82. var req = new WeChatPayJsApiSdkRequest
  83. {
  84. Package = "prepay_id=" + response.PrepayId
  85. };
  86. var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value);
  87. // 将参数(parameter)给 公众号前端 让他在微信内H5调起支付(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6)
  88. ViewData["parameter"] = JsonSerializer.Serialize(parameter);
  89. ViewData["response"] = response.Body;
  90. return View();
  91. }
  92. ViewData["response"] = response.Body;
  93. return View();
  94. }
  95. /// <summary>
  96. /// 扫码支付
  97. /// </summary>
  98. [HttpGet]
  99. public IActionResult QrCodePay()
  100. {
  101. return View();
  102. }
  103. /// <summary>
  104. /// 扫码支付
  105. /// </summary>
  106. /// <param name="viewModel"></param>
  107. [HttpPost]
  108. public async Task<IActionResult> QrCodePay(WeChatPayQrCodePayViewModel viewModel)
  109. {
  110. var request = new WeChatPayUnifiedOrderRequest
  111. {
  112. Body = viewModel.Body,
  113. OutTradeNo = viewModel.OutTradeNo,
  114. TotalFee = viewModel.TotalFee,
  115. SpBillCreateIp = viewModel.SpBillCreateIp,
  116. NotifyUrl = viewModel.NotifyUrl,
  117. TradeType = viewModel.TradeType
  118. };
  119. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  120. // response.CodeUrl 给前端生成二维码
  121. ViewData["qrcode"] = response.CodeUrl;
  122. ViewData["response"] = response.Body;
  123. return View();
  124. }
  125. /// <summary>
  126. /// APP支付
  127. /// </summary>
  128. [HttpGet]
  129. public IActionResult AppPay()
  130. {
  131. return View();
  132. }
  133. /// <summary>
  134. /// APP支付
  135. /// </summary>
  136. /// <param name="viewModel"></param>
  137. [HttpPost]
  138. public async Task<IActionResult> AppPay(WeChatPayAppPayViewModel viewModel)
  139. {
  140. var request = new WeChatPayUnifiedOrderRequest
  141. {
  142. Body = viewModel.Body,
  143. OutTradeNo = viewModel.OutTradeNo,
  144. TotalFee = viewModel.TotalFee,
  145. SpBillCreateIp = viewModel.SpBillCreateIp,
  146. NotifyUrl = viewModel.NotifyUrl,
  147. TradeType = viewModel.TradeType
  148. };
  149. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  150. if (response.ReturnCode == WeChatPayCode.Success && response.ResultCode == WeChatPayCode.Success)
  151. {
  152. var req = new WeChatPayAppSdkRequest
  153. {
  154. PrepayId = response.PrepayId
  155. };
  156. var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value);
  157. // 将参数(parameter)给 ios/android端 让他调起微信APP(https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5)
  158. ViewData["parameter"] = JsonSerializer.Serialize(parameter);
  159. ViewData["response"] = response.Body;
  160. return View();
  161. }
  162. ViewData["response"] = response.Body;
  163. return View();
  164. }
  165. /// <summary>
  166. /// H5支付
  167. /// </summary>
  168. [HttpGet]
  169. public IActionResult H5Pay()
  170. {
  171. return View();
  172. }
  173. /// <summary>
  174. /// H5支付
  175. /// </summary>
  176. /// <param name="viewModel"></param>
  177. [HttpPost]
  178. public async Task<IActionResult> H5Pay(WeChatPayH5PayViewModel viewModel)
  179. {
  180. var request = new WeChatPayUnifiedOrderRequest
  181. {
  182. Body = viewModel.Body,
  183. OutTradeNo = viewModel.OutTradeNo,
  184. TotalFee = viewModel.TotalFee,
  185. SpBillCreateIp = viewModel.SpBillCreateIp,
  186. NotifyUrl = viewModel.NotifyUrl,
  187. TradeType = viewModel.TradeType
  188. };
  189. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  190. // mweb_url为拉起微信支付收银台的中间页面,可通过访问该url来拉起微信客户端,完成支付,mweb_url的有效期为5分钟。
  191. ViewData["response"] = response.Body;
  192. return View();
  193. }
  194. /// <summary>
  195. /// 小程序支付
  196. /// </summary>
  197. [HttpGet]
  198. public IActionResult MiniProgramPay()
  199. {
  200. return View();
  201. }
  202. /// <summary>
  203. /// 小程序支付
  204. /// </summary>
  205. /// <param name="viewModel"></param>
  206. [HttpPost]
  207. public async Task<IActionResult> MiniProgramPay(WeChatPayMiniProgramPayViewModel 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 WeChatPayMiniProgramSdkRequest
  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. }
  531. }