首页 新闻 搜索 专区 学院

C#webform代码问题

0
悬赏园豆:15 [已解决问题] 解决于 2022-04-29 09:32
 这个代码是传统webform的代码
如何改成MVC的代码?
具体问题就是红色部分Page,显示是system.web.ui的类型
在调用的时候报错提示

 

 

public class ResultNotify:Notify
    {
        public ResultNotify(Page page):base(page)
        {
        }

        public override void ProcessNotify()
        {
            WxPayData notifyData = GetNotifyData();

            //检查支付结果中transaction_id是否存在
            if (!notifyData.IsSet("transaction_id"))
            {
                //若transaction_id不存在,则立即返回结果给微信支付后台
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "支付结果中微信订单号不存在");
                Log.Error(this.GetType().ToString(), "The Pay result is error : " + res.ToXml());
                page.Response.Write(res.ToXml());
                page.Response.End();
            }

            string transaction_id = notifyData.GetValue("transaction_id").ToString();

            //查询订单,判断订单真实性
            if (!QueryOrder(transaction_id))
            {
                //若订单查询失败,则立即返回结果给微信支付后台
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", "订单查询失败");
                Log.Error(this.GetType().ToString(), "Order query failure : " + res.ToXml());
                page.Response.Write(res.ToXml());
                page.Response.End();
            }
            //查询订单成功
            else
            {
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "SUCCESS");
                res.SetValue("return_msg", "OK");
                Log.Info(this.GetType().ToString(), "order query success : " + res.ToXml());
                page.Response.Write(res.ToXml());
                page.Response.End();
            }
        }

        //查询订单
        private bool QueryOrder(string transaction_id)
        {
            WxPayData req = new WxPayData();
            req.SetValue("transaction_id", transaction_id);
            WxPayData res = WxPayApi.OrderQuery(req);
            if (res.GetValue("return_code").ToString() == "SUCCESS" &&
                res.GetValue("result_code").ToString() == "SUCCESS")
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

 

复制代码
public class Notify
    {
        public Page page {get;set;}
        public Notify(Page page)
        {
            this.page = page;
        }

        /// <summary>
        /// 接收从微信支付后台发送过来的数据并验证签名
        /// </summary>
        /// <returns>微信支付后台返回的数据</returns>
        public WxPayData GetNotifyData()
        {
            //接收从微信后台POST过来的数据
            System.IO.Stream s = page.Request.InputStream;
            int count = 0;
            byte[] buffer = new byte[1024];
            StringBuilder builder = new StringBuilder();
            while ((count = s.Read(buffer, 0, 1024)) > 0)
            {
                builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
            }
            s.Flush();
            s.Close();
            s.Dispose();

            Log.Info(this.GetType().ToString(), "Receive data from WeChat : " + builder.ToString());

            //转换数据格式并验证签名
            WxPayData data = new WxPayData();
            try
            {
                data.FromXml(builder.ToString());
            }
            catch(WxPayException ex)
            {
                //若签名错误,则立即返回结果给微信支付后台
                WxPayData res = new WxPayData();
                res.SetValue("return_code", "FAIL");
                res.SetValue("return_msg", ex.Message);
                Log.Error(this.GetType().ToString(), "Sign check error : " + res.ToXml());
                page.Response.Write(res.ToXml());
                page.Response.End();
            }

            Log.Info(this.GetType().ToString(), "Check sign success");
            return data;
        }

        //派生类需要重写这个方法,进行不同的回调处理
        public virtual void ProcessNotify()
        {

        }
    }
复制代码

 

大da脸的主页 大da脸 | 初学一级 | 园豆:104
提问于:2022-01-04 10:02
< >
分享
最佳答案
0

Page这个只是用来输出返回的参数吗?

page.Response.Write(res.ToXml()); page.Response.End();

收获园豆:8
华临天下 | 小虾三级 |园豆:1481 | 2022-01-04 11:38

因为要获取支付回调的结果数据,引用的时候发现不兼容, 

大da脸 | 园豆:104 (初学一级) | 2022-01-04 11:40

@大da脸: MVC里面直接把这个获取的值,return出去就可以了,可以不用那个Page对象

华临天下 | 园豆:1481 (小虾三级) | 2022-01-04 11:42

@华临天下: 好的  我试试

大da脸 | 园豆:104 (初学一级) | 2022-01-04 15:08
 我吧相关的类中的Page引用注释后,调用回调事件,收不到返回结果

Notify notify = new Notify();
WxPayData data=notify.GetNotifyData();

这个data日志记录:未将对象引用设置到对象的实例。

只能说没有获取到数据
大da脸 | 园豆:104 (初学一级) | 2022-01-05 11:32
其他回答(1)
0

按webform中的代码逻辑,重新用MVC实现就好了,MVC中没有不用Page对象,直接Response.write就可以。

收获园豆:7
龙行天涯 | 园豆:1840 (小虾三级) | 2022-01-04 15:05

 我吧相关的类中的Page引用注释后,调用回调事件,收不到返回结果

Notify notify = new Notify();
WxPayData data=notify.GetNotifyData();

这个data日志记录:未将对象引用设置到对象的实例。

只能说没有获取到数据

 

支持(0) 反对(0) 大da脸 | 园豆:104 (初学一级) | 2022-01-05 11:31

请求帮助QQ:306300669 

支持(0) 反对(0) 大da脸 | 园豆:104 (初学一级) | 2022-01-05 11:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册