社区编辑申请
注册/登录
C# 微信支付回调验签处理
开发 后端
在微信支付中,当用户支付成功后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。接收微信支付异步通知回调地址也是有要求:通知url必须为直接可访问的url,不能携带参数。

 

概述

在微信支付中,当用户支付成功后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。接收微信支付异步通知回调地址也是有要求:通知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对象;

  1. #region  WeiXin APP 
  2.                  // Log.Info(this.GetType().ToString(), "Native pay mode 2 url is producing..."); 
  3.                  WxPayData data = new WxPayData(); 
  4.                  //data.SetValue("attach", model.Dowhere);//附加数据 
  5.                  data.SetValue("body", model.Title);//商品描述 
  6.                  data.SetValue("out_trade_no", model.LocalTransationNo);// WxPayApi.GenerateOutTradeNo());//随机字符串 
  7.                  data.SetValue("total_fee"Convert.ToInt32(model.Amount * 100));//总金额 
  8.                  data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));//交易起始时间 
  9.                  data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));//交易结束时间                                                                              //data.SetValue("goods_tag""goods_tag");//商品标记 
  10.                  data.SetValue("trade_type""APP");//交易类型 
  11.                                                     //data.SetValue("product_id", model.ProductId);//商品ID 
  12.                  WxPayData r = WxPayApi.UnifiedOrder(data);//调用统一下单接口 
  13.                  string prepay_id = r.GetValue("prepay_id").ToString(); 
  14.  
  15.                  WxPayData da2 = new WxPayData(); 
  16.                  da2.SetValue("appid", WxPayConfig.APPID);//公众账号ID 
  17.                  da2.SetValue("noncestr", WxPayApi.GenerateNonceStr());//商户号 
  18.                  da2.SetValue("package""Sign=WXPay");//商品描述 
  19.                  da2.SetValue("partnerid", WxPayConfig.MCHID);// WxPayApi.GenerateOutTradeNo());//随机字符串 
  20.                  da2.SetValue("prepayid", prepay_id);//总金额 
  21.                  da2.SetValue("timestamp", WxPayApi.GenerateTimeStamp());//交易起始时间 
  22.  
  23.                  #endregion 

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

  1. //https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7 
  2.  
  3.           WxPayData notifyData = (new Com.WeiXin.Notify(this.HttpContext)).GetNotifyData(); 
  4.  
  5.           //检查支付结果中transaction_id是否存在 
  6.           if (!notifyData.IsSet("transaction_id")) 
  7.           { 
  8.               //若transaction_id不存在,则立即返回结果给微信支付后台 
  9.               WxPayData res = new WxPayData(); 
  10.               res.SetValue("return_code""FAIL"); 
  11.               res.SetValue("return_msg""支付结果中微信订单号不存在"); 
  12.               Log.Error(this.GetType().ToString(), "The Pay result is error : " + res.ToXml()); 
  13.               HttpContext.Response.Write(res.ToXml()); 
  14.               HttpContext.Response.End(); 
  15.           } 
  16.  
  17.           string transaction_id = notifyData.GetValue("transaction_id").ToString(); 

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

  1. //查询订单,判断订单真实性 
  2. if (!QueryOrder(transaction_id)) 
  3.     //若订单查询失败,则立即返回结果给微信支付后台 
  4.     WxPayData res = new WxPayData(); 
  5.     res.SetValue("return_code""FAIL"); 
  6.     res.SetValue("return_msg""订单查询失败"); 
  7.     Log.Error(this.GetType().ToString(), "Order query failure : " + res.ToXml()); 
  8.     HttpContext.Response.Write(res.ToXml()); 
  9.     HttpContext.Response.End(); 
  10. //查询订单成功 
  11. else 
  12.     WxPayData res = new WxPayData(); 
  13.     res.SetValue("return_code""SUCCESS"); 
  14.     res.SetValue("return_msg""OK"); 
  15.     Log.Info(this.GetType().ToString(), "order query success : " + res.ToXml()); 
  16.  
  17.     string trade_no = transaction_id; 
  18.     string order_no = notifyData.GetValue("out_trade_no").ToString();     //获取订单号 
  19.     string total_fee = (Convert.ToInt32(notifyData.GetValue("total_fee").ToString()) / 100.0).ToString();       //获取总金额 
  20.                                                                                                                 //notifyData.GetValue("attach").ToString(); 
  21.     HttpContext.Response.Write(res.ToXml()); 
  22.     HttpContext.Response.End(); 
  23.  
  24.     PaymentBLL pbll = new PaymentBLL(); 
  25.     bool b = pbll.PayCallback(order_no, total_fee, transaction_id); 

4、查询订单,业务处理

  1.       //查询订单 
  2.         private bool QueryOrder(string transaction_id) 
  3.         { 
  4.             WxPayData req = new WxPayData(); 
  5.             req.SetValue("transaction_id", transaction_id); 
  6.             WxPayData res = WxPayApi.OrderQuery(req); 
  7.             if (res.GetValue("return_code").ToString() == "SUCCESS" && 
  8.                 res.GetValue("result_code").ToString() == "SUCCESS"
  9.             { 
  10.                 return true
  11.             } 
  12.             else 
  13.             { 
  14.                 return false
  15.             } 
  16.         } 
  17.         #endregion 
  18.   
  19. UP技术控 
  20. 江东子弟多才俊,卷土重来未可知。——唐·杜牧 
  21. 447篇原创内容 
  22. 公众号 

 

责任编辑:武晓燕 来源: UP技术控

同话题下的热门内容

超全!Python图形界面框架PyQt5使用指南!太强了!Python 开发桌面小工具,让代码替我们干重复的工作!Python居然被用来开发游戏了?盘点你想不到的Python开发场景浅谈Python+requests+pytest接口自动化测试框架的搭建跟着 Guava 学 Java 之 不可变集合Python轻量级Web框架:Bottle库!用 Taichi 加速 Python:提速 100+ 倍!实战 | 如何用 Python 自动化监控文件夹完成服务部署!

编辑推荐

使用Kotlin做开发一个月后的感想面试官问你什么是消息队列?把这篇甩给他!五大自动化测试的Python框架图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)2018年最流行的十大编程语言,其中包括你用的语言吗?
我收藏的内容
点赞
收藏

51CTO技术栈公众号