WeChatPayController.cs 21 KB

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