一.配置信息 (配置信息 发送参数 接收参数 )
1 //↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
2
3 // 合作身份者ID,签约账号,以2088开头由16位纯数字组成的字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
4 public static string partner = "";
5
6 // 收款支付宝账号,以2088开头由16位纯数字组成的字符串,一般情况下收款账号就是签约账号
7 public static string seller_id = partner;
8
9 // MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
10 public static string key = "";
11
12 // 服务器异步通知页面路径,需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
13 public static string notify_url = "http://" + HttpContext.Current.Request.Url.Authority.ToLower() + "/api/alipaywap/notify_url.aspx";
14
15 // 页面跳转同步通知页面路径,需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
16 public static string return_url = "http://" + HttpContext.Current.Request.Url.Authority.ToLower() + "/api/alipaywap/return_url.aspx";
17
18
19 // 服务器异步通知页面路径,需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
20 public static string pcnotify_url = "http://" + HttpContext.Current.Request.Url.Authority.ToLower() + "/api/alipaypc/notify_url.aspx";
21
22 // 页面跳转同步通知页面路径,需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
23 public static string pcreturn_url = "http://" + HttpContext.Current.Request.Url.Authority.ToLower() + "/api/alipaypc/return_url.aspx";
24
25
26
27 // 签名方式
28 public static string sign_type = "MD5";
29
30 // 调试用,创建TXT日志文件夹路径,见AlipayCore.cs类中的LogResult(string sWord)打印方法。
31 public static string log_path = HttpRuntime.AppDomainAppPath.ToString() + "log\\";
32
33 // 字符编码格式 目前支持utf-8
34 public static string input_charset = "utf-8";
35
36 // 支付类型 ,无需修改
37 public static string payment_type = "1";
38
39 // 调用的接口名,无需修改
40 public static string service = "alipay.wap.create.direct.pay.by.user"/"即时到帐接口";
41
42 //↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
43
44 static Config()
45 {
46 Maticsoft.BLL.orderpay pay = new Maticsoft.BLL.orderpay();
47 Maticsoft.Model.orderpay paymodel = pay.GetModel(1);
48 partner = paymodel.apiid;
49 key = paymodel.apikey;
50 seller_id = partner;
51
52 }
1 //把请求参数打包成数组
2 SortedDictionary<string, string> sParaTemp = new SortedDictionary<string, string>();
3 sParaTemp.Add("payment_type", "1"); //收款类型1商品购买
4 sParaTemp.Add("show_url", "goods_info.html"); //商品展示地址
5 sParaTemp.Add("out_trade_no", orderno); //网站订单号
6 sParaTemp.Add("subject", "购物订单" + "_" + username); //订单名称
7 sParaTemp.Add("body", username); //订单描述
8 sParaTemp.Add("total_fee", payfee.ToString()); //订单总金额
9 sParaTemp.Add("paymethod", ""); //默认支付方式
10 sParaTemp.Add("defaultbank", ""); //默认网银代号
11 sParaTemp.Add("anti_phishing_key", ""); //防钓鱼时间戳
12 sParaTemp.Add("exter_invoke_ip", Common.Iport.GetHostAddress()); ////获取客户端的IP地址
13 sParaTemp.Add("buyer_email", ""); //默认买家支付宝账号
14 sParaTemp.Add("royalty_type", "");
15 sParaTemp.Add("royalty_parameters", "");
16 sParaTemp.Add("service", "create_direct_pay_by_user");
17 sParaTemp.Add("partner", API.Alipay.Config.partner);
18 //增加基本配置
19 sParaTemp.Add("_input_charset", API.Alipay.Config.input_charset.ToLower());
20 sParaTemp.Add("return_url", API.Alipay.Config.pcreturn_url);
21 sParaTemp.Add("notify_url", API.Alipay.Config.pcnotify_url);
22
24 //构造即时到帐接口表单提交HTML数据,无需修改
25 Service ali = new Service();
26 string sHtmlText = ali.Create_direct_pay_by_user(sParaTemp);
27 Response.Write(sHtmlText);
/// <summary>
/// 构造即时到帐接口
/// </summary>
/// <param name="sParaTemp">请求参数集合</param>
/// <returns>表单提交HTML信息</returns>
public string Create_direct_pay_by_user(SortedDictionary<string, string> sParaTemp)
{
sParaTemp.Add("seller_email", _email);
//确认按钮显示文字
string strButtonValue = "确认";
//表单提交HTML数据
string strHtml = "";
//构造表单提交HTML数据
strHtml = Submit.BuildFormHtml(sParaTemp, "https://mapi.alipay.com/gateway.do?", "get", strButtonValue);
return strHtml;
}
/// <summary>
/// 构造提交表单HTML数据
/// </summary>
/// <param name="sParaTemp">请求参数数组</param>
/// <param name="gateway">网关地址</param>
/// <param name="strMethod">提交方式。两个值可选:post、get</param>
/// <param name="strButtonValue">确认按钮显示文字</param>
/// <returns>提交表单HTML文本</returns>
public static string BuildFormHtml(SortedDictionary<string, string> sParaTemp, string gateway, 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 + "_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>
/// 生成要请求给支付宝的参数数组
/// </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 = Core.BuildMysign(sPara, _key, _sign_type, _input_charset);
//签名结果与签名方式加入请求提交参数组中
sPara.Add("sign", mysign);
sPara.Add("sign_type", _sign_type);
return sPara;
}
/// <summary>
/// 除去数组中的空值和签名参数并以字母a到z的顺序排序
/// </summary>
/// <param name="dicArrayPre">过滤前的参数组</param>
/// <returns>过滤后的参数组</returns>
public static Dictionary<string, string> FilterPara(SortedDictionary<string, string> dicArrayPre)
{
Dictionary<string, string> dicArray = new Dictionary<string, string>();
foreach (KeyValuePair<string, string> temp in dicArrayPre)
{
if (temp.Key.ToLower() != "sign" && temp.Key.ToLower() != "sign_type" && temp.Value != "" && temp.Value != null)
{
dicArray.Add(temp.Key.ToLower(), temp.Value);
}
}
return dicArray;
}
/// <summary>
/// 生成签名结果
/// </summary>
/// <param name="sArray">要签名的数组</param>
/// <param name="key">安全校验码</param>
/// <param name="sign_type">签名类型</param>
/// <param name="_input_charset">编码格式</param>
/// <returns>签名结果字符串</returns>
public static string BuildMysign(Dictionary<string, string> dicArray, string key, string sign_type, string _input_charset)
{
string prestr = CreateLinkString(dicArray); //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
prestr = prestr + key; //把拼接后的字符串再与安全校验码直接连接起来
string mysign = Sign(prestr, sign_type, _input_charset); //把最终的字符串签名,获得签名结果
return mysign;
}