1
0

WeChatPayController.cs 20 KB

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