Files
g.hnyhua.cn/Mtxfw.Utility/AlipayNotify.cs
2026-02-07 15:48:27 +08:00

181 lines
6.9 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Web;
using System.Text;
using System.IO;
using System.Net;
using System;
using System.Collections.Generic;
namespace Mtxfw.Utility
{
/// <summary>
/// 类名Notify
/// 功能:支付宝通知处理类
/// 详细:处理支付宝各接口通知返回
/// 版本3.3
/// 修改日期2011-07-05
/// '说明:
/// 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
/// 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
///
/// //////////////////////注意/////////////////////////////
/// 调试通知返回时可查看或改写log日志的写入TXT里的数据来检查通知返回是否正常
/// </summary>
public class Notify
{
#region
private string _partner = ""; //合作身份者ID
private string _key = ""; //商户的私钥
private string _input_charset = ""; //编码格式
private string _sign_type = ""; //签名方式
//支付宝消息验证地址
private string Https_veryfy_url = "https://mapi.alipay.com/gateway.do?service=notify_verify&";
#endregion
/// <summary>
/// 构造函数
/// 从配置文件中初始化变量
/// </summary>
/// <param name="inputPara">通知返回参数数组</param>
/// <param name="notify_id">通知验证ID</param>
public Notify()
{
//初始化基础配置信息
_partner = AlipayConfig.Partner.Trim();
_key = AlipayConfig.Key.Trim();
_input_charset = AlipayConfig.Input_charset.Trim().ToLower();
_sign_type = AlipayConfig.Sign_type.Trim().ToUpper();
}
/// <summary>
/// 验证消息是否是支付宝发出的合法消息
/// </summary>
/// <param name="inputPara">通知返回参数数组</param>
/// <param name="notify_id">通知验证ID</param>
/// <param name="sign">支付宝生成的签名结果</param>
/// <returns>验证结果</returns>
public bool Verify(SortedDictionary<string, string> inputPara, string notify_id, string sign)
{
//获取返回时的签名验证结果
bool isSign = GetSignVeryfy(inputPara, sign);
//获取是否是支付宝服务器发来的请求的验证结果
string responseTxt = "true";
if (notify_id != null && notify_id != "") { responseTxt = GetResponseTxt(notify_id); }
//写日志记录(若要调试,请取消下面两行注释)
//string sWord = "responseTxt=" + responseTxt + "\n isSign=" + isSign.ToString() + "\n 返回回来的参数:" + GetPreSignStr(inputPara) + "\n ";
//Core.LogResult(sWord);
//判断responsetTxt是否为trueisSign是否为true
//responsetTxt的结果不是true与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
//isSign不是true与安全校验码、请求时的参数格式带自定义参数等、编码格式有关
if (responseTxt == "true" && isSign)//验证成功
{
return true;
}
else//验证失败
{
return false;
}
}
/// <summary>
/// 获取待签名字符串(调试用)
/// </summary>
/// <param name="inputPara">通知返回参数数组</param>
/// <returns>待签名字符串</returns>
private string GetPreSignStr(SortedDictionary<string, string> inputPara)
{
Dictionary<string, string> sPara = new Dictionary<string, string>();
//过滤空值、sign与sign_type参数
sPara = Core.FilterPara(inputPara);
//获取待签名字符串
string preSignStr = Core.CreateLinkString(sPara);
return preSignStr;
}
/// <summary>
/// 获取返回时的签名验证结果
/// </summary>
/// <param name="inputPara">通知返回参数数组</param>
/// <param name="sign">对比的签名结果</param>
/// <returns>签名验证结果</returns>
private bool GetSignVeryfy(SortedDictionary<string, string> inputPara, string sign)
{
Dictionary<string, string> sPara = new Dictionary<string, string>();
//过滤空值、sign与sign_type参数
sPara = Core.FilterPara(inputPara);
//获取待签名字符串
string preSignStr = Core.CreateLinkString(sPara);
//获得签名验证结果
bool isSgin = false;
if (sign != null && sign != "")
{
switch (_sign_type)
{
case "MD5":
isSgin = AlipayMD5.Verify(preSignStr, sign, _key, _input_charset);
break;
default:
break;
}
}
return isSgin;
}
/// <summary>
/// 获取是否是支付宝服务器发来的请求的验证结果
/// </summary>
/// <param name="notify_id">通知验证ID</param>
/// <returns>验证结果</returns>
private string GetResponseTxt(string notify_id)
{
string veryfy_url = Https_veryfy_url + "partner=" + _partner + "&notify_id=" + notify_id;
//获取远程服务器ATN结果验证是否是支付宝服务器发来的请求
string responseTxt = Get_Http(veryfy_url, 120000);
return responseTxt;
}
/// <summary>
/// 获取远程服务器ATN结果
/// </summary>
/// <param name="strUrl">指定URL路径地址</param>
/// <param name="timeout">超时时间设置</param>
/// <returns>服务器ATN结果</returns>
private string Get_Http(string strUrl, int timeout)
{
string strResult;
try
{
HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(strUrl);
myReq.Timeout = timeout;
HttpWebResponse HttpWResp = (HttpWebResponse)myReq.GetResponse();
Stream myStream = HttpWResp.GetResponseStream();
StreamReader sr = new StreamReader(myStream, Encoding.Default);
StringBuilder strBuilder = new StringBuilder();
while (-1 != sr.Peek())
{
strBuilder.Append(sr.ReadLine());
}
strResult = strBuilder.ToString();
}
catch (Exception exp)
{
strResult = "错误:" + exp.Message;
}
return strResult;
}
}
}