|
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\AlipaySubmit.cs" "{406ea660-64cf-4c82-b6f0-42d48172a799}" "9F44C35BA9820B43C6D493130B59917A"
#line 1 "D:\wwwroot\zgyzd233com\wwwroot\App_Code\AlipaySubmit.cs"
using System.Web;
using System.Text;
using System.IO;
using System.Net;
using System;
using System.Collections.Generic;
using System.Xml;
namespace Com.Alipay
{
/// <summary>
/// 类名:Submit
/// 职能:支付宝各接口要求提交类
/// 具体:机关支付宝各接口表单HTML文本,获取远程HTTP数据
/// 版本:3.3
/// 批改日期:2011-07-05
/// 注明:
/// 以下代码只是为了方便商户测试而提供的样例代码,商户能够凭据自己网站的必要,依照技术文档编写,并非肯定要使用该代码。
/// 该代码仅供进建和钻研支付宝接口使用,只是提供一个参考
/// </summary>
public class Submit
{
#region 字段
//支付宝网关地址(新)
private static string GATEWAY_NEW = "https://mapi.alipay.com/gateway.do?";
//商户的私钥
private static string _key = "";
//编码体式
private static string _input_charset = "";
//署名方式
private static string _sign_type = "";
#endregion
static Submit()
{
_key = Config.Key.Trim();
_input_charset = Config.Input_charset.Trim().ToLower();
_sign_type = Config.Sign_type.Trim().ToUpper();
}
/// <summary>
/// 天生要求时的署名
/// </summary>
/// <param name="sPara">要求给支付宝的参数数组</param>
/// <returns>署名了局</returns>
private static string BuildRequestMysign(Dictionary<string, string> sPara)
{
//把数组所有元素,依照“参数=参数值”的模式用“&”字符拼接成字符串
string prestr = Core.CreateLinkString(sPara);
//把最终的字符串署名,获得署名了局
string mysign = "";
switch (_sign_type)
{
case "MD5":
mysign = AlipayMD5.Sign(prestr, _key, _input_charset);
break;
default:
mysign = "";
break;
}
return mysign;
}
/// <summary>
/// 天生要要求给支付宝的参数数组
/// </summary>
/// <param name="sParaTemp">要求前的参数数组</param>
/// <returns>要要求的参数数组</returns>
private static Dictionary<string, string> BuildRequestPara(SortedDictionary<string, string> sParaTemp)
{
//待署名要求参数数组
Dictionary<string, string> sPara = new Dictionary<string, string>();
//署名了局
string mysign = "";
//过滤署名参数数组
sPara = Core.FilterPara(sParaTemp);
//获得署名了局
mysign = BuildRequestMysign(sPara);
//署名了局与署名方式参与要求提交参数组中
sPara.Add("sign", mysign);
sPara.Add("sign_type", _sign_type);
return sPara;
}
/// <summary>
/// 天生要要求给支付宝的参数数组
/// </summary>
/// <param name="sParaTemp">要求前的参数数组</param>
/// <param name="code">字符编码</param>
/// <returns>要要求的参数数组字符串</returns>
private static string BuildRequestParaToString(SortedDictionary<string, string> sParaTemp, Encoding code)
{
//待署名要求参数数组
Dictionary<string, string> sPara = new Dictionary<string, string>();
sPara = BuildRequestPara(sParaTemp);
//把参数组中所有元素,依照“参数=参数值”的模式用“&”字符拼接成字符串,并对参数值做urlencode
string strRequestData = Core.CreateLinkStringUrlencode(sPara, code);
return strRequestData;
}
/// <summary>
/// 成立要求,以表单HTML大局机关(默认)
/// </summary>
/// <param name="sParaTemp">要求参数数组</param>
/// <param name="strMethod">提交方式。两个值可。簆ost、get</param>
/// <param name="strButtonValue">确认按钮显示文字</param>
/// <returns>提交表单HTML文本</returns>
public static string BuildRequest(SortedDictionary<string, string> sParaTemp, string strMethod, string strButtonValue)
{
//待要求参数数组
Dictionary<string, string> dicPara = new Dictionary<string, string>();
dicPara = BuildRequestPara(sParaTemp);
StringBuilder sbHtml = new StringBuilder();
sbHtml.Append("<form id='alipaysubmit' name='alipaysubmit' action='" + GATEWAY_NEW + "_input_charset=" + _input_charset + "' method='" + strMethod.ToLower().Trim() + "'>");
foreach (KeyValuePair<string, string> temp in dicPara)
{
sbHtml.Append("<input type='hidden' name='" + temp.Key + "' value='" + temp.Value + "'/>");
}
//submit按钮控件请不要含有name属性
sbHtml.Append("<input type='submit' value='" + strButtonValue + "' style='display:none;'></form>");
sbHtml.Append("<script>document.forms['alipaysubmit'].submit();</script>");
return sbHtml.ToString();
}
/// <summary>
/// 成立要求,以仿照远程HTTP的POST要求方式机关并获取支付宝的处置了局
/// </summary>
/// <param name="sParaTemp">要求参数数组</param>
/// <returns>支付宝处置了局</returns>
public static string BuildRequest(SortedDictionary<string, string> sParaTemp)
{
Encoding code = Encoding.GetEncoding(_input_charset);
//待要求参数数组字符串
string strRequestData = BuildRequestParaToString(sParaTemp,code);
//把数组转换成流中所需字节数组类型
byte[] bytesRequestData = code.GetBytes(strRequestData);
//机关要求地址
string strUrl = GATEWAY_NEW + "_input_charset=" + _input_charset;
//要求远程HTTP
string strResult = "";
try
{
//设置HttpWebRequest根基信息
HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(strUrl);
myReq.Method = "post";
myReq.ContentType = "application/x-www-form-urlencoded";
//填充POST数据
myReq.ContentLength = bytesRequestData.Length;
Stream requestStream = myReq.GetRequestStream();
requestStream.Write(bytesRequestData, 0, bytesRequestData.Length);
requestStream.Close();
//发送POST数据要求服务器
HttpWebResponse HttpWResp = (HttpWebResponse)myReq.GetResponse();
Stream myStream = HttpWResp.GetResponseStream();
//获取服务器返回信息
StreamReader reader = new StreamReader(myStream, code);
StringBuilder responseData = new StringBuilder();
String line;
while ((line = reader.ReadLine()) != null)
{
responseData.Append(line);
}
//开释
myStream.Close();
strResult = responseData.ToString();
}
catch (Exception exp)
{
strResult = "报错:"+exp.Message;
}
return strResult;
}
/// <summary>
/// 成立要求,以仿照远程HTTP的POST要求方式机关并获取支付宝的处置了局,带文件上传职能
/// </summary>
/// <param name="sParaTemp">要求参数数组</param>
/// <param name="strMethod">提交方式。两个值可。簆ost、get</param>
/// <param name="fileName">文件绝对蹊径</param>
/// <param name="data">文件数据</param>
/// <param name="contentType">文件内容类型</param>
/// <param name="lengthFile">文件长度</param>
/// <returns>支付宝处置了局</returns>
public static string BuildRequest(SortedDictionary<string, string> sParaTemp, string strMethod, string fileName, byte[] data, string contentType, int lengthFile)
{
//待要求参数数组
Dictionary<string, string> dicPara = new Dictionary<string, string>();
dicPara = BuildRequestPara(sParaTemp);
//机关要求地址
string strUrl = GATEWAY_NEW + "_input_charset=" + _input_charset;
//设置HttpWebRequest根基信息
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(strUrl);
//设置要求方式:get、post
request.Method = strMethod;
//设置boundaryValue
string boundaryValue = DateTime.Now.Ticks.ToString("x");
string boundary = "--" + boundaryValue;
request.ContentType = "\r\nmultipart/form-data; boundary=" + boundaryValue;
//设置KeepAlive
request.KeepAlive = true;
//设置要求数据,拼接成字符串
StringBuilder sbHtml = new StringBuilder();
foreach (KeyValuePair<string, string> key in dicPara)
{
sbHtml.Append(boundary + "\r\nContent-Disposition: form-data; name=\"" + key.Key + "\"\r\n\r\n" + key.Value + "\r\n");
}
sbHtml.Append(boundary + "\r\nContent-Disposition: form-data; name=\"withhold_file\"; filename=\"");
sbHtml.Append(fileName);
sbHtml.Append("\"\r\nContent-Type: " + contentType + "\r\n\r\n");
string postHeader = sbHtml.ToString();
//将要求数据字符串类型凭据编码体式转换成字节流
Encoding code = Encoding.GetEncoding(_input_charset);
byte[] postHeaderBytes = code.GetBytes(postHeader);
byte[] boundayBytes = Encoding.ASCII.GetBytes("\r\n" + boundary + "--\r\n");
//设置长度
long length = postHeaderBytes.Length + lengthFile + boundayBytes.Length;
request.ContentLength = length;
//要求远程HTTP
Stream requestStream = request.GetRequestStream();
Stream myStream;
try
{
//发送数据要求服务器
requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
requestStream.Write(data, 0, lengthFile);
requestStream.Write(boundayBytes, 0, boundayBytes.Length);
HttpWebResponse HttpWResp = (HttpWebResponse)request.GetResponse();
myStream = HttpWResp.GetResponseStream();
}
catch (WebException e)
{
return e.ToString();
}
finally
{
if (requestStream != null)
{
requestStream.Close();
}
}
//读取支付宝返回处置了局
StreamReader reader = new StreamReader(myStream, code);
StringBuilder responseData = new StringBuilder();
String line;
while ((line = reader.ReadLine()) != null)
{
responseData.Append(line);
}
myStream.Close();
return responseData.ToString();
}
/// <summary>
/// 用于防垂钓,挪用接口query_timestamp来获取功夫戳的处置函数
/// 把稳:远程解析XML犯错,与IIS服务器配置有关
/// </summary>
/// <returns>功夫戳字符串</returns>
public static string Query_timestamp()
{
string url = GATEWAY_NEW + "service=query_timestamp&partner=" + Config.Partner + "&_input_charset=" + Config.Input_charset;
string encrypt_key = "";
XmlTextReader Reader = new XmlTextReader(url);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Reader);
encrypt_key = xmlDoc.SelectSingleNode("/alipay/response/timestamp/encrypt_key").InnerText;
return encrypt_key;
}
}
}
#line default
#line hidden