AlipayController.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. using System.Text;
  2. using System.Threading.Tasks;
  3. using Essensoft.AspNetCore.Payment.Alipay;
  4. using Essensoft.AspNetCore.Payment.Alipay.Domain;
  5. using Essensoft.AspNetCore.Payment.Alipay.Notify;
  6. using Essensoft.AspNetCore.Payment.Alipay.Request;
  7. using Microsoft.AspNetCore.Mvc;
  8. using Microsoft.Extensions.Options;
  9. using WebApplicationSample.Models;
  10. namespace WebApplicationSample.Controllers
  11. {
  12. public class AlipayController : Controller
  13. {
  14. private readonly IAlipayClient _client;
  15. private readonly IAlipayNotifyClient _notifyClient;
  16. private readonly IOptions<AlipayOptions> _optionsAccessor;
  17. public AlipayController(IAlipayClient client, IAlipayNotifyClient notifyClient, IOptions<AlipayOptions> optionsAccessor)
  18. {
  19. _client = client;
  20. _notifyClient = notifyClient;
  21. _optionsAccessor = optionsAccessor;
  22. }
  23. /// <summary>
  24. /// 支付宝指引页
  25. /// </summary>
  26. [HttpGet]
  27. public IActionResult Index()
  28. {
  29. return View();
  30. }
  31. /// <summary>
  32. /// 当面付-扫码支付
  33. /// </summary>
  34. [HttpGet]
  35. public IActionResult PreCreate()
  36. {
  37. return View();
  38. }
  39. /// <summary>
  40. /// 当面付-扫码支付
  41. /// </summary>
  42. [HttpPost]
  43. public async Task<IActionResult> PreCreate(AlipayTradePreCreateViewModel viewModel)
  44. {
  45. var model = new AlipayTradePrecreateModel
  46. {
  47. OutTradeNo = viewModel.OutTradeNo,
  48. Subject = viewModel.Subject,
  49. TotalAmount = viewModel.TotalAmount,
  50. Body = viewModel.Body
  51. };
  52. var req = new AlipayTradePrecreateRequest();
  53. req.SetBizModel(model);
  54. req.SetNotifyUrl(viewModel.NotifyUrl);
  55. var response = await _client.CertificateExecuteAsync(req, _optionsAccessor.Value);
  56. ViewData["qrcode"] = response.QrCode;
  57. ViewData["response"] = response.Body;
  58. return View();
  59. }
  60. /// <summary>
  61. /// 当面付-二维码/条码/声波支付
  62. /// </summary>
  63. [HttpGet]
  64. public IActionResult Pay()
  65. {
  66. return View();
  67. }
  68. /// <summary>
  69. /// 当面付-二维码/条码/声波支付
  70. /// </summary>
  71. [HttpPost]
  72. public async Task<IActionResult> Pay(AlipayTradePayViewModel viewModel)
  73. {
  74. var model = new AlipayTradePayModel
  75. {
  76. OutTradeNo = viewModel.OutTradeNo,
  77. Subject = viewModel.Subject,
  78. Scene = viewModel.Scene,
  79. AuthCode = viewModel.AuthCode,
  80. TotalAmount = viewModel.TotalAmount,
  81. Body = viewModel.Body
  82. };
  83. var req = new AlipayTradePayRequest();
  84. req.SetBizModel(model);
  85. var response = await _client.CertificateExecuteAsync(req, _optionsAccessor.Value);
  86. ViewData["response"] = response.Body;
  87. return View();
  88. }
  89. /// <summary>
  90. /// APP支付
  91. /// </summary>
  92. [HttpGet]
  93. public IActionResult AppPay()
  94. {
  95. return View();
  96. }
  97. /// <summary>
  98. /// APP支付
  99. /// </summary>
  100. [HttpPost]
  101. public async Task<IActionResult> AppPay(AlipayTradeAppPayViewModel viewModel)
  102. {
  103. var model = new AlipayTradeAppPayModel
  104. {
  105. OutTradeNo = viewModel.OutTradeNo,
  106. Subject = viewModel.Subject,
  107. ProductCode = viewModel.ProductCode,
  108. TotalAmount = viewModel.TotalAmount,
  109. Body = viewModel.Body
  110. };
  111. var req = new AlipayTradeAppPayRequest();
  112. req.SetBizModel(model);
  113. req.SetNotifyUrl(viewModel.NotifyUrl);
  114. var response = await _client.SdkExecuteAsync(req, _optionsAccessor.Value);
  115. //将response.Body给 ios/android端 由其去调起支付宝APP(https://docs.open.alipay.com/204/105296/ https://docs.open.alipay.com/204/105295/)
  116. ViewData["response"] = response.Body;
  117. return View();
  118. }
  119. /// <summary>
  120. /// 电脑网站支付
  121. /// </summary>
  122. [HttpGet]
  123. public IActionResult PagePay()
  124. {
  125. return View();
  126. }
  127. /// <summary>
  128. /// 电脑网站支付
  129. /// </summary>
  130. /// <param name="viewModel"></param>
  131. [HttpPost]
  132. public async Task<IActionResult> PagePay(AlipayTradePagePayViewModel viewModel)
  133. {
  134. var model = new AlipayTradePagePayModel
  135. {
  136. Body = viewModel.Body,
  137. Subject = viewModel.Subject,
  138. TotalAmount = viewModel.TotalAmount,
  139. OutTradeNo = viewModel.OutTradeNo,
  140. ProductCode = viewModel.ProductCode
  141. };
  142. var req = new AlipayTradePagePayRequest();
  143. req.SetBizModel(model);
  144. req.SetNotifyUrl(viewModel.NotifyUrl);
  145. req.SetReturnUrl(viewModel.ReturnUrl);
  146. var response = await _client.PageExecuteAsync(req, _optionsAccessor.Value);
  147. return Content(response.Body, "text/html", Encoding.UTF8);
  148. }
  149. /// <summary>
  150. /// 手机网站支付
  151. /// </summary>
  152. [HttpGet]
  153. public IActionResult WapPay()
  154. {
  155. return View();
  156. }
  157. /// <summary>
  158. /// 手机网站支付
  159. /// </summary>
  160. [HttpPost]
  161. public async Task<IActionResult> WapPay(AlipayTradeWapPayViewModel viewMode)
  162. {
  163. var model = new AlipayTradeWapPayModel
  164. {
  165. Body = viewMode.Body,
  166. Subject = viewMode.Subject,
  167. TotalAmount = viewMode.TotalAmount,
  168. OutTradeNo = viewMode.OutTradeNo,
  169. ProductCode = viewMode.ProductCode
  170. };
  171. var req = new AlipayTradeWapPayRequest();
  172. req.SetBizModel(model);
  173. req.SetNotifyUrl(viewMode.NotifyUrl);
  174. req.SetReturnUrl(viewMode.ReturnUrl);
  175. var response = await _client.PageExecuteAsync(req, _optionsAccessor.Value);
  176. return Content(response.Body, "text/html", Encoding.UTF8);
  177. }
  178. /// <summary>
  179. /// 交易查询
  180. /// </summary>
  181. [HttpGet]
  182. public IActionResult Query()
  183. {
  184. return View();
  185. }
  186. /// <summary>
  187. /// 交易查询
  188. /// </summary>
  189. [HttpPost]
  190. public async Task<IActionResult> Query(AlipayTradeQueryViewModel viewMode)
  191. {
  192. var model = new AlipayTradeQueryModel
  193. {
  194. OutTradeNo = viewMode.OutTradeNo,
  195. TradeNo = viewMode.TradeNo
  196. };
  197. var req = new AlipayTradeQueryRequest();
  198. req.SetBizModel(model);
  199. var response = await _client.CertificateExecuteAsync(req, _optionsAccessor.Value);
  200. ViewData["response"] = response.Body;
  201. return View();
  202. }
  203. /// <summary>
  204. /// 交易退款
  205. /// </summary>
  206. [HttpGet]
  207. public IActionResult Refund()
  208. {
  209. return View();
  210. }
  211. /// <summary>
  212. /// 交易退款
  213. /// </summary>
  214. [HttpPost]
  215. public async Task<IActionResult> Refund(AlipayTradeRefundViewModel viewMode)
  216. {
  217. var model = new AlipayTradeRefundModel
  218. {
  219. OutTradeNo = viewMode.OutTradeNo,
  220. TradeNo = viewMode.TradeNo,
  221. RefundAmount = viewMode.RefundAmount,
  222. OutRequestNo = viewMode.OutRequestNo,
  223. RefundReason = viewMode.RefundReason
  224. };
  225. var req = new AlipayTradeRefundRequest();
  226. req.SetBizModel(model);
  227. var response = await _client.CertificateExecuteAsync(req, _optionsAccessor.Value);
  228. ViewData["response"] = response.Body;
  229. return View();
  230. }
  231. /// <summary>
  232. /// 退款查询
  233. /// </summary>
  234. [HttpGet]
  235. public IActionResult RefundQuery()
  236. {
  237. return View();
  238. }
  239. /// <summary>
  240. /// 退款查询
  241. /// </summary>
  242. [HttpPost]
  243. public async Task<IActionResult> RefundQuery(AlipayTradeRefundQueryViewModel viewMode)
  244. {
  245. var model = new AlipayTradeFastpayRefundQueryModel
  246. {
  247. OutTradeNo = viewMode.OutTradeNo,
  248. TradeNo = viewMode.TradeNo,
  249. OutRequestNo = viewMode.OutRequestNo
  250. };
  251. var req = new AlipayTradeFastpayRefundQueryRequest();
  252. req.SetBizModel(model);
  253. var response = await _client.CertificateExecuteAsync(req, _optionsAccessor.Value);
  254. ViewData["response"] = response.Body;
  255. return View();
  256. }
  257. /// <summary>
  258. /// 统一转账
  259. /// </summary>
  260. [HttpGet]
  261. public IActionResult Transfer()
  262. {
  263. return View();
  264. }
  265. /// <summary>
  266. /// 统一转账
  267. /// </summary>
  268. [HttpPost]
  269. public async Task<IActionResult> Transfer(AlipayTransferViewModel viewMode)
  270. {
  271. var model = new AlipayFundTransUniTransferModel
  272. {
  273. OutBizNo = viewMode.OutBizNo,
  274. TransAmount = viewMode.TransAmount,
  275. ProductCode = viewMode.ProductCode,
  276. BizScene = viewMode.BizScene,
  277. PayeeInfo = new Participant { Identity = viewMode.PayeeIdentity, IdentityType = viewMode.PayeeIdentityType, Name = viewMode.PayeeName },
  278. Remark = viewMode.Remark
  279. };
  280. var req = new AlipayFundTransUniTransferRequest();
  281. req.SetBizModel(model);
  282. var response = await _client.CertificateExecuteAsync(req, _optionsAccessor.Value);
  283. ViewData["response"] = response.Body;
  284. return View();
  285. }
  286. /// <summary>
  287. /// 查询统一转账订单
  288. /// </summary>
  289. [HttpGet]
  290. public IActionResult TransQuery()
  291. {
  292. return View();
  293. }
  294. /// <summary>
  295. /// 查询统一转账订单
  296. /// </summary>
  297. [HttpPost]
  298. public async Task<IActionResult> TransQuery(AlipayTransQueryViewModel viewMode)
  299. {
  300. var model = new AlipayFundTransCommonQueryModel
  301. {
  302. OutBizNo = viewMode.OutBizNo,
  303. OrderId = viewMode.OrderId
  304. };
  305. var req = new AlipayFundTransCommonQueryRequest();
  306. req.SetBizModel(model);
  307. var response = await _client.CertificateExecuteAsync(req, _optionsAccessor.Value);
  308. ViewData["response"] = response.Body;
  309. return View();
  310. }
  311. /// <summary>
  312. /// 余额查询
  313. /// </summary>
  314. [HttpGet]
  315. public IActionResult AccountQuery()
  316. {
  317. return View();
  318. }
  319. /// <summary>
  320. /// 余额查询
  321. /// </summary>
  322. [HttpPost]
  323. public async Task<IActionResult> AccountQuery(AlipayAccountQueryViewModel viewModel)
  324. {
  325. var model = new AlipayFundAccountQueryModel
  326. {
  327. AlipayUserId = viewModel.AlipayUserId,
  328. AccountType = viewModel.AccountType
  329. };
  330. var req = new AlipayFundAccountQueryRequest();
  331. req.SetBizModel(model);
  332. var response = await _client.CertificateExecuteAsync(req, _optionsAccessor.Value);
  333. ViewData["response"] = response.Body;
  334. return View();
  335. }
  336. /// <summary>
  337. /// 电脑网站支付 - 同步跳转
  338. /// </summary>
  339. [HttpGet]
  340. public async Task<IActionResult> PagePayReturn()
  341. {
  342. try
  343. {
  344. var notify = await _notifyClient.ExecuteAsync<AlipayTradePagePayReturn>(Request, _optionsAccessor.Value);
  345. ViewData["response"] = "支付成功";
  346. return View();
  347. }
  348. catch
  349. {
  350. ViewData["response"] = "出现错误";
  351. return View();
  352. }
  353. }
  354. /// <summary>
  355. /// 手机网站支付 - 同步跳转
  356. /// </summary>
  357. [HttpGet]
  358. public async Task<IActionResult> WapPayReturn()
  359. {
  360. try
  361. {
  362. var notify = await _notifyClient.ExecuteAsync<AlipayTradeWapPayReturn>(Request, _optionsAccessor.Value);
  363. ViewData["response"] = "支付成功";
  364. return View();
  365. }
  366. catch
  367. {
  368. ViewData["response"] = "出现错误";
  369. return View();
  370. }
  371. }
  372. }
  373. }