|
Server : Microsoft-IIS/10.0 System : Windows NT EBS-6136 10.0 build 17763 (Windows Server 2016) i586 User : jxgj ( 0) PHP Version : 7.0.33 Disable Function : passthru,exec,system,shell_exec,proc_open,popen,pcntl_exec,socket_bind,stream_socket_server Directory : D:/tmp_aspnet/root/c87b3efd/cc6243dc/ |
?#pragma checksum "D:\wwwroot\zgyzd233com\wwwroot\App_Code\AlipayNotify.cs" "{406ea660-64cf-4c82-b6f0-42d48172a799}" "B5875C9E8C3FC14C9AED5CE324ACAAF9"
#line 1 "D:\wwwroot\zgyzd233com\wwwroot\App_Code\AlipayNotify.cs"
using System.Web;
using System.Text;
using System.IO;
using System.Net;
using System;
using System.Collections.Generic;
namespace Com.Alipay
{
/// <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 = Config.Partner.Trim();
_key = Config.Key.Trim();
_input_charset = Config.Input_charset.Trim().ToLower();
_sign_type = Config.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是否为true,isSign是否为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 + "¬ify_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;
}
}
}
#line default
#line hidden