using System.Collections.Generic; using System.Text.Json; using System.Threading.Tasks; using Essensoft.Paylink.WeChatPay; using Essensoft.Paylink.WeChatPay.V3; using Essensoft.Paylink.WeChatPay.V3.Domain; using Essensoft.Paylink.WeChatPay.V3.Request; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using WebApplicationSample.Models; namespace WebApplicationSample.Controllers { public class WeChatPayV3Controller : Controller { private readonly ILogger _logger; private readonly IWeChatPayClient _client; private readonly IOptions _optionsAccessor; public WeChatPayV3Controller(ILogger logger, IWeChatPayClient client, IOptions optionsAccessor) { _logger = logger; _client = client; _optionsAccessor = optionsAccessor; } /// /// 微信支付指引页 /// public IActionResult Index() { return View(); } /// /// APP支付-App下单API /// [HttpGet] public IActionResult AppPay() { return View(); } /// /// APP支付-App下单API /// /// [HttpPost] public async Task AppPay(WeChatPayAppPayV3ViewModel viewModel) { var model = new WeChatPayTransactionsAppBodyModel { 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.SetBodyModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); if (!response.IsError) { var req = new WeChatPayAppSdkRequest { PrepayId = response.PrepayId }; var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value); // 将参数(parameter)给 ios/android端 // https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_4.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 WeChatPayTransactionsJsApiBodyModel { 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.SetBodyModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); if (!response.IsError) { var req = new WeChatPayJsApiSdkRequest { Package = "prepay_id=" + response.PrepayId }; var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value); // 将参数(parameter)给 公众号前端 // https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_4.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 WeChatPayTransactionsNativeBodyModel { 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.SetBodyModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); if (!response.IsError) { // 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 WeChatPayTransactionsH5BodyModel { 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", H5Info = new H5Info { Type = "Wap" } } }; var request = new WeChatPayTransactionsH5Request(); request.SetBodyModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); // h5_url为拉起微信支付收银台的中间页面,可通过访问该url来拉起微信客户端,完成支付,h5_url的有效期为5分钟。 // https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_3_4.shtml ViewData["response"] = response.Body; return View(); } /// /// 小程序支付-JSAPI下单 /// [HttpGet] public IActionResult MiniProgramPay() { return View(); } /// /// 小程序支付-JSAPI下单 /// /// [HttpPost] public async Task MiniProgramPay(WeChatPayPubPayV3ViewModel viewModel) { var model = new WeChatPayTransactionsJsApiBodyModel { 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.SetBodyModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); if (!response.IsError) { var req = new WeChatPayMiniProgramSdkRequest { Package = "prepay_id=" + response.PrepayId }; var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value); // 将参数(parameter)给 小程序端 // https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_4.shtml ViewData["parameter"] = JsonSerializer.Serialize(parameter); ViewData["response"] = response.Body; return View(); } ViewData["response"] = response.Body; return View(); } /// /// 微信支付订单号查询 /// [HttpGet] public IActionResult QueryByTransactionId() { return View(); } /// /// 微信支付订单号查询 /// /// [HttpPost] public async Task QueryByTransactionId(WeChatPayQueryByTransactionIdViewModel viewModel) { var model = new WeChatPayTransactionsIdQueryModel { MchId = _optionsAccessor.Value.MchId, }; var request = new WeChatPayTransactionsIdRequest { TransactionId = viewModel.TransactionId }; request.SetQueryModel(model); 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 model = new WeChatPayTransactionsOutTradeNoQueryModel { MchId = _optionsAccessor.Value.MchId, }; var request = new WeChatPayTransactionsOutTradeNoRequest { OutTradeNo = viewModel.OutTradeNo, }; request.SetQueryModel(model); 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 WeChatPayTransactionsOutTradeNoCloseBodyModel { MchId = _optionsAccessor.Value.MchId, }; var request = new WeChatPayTransactionsOutTradeNoCloseRequest { OutTradeNo = viewModel.OutTradeNo, }; request.SetBodyModel(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 model = new WeChatPayBillTradeBillQueryModel { BillDate = viewModel.BillDate }; var request = new WeChatPayBillTradeBillRequest(); request.SetQueryModel(model); 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 model = new WeChatPayBillFundflowBillQueryModel { BillDate = viewModel.BillDate }; var request = new WeChatPayBillFundflowBillRequest(); request.SetQueryModel(model); 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(); request.SetRequestUrl(viewModel.DownloadUrl); 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(WeChatPayV3RefundViewModel viewModel) { var model = new WeChatPayRefundDomesticRefundsBodyModel() { TransactionId = viewModel.TransactionId, OutTradeNo = viewModel.OutTradeNo, OutRefundNo = viewModel.OutRefundNo, NotifyUrl = viewModel.NotifyUrl, Amount = new RefundAmount { Refund = viewModel.RefundAmount, Total = viewModel.TotalAmount, Currency = viewModel.Currency } }; var request = new WeChatPayRefundDomesticRefundsRequest(); request.SetBodyModel(model); 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(WeChatPayV3RefundQueryViewModel viewModel) { var request = new WeChatPayRefundDomesticRefundsOutRefundNoRequest { OutRefundNo = viewModel.OutRefundNo }; var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } #region 微信支付分 /// /// 支付分-创建支付分订单 /// public IActionResult ServiceOrder() { return View(); } /// /// 支付分-创建支付分订单 /// [HttpPost] public async Task ServiceOrder(WeChatPayScoreServiceOrderViewModel viewModel) { var model = new WeChatPayScoreServiceOrderBodyModel { AppId = _optionsAccessor.Value.AppId, ServiceId = viewModel.ServiceId, OutOrderNo = viewModel.OutOrderNo, ServiceIntroduction = viewModel.ServiceIntroduction, TimeRange = new TimeRange { StartTime = viewModel.StartTime, EndTime = viewModel.EndTime }, RiskFund = new RiskFund { Name = viewModel.RiskFundName, Amount = viewModel.RiskFundAmount }, NotifyUrl = viewModel.NotifyUrl, OpenId = viewModel.OpenId }; var request = new WeChatPayScoreServiceOrderRequest(); request.SetBodyModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 支付分-查询支付分订单 /// public IActionResult ServiceOrderQuery() { return View(); } /// /// 支付分-查询支付分订单 /// [HttpPost] public async Task ServiceOrderQuery(WeChatPayScoreServiceOrderQueryViewModel viewModel) { var model = new WeChatPayScoreServiceOrderQueryModel { AppId = _optionsAccessor.Value.AppId, ServiceId = viewModel.ServiceId, OutOrderNo = viewModel.OutOrderNo, QueryId = viewModel.QueryId }; var request = new WeChatPayScoreServiceOrderQueryRequest(); request.SetQueryModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 支付分-取消支付分订单 /// public IActionResult ServiceOrderCancel() { return View(); } /// /// 支付分-取消支付分订单 /// [HttpPost] public async Task ServiceOrderCancel(WeChatPayScoreServiceOrderCancelViewModel viewModel) { var model = new WeChatPayScoreServiceOrderOutOrderNoCancelBodyModel { AppId = _optionsAccessor.Value.AppId, ServiceId = viewModel.ServiceId, Reason = viewModel.Reason }; var request = new WeChatPayScoreServiceOrderOutOrderNoCancelRequest { OutOrderNo = viewModel.OutOrderNo }; request.SetBodyModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 支付分-修改支付分订单金额 /// public IActionResult ServiceOrderModify() { return View(); } /// /// 支付分-修改支付分订单金额 /// [HttpPost] public async Task ServiceOrderModify(WeChatPayScoreServiceOrderModifyViewModel viewModel) { var model = new WeChatPayScoreServiceOrderOutOrderNoModifyBodyModel { AppId = _optionsAccessor.Value.AppId, ServiceId = viewModel.ServiceId, PostPayments = new List { new PostPayment{ Name = viewModel.Name, Amount = viewModel.Amount, Count = viewModel.Count } }, TotalAmount = viewModel.TotalAmount, Reason = viewModel.Reason }; var request = new WeChatPayScoreServiceOrderOutOrderNoModifyRequest { OutOrderNo = viewModel.OutOrderNo }; request.SetBodyModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 支付分-完结支付分订单 /// public IActionResult ServiceOrderComplete() { return View(); } /// /// 支付分-完结支付分订单 /// [HttpPost] public async Task ServiceOrderComplete(WeChatPayScoreServiceOrderCompleteViewModel viewModel) { var model = new WeChatPayScoreServiceOrderOutOrderNoCompleteBodyModel { AppId = _optionsAccessor.Value.AppId, ServiceId = viewModel.ServiceId, PostPayments = new List { new PostPayment { Name = viewModel.Name, Amount = viewModel.Amount, Count = viewModel.Count } }, TotalAmount = viewModel.TotalAmount }; var request = new WeChatPayScoreServiceOrderOutOrderNoCompleteRequest { OutOrderNo = viewModel.OutOrderNo }; request.SetBodyModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 支付分-商户发起催收扣款 /// public IActionResult ServiceOrderPay() { return View(); } /// /// 支付分-商户发起催收扣款 /// [HttpPost] public async Task ServiceOrderPay(WeChatPayScoreServiceOrderPayViewModel viewModel) { var model = new WeChatPayScoreServiceOrderPayBodyModel { AppId = _optionsAccessor.Value.AppId, ServiceId = viewModel.ServiceId, }; var request = new WeChatPayScoreServiceOrderPayRequest { OutOrderNo = viewModel.OutOrderNo }; request.SetBodyModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 支付分-同步服务订单信息 /// public IActionResult ServiceOrderSync() { return View(); } /// /// 支付分-同步服务订单信息 /// [HttpPost] public async Task ServiceOrderSync(WeChatPayScoreServiceOrderSyncViewModel viewModel) { var model = new WeChatPayScoreServiceOrderSyncBodyModel { AppId = _optionsAccessor.Value.AppId, ServiceId = viewModel.ServiceId, Type = viewModel.Type, Detail = new SyncDetail { PaidTime = viewModel.PaidTime } }; var request = new WeChatPayScoreServiceOrderSyncRequest { OutOrderNo = viewModel.OutOrderNo }; request.SetBodyModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 支付分-创单结单合并 /// public IActionResult ServiceOrderDirectComplete() { return View(); } /// /// 支付分-创单结单合并 /// [HttpPost] public async Task ServiceOrderDirectComplete(WeChatPayScoreServiceOrderDirectCompleteViewModel viewModel) { var model = new WeChatPayScoreServiceOrderDirectCompleteBodyModel { AppId = _optionsAccessor.Value.AppId, ServiceId = viewModel.ServiceId, OutOrderNo = viewModel.OutOrderNo, ServiceIntroduction = viewModel.ServiceIntroduction, PostPayments = new List { new PostPayment{ Name = viewModel.PostPaymentName, Amount = viewModel.PostPaymentAmount, Description = viewModel.PostPaymentDescription, Count = viewModel.PostPaymentCount } }, TimeRange = new TimeRange { StartTime = viewModel.StartTime, EndTime = viewModel.EndTime }, TotalAmount = viewModel.TotalAmount, NotifyUrl = viewModel.NotifyUrl, OpenId = viewModel.OpenId }; var request = new WeChatPayScoreServiceOrderDirectCompleteRequest(); request.SetBodyModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 支付分-商户预授权 /// public IActionResult Permissions() { return View(); } /// /// 支付分-商户预授权 /// [HttpPost] public async Task Permissions(PermissionsViewModel viewModel) { var model = new WeChatPayScorePermissionsBodyModel { AppId = _optionsAccessor.Value.AppId, ServiceId = viewModel.ServiceId, AuthorizationCode = viewModel.AuthorizationCode, NotifyUrl = viewModel.NotifyUrl }; var request = new WeChatPayScorePermissionsRequest(); request.SetBodyModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 支付分-查询用户授权记录(授权协议号) /// public IActionResult PermissionsQueryForAuthCode() { return View(); } /// /// 支付分-查询用户授权记录(授权协议号) /// [HttpPost] public async Task PermissionsQueryForAuthCode(PermissionsQueryForAuthCodeViewModel viewModel) { var model = new WeChatPayScorePermissionsQueryForAuthCodeQueryModel { ServiceId = viewModel.ServiceId, }; var request = new WeChatPayScorePermissionsQueryForAuthCodeRequest { AuthorizationCode = viewModel.AuthorizationCode }; request.SetQueryModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 支付分-解除用户授权关系(授权协议号) /// public IActionResult PermissionsTerminateForAuthCode() { return View(); } /// /// 支付分-解除用户授权关系(授权协议号) /// [HttpPost] public async Task PermissionsTerminateForAuthCode(PermissionsTerminateForAuthCodeViewModel viewModel) { var model = new WeChatPayScorePermissionsTerminateForAuthCodeBodyModel { ServiceId = viewModel.ServiceId, Reason = viewModel.Reason }; var request = new WeChatPayScorePermissionsTerminateForAuthCodeRequest { AuthorizationCode = viewModel.AuthorizationCode }; request.SetBodyModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 支付分-查询用户授权记录(openid) /// public IActionResult PermissionsQueryForOpenId() { return View(); } /// /// 支付分-查询用户授权记录(openid) /// [HttpPost] public async Task PermissionsQueryForOpenId(PermissionsQueryForOpenIdViewModel viewModel) { var model = new WeChatPayScorePermissionsQueryForOpenIdQueryModel { AppId = _optionsAccessor.Value.AppId, ServiceId = viewModel.ServiceId, }; var request = new WeChatPayScorePermissionsQueryForOpenIdRequest { OpenId = viewModel.OpenId }; request.SetQueryModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } /// /// 支付分-解除用户授权关系(OpenId) /// public IActionResult PermissionsTerminateForOpenId() { return View(); } /// /// 支付分-解除用户授权关系(OpenId) /// [HttpPost] public async Task PermissionsTerminateForOpenId(PermissionsTerminateForOpenIdViewModel viewModel) { var model = new WeChatPayScorePermissionsTerminateForOpenIdBodyModel { AppId = _optionsAccessor.Value.AppId, ServiceId = viewModel.ServiceId, Reason = viewModel.Reason }; var request = new WeChatPayScorePermissionsTerminateForOpenIdRequest { OpenId = viewModel.OpenId }; request.SetBodyModel(model); var response = await _client.ExecuteAsync(request, _optionsAccessor.Value); ViewData["response"] = response.Body; return View(); } #endregion } }