WeChatPayV3Controller.cs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. using System.Text.Json;
  2. using System.Threading.Tasks;
  3. using Essensoft.AspNetCore.Payment.WeChatPay;
  4. using Essensoft.AspNetCore.Payment.WeChatPay.Domain;
  5. using Essensoft.AspNetCore.Payment.WeChatPay.Request;
  6. using Microsoft.AspNetCore.Mvc;
  7. using Microsoft.Extensions.Options;
  8. using WebApplicationSample.Models;
  9. namespace WebApplicationSample.Controllers
  10. {
  11. public class WeChatPayV3Controller : Controller
  12. {
  13. private readonly IWeChatPayV3Client _client;
  14. private readonly IOptions<WeChatPayOptions> _optionsAccessor;
  15. public WeChatPayV3Controller(IWeChatPayV3Client 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. [HttpPost]
  32. public async Task<IActionResult> GetCertificates()
  33. {
  34. if (Request.Method == "POST")
  35. {
  36. var request = new WeChatPayCertificatesRequest();
  37. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  38. ViewData["response"] = response.Body;
  39. return View();
  40. }
  41. return View();
  42. }
  43. /// <summary>
  44. /// APP支付-App下单API
  45. /// </summary>
  46. [HttpGet]
  47. public IActionResult AppPay()
  48. {
  49. return View();
  50. }
  51. /// <summary>
  52. /// APP支付-App下单API
  53. /// </summary>
  54. /// <param name="viewModel"></param>
  55. [HttpPost]
  56. public async Task<IActionResult> AppPay(WeChatPayAppPayV3ViewModel viewModel)
  57. {
  58. var model = new WeChatPayTransactionsAppModel
  59. {
  60. AppId = _optionsAccessor.Value.AppId,
  61. MchId = _optionsAccessor.Value.MchId,
  62. Amount = new Amount { Total = viewModel.Total, Currency = "CNY" },
  63. Description = viewModel.Description,
  64. NotifyUrl = viewModel.NotifyUrl,
  65. OutTradeNo = viewModel.OutTradeNo,
  66. };
  67. var request = new WeChatPayTransactionsAppRequest();
  68. request.SetBodyModel(model);
  69. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  70. if (response.StatusCode == 200)
  71. {
  72. var req = new WeChatPayV3AppSdkRequest
  73. {
  74. PrepayId = response.PrepayId
  75. };
  76. var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value);
  77. // 将参数(parameter)给 ios/android端
  78. // https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/transactions/chapter3_7.shtml
  79. ViewData["parameter"] = JsonSerializer.Serialize(parameter);
  80. ViewData["response"] = response.Body;
  81. return View();
  82. }
  83. ViewData["response"] = response.Body;
  84. return View();
  85. }
  86. /// <summary>
  87. /// 公众号支付-JSAPI下单
  88. /// </summary>
  89. [HttpGet]
  90. public IActionResult PubPay()
  91. {
  92. return View();
  93. }
  94. /// <summary>
  95. /// 公众号支付-JSAPI下单
  96. /// </summary>
  97. /// <param name="viewModel"></param>
  98. [HttpPost]
  99. public async Task<IActionResult> PubPay(WeChatPayPubPayV3ViewModel viewModel)
  100. {
  101. var model = new WeChatPayTransactionsJsApiModel
  102. {
  103. AppId = _optionsAccessor.Value.AppId,
  104. MchId = _optionsAccessor.Value.MchId,
  105. Amount = new Amount { Total = viewModel.Total, Currency = "CNY" },
  106. Description = viewModel.Description,
  107. NotifyUrl = viewModel.NotifyUrl,
  108. OutTradeNo = viewModel.OutTradeNo,
  109. Payer = new Payer { OpenId = viewModel.OpenId }
  110. };
  111. var request = new WeChatPayTransactionsJsApiRequest();
  112. request.SetBodyModel(model);
  113. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  114. if (response.StatusCode == 200)
  115. {
  116. var req = new WeChatPayV3JsApiSdkRequest
  117. {
  118. Package = "prepay_id=" + response.PrepayId
  119. };
  120. var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value);
  121. // 将参数(parameter)给 公众号前端
  122. // https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/transactions/chapter3_8.shtml
  123. ViewData["parameter"] = JsonSerializer.Serialize(parameter);
  124. ViewData["response"] = response.Body;
  125. return View();
  126. }
  127. ViewData["response"] = response.Body;
  128. return View();
  129. }
  130. /// <summary>
  131. /// 扫码支付-Native下单API
  132. /// </summary>
  133. [HttpGet]
  134. public IActionResult QrCodePay()
  135. {
  136. return View();
  137. }
  138. /// <summary>
  139. /// 扫码支付-Native下单API
  140. /// </summary>
  141. /// <param name="viewModel"></param>
  142. [HttpPost]
  143. public async Task<IActionResult> QrCodePay(WeChatPayQrCodePayV3ViewModel viewModel)
  144. {
  145. var model = new WeChatPayTransactionsNativeModel
  146. {
  147. AppId = _optionsAccessor.Value.AppId,
  148. MchId = _optionsAccessor.Value.MchId,
  149. Amount = new Amount { Total = viewModel.Total, Currency = "CNY" },
  150. Description = viewModel.Description,
  151. NotifyUrl = viewModel.NotifyUrl,
  152. OutTradeNo = viewModel.OutTradeNo,
  153. };
  154. var request = new WeChatPayTransactionsNativeRequest();
  155. request.SetBodyModel(model);
  156. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  157. // response.CodeUrl 给前端生成二维码
  158. ViewData["qrcode"] = response.CodeUrl;
  159. ViewData["response"] = response.Body;
  160. return View();
  161. }
  162. /// <summary>
  163. /// H5支付-H5下单API
  164. /// </summary>
  165. [HttpGet]
  166. public IActionResult H5Pay()
  167. {
  168. return View();
  169. }
  170. /// <summary>
  171. /// H5支付-H5下单API
  172. /// </summary>
  173. /// <param name="viewModel"></param>
  174. [HttpPost]
  175. public async Task<IActionResult> H5Pay(WeChatPayH5PayV3ViewModel viewModel)
  176. {
  177. var model = new WeChatPayTransactionsH5Model
  178. {
  179. AppId = _optionsAccessor.Value.AppId,
  180. MchId = _optionsAccessor.Value.MchId,
  181. Amount = new Amount { Total = viewModel.Total, Currency = "CNY" },
  182. Description = viewModel.Description,
  183. NotifyUrl = viewModel.NotifyUrl,
  184. OutTradeNo = viewModel.OutTradeNo,
  185. SceneInfo = new SceneInfo { PayerClientIp = "127.0.0.1" }
  186. };
  187. var request = new WeChatPayTransactionsH5Request();
  188. request.SetBodyModel(model);
  189. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  190. // h5_url为拉起微信支付收银台的中间页面,可通过访问该url来拉起微信客户端,完成支付,h5_url的有效期为5分钟。
  191. ViewData["response"] = response.Body;
  192. return View();
  193. }
  194. /// <summary>
  195. /// 微信支付订单号查询
  196. /// </summary>
  197. [HttpGet]
  198. public IActionResult QueryByTransactionId()
  199. {
  200. return View();
  201. }
  202. /// <summary>
  203. /// 微信支付订单号查询
  204. /// </summary>
  205. /// <param name="viewModel"></param>
  206. [HttpPost]
  207. public async Task<IActionResult> QueryByTransactionId(WeChatPayQueryByTransactionIdViewModel viewModel)
  208. {
  209. var request = new WeChatPayTransactionsIdRequest
  210. {
  211. TransactionId = viewModel.TransactionId,
  212. MchId = _optionsAccessor.Value.MchId,
  213. };
  214. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  215. ViewData["response"] = response.Body;
  216. return View();
  217. }
  218. /// <summary>
  219. /// 商户订单号查询
  220. /// </summary>
  221. [HttpGet]
  222. public IActionResult QueryByOutTradeNo()
  223. {
  224. return View();
  225. }
  226. /// <summary>
  227. /// 商户订单号查询
  228. /// </summary>
  229. /// <param name="viewModel"></param>
  230. [HttpPost]
  231. public async Task<IActionResult> QueryByOutTradeNo(WeChatPayQueryByOutTradeNoViewModel viewModel)
  232. {
  233. var request = new WeChatPayTransactionsOutTradeNoRequest
  234. {
  235. OutTradeNo = viewModel.OutTradeNo,
  236. MchId = _optionsAccessor.Value.MchId,
  237. };
  238. var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
  239. ViewData["response"] = response.Body;
  240. return View();
  241. }
  242. }
  243. }