using System.Text.Json; using System.Threading.Tasks; using Essensoft.Paylink.WeChatPay; using Essensoft.Paylink.WeChatPay.V2; using Essensoft.Paylink.WeChatPay.V2.Request; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using WebApplicationSample.Models; namespace WebApplicationSample.Controllers { public class WeChatPayController : Controller { private readonly ILogger _logger; private readonly IWeChatPayClient _client; private readonly IOptions _optionsAccessor; public WeChatPayController(ILogger logger, IWeChatPayClient client, IOptions optionsAccessor) { _logger = logger; _client = client; _optionsAccessor = optionsAccessor; } /// /// 微信支付指引页 /// public IActionResult Index() { return View(); } /// /// 刷卡支付 /// [HttpGet] public IActionResult MicroPay() { return View(); } /// /// 刷卡支付 /// /// [HttpPost] public async Task MicroPay(WeChatPayMicroPayViewModel viewModel) { var request = new WeChatPayMicroPayRequest { Body = viewModel.Body, OutTradeNo = viewModel.OutTradeNo, TotalFee = viewModel.TotalFee, SpBillCreateIp = viewModel.SpBillCreateIp, AuthCode = viewModel.AuthCode }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 公众号支付 /// [HttpGet] public IActionResult PubPay() { return View(); } /// /// 公众号支付 /// /// [HttpPost] public async Task PubPay(WeChatPayPubPayViewModel viewModel) { var request = new WeChatPayUnifiedOrderRequest { Body = viewModel.Body, OutTradeNo = viewModel.OutTradeNo, TotalFee = viewModel.TotalFee, SpBillCreateIp = viewModel.SpBillCreateIp, NotifyUrl = viewModel.NotifyUrl, TradeType = viewModel.TradeType, OpenId = viewModel.OpenId }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); if (response.ReturnCode == WeChatPayCode.Success && response.ResultCode == WeChatPayCode.Success) { var req = new WeChatPayJsApiSdkRequest { Package = "prepay_id=" + response.PrepayId }; var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value); // 将参数(parameter)给 公众号前端 让他在微信内H5调起支付(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6) ViewData["parameter"] = JsonSerializer.Serialize(parameter); ViewData["response"] = response.Body; return View(); } ViewData["response"] = response.Body; return View(); } /// /// 扫码支付 /// [HttpGet] public IActionResult QrCodePay() { return View(); } /// /// 扫码支付 /// /// [HttpPost] public async Task QrCodePay(WeChatPayQrCodePayViewModel viewModel) { var request = new WeChatPayUnifiedOrderRequest { Body = viewModel.Body, OutTradeNo = viewModel.OutTradeNo, TotalFee = viewModel.TotalFee, SpBillCreateIp = viewModel.SpBillCreateIp, NotifyUrl = viewModel.NotifyUrl, TradeType = viewModel.TradeType, ProfitSharing = viewModel.ProfitSharing }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); // response.CodeUrl 给前端生成二维码 ViewData["qrcode"] = response.CodeUrl; ViewData["response"] = response.Body; return View(); } /// /// APP支付 /// [HttpGet] public IActionResult AppPay() { return View(); } /// /// APP支付 /// /// [HttpPost] public async Task AppPay(WeChatPayAppPayViewModel viewModel) { var request = new WeChatPayUnifiedOrderRequest { Body = viewModel.Body, OutTradeNo = viewModel.OutTradeNo, TotalFee = viewModel.TotalFee, SpBillCreateIp = viewModel.SpBillCreateIp, NotifyUrl = viewModel.NotifyUrl, TradeType = viewModel.TradeType }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); if (response.ReturnCode == WeChatPayCode.Success && response.ResultCode == WeChatPayCode.Success) { var req = new WeChatPayAppSdkRequest { PrepayId = response.PrepayId }; var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value); // 将参数(parameter)给 ios/android端 让他调起微信APP(https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5) ViewData["parameter"] = JsonSerializer.Serialize(parameter); ViewData["response"] = response.Body; return View(); } ViewData["response"] = response.Body; return View(); } /// /// H5支付 /// [HttpGet] public IActionResult H5Pay() { return View(); } /// /// H5支付 /// /// [HttpPost] public async Task H5Pay(WeChatPayH5PayViewModel viewModel) { var request = new WeChatPayUnifiedOrderRequest { Body = viewModel.Body, OutTradeNo = viewModel.OutTradeNo, TotalFee = viewModel.TotalFee, SpBillCreateIp = viewModel.SpBillCreateIp, NotifyUrl = viewModel.NotifyUrl, TradeType = viewModel.TradeType }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); // mweb_url为拉起微信支付收银台的中间页面,可通过访问该url来拉起微信客户端,完成支付,mweb_url的有效期为5分钟。 ViewData["response"] = response.Body; return View(); } /// /// 小程序支付 /// [HttpGet] public IActionResult MiniProgramPay() { return View(); } /// /// 小程序支付 /// /// [HttpPost] public async Task MiniProgramPay(WeChatPayMiniProgramPayViewModel viewModel) { var request = new WeChatPayUnifiedOrderRequest { Body = viewModel.Body, OutTradeNo = viewModel.OutTradeNo, TotalFee = viewModel.TotalFee, SpBillCreateIp = viewModel.SpBillCreateIp, NotifyUrl = viewModel.NotifyUrl, TradeType = viewModel.TradeType, OpenId = viewModel.OpenId }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); if (response.ReturnCode == WeChatPayCode.Success && response.ResultCode == WeChatPayCode.Success) { var req = new WeChatPayMiniProgramSdkRequest { Package = "prepay_id=" + response.PrepayId }; var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value); // 将参数(parameter)给 小程序前端 让他调起支付API(https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=5) ViewData["parameter"] = JsonSerializer.Serialize(parameter); ViewData["response"] = response.Body; return View(); } ViewData["response"] = response.Body; return View(); } /// /// 查询订单 /// [HttpGet] public IActionResult OrderQuery() { return View(); } /// /// 查询订单 /// /// [HttpPost] public async Task OrderQuery(WeChatPayOrderQueryViewModel viewModel) { var request = new WeChatPayOrderQueryRequest { TransactionId = viewModel.TransactionId, OutTradeNo = viewModel.OutTradeNo }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 撤销订单 /// [HttpGet] public IActionResult Reverse() { return View(); } /// /// 撤销订单 /// /// [HttpPost] public async Task Reverse(WeChatPayReverseViewModel viewModel) { var request = new WeChatPayReverseRequest { TransactionId = viewModel.TransactionId, OutTradeNo = viewModel.OutTradeNo }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 关闭订单 /// [HttpGet] public IActionResult CloseOrder() { return View(); } /// /// 关闭订单 /// /// [HttpPost] public async Task CloseOrder(WeChatPayCloseOrderViewModel viewModel) { var request = new WeChatPayCloseOrderRequest { OutTradeNo = viewModel.OutTradeNo }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 申请退款 /// [HttpGet] public IActionResult Refund() { return View(); } /// /// 申请退款 /// /// [HttpPost] public async Task Refund(WeChatPayRefundViewModel viewModel) { var request = new WeChatPayRefundRequest { OutRefundNo = viewModel.OutRefundNo, TransactionId = viewModel.TransactionId, OutTradeNo = viewModel.OutTradeNo, TotalFee = viewModel.TotalFee, RefundFee = viewModel.RefundFee, RefundDesc = viewModel.RefundDesc, NotifyUrl = viewModel.NotifyUrl }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 查询退款 /// [HttpGet] public IActionResult RefundQuery() { return View(); } /// /// 查询退款 /// /// [HttpPost] public async Task RefundQuery(WeChatPayRefundQueryViewModel viewModel) { var request = new WeChatPayRefundQueryRequest { RefundId = viewModel.RefundId, OutRefundNo = viewModel.OutRefundNo, TransactionId = viewModel.TransactionId, OutTradeNo = viewModel.OutTradeNo }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 下载对账单 /// [HttpGet] public IActionResult DownloadBill() { return View(); } /// /// 下载对账单 /// /// [HttpPost] public async Task DownloadBill(WeChatPayDownloadBillViewModel viewModel) { var request = new WeChatPayDownloadBillRequest { BillDate = viewModel.BillDate, BillType = viewModel.BillType, TarType = viewModel.TarType }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 下载资金账单 /// [HttpGet] public IActionResult DownloadFundFlow() { return View(); } /// /// 下载资金账单 /// /// [HttpPost] public async Task DownloadFundFlow(WeChatPayDownloadFundFlowViewModel viewModel) { var request = new WeChatPayDownloadFundFlowRequest { BillDate = viewModel.BillDate, AccountType = viewModel.AccountType, TarType = viewModel.TarType }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 企业付款到零钱 /// [HttpGet] public IActionResult Transfers() { return View(); } /// /// 企业付款到零钱 /// /// [HttpPost] public async Task Transfers(WeChatPayTransfersViewModel viewModel) { var request = new WeChatPayPromotionTransfersRequest { PartnerTradeNo = viewModel.PartnerTradeNo, OpenId = viewModel.OpenId, CheckName = viewModel.CheckName, ReUserName = viewModel.ReUserName, Amount = viewModel.Amount, Desc = viewModel.Desc, SpBillCreateIp = viewModel.SpBillCreateIp }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 查询企业付款 /// [HttpGet] public IActionResult GetTransferInfo() { return View(); } /// /// 查询企业付款 /// /// [HttpPost] public async Task GetTransferInfo(WeChatPayGetTransferInfoViewModel viewModel) { var request = new WeChatPayGetTransferInfoRequest { PartnerTradeNo = viewModel.PartnerTradeNo }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 企业付款到银行卡 /// [HttpGet] public IActionResult PayBank() { return View(); } /// /// 企业付款到银行卡 /// /// [HttpPost] public async Task PayBank(WeChatPayPayBankViewModel viewModel) { var request = new WeChatPayPayBankRequest { PartnerTradeNo = viewModel.PartnerTradeNo, BankNo = viewModel.BankNo, TrueName = viewModel.TrueName, BankCode = viewModel.BankCode, Amount = viewModel.Amount, Desc = viewModel.Desc }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 查询企业付款银行卡 /// [HttpGet] public IActionResult QueryBank() { return View(); } /// /// 查询企业付款银行卡 /// /// [HttpPost] public async Task QueryBank(WeChatPayQueryBankViewModel viewModel) { var request = new WeChatPayQueryBankRequest { PartnerTradeNo = viewModel.PartnerTradeNo }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 获取RSA加密公钥 /// [HttpGet] [HttpPost] public async Task GetPublicKey() { if (Request.Method == "POST") { var request = new WeChatPayRiskGetPublicKeyRequest(); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } return View(); } /// /// 添加分账接收方 /// [HttpGet] public IActionResult ProfitSharingAddReceiver() { return View(); } /// /// 添加分账接收方 /// [HttpPost] public async Task ProfitSharingAddReceiver(WeChatPayProfitSharingAddReceiverViewModel viewModel) { var request = new WeChatPayProfitSharingAddReceiverRequest { Receiver = viewModel.Receiver }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 单次分账 /// [HttpGet] public IActionResult ProfitSharing() { return View(); } /// /// 单次分账 /// [HttpPost] public async Task ProfitSharing(WeChatPayProfitSharingViewModel viewModel) { var request = new WeChatPayProfitSharingRequest { TransactionId = viewModel.TransactionId, OutOrderNo = viewModel.OutOrderNo, Receivers = viewModel.Receivers }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } } }