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 UP技术控 江东子弟多才俊,卷土重来未可知。——唐·杜牧 447篇原创内容 公众号 
滇ICP备2023000592号-31