C# 微信支付回调验签处理的实现

 更新时间:2021年12月07日 15:01:12   作者:conan5566  
在微信支付中,当用户支付成功后,微信会把相关支付结果和用户信息发送给商户,本文就详细的介绍了C# 微信支付回调验签处理,具有一定的参考价值,感兴趣的可以了解一下

概述

在微信支付中,当用户支付成功后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。接收微信支付异步通知回调地址也是有要求:通知url必须为直接可访问的url,不能携带参数。

示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action”

在微信支付开发,支付结果通用通知介绍说明页面→https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3。

说明了:支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。

c#方法

微信支付完成后会有一个支付回调页面,处理支付完成后的事件,V3支付回调的数据形式为XML格式。

1、定义一个model类,处理一般构造函数,用于解析XML对象;

   #region  WeiXin APP
                    // Log.Info(this.GetType().ToString(), "Native pay mode 2 url is producing...");
                    WxPayData data = new WxPayData();
                    //data.SetValue("attach", model.Dowhere);//附加数据
                    data.SetValue("body", model.Title);//商品描述
                    data.SetValue("out_trade_no", model.LocalTransationNo);// WxPayApi.GenerateOutTradeNo());//随机字符串
                    data.SetValue("total_fee", Convert.ToInt32(model.Amount * 100));//总金额
                    data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));//交易起始时间
                    data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));//交易结束时间                                                                              //data.SetValue("goods_tag", "goods_tag");//商品标记
                    data.SetValue("trade_type", "APP");//交易类型
                                                       //data.SetValue("product_id", model.ProductId);//商品ID
                    WxPayData r = WxPayApi.UnifiedOrder(data);//调用统一下单接口
                    string prepay_id = r.GetValue("prepay_id").ToString();

                    WxPayData da2 = new WxPayData();
                    da2.SetValue("appid", WxPayConfig.APPID);//公众账号ID
                    da2.SetValue("noncestr", WxPayApi.GenerateNonceStr());//商户号
                    da2.SetValue("package", "Sign=WXPay");//商品描述
                    da2.SetValue("partnerid", WxPayConfig.MCHID);// WxPayApi.GenerateOutTradeNo());//随机字符串
                    da2.SetValue("prepayid", prepay_id);//总金额
                    da2.SetValue("timestamp", WxPayApi.GenerateTimeStamp());//交易起始时间

                    #endregion

2、检查支付结果中transaction_id是否存在

  //https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7

            WxPayData notifyData = (new Com.WeiXin.Notify(this.HttpContext)).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());
                HttpContext.Response.Write(res.ToXml());
                HttpContext.Response.End();
            }

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

3、查询订单,判断订单真实性

            //查询订单,判断订单真实性
            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());
                HttpContext.Response.Write(res.ToXml());
                HttpContext.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());

                string trade_no = transaction_id;
                string order_no = notifyData.GetValue("out_trade_no").ToString();     //获取订单号
                string total_fee = (Convert.ToInt32(notifyData.GetValue("total_fee").ToString()) / 100.0).ToString();       //获取总金额
                                                                                                                            //notifyData.GetValue("attach").ToString();
                HttpContext.Response.Write(res.ToXml());
                HttpContext.Response.End();

                PaymentBLL pbll = new PaymentBLL();
                bool b = pbll.PayCallback(order_no, total_fee, transaction_id);
            }
        }

4、查询订单,业务处理

        //查询订单
        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;
            }
        }
        #endregion

到此这篇关于C# 微信支付回调验签处理的实现的文章就介绍到这了,更多相关C# 微信支付回调内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#实现Winform小数字键盘模拟器

    C#实现Winform小数字键盘模拟器

    本文主要介绍了C#实现Winform小数字键盘模拟器,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • WPF中使用WebView2控件的方法及常见问题

    WPF中使用WebView2控件的方法及常见问题

    WebView2为WPF网页浏览工具,具有简单易用,页面显示清晰的优点,下面这篇文章主要给大家介绍了关于WPF中使用WebView2控件的方法及常见问题,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • C#图像伪彩色处理方法

    C#图像伪彩色处理方法

    这篇文章主要介绍了C#图像伪彩色处理方法,涉及C#操作图像的伪彩色相关技巧,需要的朋友可以参考下
    2015-04-04
  • 使用TypeScript开发微信小程序的方法

    使用TypeScript开发微信小程序的方法

    TypeScript是C#之父Anders Hejlsberg的又一力作,很多喜欢c#语法的朋友对typescript都爱不释手,今天小编给大家介绍下TypeScript开发微信小程序的方法,感兴趣的朋友一起看看吧
    2016-11-11
  • C#实现保存文件时重名自动生成新文件的方法

    C#实现保存文件时重名自动生成新文件的方法

    这篇文章主要介绍了C#实现保存文件时重名自动生成新文件的方法,涉及C#针对保存文件时出现重命名情况的自动处理技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C#获取打印机列表方法介绍

    C#获取打印机列表方法介绍

    这篇文章介绍了C#获取打印机列表的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • C#操作XML文件实例汇总

    C#操作XML文件实例汇总

    这篇文章主要介绍了C#操作xml文件实例,包括了对XML文件节点的查找、遍历、删除、添加等。是C#程序设计中非常重要的技巧,需要的朋友可以参考下
    2014-08-08
  • C#中的is和as操作符区别小结

    C#中的is和as操作符区别小结

    这篇文章主要介绍了C#中的is和as操作符区别小结,is是验证操作对象是不是自己希望的,as是将对象转换成指定类型,需要的朋友可以参考下
    2015-01-01
  • C#中验证sql语句是否正确(不执行语句)

    C#中验证sql语句是否正确(不执行语句)

    C#中验证sql语句是否正确(不执行语句),需要的朋友可以参考一下
    2013-03-03
  • Unity Undo实现原理和使用方法详解

    Unity Undo实现原理和使用方法详解

    本文将详细介绍Unity Undo实现原理和使用方法,并提供多个使用例子,帮助开发者更好地理解和应用该功能,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07

最新评论