tnblog
首页
视频
资源
登录

.NET接入微信支付(五)支付通知解析

3300人阅读 2023/2/23 17:12 总访问:26702 评论:0 收藏:0 手机
分类: 微信支付
  1.         /// <summary>
  2.         /// 读取通知请求流
  3.         /// </summary>
  4.         /// <param name="stream"></param>
  5.         /// <returns></returns>
  6.         private string ReadRequest(Stream stream)
  7.         {
  8.             System.IO.Stream s = stream;
  9.             int count = 0;
  10.             byte[] buffer = new byte[1024];
  11.             StringBuilder builder = new StringBuilder();
  12.             while ((count = s.Read(buffer, 01024)) > 0)
  13.             {
  14.                 builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
  15.             }
  16.             s.Flush();
  17.             s.Close();
  18.             s.Dispose();
  19.             return builder.ToString();
  20.         }
  21.         /// <summary>
  22.         /// 支付通知处理
  23.         /// </summary>
  24.         public void ProcessNotify()
  25.         {
  26.             Logger loger = LogManager.GetCurrentClassLogger();
  27.             //读取请求流
  28.             string resultStr = ReadRequest(Request.InputStream);
  29.             loger.Info("获取支付通知:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
  30.             loger.Info("获取支付通知:" + resultStr);
  31.             //解析对象
  32.             WcPayNotifyRequest req = resultStr.FromJsonObj<WcPayNotifyRequest>();
  33.             WechatPayHeader payHeader = new WechatPayHeader(Request.Headers);
  34.             if (!WxPayHelper.VerifySign(resultStr, payHeader))  //验签
  35.             {
  36.                 loger.Info("平台证书验签失败:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
  37.                 Response.StatusCode = 500;
  38.                 Response.Write("{\"code\": \"FAIL\",\"message\": \"验签失败\"}");
  39.                 Response.End();
  40.                 return;
  41.             }
  42.             loger.Info("平台证书验签成功:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
  43.             WcPaySuccessNotifyRequest wcPaySuccess = null;
  44.             if (req.event_type.Contains("SUCCESS"))  //支付成功
  45.             {
  46.                 string decryptText = WxPayHelper.GetAesGcmDecrypt(req.resource.associated_data, req.resource.nonce, req.resource.ciphertext);
  47.                 wcPaySuccess = decryptText.FromJsonObj<WcPaySuccessNotifyRequest>();
  48.                 loger.Info("获取支付通知资源对象解密:" + decryptText);
  49.             }
  50.             //查询订单,判断订单真实性
  51.             if (!QueryOrder(wcPaySuccess))
  52.             {
  53.                 Response.StatusCode = 500;
  54.                 Response.Write("{\"code\": \"FAIL\",\"message\": \"订单未支付成功\"}");
  55.                 Response.End();
  56.                 return;
  57.             }
  58.             else//查询订单支付成功
  59.             {
  60.                 try
  61.                 {
  62.                     //do ....
  63.                     Response.StatusCode = 200;
  64.                     Response.Write("{\"code\": \"SUCCESS\",\"message\": \"OK\"}");
  65.                     Response.End();
  66.                     return;
  67.                 }
  68.                 catch (Exception ex)
  69.                 {
  70.                     loger.Info("处理支付回传结果失败:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
  71.                     loger.Info("处理支付回传结果失败:" + ex.Message + ":" + ex.ToStringEx());
  72.                     Response.StatusCode = 200;
  73.                     Response.Write("{\"code\": \"SUCCESS\",\"message\": \"OK\"}");
  74.                     Response.End();
  75.                     return;
  76.                 }
  77.             }
  78.         }


评价

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

cAPS.net 保存base64位格式的图片

publicvoidUpload() { //取出图片对应的base64位字符 stringimgBase=Request[&quot;imgBase&quot;]; //c#里边的base6...

Quartz.net实例动态改变周期调度。misfire、Cron

Quartz:Java编写的开源的任务调度作业框架 类似Timer之类定时执行的功能,但是更强大Quartz.NET:是把Quartz转成C# NuGet...

.net Windows服务发布、安装、卸载、监听脚本。服务调试

一、脚本 为方便不用每次都去写安装卸载的脚本1.安装脚本@echooff @echo开始安装【服务】 %SystemRoot%\Microsoft.NET\Fr...

c、VB.net中全角半角转换方法

///&lt;summary&gt; ///转全角的函数(SBCcase) ///&lt;/summary&gt; ///&lt;paramname=&quot;input&quot;&gt;任意字符串...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

C.net 配合小程序实现经过第三方服务器中转文件

某些时候,微信小程序前段上传文件的时候需要经过第三方服务器再将文件上传到客户的服务器;操作如下:1:(小程序内向中端服...

.net实现QQ邮箱发送邮件功能

1、微软已经帮我们封装好了发送邮件的类MailMessage,MailMessage类构造一些邮件信息,然后通过SmtpClient进行邮件发送。Mai...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

windows 自带的netsh进行端口映射

使用netsh 把本地任意ip的25566端口 映射到192.168.81.234的25565端口netshinterfaceportproxyaddv4tov4listenaddress=0.0....

确保.net程序始终以管理员身份运行

usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; ...

ASP.net Timer细节处理

Timer的用法:1:本人称之为计时器,是asp.net官方的一种。用法即是计时所用 2:关于计时有很多中方式,本人学识有限,暂...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

asp.net主动推送百度seo

虽然可以使用百度提供的js自动推送,但是估计度娘还是希望主动推送一点。哈哈^_^,女孩子嘛大多都喜欢被动一点。publicclass...
一木浮沉,吾与之。
排名
63
文章
6
粉丝
2
评论
3
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术