.NET Core之微信支付之公众号、H5支付详解(3)

[Route("notify/wechatpay")] public class WeChatPayNotifyController : Controller { private readonly IWeChatPayNotifyClient _client; private readonly ILogger<WeChatPayNotifyController> _logger; public WeChatPayNotifyController(IWeChatPayNotifyClient client,ILogger<WeChatPayNotifyController> logger) { _client = client; _logger = logger; } /// <summary> /// 统一下单支付结果通知 /// </summary> /// <returns></returns> [Route("unifiedorder")] [HttpPost] public async Task<IActionResult> Unifiedorder() { try { _logger.LogWarning($"进入回调"); var payconfig = OpenApi.GetPayConfig(); var notify = await _client.ExecuteAsync<WeChatPayUnifiedOrderNotify>(Request); _logger.LogWarning($"返回状态码:{notify.ReturnCode}"); if (notify.ReturnCode == "SUCCESS") { _logger.LogWarning($"业务结果码:{notify.ResultCode}"); if (notify.ResultCode == "SUCCESS") { _logger.LogWarning($"支付方式:{notify.TradeType}"); _logger.LogWarning($"商户订单号:{notify.OutTradeNo}"); _logger.LogWarning($"微信支付订单号:{notify.TransactionId}"); _logger.LogWarning($"支付金额:{notify.TotalFee}"); return WeChatPayNotifyResult.Success; } } return NoContent(); } catch(Exception ex) { _logger.LogWarning($"回调失败:{ex.Message}"); return NoContent(); } } }

然后测试一下支付,查看服务器Log如下:

H5支付

H5支付是指再除开微信浏览器以外的移动端浏览器上进行微信回复操作。

和上面步骤大体一致,有几个地方需要注意

1:客户端IP问题:H5支付的时候,微信支付系统会根据客户端调起的当前Ip 作为支付Ip,若发现 发起支付请求时,ip有问题,则会支付失败,或者提示系统繁忙。这里贴一下我获取IP的代码:

Utils.GetUserIp(_accessor.HttpContext);//页面上调用 /// <summary> /// 穿过代理服务器获取真实IP /// </summary> /// <returns></returns> public static string GetUserIp(this HttpContext context) { var ip = context.Request.Headers["X-Forwarded-For"].FirstOrDefault(); if (string.IsNullOrEmpty(ip)) { ip = context.Connection.RemoteIpAddress.ToString(); } return ip; }

2:TradeType类型应该是:MWEB

3:若调起微信支付成功后,默认回调到支付首页,若需要设置回调页面,则可以再URl中拼接:

/// <summary> /// H5支付 /// </summary> /// <param></param> /// <returns></returns> [HttpPost] public async Task<IActionResult> 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); // mweb_url为拉起微信支付收银台的中间页面,可通过访问该url来拉起微信客户端,完成支付,mweb_url的有效期为5分钟。 if (response.MwebUrl == null) { ViewData["response"] = response.ReturnMsg; return View(); } return Redirect(response.MwebUrl); }

.NET Core之微信支付之公众号、H5支付详解

更多详细可参考文档: https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4

4:支付结果通知:

注意:

1、同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。

2、后台通知交互时,如果微信收到商户的应答不符合规范或超时,微信会判定本次通知失败,重新发送通知,直到成功为止(在通知一直不成功的情况下,微信总共会发起10次通知,通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 总计 24h4m),但微信不保证通知最终一定能成功。

3、在订单状态不明或者没有收到微信支付结果通知的情况下,建议商户主动调用微信支付【 】确认订单状态。

特别提醒:

1、商户系统对于支付结果通知的内容一定要做 签名验证,并校验返回的订单金额是否与商户侧的订单金额一致 ,防止数据泄漏导致出现“假通知”,造成资金损失。

2、当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。

最后可以测试下H5支付,查看返回的Log:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdsgxd.html