using System.Text.Json; using System.Threading.Tasks; using Essensoft.AspNetCore.Payment.WeChatPay; using Essensoft.AspNetCore.Payment.WeChatPay.Domain; using Essensoft.AspNetCore.Payment.WeChatPay.Request; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using WebApplicationSample.Models; namespace WebApplicationSample.Controllers { public class WeChatPayV3Controller : Controller { private readonly IWeChatPayV3Client _client; private readonly IOptions _optionsAccessor; public WeChatPayV3Controller(IWeChatPayV3Client client, IOptions optionsAccessor) { _client = client; _optionsAccessor = optionsAccessor; } /// /// 微信支付指引页 /// public IActionResult Index() { return View(); } /// /// 获取平台证书列表 /// [HttpGet] [HttpPost] public async Task GetCertificates() { if (Request.Method == "POST") { var request = new WeChatPayCertificatesRequest(); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } return View(); } /// /// APP支付-App下单API /// [HttpGet] public IActionResult AppPay() { return View(); } /// /// APP支付-App下单API /// /// [HttpPost] public async Task AppPay(WeChatPayAppPayV3ViewModel viewModel) { var model = new WeChatPayTransactionsAppModel { AppId = _optionsAccessor.Value.AppId, MchId = _optionsAccessor.Value.MchId, Amount = new Amount { Total = viewModel.Total, Currency = "CNY" }, Description = viewModel.Description, NotifyUrl = viewModel.NotifyUrl, OutTradeNo = viewModel.OutTradeNo, }; var request = new WeChatPayTransactionsAppRequest(); request.SetQueryModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); if (response.StatusCode == 200) { var req = new WeChatPayV3AppSdkRequest { PrepayId = response.PrepayId }; var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value); // 将参数(parameter)给 ios/android端 // https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/transactions/chapter3_7.shtml ViewData["parameter"] = JsonSerializer.Serialize(parameter); ViewData["response"] = response.Body; return View(); } ViewData["response"] = response.Body; return View(); } /// /// 公众号支付-JSAPI下单 /// [HttpGet] public IActionResult PubPay() { return View(); } /// /// 公众号支付-JSAPI下单 /// /// [HttpPost] public async Task PubPay(WeChatPayPubPayV3ViewModel viewModel) { var model = new WeChatPayTransactionsJsApiModel { AppId = _optionsAccessor.Value.AppId, MchId = _optionsAccessor.Value.MchId, Amount = new Amount { Total = viewModel.Total, Currency = "CNY" }, Description = viewModel.Description, NotifyUrl = viewModel.NotifyUrl, OutTradeNo = viewModel.OutTradeNo, Payer = new PayerInfo { OpenId = viewModel.OpenId } }; var request = new WeChatPayTransactionsJsApiRequest(); request.SetQueryModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); if (response.StatusCode == 200) { var req = new WeChatPayV3JsApiSdkRequest { Package = "prepay_id=" + response.PrepayId }; var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value); // 将参数(parameter)给 公众号前端 // https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pay/transactions/chapter3_8.shtml ViewData["parameter"] = JsonSerializer.Serialize(parameter); ViewData["response"] = response.Body; return View(); } ViewData["response"] = response.Body; return View(); } /// /// 扫码支付-Native下单API /// [HttpGet] public IActionResult QrCodePay() { return View(); } /// /// 扫码支付-Native下单API /// /// [HttpPost] public async Task QrCodePay(WeChatPayQrCodePayV3ViewModel viewModel) { var model = new WeChatPayTransactionsNativeModel { AppId = _optionsAccessor.Value.AppId, MchId = _optionsAccessor.Value.MchId, Amount = new Amount { Total = viewModel.Total, Currency = "CNY" }, Description = viewModel.Description, NotifyUrl = viewModel.NotifyUrl, OutTradeNo = viewModel.OutTradeNo, }; var request = new WeChatPayTransactionsNativeRequest(); request.SetQueryModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); // response.CodeUrl 给前端生成二维码 ViewData["qrcode"] = response.CodeUrl; ViewData["response"] = response.Body; return View(); } /// /// H5支付-H5下单API /// [HttpGet] public IActionResult H5Pay() { return View(); } /// /// H5支付-H5下单API /// /// [HttpPost] public async Task H5Pay(WeChatPayH5PayV3ViewModel viewModel) { var model = new WeChatPayTransactionsH5Model { AppId = _optionsAccessor.Value.AppId, MchId = _optionsAccessor.Value.MchId, Amount = new Amount { Total = viewModel.Total, Currency = "CNY" }, Description = viewModel.Description, NotifyUrl = viewModel.NotifyUrl, OutTradeNo = viewModel.OutTradeNo, SceneInfo = new SceneInfo { PayerClientIp = "127.0.0.1" } }; var request = new WeChatPayTransactionsH5Request(); request.SetQueryModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); // h5_url为拉起微信支付收银台的中间页面,可通过访问该url来拉起微信客户端,完成支付,h5_url的有效期为5分钟。 ViewData["response"] = response.Body; return View(); } /// /// 微信支付订单号查询 /// [HttpGet] public IActionResult QueryByTransactionId() { return View(); } /// /// 微信支付订单号查询 /// /// [HttpPost] public async Task QueryByTransactionId(WeChatPayQueryByTransactionIdViewModel viewModel) { var request = new WeChatPayTransactionsIdRequest { TransactionId = viewModel.TransactionId, MchId = _optionsAccessor.Value.MchId, }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 商户订单号查询 /// [HttpGet] public IActionResult QueryByOutTradeNo() { return View(); } /// /// 商户订单号查询 /// /// [HttpPost] public async Task QueryByOutTradeNo(WeChatPayQueryByOutTradeNoViewModel viewModel) { var request = new WeChatPayTransactionsOutTradeNoRequest { OutTradeNo = viewModel.OutTradeNo, MchId = _optionsAccessor.Value.MchId, }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 关闭订单 /// [HttpGet] public IActionResult OutTradeNoClose() { return View(); } /// /// 关闭订单 /// /// [HttpPost] public async Task OutTradeNoClose(WeChatPayOutTradeNoCloseViewModel viewModel) { var model = new WeChatPayTransactionsOutTradeNoCloseModel { MchId = _optionsAccessor.Value.MchId, }; var request = new WeChatPayTransactionsOutTradeNoCloseRequest { OutTradeNo = viewModel.OutTradeNo, }; request.SetQueryModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 申请交易账单 /// [HttpGet] public IActionResult TradeBill() { return View(); } /// /// 申请交易账单 /// /// [HttpPost] public async Task TradeBill(WeChatPayTradeBillViewModel viewModel) { var request = new WeChatPayBillTradeBillRequest { BillDate = viewModel.BillDate }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 申请资金账单 /// [HttpGet] public IActionResult FundflowBill() { return View(); } /// /// 申请资金账单 /// /// [HttpPost] public async Task FundflowBill(WeChatPayFundflowBillViewModel viewModel) { var request = new WeChatPayBillFundflowBillRequest { BillDate = viewModel.BillDate }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 下载账单 /// [HttpGet] public IActionResult BillDownload() { return View(); } /// /// 下载账单 /// /// [HttpPost] public async Task BillDownload(WeChatPayBillDownloadViewModel viewModel) { var request = new WeChatPayBillDownloadRequest { DownloadUrl = viewModel.DownloadUrl }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } } }