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


猜你喜欢
- 偶然机会看到一种对象初始的方式:// 新建一个列表,并赋值 "Harry","Tony","
- 之前在开发一个程序,希望能够通过属性名称读取出属性值,但是由于那时候不熟悉反射,所以并没有找到合适的方法,做了不少的重复性工作啊!然后今天我
- 这篇文章主要介绍了Java接口统一样式返回模板简介,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- 求直方图中的最大矩形面积:例如给定直方图{2,3,1,2,4,2}则直方图中最大矩形面积为x=(3,6),|x|=3,y=2,max面积=6
- 说到内存管理,笔者这里想先比较一下java与C、C++之间的区别:在C、C++中,内存管理是由程序员负责的,也就是说程序员既要完成繁重的代码
- 前言我们一说到spring,可能第一个想到的是 IOC(控制反转) 和 AOP(面向切面编程)。没错,它们是spring的基石,得益于它们的
- 本文实例讲述了Android编程实现简单文件浏览器功能。分享给大家供大家参考,具体如下:运行效果:布局:<LinearLayout x
- Android webview在默认情况下是不支持网页中的文件上传功能的;如果在网页中有<input type="file&
- public interface ICacheStrategy { &
- static关键字static关键词与对象无关。static关键字主要修饰四个部分的内容这里我们主要介绍static修饰属性和修饰方法。1.
- 本文介绍了java web每天定时执行任务,分享给大家,具体如下:第一步:package com.eh.util;import java.u
- 本文实例总结了Android横竖屏切换相关技巧。分享给大家供大家参考,具体如下:一、禁止横竖屏切换Android横竖屏切换在手机开发中比较常
- 在新版的AndroidStudio3.6 中,在项目的包下新建 activity 时,一般会同时生成对应的java和xml文件,例如新建 M
- 限流背景在早期的计算机领域,限流技术(time limiting)被用做控制网络接口收发通信数据的速率。可以用来优化性能,减少延迟和提高带宽
- 本文实例讲述了Java使用TCP套接字实现多人聊天功能。分享给大家供大家参考,具体如下:废话不多说,直接开搞:先创建一个服务端:packag
- 通过输入流来读取客户端信息,相应的时候通过输出流来实现。服务端类的代码:import java.io.BufferedReader;impo
- 引言在实际应用场景中,我们封装一个学生的类,这个类用于封装学生的日常行为,如:上学、吃饭、上课等。然而,在疫情期间,学生上学时入校、吃饭时进
- 1. 什么是AOPAOP (Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期 * 实现在
- 本文实例为大家分享了Android实现底部滚轮式选择弹跳框的具体代码,供大家参考,具体内容如下先看效果:调用方法:SlideDialog s
- 1、Aop 全程是Aspect Oriented Programming 即面向切面编程,通过预编译方式和运行期 * 实现程序功能的同一维