using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
namespace SiteCore.Alipay
{
///
/// 类名:alipay_notify
/// 功能:付款过程中服务器通知类
/// 详细:该页面是通知返回核心处理文件,不需要修改
/// 版本:3.1
/// 修改日期:2010-10-29
/// '说明:
/// 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
/// 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
///
/// //////////////////////注意/////////////////////////////
/// 调试通知返回时,可查看或改写log日志的写入TXT里的数据,来检查通知返回是否正常
///
public class AlipayNotify
{
private readonly string gateway = ""; //网关地址
private readonly string _transport = ""; //访问模式
private readonly string _partner = ""; //合作身份者ID
private readonly string _key = ""; //交易安全校验码
private readonly string _input_charset = ""; //编码格式
private readonly string _sign_type = ""; //签名方式
private readonly string mysign = ""; //签名结果
private readonly string responseTxt = ""; //服务器ATN结果
private readonly Dictionary sPara = new Dictionary();//要签名的参数组
private readonly string preSignStr = ""; //待签名的字符串
///
/// 获取通知返回后计算后(验证)的签名结果
///
public string Mysign
{
get { return mysign; }
}
///
/// 获取验证是否是支付宝服务器发来的请求结果
///
public string ResponseTxt
{
get { return responseTxt; }
}
///
/// 获取待签名的字符串(调试用)
///
public string PreSignStr
{
get { return preSignStr; }
}
///
/// 构造函数
/// 从配置文件中初始化变量
///
/// 通知返回来的参数数组
/// 验证通知ID
/// 合作身份者ID
/// 安全校验码
/// 编码格式
/// 签名类型
/// 访问模式
public AlipayNotify(SortedDictionary inputPara, string notify_id, string partner, string key, string input_charset, string sign_type, string transport)
{
_transport = transport;
if (_transport == "https")
{
gateway = "https://www.alipay.com/cooperate/gateway.do?";
}
else
{
gateway = "http://notify.alipay.com/trade/notify_query.do?";
}
_partner = partner.Trim();
_key = key.Trim();
_input_charset = input_charset;
_sign_type = sign_type.ToUpper();
sPara = AlipayFunction.Para_filter(inputPara); //过滤空值、sign与sign_type参数
preSignStr = AlipayFunction.Create_linkstring(sPara); //获取待签名字符串(调试用)
//获得签名结果
mysign = AlipayFunction.Build_mysign(sPara, _key, _sign_type, _input_charset);
//获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求
responseTxt = Verify(notify_id);
}
///
/// 验证是否是支付宝服务器发来的请求
///
/// 验证结果
private string Verify(string notify_id)
{
string veryfy_url = "";
if (_transport == "https")
{
veryfy_url = gateway + "service=notify_verify&partner=" + _partner + "¬ify_id=" + notify_id;
}
else
{
veryfy_url = gateway + "partner=" + _partner + "¬ify_id=" + notify_id;
}
return Get_Http(veryfy_url, 120000);
}
///
/// 获取远程服务器ATN结果
///
/// 指定URL路径地址
/// 超时时间设置
/// 服务器ATN结果
private string Get_Http(string strUrl, int timeout)
{
string strResult;
try
{
HttpWebRequest myReq = (HttpWebRequest)WebRequest.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;
}
}
}