支付宝支付
一.配置信息 (配置信息 发送参数 接收参数 )
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; }