public override void Submit(IPayHistory order) { base.BaseSubmit(order); var tenpay = new RequestHandler(HttpContext.Current); tenpay.init(); tenpay.setKey(key); tenpay.setGateUrl("https://gw.tenpay.com/gateway/pay.htm"); tenpay.setParameter("total_fee", ((int)(order.Amount * 100)).ToString()); //用户的公网ip,测试时填写127.0.0.1,只能支持10分以下交易 tenpay.setParameter("spbill_create_ip", ip); tenpay.setParameter("return_url", return_url); tenpay.setParameter("partner", bargainor_id); tenpay.setParameter("out_trade_no", order.OrderId); tenpay.setParameter("notify_url", notify_url); tenpay.setParameter("attach", order.UserId); tenpay.setParameter("body", order.Desc); tenpay.setParameter("bank_type", order.BankType); //系统可选参数 tenpay.setParameter("sign_type", "MD5"); tenpay.setParameter("service_version", "1.0"); tenpay.setParameter("input_charset", ChargeConfig.Charset); tenpay.setParameter("sign_key_index", "1"); string url = tenpay.getRequestURL(); HttpContext.Current.Response.Redirect(url); }
public override void Submit(IPayHistory order) { base.BaseSubmit(order); var request = new Message.Web.PayRequest(); request.version = PartnerConfig.VERSION; request.oid_partner = PartnerConfig.OID_PARTNER; request.user_id = order.UserId; request.timestamp = YinTongUtil.getCurrentDateTimeStr(); request.sign_type = PartnerConfig.SIGN_TYPE; request.busi_partner = PartnerConfig.BUSI_PARTNER; request.no_order = order.OrderId; request.dt_order = YinTongUtil.getCurrentDateTimeStr(); request.name_goods = "在线充值"; request.money_order = order.Amount.ToString(); request.notify_url = notify_url; request.url_return = return_url; request.SetSign(); var fields = request.GetType().GetFields(); StringBuilder sbHtml = new StringBuilder(); sbHtml.Append("<form id='payBillForm' action='" + request.InterFaceUrl + "' method='post'>"); foreach (var temp in fields) { sbHtml.Append("<input type='hidden' name='" + temp.Name + "' value='" + temp.GetValue(request) + "'/>"); } //submit按钮控件请不要含有name属性 sbHtml.Append("<input type='submit' value='tijiao' style='display:none;'></form>"); sbHtml.Append("<script>document.forms['payBillForm'].submit();</script>"); HttpContext.Current.Response.Write(sbHtml.ToString()); }
/// <summary> /// 转向页执行此方法 /// 这里为了实现自定义转向 /// </summary> /// <param name="order"></param> public void Redirect(IPayHistory order) { if (!string.IsNullOrEmpty(order.RedirectUrl)) { HttpContext.Current.Response.Redirect(order.RedirectUrl + "?amount=" + order.Amount + "&orderId=" + order.OrderId + "&companyType=" + (int)order.CompanyType + "&ProductOrderId=" + order.ProductOrderId); } }
/// <summary> /// WAP认证支付 /// 首次需传入银行卡进行绑定 /// 再次按绑定的银行卡进行支付 /// </summary> /// <param name="order"></param> /// <param name="id_no"></param> /// <param name="acct_name"></param> /// <param name="card_no"></param> /// <param name="no_agree"></param> /// <param name="risk_item"></param> public void WapAuthSubmit(IPayHistory order, string id_no, string acct_name, string card_no, string no_agree, string risk_item) { var request = new Message.WapAuth.PayRequest(); request.version = PartnerConfig.VERSION; request.oid_partner = PartnerConfig.OID_PARTNER; request.user_id = order.UserId; request.sign_type = PartnerConfig.SIGN_TYPE; request.busi_partner = PartnerConfig.BUSI_PARTNER; request.no_order = order.OrderId; request.dt_order = YinTongUtil.getCurrentDateTimeStr(); request.name_goods = "在线充值"; request.money_order = order.Amount.ToString(); request.notify_url = CoreHelper.CustomSetting.GetConfigKey("lianlianWapAuthNotifyUrl"); request.url_return = CoreHelper.CustomSetting.GetConfigKey("lianlianWapAuthReturnUrl"); request.id_type = "0"; request.id_no = id_no; request.acct_name = acct_name; request.card_no = card_no; request.no_agree = no_agree; request.risk_item = risk_item;//风控参数 request.SetSign(); var data = CoreHelper.SerializeHelper.SerializerToJson(request, Encoding.UTF8); StringBuilder sbHtml = new StringBuilder(); sbHtml.Append("<form id='payBillForm' action='" + request.InterFaceUrl + "' method='post'>"); sbHtml.Append("<input name='req_data' value='" + data + "' /></form>"); sbHtml.Append("<script>document.forms['payBillForm'].submit();</script>"); System.Web.HttpContext.Current.Response.Write(sbHtml.ToString()); }
/// <summary> /// 提交支付 /// </summary> /// <param name="order"></param> public static void Submit(IPayHistory order) { if (order.OrderType == OrderType.支付) { if (string.IsNullOrEmpty(order.ProductOrderId)) { throw new Exception("支付类型订单必须传ProductOrderId"); } } Company.CompanyBase company = GetCompany(order.CompanyType); try { company.Submit(order); } catch (Exception ero) { if (ero is System.Threading.ThreadAbortException) { return; } CoreHelper.EventLog.Log("提交支付订单时出错:" + ero, true); throw ero; } }
public override void Submit(IPayHistory order) { BaseSubmit(order); var request = new ChargeRequest(); request.merchantAcctId = merchantAcctId; request.payerName = ""; request.payerContactType = "1"; request.orderId = order.OrderId; request.orderAmount = (Convert.ToInt32(order.Amount) * 100).ToString(); request.orderTime = DateTime.Now.ToString("yyyyMMddHHmmss"); request.productName = "在线支付"; request.productNum = "1"; request.productDesc = "在线支付"; request.payType = "00"; request.ext1 = order.UserId; request.bgUrl = notify_url; request.MakeSign(); var fields = request.GetType().GetProperties(); //测试 string html = "<form id='form1' name='form1' action='https://sandbox.99bill.com/gateway/recvMerchantInfoAction.htm' method='post'>\r\n"; foreach (var item in fields) { html += string.Format("<input type='hidden' Name='{0}' value='{1}' />\r\n", item.Name, item.GetValue(request, null)); } html += "</form>\r\n"; html += "<script>form1.submit()</script>"; //Log(html); HttpContext.Current.Response.Write(html); }
/// <summary> /// 查询订单 /// 如果订单未确认,会自动确认 /// </summary> /// <param name="order"></param> public static bool CheckOrder(IPayHistory order,out string message) { if (order.Status == OrderStatus.已确认 || order.Status == OrderStatus.已退款) { message = "此订单状态为" + order.Status.Discription(); return false; } Company.CompanyBase company = GetCompany(order.CompanyType); return company.CheckOrder(order,out message); }
/// <summary> /// 订单退款方法 /// </summary> /// <param name="order"></param> protected internal void BaseRefundOrder(IPayHistory order) { ///未确认的订单不能退款 if (order.Status != OrderStatus.已确认) { return; } OnlinePayBusiness.Instance.RefundOrder(order); Log("支付订单被退款:" + order.OrderId + " amount:" + order.Amount, true); }
/// <summary> /// 处理通知 /// </summary> /// <param name="result"></param> /// <param name="error"></param> /// <returns></returns> public bool DealChargeNotify(Charge.Response result, out string error) { error = ""; var orderId = result.SrcReqId; IPayHistory order = OnlinePayBusiness.Instance.GetOrder(orderId, ThisCompanyType); order.spBillno = result.SrcReqId; Confirm(order, GetType(), order.Amount); return(true); }
/// <summary> /// 订单取消,退款 /// 只要提交成功就一定能成功,特殊情况除外 /// </summary> /// <param name="order"></param> /// <param name="message"></param> /// <returns></returns> public static bool RefundOrder(IPayHistory order, out string message) { if (order.Status != OrderStatus.已确认) { message = "此订单状态为" + order.Status.Discription(); return(false); } Company.CompanyBase company = GetCompany(order.CompanyType); return(company.RefundOrder(order, out message)); }
/// <summary> /// 生成订单 /// </summary> /// <param name="amount"></param> /// <param name="user"></param> /// <param name="companyType"></param> /// <returns></returns> public static IPayHistory CreateOrder(decimal amount, string user, CompanyType companyType) { Company.CompanyBase company = GetCompany(companyType); IPayHistory order = null; lock (lockObj) { order = company.CreateOrder(amount, user); } return(order); }
/// <summary> /// 提交到数据库+ /// 对于代理,需查询OrderType为Charge的记录 /// </summary> /// <param name="order"></param> protected void BaseSubmit(IPayHistory order) { if (ThisCompanyType == CompanyType.None) { throw new Exception("接口初始化没有指定类型,请检查"); } if (string.IsNullOrEmpty(order.OrderId)) { throw new Exception("没有指定OrderId"); } OnlinePayBusiness.Instance.Add(order); string log = string.Format("提交订单 {0} {1} {2} {3}", order.UserId, order.OrderId, order.Amount, order.OrderType); Log(log, false); }
protected override string OnNotify(HttpContext context) { var response = ChargeNotify.FromRequest(context.Request.QueryString); var a = response.CheckSign(); int result = 1; string msg1 = "error"; if (a && response.payResult == "10") { IPayHistory order = OnlinePayBusiness.Instance.GetOrder(response.orderId, ThisCompanyType); Confirm(order, GetType(), Convert.ToDecimal(response.payAmount) / 100); result = 1; msg1 = "success"; } return("<result>" + result + "</result><redirecturl>" + return_url + "?msg=" + msg1 + "</redirecturl>"); }
public override void Submit(IPayHistory order) { BaseSubmit(order); var request = CreateHead <Charge.Request>(); request.UserId = order.UserId; request.Amt = (Convert.ToInt64(order.Amount) * 100).ToString(); request.SrcReqId = order.OrderId;//更改为订单ID request.CurCode = "156"; string notifyUrl = ChargeConfig.GetConfigKey(CompanyType.银联托管, ChargeConfig.DataType.NotifyUrl); string returnUrl = ChargeConfig.GetConfigKey(CompanyType.银联托管, ChargeConfig.DataType.ReturnUrl); request.NotifyUrl = ConvertUrl(notifyUrl); request.ReturnUrl = ConvertUrl(returnUrl); Submit(request); }
/// <summary> /// 生成订单实例 /// </summary> /// <param name="money"></param> /// <param name="user"></param> /// <param name="userType"></param> /// <returns></returns> public IPayHistory CreateOrder(decimal amount, string user) { if (amount <= 0) { throw new Exception("支付金额不能小于或等于0"); } IPayHistory order = new IPayHistory(); order.Amount = amount; order.CompanyType = ThisCompanyType; order.Status = OrderStatus.已提交; order.UserId = user; lock (lockObj) { order.OrderId = CreateOrderId(); } return(order); }
protected override string OnNotify(System.Web.HttpContext context) { StreamReader stream = new StreamReader(context.Request.InputStream); string json = stream.ReadToEnd(); stream.Close(); var response = Message.MessageBase.FromRequest <Message.Web.PayNotify>(json); var a = response.CheckSign(); if (a && response.result_pay == "SUCCESS") { IPayHistory order = OnlinePayBusiness.Instance.GetOrder(response.no_order, ThisCompanyType); Confirm(order, GetType(), Convert.ToDecimal(response.money_order)); var result = new { ret_code = "0000", ret_msg = "交易成功" }; return(CoreHelper.SerializeHelper.SerializerToJson(result)); } var result2 = new { ret_code = "9999", ret_msg = "失败" }; return(CoreHelper.SerializeHelper.SerializerToJson(result2)); }
/// <summary> /// 提交支付,转向需要按具体需求重写 /// </summary> /// <param name="order"></param> public override void Submit(IPayHistory order) { BaseSubmit(order); string out_trade_no = order.OrderId; string subject = order.Desc; //商品名称 string body = order.UserId; //商品描述 string price = order.Amount.ToString(); //商品价格 string bankType = order.BankType; //银行代码 string token = (HttpContext.Current.Session["ali_token"] != null) ? HttpContext.Current.Session["ali_token"].ToString() : string.Empty; // 支付宝来源用户的验证码 //相关参数名称具体含义,可以在支付宝接口服务文档中查询到, //以上两个文件,通知正常都可以在notify data目录找到通知过来的日志 string aliay_url = string.Empty; if (token == string.Empty) { //HttpContext.Current.Request.QueryString["is_company"] 判断企业网银支付渠道 if (HttpContext.Current.Request.QueryString["is_company"] != null && HttpContext.Current.Request.QueryString["is_company"].ToString() != "") { aliay_url = AliPay.CreatUrl(company_gateway, service, partner, sign_type, out_trade_no, subject, body, price, show_url, seller_email, key, return_url, _input_charset, notify_url, bankType); } else { aliay_url = AliPay.CreatUrl(company_gateway, service, partner, sign_type, out_trade_no, subject, body, price, show_url, seller_email, key, return_url, _input_charset, notify_url, bankType); } } else { if (HttpContext.Current.Request.QueryString["is_company"] != null && HttpContext.Current.Request.QueryString["is_company"].ToString() != "") { aliay_url = AliPay.CreatUrl(company_gateway, service, partner, sign_type, out_trade_no, subject, body, price, show_url, seller_email, key, return_url, _input_charset, notify_url, bankType, token); } else { aliay_url = AliPay.CreatUrl(company_gateway, service, partner, sign_type, out_trade_no, subject, body, price, show_url, seller_email, key, return_url, _input_charset, notify_url, bankType, token); } } //HttpContext.Current.Response.Write(aliay_url); //HttpContext.Current.Response.End(); HttpContext.Current.Response.Redirect(aliay_url); }
/// <summary> /// 通过参数直接提交 /// 会产生跳转 /// </summary> /// <param name="user"></param> /// <param name="amount"></param> /// <param name="bankType"></param> /// <param name="orderType"></param> /// <param name="companyType"></param> /// <param name="byProductOrder"></param> /// <param name="redirectUrl"></param> public static void Submit(string user, decimal amount, string bankType, OrderType orderType, CompanyType companyType, string byProductOrder, string redirectUrl) { //todo 订单需要判断没有有付过款,并存不存在 if (amount <= 0) { throw new Exception("找不到订单,或订单金额为0"); } IPayHistory order = ChargeService.CreateOrder(amount, user, companyType); order.RedirectUrl = redirectUrl; //在这里传入银行代码 order.BankType = bankType; //传入商城订单编号 order.ProductOrderId = byProductOrder; //在这里传入订单类型,默认为充值 order.OrderType = orderType; ChargeService.Submit(order); }
public override void Submit(IPayHistory order) { BaseSubmit(order); var request = new ChargeSubmit(); request.MerId = MerchantId; request.CmdId = "Buy"; request.OrdId = order.OrderId; request.OrdAmt = order.Amount.ToString("f"); request.BgRetUrl = NotifyUrl; request.RetUrl = ReturnUrl; request.ChkValue = request.MakeSign(); var fields = request.GetType().GetFields(); //测试 string html = "<form id='form1' name='form1' action='https://mas.chinapnr.com/gar/RecvMerchant.do' method='post'>\r\n"; foreach (var item in fields) { html += string.Format("<input type='hidden' Name='{0}' value='{1}' />\r\n", item.Name, item.GetValue(request)); } html += "</form>\r\n"; html += "<script>form1.submit()</script>"; HttpContext.Current.Response.Write(html); }
/// <summary> /// 确认订单,失败会插入方法缓存,下次会自动重新执行方法 /// </summary> /// <param name="orderNumber"></param> /// <param name="companyType"></param> //protected internal Order Confirm(string orderNumber, CompanyType companyType, Type fromType) //{ // Order order = OrderAction.GetOrder(orderNumber, companyType); // if (order != null) // { // OrderAction.Confirm(order, fromType); // } // return order; //} /// <summary> /// 确认订单,并核对通知过来的金额 /// </summary> /// <param name="order"></param> /// <param name="fromType"></param> /// <param name="notifyAmount">通知的订单金额,如果没有填原始订单的金额</param> protected internal void Confirm(IPayHistory order, Type fromType, decimal notifyAmount) { if (order.Amount != notifyAmount) { string message = order.CompanyType + "订单金额和支付金额对不上:" + order.OrderId + " 订单金额:" + order.Amount + " 通知金额:" + notifyAmount; Log(message, true); throw new Exception(message); } string key = "IPayHistory_" + order.OrderId; if (!CoreHelper.ConcurrentControl.Check(key, 10)) { Log("过滤重复通知确认:" + order.OrderId + " amount:" + order.Amount); return; } if (order.Status == OrderStatus.已确认 || order.Status == OrderStatus.已退款) { return; } OnlinePayBusiness.Instance.ConfirmByType(order, fromType); Log("确认订单:" + order.OrderId + " amount:" + order.Amount); }
protected override string OnNotify(System.Web.HttpContext context) { context.Request.ContentEncoding = encode; var c = context.Request.Form; var fields = typeof(ChargeResponse).GetFields(); var obj = new ChargeResponse(); foreach (var item in fields) { item.SetValue(obj, c[item.Name]); } if (obj.CheckSign(obj.ChkValue)) { return("签名不正确"); } if (obj.RespCode == "000000") { IPayHistory order = OnlinePayBusiness.Instance.GetOrder(obj.OrdId, ThisCompanyType); Confirm(order, GetType(), Convert.ToDecimal(obj.OrdAmt)); return(string.Format("RECV_ORD_ID_{0}", obj.OrdId)); } return(string.Format("失败 {0}", obj.RespCode)); }
/// <summary> /// 查询订单状态,返回是否成功 /// </summary> /// <param name="order"></param> /// <returns></returns> public override bool CheckOrder(IPayHistory order, out string message) { string url = AliPay.CreateQueryOrderUrl(company_gateway, "single_trade_query", partner, sign_type, order.OrderId, key, _input_charset); string responseTxt = CoreHelper.HttpRequest.HttpGet(url, Encoding.Default); try { XmlDocument doc = new XmlDocument(); doc.LoadXml(responseTxt); XmlNode node = doc.SelectSingleNode("alipay/response/trade/trade_status"); if (node == null) { message = "服务器返回:" + responseTxt; return(false); } if (node != null) { string trade_status = node.InnerText; if (trade_status == "TRADE_FINISHED" || trade_status == "TRADE_SUCCESS") { if (order.Status != OrderStatus.已确认) { Confirm(order, GetType(), order.Amount); } message = "成功"; return(true); } } } catch (Exception ero) { message = "出现错误:" + ero.Message; return(false); } message = "失败"; return(false); }
public override bool RefundOrder(IPayHistory order, out string message) { message = ""; if (string.IsNullOrEmpty(order.spBillno)) { throw new Exception("支付宝订单号为空,请检查sp_billno"); } ////////////////////////////////////////////请求参数//////////////////////////////////////////// //服务器异步通知页面路径 string notify_url = refundNotifyUrl; //需http://格式的完整路径,不允许加?id=123这类自定义参数 //退款批次号 string batch_no = DateTime.Now.ToString("yyyyMMdd") + order.OrderId.Substring(6, order.OrderId.Length - 6) + "C"; //必填,每进行一次即时到账批量退款,都需要提供一个批次号,必须保证唯一性 //退款请求时间 string refund_date = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"); //必填,格式为:yyyy-MM-dd hh:mm:ss //退款总笔数 string batch_num = "1"; //必填,即参数detail_data的值中,“#”字符出现的数量加1,最大支持1000笔(即“#”字符出现的最大数量999个) //单笔数据集 string detail_data = order.spBillno + "^" + order.Amount + "^协商退款"; //必填,格式详见“4.3 单笔数据集参数说明” //Log(detail_data); //////////////////////////////////////////////////////////////////////////////////////////////// //把请求参数打包成数组 SortedDictionary<string, string> sParaTemp = new SortedDictionary<string, string>(); sParaTemp.Add("partner", partner); sParaTemp.Add("_input_charset", _input_charset); sParaTemp.Add("service", "refund_fastpay_by_platform_nopwd"); sParaTemp.Add("notify_url", notify_url); sParaTemp.Add("batch_no", batch_no); sParaTemp.Add("refund_date", refund_date); sParaTemp.Add("batch_num", batch_num); sParaTemp.Add("detail_data", detail_data); //建立请求 string sHtmlText = AlipaySubmit.BuildRequest(sParaTemp); //请在这里加上商户的业务逻辑程序代码 //——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(sHtmlText); Log(sHtmlText); string status = xmlDoc.SelectSingleNode("/alipay/is_success").InnerText; if (status == "F") { message = "退款失败:" + xmlDoc.SelectSingleNode("/alipay/error").InnerText; return false; } else { if (status == "T") { message = "退款成功"; BaseRefundOrder(order); return true; } else if (status == "P") { message = "退款处理中"; //退款通知会用及时到帐接口发过来 return true; } return false; } }
/// <summary> /// 提交支付,转向需要按具体需求重写 /// </summary> /// <param name="order"></param> public override void Submit(IPayHistory order) { BaseSubmit(order); string out_trade_no =order.OrderId; string subject = order.Desc; //商品名称 string body = order.UserId; //商品描述 string price = order.Amount.ToString(); //商品价格 string bankType = order.BankType; //银行代码 string token = (HttpContext.Current.Session["ali_token"] != null) ? HttpContext.Current.Session["ali_token"].ToString() : string.Empty; // 支付宝来源用户的验证码 //相关参数名称具体含义,可以在支付宝接口服务文档中查询到, //以上两个文件,通知正常都可以在notify data目录找到通知过来的日志 string aliay_url = string.Empty; if (token == string.Empty) { //HttpContext.Current.Request.QueryString["is_company"] 判断企业网银支付渠道 if (HttpContext.Current.Request.QueryString["is_company"] != null && HttpContext.Current.Request.QueryString["is_company"].ToString()!="") { aliay_url = AliPay.CreatUrl(company_gateway, service, partner, sign_type, out_trade_no, subject, body, price, show_url, seller_email, key, return_url, _input_charset, notify_url, bankType); } else { aliay_url = AliPay.CreatUrl(company_gateway, service, partner, sign_type, out_trade_no, subject, body, price, show_url, seller_email, key, return_url, _input_charset, notify_url, bankType); } } else { if (HttpContext.Current.Request.QueryString["is_company"] != null && HttpContext.Current.Request.QueryString["is_company"].ToString() != "") { aliay_url = AliPay.CreatUrl(company_gateway, service, partner, sign_type, out_trade_no, subject, body, price, show_url, seller_email, key, return_url, _input_charset, notify_url, bankType, token); } else { aliay_url = AliPay.CreatUrl(company_gateway, service, partner, sign_type, out_trade_no, subject, body, price, show_url, seller_email, key, return_url, _input_charset, notify_url, bankType, token); } } //HttpContext.Current.Response.Write(aliay_url); //HttpContext.Current.Response.End(); HttpContext.Current.Response.Redirect(aliay_url); }
/// <summary> /// 退款接口,可重复提交得到状态 /// </summary> /// <param name="order"></param> /// <param name="message"></param> /// <returns></returns> public override bool RefundOrder(IPayHistory order, out string message) { #region 退款 RequestHandler reqHandler = new RequestHandler(HttpContext.Current); //通信对象 TenpayHttpClient httpClient = new TenpayHttpClient(); ClientResponseHandler resHandler = new ClientResponseHandler(); //----------------------------- //设置请求参数 //----------------------------- reqHandler.init(); reqHandler.setKey(key); reqHandler.setGateUrl("https://mch.tenpay.com/refundapi/gateway/refund.xml"); reqHandler.setParameter("partner", bargainor_id); //out_trade_no和transaction_id至少一个必填,同时存在时transaction_id优先 //reqHandler.setParameter("out_trade_no", order.OrderId); reqHandler.setParameter("transaction_id", order.OrderId); reqHandler.setParameter("out_refund_no", order.OrderId + "C"); reqHandler.setParameter("total_fee", (order.Amount * 100).ToString()); reqHandler.setParameter("refund_fee", (order.Amount * 100).ToString()); reqHandler.setParameter("op_user_id", bargainor_id); reqHandler.setParameter("op_user_passwd", ChargeConfig.GetConfigKey(ThisCompanyType, ChargeConfig.DataType.PayPass)); string requestUrl = reqHandler.getRequestURL(); //证书和证书密码 httpClient.setCertInfo(ChargeConfig.GetConfigKey(ThisCompanyType, ChargeConfig.DataType.CertFile), bargainor_id); //设置请求内容 httpClient.setReqContent(requestUrl); //设置超时 httpClient.setTimeOut(10); string rescontent = ""; //后台调用 if (!httpClient.call()) { message = "接口调用失败"; return false; } //获取结果 rescontent = httpClient.getResContent(); resHandler.setKey(key); //设置结果参数 resHandler.setContent(rescontent); message = resHandler.getParameter("retmsg"); //Log("退款返回结果为:" + rescontent); //判断签名及结果 if (!resHandler.isTenpaySign()) { message = "返回签名验证错误"; return false; } if (resHandler.getParameter("retcode") != "0") { return false; } //商户订单号 string out_trade_no = resHandler.getParameter("out_trade_no"); //财富通订单号 string transaction_id = resHandler.getParameter("transaction_id"); // 退款状态: //4,10:退款成功。 //3,5,6:退款失败。 //8,9,11:退款处理中。 //1,2:未确定,需要商户原退款单号重新发起。 //7:转入代发,退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,资金回流到商户的现金帐号,需要商户人工干预,通过线下或者财富通转账的方式进行退款 string refund_status = resHandler.getParameter("refund_status"); if (refund_status == "4" || refund_status == "10") { string recv_user_id = resHandler.getParameter("recv_user_id"); string reccv_user_name = resHandler.getParameter("reccv_user_name"); //Log("退款接收人信息为:" + recv_user_id + " " + reccv_user_name); BaseRefundOrder(order); return true; } if (refund_status == "8" || refund_status == "9" || refund_status == "11") { //todo 自动重复查询 message = "退款处理中"; return true; } return false; #endregion }
/// <summary> /// 接口转向页执行此方法 /// </summary> /// <param name="order"></param> public static void Redirect(IPayHistory order) { Company.CompanyBase company = GetCompany(order.CompanyType); company.Redirect(order); }
public override void Submit(IPayHistory order) { base.BaseSubmit(order); var tenpay = new RequestHandler(HttpContext.Current); tenpay.init(); tenpay.setKey(key); tenpay.setGateUrl("https://gw.tenpay.com/gateway/pay.htm"); tenpay.setParameter("total_fee", ((int)(order.Amount * 100)).ToString()); //用户的公网ip,测试时填写127.0.0.1,只能支持10分以下交易 tenpay.setParameter("spbill_create_ip", ip); tenpay.setParameter("return_url", return_url); tenpay.setParameter("partner", bargainor_id); tenpay.setParameter("out_trade_no", order.OrderId); tenpay.setParameter("notify_url", notify_url); tenpay.setParameter("attach", order.UserId); tenpay.setParameter("body", order.Desc); tenpay.setParameter("bank_type", order.BankType); //系统可选参数 tenpay.setParameter("sign_type", "MD5"); tenpay.setParameter("service_version", "1.0"); tenpay.setParameter("input_charset", ChargeConfig.Charset); tenpay.setParameter("sign_key_index", "1"); string url= tenpay.getRequestURL(); HttpContext.Current.Response.Redirect(url); }
public override bool CheckOrder(IPayHistory order,out string message) { //创建请求对象 RequestHandler reqHandler = new RequestHandler(HttpContext.Current); //通信对象 TenpayHttpClient httpClient = new TenpayHttpClient(); //应答对象 ClientResponseHandler resHandler = new ClientResponseHandler(); //----------------------------- //设置请求参数 //----------------------------- reqHandler.init(); reqHandler.setKey(key); reqHandler.setGateUrl("https://gw.tenpay.com/gateway/normalorderquery.xml"); reqHandler.setParameter("partner", bargainor_id); //out_trade_no和transaction_id至少一个必填,同时存在时transaction_id优先 reqHandler.setParameter("out_trade_no", order.OrderId); //reqHandler.setParameter("transaction_id", "1900000109201103020030626316"); string requestUrl = reqHandler.getRequestURL(); //设置请求内容 httpClient.setReqContent(requestUrl); //设置超时 httpClient.setTimeOut(10); string rescontent = ""; //后台调用 if (httpClient.call()) { //获取结果 rescontent = httpClient.getResContent(); resHandler.setKey(key); //设置结果参数 resHandler.setContent(rescontent); //判断签名及结果 if (resHandler.isTenpaySign() && resHandler.getParameter("retcode") == "0") { //商户订单号 string out_trade_no = resHandler.getParameter("out_trade_no"); //财富通订单号 string transaction_id = resHandler.getParameter("transaction_id"); //金额,以分为单位 string total_fee = resHandler.getParameter("total_fee"); //如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee string discount = resHandler.getParameter("discount"); //支付结果 string trade_state = resHandler.getParameter("trade_state"); //支付成功 if (trade_state == "0") { if (order.Status != OrderStatus.已确认) { Confirm(order, GetType(), order.Amount); } message = "成功"; return true; } } else { message = "失败"; return false; } } else { message = "服务器返回:" + httpClient.getResponseCode(); return false; } message = "失败"; return false; }
/// <summary> /// 退款,取消订单 /// </summary> /// <param name="order"></param> /// <param name="message"></param> /// <returns></returns> public abstract bool RefundOrder(IPayHistory order, out string message);
public override bool RefundOrder(IPayHistory order, out string message) { throw new NotImplementedException(); }
/// <summary> /// 提交支付 /// </summary> /// <param name="order"></param> public static void Submit(IPayHistory order) { if (order.OrderType == OrderType.支付) { if (string.IsNullOrEmpty(order.ProductOrderId)) { throw new Exception("支付类型订单必须传ProductOrderId"); } } Company.CompanyBase company = GetCompany(order.CompanyType); try { company.Submit(order); } catch(Exception ero) { if (ero is System.Threading.ThreadAbortException) { return; } CoreHelper.EventLog.Log("提交支付订单时出错:" + ero, true); throw ero; } }
public override bool CheckOrder(IPayHistory order, out string message) { //创建请求对象 RequestHandler reqHandler = new RequestHandler(HttpContext.Current); //通信对象 TenpayHttpClient httpClient = new TenpayHttpClient(); //应答对象 ClientResponseHandler resHandler = new ClientResponseHandler(); //----------------------------- //设置请求参数 //----------------------------- reqHandler.init(); reqHandler.setKey(key); reqHandler.setGateUrl("https://gw.tenpay.com/gateway/normalorderquery.xml"); reqHandler.setParameter("partner", bargainor_id); //out_trade_no和transaction_id至少一个必填,同时存在时transaction_id优先 reqHandler.setParameter("out_trade_no", order.OrderId); //reqHandler.setParameter("transaction_id", "1900000109201103020030626316"); string requestUrl = reqHandler.getRequestURL(); //设置请求内容 httpClient.setReqContent(requestUrl); //设置超时 httpClient.setTimeOut(10); string rescontent = ""; //后台调用 if (httpClient.call()) { //获取结果 rescontent = httpClient.getResContent(); resHandler.setKey(key); //设置结果参数 resHandler.setContent(rescontent); //判断签名及结果 if (resHandler.isTenpaySign() && resHandler.getParameter("retcode") == "0") { //商户订单号 string out_trade_no = resHandler.getParameter("out_trade_no"); //财富通订单号 string transaction_id = resHandler.getParameter("transaction_id"); //金额,以分为单位 string total_fee = resHandler.getParameter("total_fee"); //如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee string discount = resHandler.getParameter("discount"); //支付结果 string trade_state = resHandler.getParameter("trade_state"); //支付成功 if (trade_state == "0") { if (order.Status != OrderStatus.已确认) { Confirm(order, GetType(), order.Amount); } message = "成功"; return(true); } } else { message = "失败"; return(false); } } else { message = "服务器返回:" + httpClient.getResponseCode(); return(false); } message = "失败"; return(false); }
/// <summary> /// 退款接口,可重复提交得到状态 /// </summary> /// <param name="order"></param> /// <param name="message"></param> /// <returns></returns> public override bool RefundOrder(IPayHistory order, out string message) { #region 退款 RequestHandler reqHandler = new RequestHandler(HttpContext.Current); //通信对象 TenpayHttpClient httpClient = new TenpayHttpClient(); ClientResponseHandler resHandler = new ClientResponseHandler(); //----------------------------- //设置请求参数 //----------------------------- reqHandler.init(); reqHandler.setKey(key); reqHandler.setGateUrl("https://mch.tenpay.com/refundapi/gateway/refund.xml"); reqHandler.setParameter("partner", bargainor_id); //out_trade_no和transaction_id至少一个必填,同时存在时transaction_id优先 //reqHandler.setParameter("out_trade_no", order.OrderId); reqHandler.setParameter("transaction_id", order.OrderId); reqHandler.setParameter("out_refund_no", order.OrderId + "C"); reqHandler.setParameter("total_fee", (order.Amount * 100).ToString()); reqHandler.setParameter("refund_fee", (order.Amount * 100).ToString()); reqHandler.setParameter("op_user_id", bargainor_id); reqHandler.setParameter("op_user_passwd", ChargeConfig.GetConfigKey(ThisCompanyType, ChargeConfig.DataType.PayPass)); string requestUrl = reqHandler.getRequestURL(); //证书和证书密码 httpClient.setCertInfo(ChargeConfig.GetConfigKey(ThisCompanyType, ChargeConfig.DataType.CertFile), bargainor_id); //设置请求内容 httpClient.setReqContent(requestUrl); //设置超时 httpClient.setTimeOut(10); string rescontent = ""; //后台调用 if (!httpClient.call()) { message = "接口调用失败"; return(false); } //获取结果 rescontent = httpClient.getResContent(); resHandler.setKey(key); //设置结果参数 resHandler.setContent(rescontent); message = resHandler.getParameter("retmsg"); //Log("退款返回结果为:" + rescontent); //判断签名及结果 if (!resHandler.isTenpaySign()) { message = "返回签名验证错误"; return(false); } if (resHandler.getParameter("retcode") != "0") { return(false); } //商户订单号 string out_trade_no = resHandler.getParameter("out_trade_no"); //财富通订单号 string transaction_id = resHandler.getParameter("transaction_id"); // 退款状态: //4,10:退款成功。 //3,5,6:退款失败。 //8,9,11:退款处理中。 //1,2:未确定,需要商户原退款单号重新发起。 //7:转入代发,退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,资金回流到商户的现金帐号,需要商户人工干预,通过线下或者财富通转账的方式进行退款 string refund_status = resHandler.getParameter("refund_status"); if (refund_status == "4" || refund_status == "10") { string recv_user_id = resHandler.getParameter("recv_user_id"); string reccv_user_name = resHandler.getParameter("reccv_user_name"); //Log("退款接收人信息为:" + recv_user_id + " " + reccv_user_name); BaseRefundOrder(order); return(true); } if (refund_status == "8" || refund_status == "9" || refund_status == "11") { //todo 自动重复查询 message = "退款处理中"; return(true); } return(false); #endregion }
/// <summary> /// 产生记录并URL转向 /// </summary> /// <param name="order"></param> public abstract void Submit(IPayHistory order);
/// <summary> /// 查询订单状态,返回是否成功 /// </summary> /// <param name="order"></param> /// <returns></returns> public override bool CheckOrder(IPayHistory order,out string message) { string url = AliPay.CreateQueryOrderUrl(company_gateway, "single_trade_query", partner, sign_type, order.OrderId, key, _input_charset); string responseTxt = CoreHelper.HttpRequest.HttpGet(url, Encoding.Default); try { XmlDocument doc = new XmlDocument(); doc.LoadXml(responseTxt); XmlNode node = doc.SelectSingleNode("alipay/response/trade/trade_status"); if (node == null) { message = "服务器返回:" + responseTxt; return false; } if (node != null) { string trade_status = node.InnerText; if (trade_status == "TRADE_FINISHED" || trade_status == "TRADE_SUCCESS") { if (order.Status != OrderStatus.已确认) { Confirm(order, GetType(), order.Amount); } message = "成功"; return true; } } } catch(Exception ero) { message = "出现错误:" + ero.Message; return false; } message = "失败"; return false; }
/// <summary> /// 调用接口检查支付是否成功 /// 根据情况手动Confirm /// </summary> /// <param name="order"></param> public abstract bool CheckOrder(IPayHistory order, out string message);
public override bool RefundOrder(IPayHistory order, out string message) { message = ""; if (string.IsNullOrEmpty(order.spBillno)) { throw new Exception("支付宝订单号为空,请检查sp_billno"); } ////////////////////////////////////////////请求参数//////////////////////////////////////////// //服务器异步通知页面路径 string notify_url = refundNotifyUrl; //需http://格式的完整路径,不允许加?id=123这类自定义参数 //退款批次号 string batch_no = DateTime.Now.ToString("yyyyMMdd") + order.OrderId.Substring(6, order.OrderId.Length - 6) + "C"; //必填,每进行一次即时到账批量退款,都需要提供一个批次号,必须保证唯一性 //退款请求时间 string refund_date = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"); //必填,格式为:yyyy-MM-dd hh:mm:ss //退款总笔数 string batch_num = "1"; //必填,即参数detail_data的值中,“#”字符出现的数量加1,最大支持1000笔(即“#”字符出现的最大数量999个) //单笔数据集 string detail_data = order.spBillno + "^" + order.Amount + "^协商退款"; //必填,格式详见“4.3 单笔数据集参数说明” //Log(detail_data); //////////////////////////////////////////////////////////////////////////////////////////////// //把请求参数打包成数组 SortedDictionary <string, string> sParaTemp = new SortedDictionary <string, string>(); sParaTemp.Add("partner", partner); sParaTemp.Add("_input_charset", _input_charset); sParaTemp.Add("service", "refund_fastpay_by_platform_nopwd"); sParaTemp.Add("notify_url", notify_url); sParaTemp.Add("batch_no", batch_no); sParaTemp.Add("refund_date", refund_date); sParaTemp.Add("batch_num", batch_num); sParaTemp.Add("detail_data", detail_data); //建立请求 string sHtmlText = AlipaySubmit.BuildRequest(sParaTemp); //请在这里加上商户的业务逻辑程序代码 //——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(sHtmlText); Log(sHtmlText); string status = xmlDoc.SelectSingleNode("/alipay/is_success").InnerText; if (status == "F") { message = "退款失败:" + xmlDoc.SelectSingleNode("/alipay/error").InnerText; return(false); } else { if (status == "T") { message = "退款成功"; BaseRefundOrder(order); return(true); } else if (status == "P") { message = "退款处理中"; //退款通知会用及时到帐接口发过来 return(true); } return(false); } }
/// <summary> /// 获取通知,按具体需求重写 /// </summary> /// <param name="context"></param> protected override string OnNotify(HttpContext context) { alipayNotifyURL = alipayNotifyURL + "&partner=" + partner + "¬ify_id=" + context.Request.Form["notify_id"]; //获取支付宝ATN返回结果,true是正确的订单信息,false 是无效的 string responseTxt = CoreHelper.HttpRequest.HttpGet(alipayNotifyURL, Encoding.Default); int i; NameValueCollection coll = context.Request.Form; // Get names of all forms into a string array. String[] requestarr = coll.AllKeys; //进行排序; string[] Sortedstr = AliPay.BubbleSort(requestarr); //构造待md5摘要字符串 ; string prestr = ""; for (i = 0; i < Sortedstr.Length; i++) { if (context.Request.Form[Sortedstr[i]] != "" && Sortedstr[i] != "sign" && Sortedstr[i] != "sign_type") { if (i == Sortedstr.Length - 1) { prestr = prestr + Sortedstr[i] + "=" + context.Request.Form[Sortedstr[i]]; } else { prestr = prestr + Sortedstr[i] + "=" + context.Request.Form[Sortedstr[i]] + "&"; } } } prestr = prestr + key; string mysign = AliPay.GetMD5(prestr, _input_charset); string sign = context.Request.Form["sign"]; string strOrderNO = context.Request.Form["out_trade_no"]; //订单号 string strPrice = context.Request.Form["total_fee"]; //金额 string trade_no = context.Request.Form["trade_no"]; //支付宝订单号 string notify_type = context.Request.Form["notify_type"]; string trade_status = context.Request.Form["trade_status"]; //交易状态 string refund_status = context.Request.Form["refund_status"]; //退款状态 string gmt_refund = context.Request.Form["refund_status"]; //退款时间 if (mysign == sign && responseTxt == "true") //验证支付发过来的消息,签名是否正确 { if (notify_type == "trade_status_sync") { #region 支付&退款 if (trade_status == "WAIT_BUYER_PAY")// 判断支付状态_等待买家付款(文档中有枚举表可以参考) { Log("WAIT_BUYER_PAY" + strOrderNO); context.Response.Write("success"); //返回给支付宝消息,成功,请不要改写这个success }//支付状态成功并且退款通知为NULL else if ((trade_status == "TRADE_FINISHED" || trade_status == "TRADE_SUCCESS") && string.IsNullOrEmpty(refund_status)) { #region 支付处理 IPayHistory order = OnlinePayBusiness.Instance.GetOrder(strOrderNO, ThisCompanyType); order.spBillno = trade_no; Confirm(order, GetType(), Convert.ToDecimal(strPrice)); #endregion //context.Response.Write("success"); //返回给支付宝消息,成功,请不要改写这个success return("success"); } else if (refund_status == "REFUND_SUCCESS")//退款成功 { #region 退款处理 Log("收到退款通知:" + strOrderNO); IPayHistory order = OnlinePayBusiness.Instance.GetOrder(strOrderNO, ThisCompanyType); BaseRefundOrder(order); #endregion //context.Response.Write("success"); return("success"); } else { //context.Response.Write("fail"); return("fail"); } #endregion } else if (notify_type == "batch_trans_notify") { #region 批量付款通知 /*** * string batch_no = context.Request.Form["batch_no"]; * string success_details = context.Request.Form["success_details"]; * string fail_details = context.Request.Form["success_details"]; * List<BatchPayItem> arry1 = BatchPayItem.FromDetail(success_details); * List<BatchPayItem> arry2 = BatchPayItem.FromDetail(fail_details); * foreach(BatchPayItem a in arry1) * { * HotelBookModel.AccountHistory item = new HotelBookModel.AccountHistory(); * item.OrderId = a.OrderNo; * item.Status = HotelBookModel.AccountHistory.AccountStatus.Success; * item.Remark = "转帐成功:" + a.Remark; * item.BatchNo = batch_no; * AccountHistoryAction.UpdateStatus(item); * } * foreach (BatchPayItem a in arry2) * { * HotelBookModel.AccountHistory item = new HotelBookModel.AccountHistory(); * item.OrderId = a.OrderNo; * item.Status = HotelBookModel.AccountHistory.AccountStatus.Fail; * item.Remark = "转帐失败:" + a.Remark; * item.BatchNo = batch_no; * AccountHistoryAction.UpdateStatus(item); * } * context.Response.Write("success"); * **/ #endregion return("success"); } } else { //context.Response.Write("fail"); return("fail"); } return("fail"); }