最新要闻
- 13+3相豪华供电!影驰RTX 4070 Ti星曜OC显卡图赏
- 女子跨年夜中1000万后悔跟孩子说 他们说不奋斗了引网友热议:这能躺平?
- 环球热议:乘联会:预计2022年乘用车销量2070万辆 今年或0增长
- 存款贬值了快一半 土耳其人把游戏当成了救命稻草
- 每周只上班4天半!乐视居然成了"反卷斗士":真是神仙日子吗?
- 砍单三大产品线 苹果市值跌破2万亿美元 富士康表态
- 世界热点评!抄底吗?知名投资人段永平:已将手上腾讯美股换成苹果
- 天天观速讯丨二次元外观下带来澎湃性能!铭瑄MS RTX 4070 Ti OC12G璦珈评测:最强192bit显卡非它莫属
- 10升好身材!ROG发布冰刃X迷你机:居然有没发布的RTX 4070
- 金庸最成功的作品 来源自历史上让人耻辱的失败
- 焦点要闻:500吨级!中国最强液体火箭发动机的“家”快建好了
- 胡伟武:Linux桌面软件生态是x86和ARM“软肋” 龙芯希望一两年后全面超过
- 丰田总裁再度质疑电动汽车:这会让车企降低价值!
- 每日资讯:RTX 4090加持:ROG发布新款XG Mobile显卡坞
- 即时:三星发布全球首款8K 150寸投影仪:离墙几毫米即可完成投射
- 焦点热文:画面太美!男子意外发现交通卡余额有172万 官方回应真相无奈
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
微信支付--JSAPI支付(微信小程序和微信公众号支付都可以采用该方式)
(资料图片仅供参考)
本实例使用了工具包SKIT.FlurlHttpClient.Wechat.TenpayV3(github:https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat)
示例中的_repositoryWrapper的相关使用是我们业务中的业务代码,使用者可以根据自己的业务自行删除。
1、生成预支付订单(供前端调用,返回的信息供小程序端或公众号端调起微信支付).
public async TaskGeneratePrePaidOrder(PrePaidOrderRequestDto orderBasic) { string orderStatus = await _repositoryWrapper.OrderRepository.QueryOrderStatusAsync(orderBasic.OrderId); //订单已取消||订单已支付 if (orderStatus == OrderStatus.Cancel.ToString("D") || orderStatus == OrderStatus.PaySuccess.ToString("D")) { PayTransactionDto payTransaction = new() { OrderStatus = orderStatus, }; return payTransaction; } //string serialNumber = RSAUtility.ExportSerialNumber(@"D:\1630126864_20220905_cert\apiclient_cert.pem"); var manager = new InMemoryCertificateManager(); var options = new WechatTenpayClientOptions() { MerchantId = _config["MerchantId"],//商户号 MerchantV3Secret = _config["MerchantV3Secret"],//商户API v3密钥 MerchantCertificateSerialNumber = _config["MerchantCertificateSerialNumber"],//商户API证书序列号 MerchantCertificatePrivateKey = FileContentHelper.ReadFileContent("apiclient_key.pem", Path.Combine(AppContext.BaseDirectory, "apiclient_key.pem")),//商户API证书私钥 PlatformCertificateManager = manager // 证书管理器的具体用法请参阅下文的高级技巧与加密、验签有关的章节 }; var client = new WechatTenpayClient(options); /* 以 JSAPI 统一下单接口为例 */ //var userLogin = await _userService.UserLogin(orderBasic.JSCode); Log.Information("OpenId is " + orderBasic.OpenId); Log.Information("OrderId is " + orderBasic.OrderId); IEnumerable orderList = await _repositoryWrapper.OrderRepository.GetOrderPriceAndQty(orderBasic.OrderId); int total = 0; foreach (OrderDetailEntity orderDetail in orderList) { total += orderDetail.TicketTypePrice * 100 * orderDetail.Qty; } total = (int)(total - orderBasic.UseWalletAmount * 100); long orderNumber = await _repositoryWrapper.OrderRepository.QueryOrderNumberByOrderIdAsync(orderBasic.OrderId); var request = new CreatePayTransactionJsapiRequest() { OutTradeNumber = orderNumber.ToString(), AppId = _config["EmscnplAppId"],//微信 AppId Description = $"订单号为{orderNumber}", ExpireTime = DateTimeOffset.Now.AddSeconds(200), NotifyUrl = _config["wechatPayNotifyUrl"],//回调地址 Amount = new() { Total = total //Total = 1 }, Payer = new() { OpenId = orderBasic.OpenId //OpenId = "oLS5G5C9C2KZuYo-Y9HhyyP-RiFs" }, Attachment = orderBasic.UseWalletAmount.ToString(), }; //var response = await client.ExecuteCreatePayTransactionH5Async(request); var response = await client.ExecuteCreatePayTransactionJsapiAsync(request); Log.Information("response ExecuteCreatePayTransactionJsapiAsync {@response}", response); if (response.IsSuccessful()) { //Console.WriteLine("PrepayId:" + response.PrepayId); //var collection = ExtractQueryParams(response.H5Url); //var prepayId = collection["prepay_id"]; //var package= collection["package"]; var paramMap = client.GenerateParametersForJsapiPayRequest(request.AppId, response.PrepayId); Log.Information("response paramMap {@paramMap}", paramMap); PayTransactionDto payTransaction = new() { WechatpayNonce = paramMap["nonceStr"], WechatpaySignature = paramMap["paySign"], WeChatPrepayId = response.PrepayId, TimeStamp = paramMap["timeStamp"], SignType = paramMap["signType"], Package = paramMap["package"], OrderStatus = orderStatus, }; Log.Information("payTransaction information {@payTransaction}", payTransaction); await _repositoryWrapper.OrderRepository.UpdateOrderStatusAsync(new Contract.OrderStatusDto { OrderId = orderBasic.OrderId, OrderStatus = OrderStatus.PrePay.ToString("D") }); await _repositoryWrapper.RedPackageRepository.BatchUpdateRedPackeStatus(orderBasic.VoucherId, orderBasic.WeChatId, orderBasic.OrderId, RedpackageUseEnum.Lock); await _repositoryWrapper.OrderRepository.BindWechatId(orderBasic.OrderId, orderBasic.WeChatId); return payTransaction; } else { throw new Exception("ExecuteCreatePayTransactionJsapiAsync call return fail"); } }
2、支付完成后的回调方法处理
Controller方法:
////// 支付成功后的回调函数 /// /// /// /// /// ///[HttpPost("WeChatPayNotifyUrl", Name = "WeChatPayNotifyUrl")] public async Task WeChatPayNotifyUrl( [FromHeader(Name = "Wechatpay-Timestamp")] string timestamp, [FromHeader(Name = "Wechatpay-Nonce")] string nonce, [FromHeader(Name = "Wechatpay-Signature")] string signature, [FromHeader(Name = "Wechatpay-Serial")] string serialNumber) { // 接收服务器推送 // 文档:https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_2.shtml using var reader = new StreamReader(Request.Body, Encoding.UTF8); string content = await reader.ReadToEndAsync(); Log.Information("Wechatpay-Timestamp data is {@content}", content); Log.Information("Wechatpay-Nonce {@nonce}", nonce); Log.Information("Wechatpay-Signature {@signature}", signature); Log.Information("Wechatpay-Serial {@serialNumber}", serialNumber); _weChatAppService.ParseNotifyData(timestamp, nonce, content, signature, serialNumber); }
Service方法:
public async void ParseNotifyData(string timeStamp, string nonce, string content, string signature, string serialNumber) { var manager = new InMemoryCertificateManager(); var options = new WechatTenpayClientOptions() { MerchantId = _config["MerchantId"],//商户号 MerchantV3Secret = _config["MerchantV3Secret"],//商户API v3密钥 MerchantCertificateSerialNumber = _config["MerchantCertificateSerialNumber"],//商户API证书序列号 MerchantCertificatePrivateKey = FileContentHelper.ReadFileContent("apiclient_key.pem", Path.Combine(AppContext.BaseDirectory, "apiclient_key.pem")),//商户API证书私钥 PlatformCertificateManager = manager // 证书管理器的具体用法请参阅下文的高级技巧与加密、验签有关的章节 }; var client = new WechatTenpayClient(options); var request = new QueryCertificatesRequest(); var response = await client.ExecuteQueryCertificatesAsync(request); if (response.IsSuccessful()) { response = client.DecryptResponseSensitiveProperty(response); foreach (var certificateModel in response.CertificateList) { manager.AddEntry(new CertificateEntry(certificateModel)); } Log.Information("查询微信商户平台证书成功。"); } bool valid = client.VerifyEventSignature(timeStamp, nonce, content, signature, serialNumber, out Exception? error); if (valid) { /* 将 JSON 反序列化得到通知对象 */ /* 你也可以将 WechatTenpayEvent 类型直接绑定到 MVC 模型上,这样就不再需要手动反序列化 */ var callbackModel = client.DeserializeEvent(content); if ("TRANSACTION.SUCCESS".Equals(callbackModel.EventType)) { /* 根据事件类型,解密得到支付通知敏感数据 */ var callbackResource = client.DecryptEventResource(callbackModel); string outTradeNumber = callbackResource.OutTradeNumber; string transactionId = callbackResource.TransactionId; Log.Information("回调返回的解密数据为{@callbackResource}", callbackResource); Console.WriteLine("订单 {0} 已完成支付,交易单号为 {1}", outTradeNumber, transactionId); Log.Information("outTradeNumber is " + outTradeNumber); Log.Information("outTradeNumber is " + transactionId); #region[存取支付结果] string boxCode = await GetBoxCodeByOrderNumber(Convert.ToInt64(outTradeNumber)); //解绑机器; await _repositoryWrapper.UserBoxRepository.UnBindBox(boxCode); var orderId = await _repositoryWrapper.OrderRepository.QueryOrderIdByOrderNumberAsync(Convert.ToInt64(outTradeNumber)); Log.Information("Update order pay result"); await _repositoryWrapper.OrderRepository.SavePayResult(new OrderEntity() { OrderId = orderId, OutTradeNo = Int64.Parse(outTradeNumber), TradeState = callbackResource.TradeState, TradeStateDesc = callbackResource.TradeStateDescription, BankType = callbackResource.BankType, Total = callbackResource.Amount.Total, OpenId = callbackResource.Payer.OpenId, PayTotal = callbackResource.Amount.PayerTotal, TransactionId = callbackResource.TransactionId, SuccessTime = callbackResource.SuccessTime.ToString() }); #endregion Log.Information("Update order pay status"); if (!String.IsNullOrWhiteSpace(callbackResource.Attachment)) { decimal walletAmount = 0m; if (Decimal.TryParse(callbackResource.Attachment, out walletAmount) && walletAmount > 0) { string weChatId = await _repositoryWrapper.OrderRepository.QueryWeChatIdByOrderId(orderId); await _repositoryWrapper.WalletRepository.PayUseWallet(new List (), orderId, weChatId, walletAmount, false, true); } } await _repositoryWrapper.OrderRepository.UpdateOrderStatusByOrderNumberAsync(Convert.ToInt64(outTradeNumber), OrderStatus.PaySuccess.ToString("D"), (decimal)callbackResource.Amount.PayerTotal / 100); await _repositoryWrapper.RedPackageRepository.BatchUpdateRedPackeStatus(orderId, RedpackageUseEnum.Used); } else { /* 根据事件类型,解密得到支付通知敏感数据 */ var callbackResource = client.DecryptEventResource (callbackModel); string outTradeNumber = callbackResource.OutTradeNumber; JObject obj = new(); obj.Add("action", "payFail"); var payFailStr = JsonConvert.SerializeObject(obj); await _repositoryWrapper.OrderRepository.UpdateOrderStatusByOrderNumberAsync(Convert.ToInt64(outTradeNumber), OrderStatus.PayFail.ToString("D"), (decimal)callbackResource.Amount.PayerTotal / 100); } } else { Log.Error("Verify fail"); Log.Error("Verify fail is {@error}", error); } }
3、查询支付结果
_orderService是我们业务中使用的service,使用方可自行根据自身业务删除。
public async TaskQueryOrderPayStatus(OrderBaseDto orderBasic) { PayResultDto payResultDto = new PayResultDto(); string orderStatus = await _repositoryWrapper.OrderRepository.QueryOrderStatusAsync(orderBasic.OrderId); if (orderStatus != null) { OrderStatus orderEnumStatus = OrderStatus.UnDefine; if (System.Enum.TryParse(orderStatus, out orderEnumStatus) && orderEnumStatus == OrderStatus.PaySuccess) { payResultDto.PaySuccess = true; payResultDto.ContributionAmount = await _orderService.GetOrderContributionAsync(orderBasic.OrderId); ; return payResultDto; } } //string serialNumber = RSAUtility.ExportSerialNumber(@"D:\1630126864_20220905_cert\apiclient_cert.pem"); var manager = new InMemoryCertificateManager(); var options = new WechatTenpayClientOptions() { MerchantId = _config["MerchantId"],//商户号 MerchantV3Secret = _config["MerchantV3Secret"],//商户API v3密钥 MerchantCertificateSerialNumber = _config["MerchantCertificateSerialNumber"],//商户API证书序列号 MerchantCertificatePrivateKey = FileContentHelper.ReadFileContent("apiclient_key.pem", Path.Combine(AppContext.BaseDirectory, "apiclient_key.pem")),//商户API证书私钥 PlatformCertificateManager = manager // 证书管理器的具体用法请参阅下文的高级技巧与加密、验签有关的章节 }; var client = new WechatTenpayClient(options); /* 以 JSAPI 统一下单接口为例 */ //var userLogin = await _userService.UserLogin(orderBasic.JSCode); Log.Information("OrderId is " + orderBasic.OrderId); long orderNumber = await _repositoryWrapper.OrderRepository.QueryOrderNumberByOrderIdAsync(orderBasic.OrderId); var request = new GetPayTransactionByOutTradeNumberRequest() { OutTradeNumber = orderNumber.ToString(), MerchantId = _config["MerchantId"],//商户号 WechatpayCertificateSerialNumber = _config["MerchantCertificateSerialNumber"]//商户API证书序列号 }; var response = await client.ExecuteGetPayTransactionByOutTradeNumberAsync(request); Log.Information("response {@response}", response); if (response.IsSuccessful() && response.TradeState == "SUCCESS") { int payTotal = response.Amount.Total; Console.WriteLine("pay amount:" + payTotal); Log.Information($"QueryOrder order {orderNumber} payTotal is {payTotal}"); if (payTotal > 0) { await _repositoryWrapper.OrderRepository.UpdateOrderStatusAsync(new OrderStatusDto() { OrderId = orderBasic.OrderId, OrderStatus = OrderStatus.PaySuccess.ToString("D"), }); payResultDto.PaySuccess = true; payResultDto.ContributionAmount = await _orderService.GetOrderContributionAsync(orderBasic.OrderId); //payResultDto.Amount = payTotal/100m; } } else { Log.Information($"response.RawStatus is {response.RawStatus}"); Log.Information($"response.ErrorCode is {response.ErrorCode},response.ErrorMessage is {response.ErrorMessage}"); //throw new Exception($"QueryOrder call return fail,orderNumber is {orderNumber}"); } return payResultDto; }
-
微信支付--JSAPI支付(微信小程序和微信公众号支付都可以采用该方式)
本实例使用了工具包SKIT FlurlHttpClient Wechat TenpayV3(github:https: github com fudiwei DotNetCore SKIT Flur
来源: 微信支付--JSAPI支付(微信小程序和微信公众号支付都可以采用该方式)
13+3相豪华供电!影驰RTX 4070 Ti星曜OC显卡图赏
女子跨年夜中1000万后悔跟孩子说 他们说不奋斗了引网友热议:这能躺平?
环球热议:乘联会:预计2022年乘用车销量2070万辆 今年或0增长
存款贬值了快一半 土耳其人把游戏当成了救命稻草
每周只上班4天半!乐视居然成了"反卷斗士":真是神仙日子吗?
一本通动态规划篇解题报告
当前视讯!Python的保留字、标识符、变量的定义、常用数据类型、数据类型转换
砍单三大产品线 苹果市值跌破2万亿美元 富士康表态
世界热点评!抄底吗?知名投资人段永平:已将手上腾讯美股换成苹果
天天观速讯丨二次元外观下带来澎湃性能!铭瑄MS RTX 4070 Ti OC12G璦珈评测:最强192bit显卡非它莫属
10升好身材!ROG发布冰刃X迷你机:居然有没发布的RTX 4070
金庸最成功的作品 来源自历史上让人耻辱的失败
焦点要闻:500吨级!中国最强液体火箭发动机的“家”快建好了
世界信息:CF13C. Sequence
看点:设计模式简单介绍
胡伟武:Linux桌面软件生态是x86和ARM“软肋” 龙芯希望一两年后全面超过
丰田总裁再度质疑电动汽车:这会让车企降低价值!
每日资讯:RTX 4090加持:ROG发布新款XG Mobile显卡坞
即时:三星发布全球首款8K 150寸投影仪:离墙几毫米即可完成投射
焦点热文:画面太美!男子意外发现交通卡余额有172万 官方回应真相无奈
天天速看:写给大忙人看的Go语言快速指南(中文翻译)
天天实时:[概率论与数理统计]笔记:2.2 随机变量的数字特征
Python:numpy模块最详细的教程
python3实现字符串的全排列的方法(无重复字符)两种解决方法
全球快播:python中可以处理word文档的模块:docx模块
环球即时看!宏碁发布eKinekt BD 3酷骑桌:工作之余还能骑动感单车
世界热讯:1.6亿美元是罚定了!印度法庭驳回谷歌推翻垄断案的请求
当前热点-17万元起真香!奇瑞最高颜值SUV星途瑶光盲订量已达6012台
环球热点评!2022广州车展压轴登场 这八款新能源新车千万不要错过
今头条!全新NT架构加持!腾讯QQ原生上架麒麟应用商店
天天微资讯!国产可乐为什么都在陆续消失?专家道出原因
哄娃神器 一公司推出可自动驾驶婴儿车:售价约2.2万人民币
画风有《魔兽》那味了:国产多端MMO《塔瑞斯世界》PV首曝
【环球热闻】男子一口气网购20个26元扫地机器人:场面壮观实测失望
男子为研究显卡到网吧一口气拿7块:网友调侃要都是4090赚大
环球微资讯!Float value issue in GLSL
【环球热闻】事件总线 + 函数计算构建云上最佳事件驱动架构应用
实时:C罗说世界杯唯一赢阿根廷的是沙特 这里是新挑战 不是养老
配大哥H9同款2.0T 国产豪华轿跑红旗H6官图发布:罕见中置双排气
全球热头条丨微软再次挑战谷歌:Bing或将推出ChatGPT AI版本
【全球时快讯】一加首次推出100W双口充电器:支持65W PD快充 首发229元
世界观点:华系车崛起!欧洲每10台新能源汽车 就有1台来自中国
MySQL——索引
全球关注:易基因|METTL3 通过调节m6A 修饰抑制口腔鳞状细胞癌安罗替尼敏感性 | 肿瘤研究
环球今头条!苹果app怎么上架
天天看热讯:有史以来第一个6GHz CPU i9-13900KS现身中国!要卖6500元?
【当前热闻】3999元用4年依然流畅!一加11开启预售
热头条丨奥迪A6L提车三天出问题 4、5挡异响!4S店同意退车
热文:河南一女生118元买网红甜品巴斯克蛋糕 收到后吐槽像烧饼:生日毁了
环球动态:60多岁男子高速逆行撞废比亚迪新车 刚提一个月心疼不已
JS逆向实战10——某集团RSA长加密
WINDOWS文本编辑器丨EmEditor功能简介
天天最资讯丨中国首批电子后视镜来了 吉利旗下路特斯首搭
微头条丨1000元大额券:骆驼户外徒步鞋179元起、夹棉冲锋衣199元起
长安马自达旗舰SUV大促:优惠7万多、还送5万公里延保
杨迪在淘宝真的火 阳敌手机壳搜索量暴涨2300倍
一加11搭载三星2K柔性微曲屏:安卓首发随帧变动技术
【K哥爬虫普法】大数据风控第一案:从魔蝎科技案件判决,看爬虫技术刑事边界
简讯:通过持续交付提升发布效率
三款免费强大的SSH工具食用指南
焦点速递!Rpmbuild原码打包成rpm包
微速讯:App在苹果上架难吗
快讯:00后员工吐槽老板创意土被约谈 网友:老一辈审美观需升级
苹果妥协了!iOS第三方商店有望上线:欧洲iPhone专享
全球新动态:女子关窗围炉煮茶3小时致一氧化碳中毒:医生科普紧急救助办法
天天即时看!北京2人坠冰身亡 专家科普发现冰面破裂该如何自救
今日快讯:IO、NIO、BIO傻傻分不清吗,让我对象告诉你~~
游客误把燃香扔进400年文物里:网友心痛!科普雍和宫须弥山
专家称《原神》唯美:展现出我国的高现代化水准
今头条!尚硅谷Vue2.0+3.0的笔记资料(cli开始)
天天消息!docx替换word属性打勾
【天天播资讯】贾跃亭的法拉第未来重返2023年CES FF 91完成一系列升级
【速看料】二手车商亏哭!日系车保值“神话”破灭 国人无视省油、小毛病少爱上新能源
全球今热点:曾称污染比燃油车更大!丰田章男再度质疑电动车
郑州大气!明日10点起发放年货消费券:全国用户都能用
每日速读!全球首款!外星人推出24.5寸500Hz IPS电竞显示器:0.5ms急速响应
浅析 Dubbo 3.0 中接口级地址推送性能的优化
环球快报:行走的救护员!凯迪拉克车主把AED放车上:还允许破窗使用
焦点!特斯拉自动辅助驾驶追尾事故车辆 前车车主当场被吓懵
Win11 22H2又出新Bug:文件管理器随机“突然出现”
【独家焦点】动物也懂协同合作 两只雪豹一起偷鸡:一只踩点、一只放哨
天天播报:雷军:相信旗舰机会全部标配无线充电
环球快资讯:实战Flink sql语法改造
快讯:上映仅半个月 《阿凡达2》拿下2022全球票房年度冠军:超越《壮志凌云2》
当前通讯!现货:抗原检测试剂盒3.9元/份(顺丰包邮)
NVIDIA发布RTX视频超分辨率技术:看视频也有“DLSS”了
世界新资讯:时隔15年 Qi2无线充电标准官宣:基于苹果MagSafe打造 磁吸将降临安卓
面试官:Docker 有几种网络模式?5 年工作经验都表示答不上来。。
梦想云图Node.JS服务 (网页CAD,在线CAD )
每日看点!upload-lab靶场
世界讯息:电动车充电自燃一家4口不幸遇难 现场惨烈:网友感慨为何在家充电?
百事通!新势力年交付突破百万背后 谁得意 谁失意?
环球新消息丨安卓阵营绝无仅有!一加11屏幕体验最接近苹果iPhone ProMotion
全球焦点!售价或低于20万 特斯全新入门新车效果图曝光:颜值挺高
焦点要闻:祖传1200万像素要终结!曝苹果iPhone 15将配备4800万像素
滑雪不会刹车女生一路靠吼下坡 网友调侃练河东狮吼:医生科普受伤有多严重
环球新动态:一加11今天发!起步就是12GB+256GB 拒绝凑数卡价位
PC主机消失不可避免:备胎随时上位
快看点丨华硕ROG发布首款四频Wi-Fi 7八爪鱼游戏路由:25Gbps、三万兆网口