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

作者:conan5566 时间:2021-07-27 01:57:34 

目录
  • 概述

  • 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

来源:https://mp.weixin.qq.com/s/5UNFnx4BWjcJxS7sDImeOQ

标签:C#,微信支付,回调
0
投稿

猜你喜欢

  • mybatis mybatis-plus-generator+clickhouse自动生成代码案例详解

    2021-06-06 10:12:55
  • Hibernate持久化对象生命周期原理解析

    2022-08-14 19:44:27
  • Spring Boot Actuator自定义健康检查教程

    2022-06-12 14:54:59
  • c# List find()方法返回值的问题说明(返回结果为对象的指针)

    2023-11-20 21:55:34
  • JAVA的反射机制你了解多少

    2023-11-29 16:46:38
  • java生成xml格式文件的方法

    2023-11-23 02:40:32
  • 详解Java动态字节码技术

    2022-06-20 03:20:20
  • Java编程中的4种代码块详解

    2022-01-04 03:10:20
  • Java正确使用访问修饰符的姿势

    2021-10-11 09:52:50
  • Java深入讲解instanceof关键字的使用

    2023-02-27 13:05:05
  • Android手动检查并申请权限方法

    2023-08-04 23:14:17
  • Java定时器Timer简述

    2023-07-20 19:17:16
  • Java获取时间年、月、日的方法

    2022-02-10 16:58:36
  • Java本地缓存工具之LoadingCache的使用详解

    2023-06-24 11:28:11
  • OpenCV实现直线检测并消除

    2023-07-12 20:44:36
  • Java 动态数组的实现示例

    2022-02-27 07:05:25
  • Spring的异常重试框架Spring Retry简单配置操作

    2023-11-25 18:27:35
  • Java实例讲解Comparator的使用

    2021-07-15 09:16:58
  • opencv配置的完整步骤(win10+VS2015+OpenCV3.1.0)

    2023-06-28 14:55:19
  • Springboot WebJar打包及使用实现流程解析

    2023-06-21 22:08:00
  • asp之家 软件编程 m.aspxhome.com