C# 微信支付回调验签处理的实现
作者:conan5566 发布时间:2021-07-27 01:57:34
标签:C#,微信支付,回调
目录
概述
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
0
投稿
猜你喜欢
- Map接口存储特点以键(key)值(value)对的形式存储键无序、无下标、元素不可重复值无序、无下标、元素可以重复常用实现类HashMap
- 本文实例为大家分享了java实现酒店管理系统的具体代码,供大家参考,具体内容如下编写环境:MyEclipse2014+sql server2
- 简介:Springboot使用Mybatis&Mybatis-plus 两者文件映射配置略有不同,之前我用的是Mybatis,但公司
- 这里我们给定一个集合strings一、写法1–循环for (int i = 0, len = strings.size(); i <
- 框架的概述JDBC存在的问题:我们要想研究mybatis就必须知道jdbc所存在的问题,那我那么我们首先来复习一下jdbc操作数据库的大致流
- SpringMVC4使用数据校验的时候需要使用hibernate-validator的包第一步添加依赖 <d
- 今天来说一个Java多机部署下定时任务的处理方案。需求: 有两台服务器同时部署了同一套代码, 代码中写有spring自带的定时任务,但是每次
- 这篇文章主要介绍了springboot使用事物注解方式代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 引言:前面几个专题对委托进行了详细的介绍的,然后我们在编写代码过程中经常会听到“事件”这个概念的,尤其是写UI的时候,当我们点击一个按钮后V
- 上期回顾上期我们主要介绍了排序的基本认识,以及四个排序,分别是直接插入排序,希尔排序,选择排序,堆排序,从这些排序中,了解了算法的实现,以及
- 本文实例为大家分享了Java实现简单员工管理系统的具体代码,供大家参考,具体内容如下代码如下:import java.util.*;publ
- 布局管理器在java.awt 包中提供了5中常用的布局管理器,分别式FlowLayout(流式布局管理器)、BorderLayout(边界布
- 时间处理相关类:1.java.util.Date:时间类2.java.text.DateFormat:时间格式化类(抽象类),实现类:jav
- 我就废话不多说了,大家还是直接看代码吧~/** * 从list中随机抽取元素 * * @param
- 一、错误处理原理分析使用SpringBoot创建的web项目中,当我们请求的页面不存在(http状态码为404),或者器发生异常(http状
- 简单介绍华为鸿蒙系统应用开发工具 DevEco Studio的安装和使用据说12月份鸿蒙系统会推出手机的SDK哦,作为一名普通的开发者,表示
- 基本要点1、定义根据百度百科的定义,RESTFUL是一种网络应用程序的设计风格和开发方式2、传统方式与Restful风格的区别在我们学习re
- 带占位符的 URL 是 Spring3.0 新增的功能,该功能在SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义。通过
- 背景分析在项目的开发中,不管是对底层的数据逻辑操作过程,还是业务逻辑的处理过程,还是控制逻辑的处理过程,都不可避免会遇到各种可预知的、不可预
- spring boot实现自动输出word文档功能本文用到Apache POI组件组件依赖在pom.xml文件中添加<dependen