您现在的位置是:网站首页> 编程资料编程资料
.NET Core之微信支付之公众号、H5支付详解_实用技巧_
2023-05-24
291人已围观
简介 .NET Core之微信支付之公众号、H5支付详解_实用技巧_
前言
本篇主要记录微信支付中公众号及H5支付全过程。
准备篇
公众号或者服务号(并开通微信支付功能)、商户平台中开通JSAPI支付、H5支付。
配置篇
公众号或者服务号中 -------开发-------开发者工具---------web开发者工具-------绑定为开发者
公众号或者服务号中 -------公众号设置--------功能设置 :填写业务域名、JS安全域名、网页授权域名 示例:pay.one.com
商户平台中--------产品中心-------开发配置------JSAPI支付授权目录填写:http://pay.one.com/ http://pay.one.com/WeChatPay/PubPay/-----H5支付填写:pay.one.com



若对配置还有疑问,可参考官方文档:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6
开发篇
JSAPI支付
本Demo是基于Payment 的SDK开发。具体详情可参考: https://github.com/Essensoft/Payment
首先 使用Nuget安装payment:
Install-Package :Essensoft.AspNetCore.Payment.WeChatPay -Version 2.3.2
建一个Model: WeChatPayPubPayViewModel
public class WeChatPayPubPayViewModel { [Required] [Display(Name = "out_trade_no")] public string OutTradeNo { get; set; } [Required] [Display(Name = "body")] public string Body { get; set; } [Required] [Display(Name = "total_fee")] public int TotalFee { get; set; } [Required] [Display(Name = "spbill_create_ip")] public string SpbillCreateIp { get; set; } [Required] [Display(Name = "notify_url")] public string NotifyUrl { get; set; } [Required] [Display(Name = "trade_type")] public string TradeType { get; set; } [Required] [Display(Name = "openid")] public string OpenId { get; set; } }WeChatPayController:
//微信支付请求客户端(用于处理请求与响应) private readonly IWeChatPayClient _client; private readonly ILogger_logger; private IHttpContextAccessor _accessor; public WeChatPayController(IWeChatPayClient client, IHttpContextAccessor accessor, ILogger logger) { _client = client; _accessor = accessor; _logger = logger; } /// /// 公众号支付 /// ///[HttpGet] public IActionResult PubPay() { WeChatPayPubPayViewModel payModel=new WeChatPayPubPayViewModel() { Body = "微信公众号支付测试", OutTradeNo = DateTime.Now.ToString("yyyyMMddHHmmssfff"), TotalFee = 1,//分 单位 SpbillCreateIp = "127.0.0.1", NotifyUrl = "http://pay.one.com/notify/wechatpay/unifiedorder", TradeType = "JSAPI", OpenId = "" //此处需进行授权 获取OpenId }; return View(payModel); } /// /// 公众号支付 /// /// ///[HttpPost] public async Task PubPay(WeChatPayPubPayViewModel viewModel) { if(string.IsNullOrEmpty(viewModel.OpenId)) { ViewData["response"] = "请返回上级重新进入此页面以获取最新数据"; return View(); } 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 //此处需进行授权 获取OpenId }; var response = await _client.ExecuteAsync(request);if (response.ReturnCode == "SUCCESS" && response.ResultCode == "SUCCESS") { var req = new WeChatPayH5CallPaymentRequest { Package = "prepay_id=" + response.PrepayId }; var parameter = await _client.ExecuteAsync(req); // 将参数(parameter)给 公众号前端 让他在微信内H5调起支付(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6) ViewData["parameter"] = JsonConvert.SerializeObject(parameter); ViewData["response"] = response.Body; return View(); } ViewData["response"] = response.Body; return View(); }
注意:公众号或者微信内支付,需要授权获取到用户的OpenId。所以,此处我们还需要进行微信授权,而授权方式有两种,一种是静默授权、一种是需要用户同意,区别是 静默授权只能拿到Openid,而经用户同意后可拿到 微信头像、昵称、性别等其他信息。
具体可参阅文档: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
页面:
@using Newtonsoft.Json @model WeChatPayPubPayViewModel @{ ViewData["Title"] = "公众号支付-统一下单"; }
@section Scripts { @{await Html.RenderPartialAsync("_ValidationScriptsPartial"); } } 此时:PayBack Action如下:
[HttpGet] public async TaskPayBack() { var code = Request.Query["code"]; var state = Request.Query["state"]; OAuthToken tokenModel = new OAuthToken(); //通过code换取token if (!string.IsNullOrEmpty(code)) { _logger.LogWarning("授权成功"); ViewBag.Code = code; tokenModel = OauthApi.GetAuthToken(code, wechatAppId); } var request = new WeChatPayUnifiedOrderRequest { Body = "微信公众号支付测试", OutTradeNo = DateTime.Now.ToString("yyyyMMddHHmmssfff"), TotalFee = 1,//分 单位 SpbillCreateIp = "127.0.0.1", NotifyUrl = "http://pay.one.com/notify/wechatpay/unifiedorder", TradeType = "JSAPI", OpenId = tokenModel.Openid //此处需进行授权 获取OpenId }; var response = await _client.ExecuteAsync(request); _logger.LogWarning($"统一下单接口返回:{response.ReturnCode}"); if (response.ReturnCode == "SUCCESS" && response.ResultCode == "SUCCESS") { var req = new WeChatPayH5CallPaymentRequest { Package = "prepay_id=" + response.PrepayId }; var parameter = await _client.ExecuteAsync(req); // 将参数(parameter)给 公众号前端 让他在微信内H5调起支付(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6) ViewData["parameter"] = JsonConvert.SerializeObject(parameter); _logger.LogWarning($"统一下单成功,即将调起微信支付:{ViewData["parameter"].ToString()}"); ViewData["response"] = response.Body; return View(); } ViewData["response"] = response.Body; return View(); }
其中:OAuthToken是网页授权 返回的实体:
/// 获取网页授权token时,返回的实体 /// public class OAuthToken : BaseRes { /// /// 网页授权接口调用凭证。注意:此access_token与基础支持的access_token不同 /// [JsonProperty("access_token")] public string AccessToken { get; set; } private int _expiresIn; /// /// access_token接口调用凭证超时时间,单位(秒) /// [JsonProperty("expires_in")] public int ExpiresIn { get { return _expiresIn; } set { ExpiresTime = DateTime.Now.AddSeconds(value); _expiresIn = value; } } /// /// 用于刷新access_token /// [JsonProperty("refresh_token")] public string RefreshToken { get; set; } /// /// 用户唯一标识。请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的openid /// [JsonProperty("openid")] public string Openid { get; set; } /// /// 用户授权的作用域,使用逗号(,)分隔 /// [JsonProperty("scope")] public string Scope { get; set; } [JsonProperty("expires_time")] public DateTime ExpiresTime { get; set; } /// /// 只有在用户将公众号绑定到微信开放平台账号后,才会出现该字段 /// [JsonProperty("unionid")] public string Unionid { get; set; } } 最后 贴一下支付成功后的回调函数:
[Route("notify/wechatpay")] public class WeChatPayNotifyController : Controller { private readon
相关内容
- ASP.NET Core中自定义路由约束的实现_实用技巧_
- 列举ASP.NET页面之间传递值的几种方式_实用技巧_
- asp.net core系列之模型绑定和验证方法_实用技巧_
- .NET生成水印更好的方法实例代码_实用技巧_
- aspnetcore 实现简单的伪静态化功能_实用技巧_
- ASP.NET第一次访问慢的完美解决方案(MVC,Web Api)_实用技巧_
- .Net学习笔记之Layui多图片上传功能_实用技巧_
- Linux服务器下利用Docker部署.net Core项目的全过程_实用技巧_
- 使用.NET Core实现饿了吗拆红包功能_实用技巧_
- ASP.NET Core MVC学习教程之路由(Routing)_实用技巧_
点击排行
本栏推荐
