public static JObject createUrl(string from, string fromNo, string fee, string subject, string currentHost) { var now = DateTime.Now.ToString("yyyyMMddHHmmssfff"); var out_trade_no = now + CommonBusiness.CreateRandom(); //付款金额,必填 var total_fee = (double.Parse(fee)).ToString(); //订单名称,必填 if (string.IsNullOrEmpty(subject)) { subject = "微信支付"; } var content = GetUnifiedOrderResult(out_trade_no, total_fee, subject); // 本地数据维护 微信单位为分 var result = TradeBusiness.AddTrade(out_trade_no, from, fromNo, PaymentType.WechatPay, fee, subject, null, "0"); if (!(bool)result["Flg"]) { throw new Exception("本地数据维护失败"); } return(new JObject( new JProperty("Trade", ((JObject)result["Object"])["result"]), new JProperty("Content", content))); }
public void ProcessRequest(HttpContext context) { var from = context.Request.QueryString["from"] ?? "73D589ED1"; var tradeNo = context.Request.QueryString["tradeNo"] ?? "20171025103417195232829"; var fee = context.Request.QueryString["fee"] ?? "10"; var result = TradeBusiness.GetTrade(tradeNo, from); ICBC.Refund.execute(from, tradeNo, string.Empty, fee, result); context.Response.ContentType = "text/plain"; context.Response.Write("Hello World"); }
private void btnGetCategories_Click(object sender, EventArgs e) { try { //This model implements the ITrade mandatory interface List <TradeModel> tradeList = new List <TradeModel>(); this.categoriesList.Items.Clear(); if (this.dataGridViewTrades.Rows.Count == 0) { MessageBox.Show("Please save at least one value!"); } else { for (int i = 0; i < dataGridViewTrades.Rows.Count; i++) { var value = dataGridViewTrades.Rows[i].Cells[0].Value.ToString(); var clientSector = dataGridViewTrades.Rows[i].Cells[1].Value.ToString(); tradeList.Add(new TradeModel() { Value = Double.Parse(value), ClientSector = clientSector }); } if (tradeList.Count > 0) { List <String> resultCat = new TradeBusiness().SeeCategories(tradeList); foreach (var cat in resultCat) { categoriesList.Items.Add(cat); this.t = new List <TradeModel>(); } } } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
public void ProcessRequest(HttpContext context) { var result = false; try { var xdocument = XDocument.Load(context.Request.InputStream); var return_code = xdocument.Descendants("return_code").FirstOrDefault(); if (return_code != null && return_code.Value == "SUCCESS") { var result_code = xdocument.Descendants("result_code").First().Value; var out_trade_no = xdocument.Descendants("out_trade_no").First().Value; var transaction_id = xdocument.Descendants("transaction_id").First().Value; var status = (result_code == "SUCCESS" ? TradeStatus.NOTIFYSUCCESS : TradeStatus.NOTIFYISSUE); WebApiConfig.log.Info("微信通知 " + out_trade_no + "-" + transaction_id + ":" + result_code); JObject localResult; if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, transaction_id, PaymentType.WechatPay, result_code, status, out localResult)) { WebApiConfig.log.Error(out_trade_no + "-" + transaction_id + "微信通知支付成功,本地数据库状态维护失败"); } else { result = true; } // 通知患者端 PatientCustomerBusiness.NotifyPatient(localResult); } } catch { } if (result) { context.Response.ContentType = "text/xml"; context.Response.Write("<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>"); } else { context.Response.ContentType = "text/xml"; context.Response.Write("<xml><return_code><![CDATA[FAIL]]></return_code></xml>"); } }
public static JObject execute(string from, string out_trade_no, string trade_no, string refund_amount, JObject result) { // 标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传。 var now = DateTime.Now.ToString("yyyyMMddHHmmssfff"); var out_request_no = now + CommonBusiness.CreateRandom(); var amount = (double.Parse(refund_amount) / 100).ToString(); IAopClient client = new DefaultAopClient(ConfigurationManager.AppSettings["alipay.port"], ConfigurationManager.AppSettings["alipay.appId"], ConfigurationManager.AppSettings["alipay.privateKey"]); AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); request.BizContent = "{" + string.Format( " \"out_trade_no\":\"{0}\"," + " \"trade_no\":\"{1}\"," + " \"refund_amount\":{2}," + " \"refund_reason\":\"正常退款\"," + " \"out_request_no\":{3}", out_trade_no, trade_no, amount, out_request_no) + " }"; AlipayTradeRefundResponse response = client.Execute(request); if (!response.IsError) { WebApiConfig.log.Error("支付宝退款成功:" + out_trade_no + "," + out_request_no + "," + amount); JObject localResult; if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, response.TradeNo, PaymentType.Alipay, string.Empty, TradeStatus.REFUND, out localResult)) { WebApiConfig.log.Error(out_trade_no + "-" + trade_no + "支付宝退款成功,本地数据库状态维护失败:" + out_trade_no); return(new JObject(new JProperty("Trade", result))); } else { return(new JObject(new JProperty("Trade", localResult))); } } else { WebApiConfig.log.Error("支付宝退款失败:" + out_trade_no + "," + out_request_no + "," + amount + "-" + response.SubMsg); throw new Exception("支付宝退款失败:" + response.SubMsg); } }
public HttpResponseMessage Get(string no, string from, string type) { var response = new RetDTO(); JObject requestHeader = new JObject(); try { if (string.IsNullOrEmpty(no) || string.IsNullOrEmpty(from) || string.IsNullOrEmpty(type)) { response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.ParamError, "参数不正确"); return(Request.CreateResponse(HttpStatusCode.OK, response, "application/json")); } JObject result; if (type == "1") { result = TradeBusiness.GetTrade(no, from); } else if (type == "2") { result = TradeBusiness.GetByActualTradeNo(no, from); } else { result = TradeBusiness.GetByTradeFromNo(no, from); } response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.Success, string.Empty); response.Body = result; return(Request.CreateResponse(HttpStatusCode.OK, response, "application/json")); } catch (Exception ex) { response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.CatchError, ex.Message); return(Request.CreateResponse(HttpStatusCode.OK, response, "application/json")); } }
public static JObject execute(string from, string out_trade_no, string trade_no, string refund_amount, JObject result) { var content = RefundRequest(out_trade_no, refund_amount); if (content.IsSet("refund_id") && content.IsSet("transaction_id")) { WebApiConfig.log.Error("微信退款成功:" + out_trade_no); JObject localResult; if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, content.GetValue("transaction_id").ToString(), PaymentType.WechatPay, content.GetValue("refund_id").ToString(), TradeStatus.REFUND, out localResult)) { WebApiConfig.log.Error(out_trade_no + "-" + trade_no + "微信退款成功,本地数据库状态维护失败:" + out_trade_no); return(new JObject(new JProperty("Trade", result))); } else { return(new JObject(new JProperty("Trade", localResult))); } } else { WebApiConfig.log.Error("微信退款成功, 返回值不对:" + out_trade_no); throw new Exception("微信退款成功, 返回值不对:" + out_trade_no); } }
public HttpResponseMessage Get(string startTime, string endTime) { var response = new RetDTO(); JObject requestHeader = new JObject(); try { if (string.IsNullOrEmpty(startTime) || string.IsNullOrEmpty(endTime)) { response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.ParamError, "参数不正确"); return(Request.CreateResponse(HttpStatusCode.OK, response, "application/json")); } var result = TradeBusiness.GetTradeList(startTime, endTime); response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.Success, string.Empty); response.Body = result; return(Request.CreateResponse(HttpStatusCode.OK, response, "application/json")); } catch (Exception ex) { response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.CatchError, ex.Message); return(Request.CreateResponse(HttpStatusCode.OK, response, "application/json")); } }
protected void Page_Load(object sender, EventArgs e) { WebApiConfig.log.Info(Request.RawUrl); SortedDictionary <string, string> sPara = GetRequestGet(); if (sPara.Count > 0)//判断是否有带返回参数 { Notify aliNotify = new Notify(); //bool verifyResult = aliNotify.Verify(sPara, Request.QueryString["notify_id"], Request.QueryString["sign"]); string sign = sPara["sign"]; sPara.Remove("sign"); sPara.Remove("sign_type"); string signContent = AlipaySignature.GetSignContent(sPara); var verifyResult = AlipaySignature.RSACheckContent(signContent, sign, ConfigurationManager.AppSettings["alipay.publicKey"], Request.QueryString["charset"], "RSA", false); if (verifyResult)//验证成功 { ///////////////////////////////////////////////////////////////////////////////////////////////////////////// //请在这里加上商户的业务逻辑程序代码 //——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表 //商户订单号 string out_trade_no = Request.QueryString["out_trade_no"]; //支付宝交易号 string trade_no = Request.QueryString["trade_no"]; //交易状态 string trade_status = Request.QueryString["trade_status"] ?? string.Empty; JObject localResult; int resultCode; if (Request.QueryString["trade_status"] == "TRADE_FINISHED") { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 WebApiConfig.log.Info(out_trade_no + "-" + trade_no + "支付宝返回订单完成"); if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, trade_no, PaymentType.Alipay, trade_status, TradeStatus.RETURNFINISHED, out localResult)) { WebApiConfig.log.Error(out_trade_no + "-" + trade_no + "支付宝返回订单完成,本地数据库状态维护失败"); } resultCode = (int)TradeStatus.RETURNFINISHED; } else if (Request.QueryString["trade_status"] == "TRADE_SUCCESS") { WebApiConfig.log.Info(out_trade_no + "-" + trade_no + "支付宝返回订单支付成功"); if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, trade_no, PaymentType.Alipay, trade_status, TradeStatus.RETURNSUCCESS, out localResult)) { WebApiConfig.log.Error(out_trade_no + "-" + trade_no + "支付宝返回订单支付成功,本地数据库状态维护失败"); } resultCode = (int)TradeStatus.RETURNSUCCESS; } else { WebApiConfig.log.Error(out_trade_no + "-" + trade_no + "支付宝沒有返回订单支付結果"); // ? 新接口return 沒有trade_status //TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, trade_no, PaymentType.Alipay, trade_status, TradeStatus.RETURNISSUE, out localResult); //resultCode = (int)TradeStatus.RETURNISSUE; TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, trade_no, PaymentType.Alipay, trade_status, TradeStatus.RETURNISSUE, out localResult); resultCode = (int)TradeStatus.RETURNSUCCESS; } var returnUrl = localResult.GetValue("ReturnUrl") == null ? string.Empty : localResult.GetValue("ReturnUrl").ToString(); if (string.IsNullOrEmpty(returnUrl)) { //打印页面 Response.Write(out_trade_no + "订单处理完毕"); } else { var fee = localResult.GetValue("Fee").ToString(); Response.Clear(); Response.Write("<script>top.postMessage('{\"url\":\"" + string.Format("{0}?result={1}&tradeNo={2}&fee={3}\"", returnUrl, resultCode, out_trade_no, fee) + "}', '*');</script>"); Response.End(); } //——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— ///////////////////////////////////////////////////////////////////////////////////////////////////////////// } else//验证失败 { WebApiConfig.log.Error("支付宝返回结果验证失败"); Response.Write("支付宝返回结果验证失败"); } } else { WebApiConfig.log.Error("支付宝返回结果无返回参数"); Response.Write("支付宝返回结果无返回参数"); } }
public static JObject createForm(PaymentType paymentType, string from, string fromNo, string fee, string subject, string installmentTimes, bool isPC = false) { ////////////////////////////////////////////请求参数//////////////////////////////////////////// //商户订单号,商户网站订单系统中唯一订单号,必填 var now = DateTime.Now; var out_trade_no = now.ToString("yyyyMMddHHmmssfff") + CommonBusiness.CreateRandom(); var orderDate = now.ToString("yyyyMMddHHmmss"); //订单名称,必填 if (string.IsNullOrEmpty(subject)) { subject = "工行支付"; } //付款金额,必填 var total_fee = (double.Parse(fee)).ToString(); if (!isPC) { var tranData = CreateTranData(orderDate, out_trade_no, total_fee, installmentTimes); // 本地数据维护 支付宝单位为元 支付宝类型统一为alipay 不好区分 var result = TradeBusiness.AddTrade(out_trade_no, from, fromNo, PaymentType.ICBC, total_fee, subject, string.Empty, "0"); if (!(bool)result["Flg"]) { throw new Exception("本地数据维护失败"); } var bytes = Encoding.GetEncoding("gbk").GetBytes(tranData); var translateString = Convert.ToBase64String(bytes); var form = new StringBuilder(); var signs = CBCPayOnline.GetCheckInfo(tranData); form.Append("<h3>页面跳转中。。。</h3>"); //form.Append("<form style=\"display:none;\" id=\"payForm\" action=\"http://wap2.icbc.com.cn/servlet/ICBCWAPEBizServlet\" > "); form.Append("<form style=\"display:none;\" id=\"payForm\" action=\"https://mywap2.icbc.com.cn/ICBCWAPBank/servlet/ICBCWAPEBizServlet\" > "); form.Append("<INPUT NAME=\"interfaceName\" TYPE=\"text\" value=\"ICBC_WAPB_B2C\">"); form.Append("<INPUT NAME=\"interfaceVersion\" TYPE=\"text\" value=\"1.0.0.6\">"); form.Append("<INPUT NAME=\"tranData\" TYPE=\"text\" value=\"" + translateString + "\">"); form.Append("<INPUT NAME=\"merSignMsg\" TYPE=\"text\" value=\"" + signs[0] + "\">"); form.Append("<INPUT NAME=\"merCert\" TYPE=\"text\" value=\"" + signs[1] + "\">"); form.Append("<INPUT NAME=\"clientType\" TYPE=\"text\" value=\"0\">"); form.Append("</form>"); form.Append("<script>document.forms['payForm'].submit();</script>"); return(new JObject( new JProperty("Trade", ((JObject)result["Object"])["result"]), new JProperty("Content", form.ToString()))); } else { var tranData = CreateTranData_PC(orderDate, out_trade_no, total_fee, installmentTimes); // 本地数据维护 支付宝单位为元 支付宝类型统一为alipay 不好区分 var result = TradeBusiness.AddTrade(out_trade_no, from, fromNo, PaymentType.ICBC, total_fee, subject, string.Empty, "0"); if (!(bool)result["Flg"]) { throw new Exception("本地数据维护失败"); } var bytes = Encoding.GetEncoding("gbk").GetBytes(tranData); var translateString = Convert.ToBase64String(bytes); var form = new StringBuilder(); var signs = CBCPayOnline.GetCheckInfo(tranData); form.Append("<h3>页面跳转中。。。</h3>"); //form.Append("<form style=\"display:none;\" id=\"payForm\" action=\"http://wap2.icbc.com.cn/servlet/ICBCWAPEBizServlet\" > "); form.Append("<form style=\"display:none;\" id=\"payForm\" action=\"https://B2C.icbc.com.cn/servlet/ICBCINBSEBusinessServlet\" > "); form.Append("<INPUT NAME=\"interfaceName\" TYPE=\"text\" value=\"ICBC_PERBANK_B2C\">"); form.Append("<INPUT NAME=\"interfaceVersion\" TYPE=\"text\" value=\"1.0.0.11\">"); form.Append("<INPUT NAME=\"tranData\" TYPE=\"text\" value=\"" + translateString + "\">"); form.Append("<INPUT NAME=\"merSignMsg\" TYPE=\"text\" value=\"" + signs[0] + "\">"); form.Append("<INPUT NAME=\"merCert\" TYPE=\"text\" value=\"" + signs[1] + "\">"); //form.Append("<INPUT NAME=\"clientType\" TYPE=\"text\" value=\"0\">"); form.Append("</form>"); form.Append("<script>document.forms['payForm'].submit();</script>"); return(new JObject( new JProperty("Trade", ((JObject)result["Object"])["result"]), new JProperty("Content", form.ToString()))); } }
public static JObject createForm(string from, string fromNo, string fee, string subject, string returnUrl) { ////////////////////////////////////////////请求参数//////////////////////////////////////////// //商户订单号,商户网站订单系统中唯一订单号,必填 var now = DateTime.Now.ToString("yyyyMMddHHmmssfff"); var txnTime = DateTime.Now.ToString("yyyyMMddHHmmss"); var out_trade_no = now + CommonBusiness.CreateRandom(); //订单名称,必填 if (string.IsNullOrEmpty(subject)) { subject = "银联付款"; } //付款金额,必填 var total_fee = fee; //商品描述,可空 var body = string.Empty; //////////////////////////////////////////////////////////////////////////////////////////////// /** * 重要:联调测试时请仔细阅读注释! * * 产品:跳转网关支付产品<br> * 交易:消费:前台跳转,有前台通知应答和后台通知应答<br> * 日期: 2015-09<br> * 版本: 1.0.0 * 版权: 中国银联<br> * 说明:以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己需要,按照技术文档编写。该代码仅供参考,不提供编码性能规范性等方面的保障<br> * 提示:该接口参考文档位置:open.unionpay.com帮助中心 下载 产品接口规范 《网关支付产品接口规范》,<br> * 《平台接入接口规范-第5部分-附录》(内包含应答码接口规范,全渠道平台银行名称-简码对照表)<br> * 《全渠道平台接入接口规范 第3部分 文件接口》(对账文件格式说明)<br> * 测试过程中的如果遇到疑问或问题您可以:1)优先在open平台中查找答案: * 调试过程中的问题或其他问题请在 https://open.unionpay.com/ajweb/help/faq/list 帮助中心 FAQ 搜索解决方案 * 测试过程中产生的6位应答码问题疑问请在https://open.unionpay.com/ajweb/help/respCode/respCodeList 输入应答码搜索解决方案 * 2) 咨询在线人工支持: open.unionpay.com注册一个用户并登陆在右上角点击“在线客服”,咨询人工QQ测试支持。 * 交易说明:1)以后台通知或交易状态查询交易确定交易成功,前台通知不能作为判断成功的标准. * 2)交易状态查询交易(Form_6_5_Query)建议调用机制:前台类交易建议间隔(5分、10分、30分、60分、120分)发起交易查询,如果查询到结果成功,则不用再查询。(失败,处理中,查询不到订单均可能为中间状态)。也可以建议商户使用payTimeout(支付超时时间),过了这个时间点查询,得到的结果为最终结果。 */ Dictionary <string, string> param = new Dictionary <string, string>(); //以下信息非特殊情况不需要改动 param["version"] = "5.0.0"; //版本号 param["encoding"] = "UTF-8"; //编码方式 param["txnType"] = "01"; //交易类型 param["txnSubType"] = "01"; //交易子类 param["bizType"] = "000201"; //业务类型 param["signMethod"] = "01"; //签名方法 param["channelType"] = "08"; //渠道类型 param["accessType"] = "0"; //接入类型 param["frontUrl"] = SDKConfig.FrontUrl; //前台通知地址 param["backUrl"] = SDKConfig.BackUrl; //后台通知地址 param["currencyCode"] = "156"; //交易币种 //TODO 以下信息需要填写 param["merId"] = "777290058110048"; //商户号,请改自己的测试商户号,此处默认取demo演示页面传递的参数 param["orderId"] = out_trade_no; //商户订单号,8-32位数字字母,不能含“-”或“_”,此处默认取demo演示页面传递的参数,可以自行定制规则 param["txnTime"] = txnTime; //订单发送时间,格式为YYYYMMDDhhmmss,取北京时间,此处默认取demo演示页面传递的参数,参考取法: DateTime.Now.ToString("yyyyMMddHHmmss") param["txnAmt"] = total_fee; //交易金额,单位分,此处默认取demo演示页面传递的参数 //param["reqReserved"] = "透传信息";//请求方保留域,透传字段,查询、通知、对账文件中均会原样出现,如有需要请启用并修改自己希望透传的数据 //TODO 其他特殊用法请查看 pages/api_01_gateway/special_use_purchase.htm AcpService.Sign(param, System.Text.Encoding.UTF8); // 本地数据维护 银联单位为分 var result = TradeBusiness.AddTrade(out_trade_no, from, fromNo, PaymentType.Alipay, fee, subject, returnUrl, "0"); if (!(bool)result["Flg"]) { throw new Exception("本地数据维护失败"); } var content = AcpService.CreateAutoFormHtml(SDKConfig.FrontTransUrl, param, System.Text.Encoding.UTF8);// 将SDKUtil产生的Html文档写入页面,从而引导用户浏览器重定向 return(new JObject( new JProperty("Trade", ((JObject)result["Object"])["result"]), new JProperty("Content", content))); }
public void ProcessRequest(HttpContext context) { var result = false; try { var str = "工行通知:"; foreach (var item in context.Request.Form.AllKeys) { str += string.Format("{0}:{1},", item, context.Request.Form[item]); } WebApiConfig.log.Info(str); var notifyData = Encoding.GetEncoding("gbk").GetString(Convert.FromBase64String(context.Request.Form["notifyData"])); WebApiConfig.log.Info("notifyData:" + notifyData); var xdocument = XDocument.Parse(notifyData); var return_code = xdocument.Descendants("tranStat").First().Value; var out_trade_no = xdocument.Descendants("orderid").First().Value; var orderDate = xdocument.Descendants("orderDate").First().Value; var amount = xdocument.Descendants("amount").First().Value; var installmentTimes = xdocument.Descendants("installmentTimes").First().Value; var tranSerialNoNode = xdocument.Descendants("TranSerialNo").FirstOrDefault(); if (tranSerialNoNode == null) { tranSerialNoNode = xdocument.Descendants("tranSerialNo").FirstOrDefault(); } var tranSerialNo = tranSerialNoNode.Value; // 银行端指令流水号 var comment = xdocument.Descendants("comment").First().Value; WebApiConfig.log.Info("工行通知(" + out_trade_no + "-" + orderDate + "-" + amount + "-" + installmentTimes + "):" + return_code); TradeStatus status; if (return_code == "1") { status = TradeStatus.NOTIFYSUCCESS; } else if (return_code == "2") { status = TradeStatus.NOTIFYISSUE; } else if (return_code == "3") { status = TradeStatus.NOTIFYSUSPECT; } else { status = TradeStatus.NOTIFYUNKNOWN; } JObject localResult; if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, tranSerialNo, PaymentType.ICBC, return_code, status, out localResult)) { WebApiConfig.log.Error(out_trade_no + "-" + tranSerialNo + ":接受到工行通知,本地数据库状态维护失败"); } else { result = true; } if (return_code == "1") { // 通知患者端 PatientCustomerBusiness.NotifyPatient(localResult); } } catch (Exception e) { WebApiConfig.log.Error(e.ToString()); } // todo if (result) { context.Response.ContentType = "text/html"; context.Response.Write("success"); } else { context.Response.ContentType = "text/html"; context.Response.Write("failure"); } }
/// <summary> /// 检查未提交订单 /// </summary> public static void CheckOrder() { while (true) { var now = DateTime.Now; var start = now.AddHours(-24); var list = TradeBusiness.GetTradeList(start.ToString(), now.ToString()); var outMess = string.Empty; foreach (var item in list) { var jObject = item as JObject; var tradeNo = jObject.GetValue("TradeNo").ToString(); var status = jObject.GetValue("Status").ToString(); if (status == "4" || status == "7") { break; } try { var mess = CheckOrder(tradeNo, tradeNo.Substring(0, 8), ConfigurationManager.AppSettings["icbc.merID"], ConfigurationManager.AppSettings["icbc.merAcct"], out outMess); if (mess.Length > 5)//缴费成功,未返回错误编码,返回xml数据 { DataSet myds = new DataSet(); StringReader strReader = new StringReader(mess); myds.ReadXml(strReader); string stat = myds.Tables["out"].Rows[0]["tranStat"].ToString(); if (stat == "1" || stat == "0") { var actualTradeNo = myds.Tables["out"].Rows[0]["tranSerialNum"].ToString(); JObject localResult; if (!TradeBusiness.UpdateTradeStatusSeveralTimes(tradeNo, actualTradeNo, PaymentType.ICBC, stat, TradeStatus.NOTIFYSUCCESS, out localResult)) { WebApiConfig.log.Info(tradeNo + ":工行查询支付成功,本地数据库状态维护失败"); } // 通知患者端 PatientCustomerBusiness.NotifyPatient(localResult); } else//支付失败 { WebApiConfig.log.Error(tradeNo + ":工行查询支付失败"); } } else { string pays = ""; switch (mess) { case "40972": pays = "API查询的订单不存在"; break; case "40973": pays = "API查询过程中系统异常"; break; case "40976": pays = "API查询系统异常"; break; case "40977": pays = "商户证书信息错"; break; case "40978": pays = "解包商户请求数据报错"; break; case "40979": pays = "查询的订单不存在"; break; case "40980": pays = "API查询过程中系统异常"; break; case "40981": pays = "给商户打包返回数据错"; break; case "40982": pays = "系统错误"; break; case "40983": pays = "查询的订单不唯一"; break; case "40987": pays = "商户代码或者商城账号有误"; break; case "40947": pays = "给商户打包返回数据错"; break; case "40948": pays = "商城状态非法"; break; case "40949": pays = "商城类别非法"; break; case "40950": pays = "商城应用类别非法"; break; case "40951": pays = "商户证书id状态非法"; break; case "40952": pays = "商户证书id未绑定"; break; case "40953": pays = "商户id权限非法"; break; case "40954": pays = "检查商户状态时数据库异常"; break; } WebApiConfig.log.Error(tradeNo + ":工行查询支付发生错误, 错误编码:" + mess + "-" + pays); } } catch (Exception e) { WebApiConfig.log.Error(tradeNo + ":工行查询支付发生错误:" + e.ToString()); } } System.Threading.Thread.Sleep(1000 * 60 * 60); } }
//public static JObject execute(string from, string out_trade_no, string trade_no, string refund_amount, JObject result) //{ // // 标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传。 // var amount = (double.Parse(refund_amount)).ToString(); // var now = DateTime.Now; // var seqno = now.ToString("yyyyMMddHHmmssfff") + CommonBusiness.CreateRandom(); // var signTime = now.ToString("yyyyMMddHHmmssfff"); // var tranDate = now.ToString("yyyyMMdd"); // var tranTime = now.ToString("HHmmssfff"); // var sb = new StringBuilder(); // sb.Append("<?xml version=\"1.0\" encoding=\"GBK\"?>"); // sb.Append("<CMS>"); // sb.Append("<eb>"); // sb.Append("<pub>"); // sb.Append("<TransCode>EBUSCOM</TransCode>"); //交易代码 // sb.Append("<CIS>100190013673155</CIS>"); // 客户注册时的归属编码,集团CIS号 // sb.Append("<BankCode>102</BankCode>"); // 客户注册时的归属单位,归属银行编号 // sb.Append("<ID>Niuluo.y.1001</ID> "); // 无证书客户可上送空 // sb.Append("<TranDate>" + tranDate + "</TranDate>"); // ERP系统产生的交易日期,格式是yyyyMMdd // sb.Append("<TranTime>" + tranTime + "</TranTime>"); // ERP系统产生的交易时间,格式如HHmmssSSS,精确到毫秒 // sb.Append("<fSeqno>" + seqno + "</fSeqno>"); // ERP系统产生的指令包序列号,一个集团永远不能重复 // sb.Append("</pub>"); // sb.Append("<in>"); // sb.Append("<TranType>0</TranType>"); // 0:退货 1:返还 2:转付 // sb.Append("<ShopType>2</ShopType>"); // 1:B2B商城 2:B2C商城 // sb.Append("<ShopCode>" + ConfigurationManager.AppSettings["icbc.merID"] + "</ShopCode>"); // 商城代码 // sb.Append("<ShopAcct>" + ConfigurationManager.AppSettings["icbc.merAcct"] + "</ShopAcct>"); // 商城账号 银联订单不可以上送 // sb.Append("<OrderNum>" + out_trade_no + "</OrderNum>"); // sb.Append("<PayType></PayType>"); // 0:普通 1:加急(B2C交易可为空) // sb.Append("<PayDate>" + out_trade_no.Substring(0, 8) + "</PayDate>"); // yyyyMMdd(支持14位日期,前8位生效) // sb.Append("<TransferName></TransferName>"); // B2C转付操作时必输,其他情况为空 // sb.Append("<TransferAccNo></TransferAccNo>"); // B2C转付操作时必输,其他情况为空 // sb.Append("<PayAmt>" + amount + "</PayAmt>"); // 以分为单位,B2C转付交易时需控制单笔金额(<=5万元), 融e购订单复用为现金支付金额 // sb.Append("<SignTime>" + signTime + "</SignTime>"); // 格式是yyyyMMddHHmmssSSS // sb.Append("<ReqReserved1></ReqReserved1>"); // 退货时,可输入退货原因 // sb.Append("<ReqReserved2></ReqReserved2> "); // 融e购订单复用为退货积分值|退货积分等值金额|退货积分对应商户金额 // sb.Append("<AcctSeq></AcctSeq> "); // sb.Append("</in>"); // sb.Append("</eb>"); // sb.Append("</CMS>"); // var queryParams = new StringBuilder(); // queryParams.Append("Version=0.0.1.0"); // queryParams.Append("&TransCode=EBUSCOM"); // queryParams.Append("&BankCode=102"); // queryParams.Append("&GroupCIS=100190013673155"); // queryParams.Append("&ID=Niuluo.y.1001"); // 客户的证书ID(无证书客户可空) // queryParams.Append("&PackageID=" + seqno); // 客户的指令包序列号(由客户ERP系统产生,不可重复) // queryParams.Append("&Cert=客户的证书公钥信息(进行BASE64编码)"); // queryParams.Append("&reqData=" + CBCPayOnline.Encode(sb.ToString())); // 客户的xml请求数据 // var errorInfo = string.Empty; // CBCPayOnline.PostDataBySSL(queryParams.ToString(), "https://银行通讯前置的地址和加密端口号?请求数据", string.Empty, string.Empty, out errorInfo); // WebApiConfig.log.Info("工行退费返回结果:" + errorInfo); // if (errorInfo.IndexOf("errorCode=") > -1) // { // WebApiConfig.log.Error("工行退费失败:" + errorInfo); // throw new Exception("工行退费失败"); // } // else if (errorInfo.IndexOf("reqData=") > -1) // { // var returnStr = CBCPayOnline.Decode(errorInfo.Replace("reqData=", string.Empty), "gbk"); // WebApiConfig.log.Info("工行退费返回xml:" + returnStr); // var doc = XDocument.Parse(returnStr); // var orderNum = doc.Descendants("OrderNum").FirstOrDefault().Value; // var resultCode = doc.Descendants("Result").FirstOrDefault().Value; // var fee = doc.Descendants("PayAmt").FirstOrDefault().Value; // var retCode = doc.Descendants("RetCode").FirstOrDefault().Value; // if (orderNum != out_trade_no) // { // WebApiConfig.log.Error("工行退费订单号不匹配:" + orderNum + "&" + out_trade_no); // throw new Exception("工行退费交易不成功"); // } // else if (resultCode != "1") // { // WebApiConfig.log.Error("工行退费交易不成功:" + orderNum + "&" + resultCode); // throw new Exception("工行退费交易不成功"); // } // else // { // WebApiConfig.log.Error("工行退费成功:" + orderNum + "&" + fee); // JObject localResult; // if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, retCode, PaymentType.ICBC, string.Empty, TradeStatus.REFUND, out localResult)) // { // WebApiConfig.log.Error("工行退费成功,本地数据库状态维护失败:" + orderNum); // return new JObject(new JProperty("Trade", result)); // } // else // { // return new JObject(new JProperty("Trade", localResult)); // } // } // } // else // { // WebApiConfig.log.Error("工行退费结果未知:" + errorInfo); // throw new Exception("工行退费失败"); // } //} public static JObject execute(string from, string out_trade_no, string trade_no, string refund_amount, JObject result) { //return new JObject(new JProperty("Trade", result)); // 标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传。 var amount = (double.Parse(refund_amount)).ToString(); var now = DateTime.Now; var seqno = now.ToString("yyyyMMddHHmmssfff") + CommonBusiness.CreateRandom(); var signTime = now.ToString("yyyyMMddHHmmssfff"); var tranDate = now.ToString("yyyyMMdd"); var tranTime = now.ToString("HHmmssfff"); var sb = new StringBuilder(); sb.Append("<?xml version=\"1.0\" encoding=\"GBK\"?>"); sb.Append("<CMS>"); sb.Append("<eb>"); sb.Append("<pub>"); sb.Append("<TransCode>EBUSCOM</TransCode>"); //交易代码 sb.Append("<CIS>100190013673155</CIS>"); // 客户注册时的归属编码,集团CIS号 sb.Append("<BankCode>102</BankCode>"); // 客户注册时的归属单位,归属银行编号 sb.Append("<ID>Niuluo.y.1001</ID> "); // 无证书客户可上送空 sb.Append("<TranDate>" + tranDate + "</TranDate>"); // ERP系统产生的交易日期,格式是yyyyMMdd sb.Append("<TranTime>" + tranTime + "</TranTime>"); // ERP系统产生的交易时间,格式如HHmmssSSS,精确到毫秒 sb.Append("<fSeqno>" + seqno + "</fSeqno>"); // ERP系统产生的指令包序列号,一个集团永远不能重复 sb.Append("</pub>"); sb.Append("<in>"); sb.Append("<TranType>0</TranType>"); // 0:退货 1:返还 2:转付 sb.Append("<ShopType>2</ShopType>"); // 1:B2B商城 2:B2C商城 sb.Append("<ShopCode>" + ConfigurationManager.AppSettings["icbc.merID"] + "</ShopCode>"); // 商城代码 sb.Append("<ShopAcct>" + ConfigurationManager.AppSettings["icbc.merAcct"] + "</ShopAcct>"); // 商城账号 银联订单不可以上送 sb.Append("<OrderNum>" + out_trade_no + "</OrderNum>"); sb.Append("<PayType></PayType>"); // 0:普通 1:加急(B2C交易可为空) sb.Append("<PayDate>" + out_trade_no.Substring(0, 8) + "</PayDate>"); // yyyyMMdd(支持14位日期,前8位生效) sb.Append("<TransferName></TransferName>"); // B2C转付操作时必输,其他情况为空 sb.Append("<TransferAccNo></TransferAccNo>"); // B2C转付操作时必输,其他情况为空 sb.Append("<PayAmt>" + amount + "</PayAmt>"); // 以分为单位,B2C转付交易时需控制单笔金额(<=5万元), 融e购订单复用为现金支付金额 sb.Append("<SignTime>" + signTime + "</SignTime>"); // 格式是yyyyMMddHHmmssSSS sb.Append("<ReqReserved1></ReqReserved1>"); // 退货时,可输入退货原因 sb.Append("<ReqReserved2></ReqReserved2> "); // 融e购订单复用为退货积分值|退货积分等值金额|退货积分对应商户金额 sb.Append("<AcctSeq></AcctSeq> "); sb.Append("</in>"); sb.Append("</eb>"); sb.Append("</CMS>"); try { // NC签名数据处理 ASCIIEncoding encoding = new ASCIIEncoding(); byte[] data = encoding.GetBytes(sb.ToString()); WebRequest webRequest = WebRequest.Create("http://www.niuluo-tech.cn:95"); HttpWebRequest httpRequest = webRequest as HttpWebRequest; httpRequest.KeepAlive = true; httpRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"; httpRequest.ContentType = "INFOSEC_SIGN/1.0"; httpRequest.Method = "POST"; httpRequest.ContentLength = data.Length; Stream requestStream = httpRequest.GetRequestStream(); requestStream.Write(data, 0, data.Length); requestStream.Close(); Stream responseStream = null; responseStream = httpRequest.GetResponse().GetResponseStream(); string stringResponse = string.Empty; if (responseStream != null) { using (StreamReader responseReader = new StreamReader(responseStream, Encoding.GetEncoding("GBK"))) { stringResponse = responseReader.ReadToEnd(); } responseStream.Close(); } WebApiConfig.log.Info("NC签名数据:" + stringResponse); var beginSign = 0; var endSign = 0; try { beginSign = stringResponse.IndexOf("<sign>") + 6; endSign = stringResponse.IndexOf("</sign>"); WebApiConfig.log.Info("NC签名结果:" + beginSign + "&" + endSign); } catch (Exception e) { WebApiConfig.log.Error("!!!!!!!!!!接收签名数据失败,请检查nc设置!!!!!!!!!!"); } // NC工行退款 var repSignContent = stringResponse.Substring(beginSign, endSign - beginSign); var queryParams = new StringBuilder(); queryParams.Append("Version=0.0.1.0"); queryParams.Append("&TransCode=EBUSCOM"); queryParams.Append("&BankCode=102"); queryParams.Append("&GroupCIS=100190013673155"); queryParams.Append("&ID=Niuluo.y.1001"); // 客户的证书ID(无证书客户可空) queryParams.Append("&PackageID=" + seqno); // 客户的指令包序列号(由客户ERP系统产生,不可重复) queryParams.Append("&Cert="); queryParams.Append("&reqData=" + repSignContent); // 客户的xml请求数据 ASCIIEncoding encoding2 = new ASCIIEncoding(); byte[] data2 = encoding.GetBytes(queryParams.ToString()); WebRequest webRequest2 = WebRequest.Create("http://www.niuluo-tech.cn:94/servlet/ICBCCMPAPIReqServlet?PackageID=" + seqno + "&SendTime=" + now.ToString("yyyyMMddHHmmss")); HttpWebRequest httpRequest2 = webRequest2 as HttpWebRequest; httpRequest2.KeepAlive = true; httpRequest2.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"; httpRequest2.ContentType = "application/x-www-form-urlencoded"; httpRequest2.Method = "POST"; httpRequest2.ContentLength = data2.Length; Stream requestStream2 = httpRequest2.GetRequestStream(); requestStream2.Write(data2, 0, data2.Length); requestStream2.Close(); Stream responseStream2 = null; responseStream2 = httpRequest2.GetResponse().GetResponseStream(); string stringResponse2 = string.Empty; if (responseStream2 != null) { using (StreamReader responseReader = new StreamReader(responseStream2, Encoding.GetEncoding("GBK"))) { stringResponse2 = responseReader.ReadToEnd(); } responseStream2.Close(); } WebApiConfig.log.Info("工行退费返回结果:" + stringResponse2); if (stringResponse2.IndexOf("errorCode=") > -1) { WebApiConfig.log.Error("工行退费失败:" + stringResponse2); throw new Exception("工行退费失败"); } else if (stringResponse2.IndexOf("reqData=") > -1) { var returnStr = CBCPayOnline.Decode(stringResponse2.Replace("reqData=", string.Empty), "gbk"); WebApiConfig.log.Info("工行退费返回xml:" + returnStr); var doc = XDocument.Parse(returnStr); var orderNum = doc.Descendants("OrderNum").FirstOrDefault().Value; var resultCode = doc.Descendants("Result").FirstOrDefault().Value; var fee = doc.Descendants("PayAmt").FirstOrDefault().Value; var retCode = doc.Descendants("fSeqno").FirstOrDefault().Value; if (orderNum != out_trade_no) { WebApiConfig.log.Error("工行退费订单号不匹配:" + orderNum + "&" + out_trade_no); throw new Exception("工行退费交易不成功"); } else if (resultCode != "1") { var retMsg = doc.Descendants("RetMsg").FirstOrDefault().Value; WebApiConfig.log.Error("工行退费交易不成功:" + orderNum + "&" + resultCode + ":" + retMsg); throw new Exception("工行退费交易不成功"); } else { WebApiConfig.log.Info("工行退费成功:" + orderNum + "&" + fee + ":" + retCode); JObject localResult; if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, result.GetValue("ActualTradeNo").ToString(), PaymentType.ICBC, string.Empty, TradeStatus.REFUND, out localResult)) { WebApiConfig.log.Error("工行退费成功,本地数据库状态维护失败:" + orderNum); return(new JObject(new JProperty("Trade", result))); } else { return(new JObject(new JProperty("Trade", localResult))); } } } else { WebApiConfig.log.Error("工行退费结果未知:" + stringResponse2); throw new Exception("工行退费失败"); } } catch (Exception e) { WebApiConfig.log.Error(e.Message); WebApiConfig.log.Error("退费出错:" + e.ToString()); } return(null); }
protected void Page_Load(object sender, EventArgs e) { SortedDictionary <string, string> sPara = GetRequestPost(); if (sPara.Count > 0)//判断是否有带返回参数 { var str = string.Empty; foreach (var item in sPara) { str += string.Format("{0}:{1},", item.Key, item.Value); } WebApiConfig.log.Info(str); Notify aliNotify = new Notify(); //bool verifyResult = aliNotify.Verify(sPara, Request.Form["notify_id"], Request.Form["sign"]); string sign = sPara["sign"]; sPara.Remove("sign"); sPara.Remove("sign_type"); string signContent = AlipaySignature.GetSignContent(sPara); var verifyResult = AlipaySignature.RSACheckContent(signContent, sign, ConfigurationManager.AppSettings["alipay.publicKey"], Request.QueryString["charset"], "RSA", false); if (verifyResult)//验证成功 { ///////////////////////////////////////////////////////////////////////////////////////////////////////////// //请在这里加上商户的业务逻辑程序代码 //——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表 //商户订单号 string out_trade_no = Request.Form["out_trade_no"]; //支付宝交易号 string trade_no = Request.Form["trade_no"]; //交易状态 string trade_status = Request.Form["trade_status"]; JObject localResult; int resultCode; if (Request.Form["trade_status"] == "TRADE_FINISHED") { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的 //如果有做过处理,不执行商户的业务程序 //注意: //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知 WebApiConfig.log.Info(out_trade_no + "-" + trade_no + "支付宝通知订单完成"); if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, trade_no, PaymentType.Alipay, trade_status, TradeStatus.NOTIFYFINISHED, out localResult)) { WebApiConfig.log.Error(out_trade_no + "-" + trade_no + "支付宝通知订单完成,本地数据库状态维护失败"); } resultCode = (int)TradeStatus.NOTIFYFINISHED; } else if (Request.Form["trade_status"] == "TRADE_SUCCESS") { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的 //如果有做过处理,不执行商户的业务程序 //注意: //付款完成后,支付宝系统发送该交易状态通知 WebApiConfig.log.Info(out_trade_no + "-" + trade_no + "支付宝通知订单支付成功"); if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, trade_no, PaymentType.Alipay, trade_status, TradeStatus.NOTIFYSUCCESS, out localResult)) { WebApiConfig.log.Error(out_trade_no + "-" + trade_no + "支付宝通知订单支付成功,本地数据库状态维护失败"); } resultCode = (int)TradeStatus.NOTIFYSUCCESS; } else { TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, trade_no, PaymentType.Alipay, trade_status, TradeStatus.NOTIFYISSUE, out localResult); WebApiConfig.log.Error(out_trade_no + "-" + trade_no + "支付宝通知失败"); resultCode = (int)TradeStatus.NOTIFYISSUE; } // 通知患者端 PatientCustomerBusiness.NotifyPatient(localResult); Response.Clear(); Response.Write("success"); Response.End(); ///////////////////////////////////////////////////////////////////////////////////////////////////////////// } else//验证失败 { WebApiConfig.log.Error("支付宝通知验证失败"); Response.Write("支付宝通知验证失败"); } } else { WebApiConfig.log.Error("支付宝无通知参数"); Response.Write("支付宝无通知参数"); } }
protected void Page_Load(object sender, EventArgs e) { // **************演示后台接收银联返回报文交易结果展示*********************** if (Request.HttpMethod == "POST") { // 使用Dictionary保存参数 Dictionary <string, string> resData = new Dictionary <string, string>(); var coll = Request.Form; string[] requestItem = coll.AllKeys; for (int i = 0; i < requestItem.Length; i++) { resData.Add(requestItem[i], Request.Form[requestItem[i]]); } // 返回报文中不包含UPOG,表示Server端正确接收交易请求,则需要验证Server端返回报文的签名 if (AcpService.Validate(resData, System.Text.Encoding.UTF8)) { //Response.Write("商户端验证返回报文签名成功\n"); string respcode = resData["respCode"]; //00、A6为成功,其余为失败。其他字段也可按此方式获取。 var out_trade_no = resData["orderId"]; var trade_no = resData["queryId"]; //如果卡号我们业务配了会返回且配了需要加密的话,请按此方法解密 //if(resData.ContainsKey("accNo")) //{ // string accNo = SecurityUtil.DecryptData(resData["accNo"], System.Text.Encoding.UTF8); //} JObject localResult; int resultCode; if (respcode == "00" || respcode == "A6") { //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 WebApiConfig.log.Info(out_trade_no + "-" + trade_no + "银联通知完成"); if (!TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, trade_no, PaymentType.UnionPay, respcode, TradeStatus.NOTIFYSUCCESS, out localResult)) { WebApiConfig.log.Error(out_trade_no + "-" + trade_no + "银联通知完成,本地数据库状态维护失败"); } resultCode = (int)TradeStatus.NOTIFYSUCCESS; } else { WebApiConfig.log.Error(out_trade_no + "-" + trade_no + "银联通知错误"); TradeBusiness.UpdateTradeStatusSeveralTimes(out_trade_no, trade_no, PaymentType.UnionPay, respcode, TradeStatus.NOTIFYISSUE, out localResult); resultCode = (int)TradeStatus.NOTIFYISSUE; } //如果卡号我们业务配了会返回且配了需要加密的话,请按此方法解密 //if(resData.ContainsKey("accNo")) //{ // string accNo = SecurityUtil.DecryptData(resData["accNo"], System.Text.Encoding.UTF8); //} var returnUrl = localResult.GetValue("ReturnUrl") == null ? string.Empty : localResult.GetValue("ReturnUrl").ToString(); if (string.IsNullOrEmpty(returnUrl)) { //商户端根据返回报文内容处理自己的业务逻辑 ,DEMO此处只输出报文结果 StringBuilder builder = new StringBuilder(); builder.Append("<tr><td align=\"center\" colspan=\"2\"><b>商户端接收银联返回报文并按照表格形式输出结果</b></td></tr>"); for (int i = 0; i < requestItem.Length; i++) { builder.Append("<tr><td width=\"30%\" align=\"right\">" + requestItem[i] + "</td><td style='word-break:break-all'>" + Request.Form[requestItem[i]] + "</td></tr>"); } builder.Append("<tr><td width=\"30%\" align=\"right\">商户端验证银联返回报文结果</td><td>验证签名成功.</td></tr>"); Response.Write(builder.ToString()); } else { var fee = localResult.GetValue("Fee").ToString(); Response.Clear(); Response.Write("<script>top.postMessage('{\"url\":\"" + string.Format("{0}?result={1}&tradeNo={2}&fee={3}\"", returnUrl, resultCode, out_trade_no, fee) + "}', '*');</script>"); Response.End(); } } else { WebApiConfig.log.Error("银联验证签名失败"); Response.Write("<tr><td width=\"30%\" align=\"right\">商户端验证银联返回报文结果</td><td>验证签名失败.</td></tr>"); } } }
// POST api/<controller> public HttpResponseMessage Post() { var response = new RetDTO(); JObject requestHeader = null; JObject requestBody = null; var token = string.Empty; var timeStamp = string.Empty; var tradeNo = string.Empty; var fee = string.Empty; var from = string.Empty; var sign = string.Empty; try { var httpCurrent = HttpContext.Current; var request = HttpHelper.GetRequestJObjectFromStream(HttpContext.Current); requestHeader = (JObject)request.GetValue("Header"); token = requestHeader.GetValue("Token").ToString(); timeStamp = requestHeader.GetValue("TimeStamp").ToString(); requestBody = (JObject)request.GetValue("Body"); tradeNo = requestBody.GetValue("TradeNo").ToString(); fee = requestBody.GetValue("Fee").ToString(); from = requestBody.GetValue("From").ToString(); sign = requestBody.GetValue("sign").ToString(); WebApiConfig.log.Info("Refund controller:" + request.ToString()); } catch (Exception ex) { WebApiConfig.log.Error("参数错误"); response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.CatchError, "参数错误:" + ex.Message); return(Request.CreateResponse(HttpStatusCode.BadRequest, response)); } try { if (string.IsNullOrEmpty(token)) { WebApiConfig.log.Error("令牌为空"); response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.NoLogin, "令牌为空"); return(Request.CreateResponse(HttpStatusCode.BadRequest, response)); } double temp; if (string.IsNullOrEmpty(tradeNo) || !double.TryParse(fee, out temp) || string.IsNullOrEmpty(from) || string.IsNullOrEmpty(sign)) { WebApiConfig.log.Error("参数不正确"); response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.ParamError, "参数不正确"); return(Request.CreateResponse(HttpStatusCode.BadRequest, response)); } //sign = EncryptDES(tradeNo + "," + from); var signValue = Decode(sign); var splits = signValue.Split(','); if (splits.Length != 2 || splits[0] != tradeNo || splits[1] != from) { WebApiConfig.log.Error("验证签名不过"); response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.ParamError, "验证签名不过"); return(Request.CreateResponse(HttpStatusCode.BadRequest, response)); } var result = TradeBusiness.GetByActualTradeNo(tradeNo, from); if (result == null) { WebApiConfig.log.Error("传入的订单号不存在"); throw new Exception("传入的订单号不存在"); } object responseForm; var paymentType = result.GetValue("Type").ToString(); //if (paymentType == ((int)PaymentType.Alipay).ToString() || paymentType == ((int)PaymentType.AlipayWap).ToString()) //{ // responseForm = Alipay.Refund.execute(from, tradeNo, string.Empty, fee, result); //} //else if (paymentType == ((int)PaymentType.WechatPay).ToString()) //{ // responseForm = WxPay.Refund.execute(from, tradeNo, string.Empty, fee, result); //} if (paymentType == ((int)PaymentType.ICBC).ToString()) { WebApiConfig.log.Info("开始退款流程"); responseForm = ICBC.Refund.execute(from, result.GetValue("TradeNo").ToString(), string.Empty, fee, result); } else { WebApiConfig.log.Error("该模式不支持退款"); throw new Exception("该模式不支持退款"); } response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.Success, string.Empty); response.Body = responseForm; return(Request.CreateResponse(HttpStatusCode.OK, response)); } catch (Exception ex) { response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.CatchError, ex.Message); return(Request.CreateResponse(HttpStatusCode.InternalServerError, response)); } }
// POST api/<controller> public HttpResponseMessage Post() { var response = new RetDTO(); JObject requestHeader = null; JObject requestBody = null; var token = string.Empty; var timeStamp = string.Empty; var no = string.Empty; var from = string.Empty; var type = string.Empty; try { var httpCurrent = HttpContext.Current; var request = HttpHelper.GetRequestJObjectFromStream(HttpContext.Current); requestHeader = (JObject)request.GetValue("Header"); token = requestHeader.GetValue("Token").ToString(); timeStamp = requestHeader.GetValue("TimeStamp").ToString(); requestBody = (JObject)request.GetValue("Body"); no = requestBody.GetValue("No").ToString(); from = requestBody.GetValue("From").ToString(); type = requestBody.GetValue("Type").ToString(); } catch (Exception ex) { response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.CatchError, "参数错误:" + ex.Message); return(Request.CreateResponse(HttpStatusCode.OK, response)); } try { if (string.IsNullOrEmpty(token)) { response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.NoLogin, "令牌为空"); return(Request.CreateResponse(HttpStatusCode.OK, response)); } double temp; if (string.IsNullOrEmpty(no) || string.IsNullOrEmpty(from) || string.IsNullOrEmpty(type)) { response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.ParamError, "参数不正确"); return(Request.CreateResponse(HttpStatusCode.OK, response)); } JObject result; if (type == "1") { result = TradeBusiness.GetTrade(no, from); } else if (type == "2") { result = TradeBusiness.GetByActualTradeNo(no, from); } else { result = TradeBusiness.GetByTradeFromNo(no, from); } response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.Success, string.Empty); response.Body = result; return(Request.CreateResponse(HttpStatusCode.OK, response)); } catch (Exception ex) { response.Header = CommonBusiness.SetHeader(requestHeader, CustomizeStatus.CatchError, ex.Message); return(Request.CreateResponse(HttpStatusCode.OK, response)); } }
public static JObject createForm(PaymentType paymentType, string from, string fromNo, string fee, string subject, string returnUrl, string showUrl) { ////////////////////////////////////////////请求参数//////////////////////////////////////////// //商户订单号,商户网站订单系统中唯一订单号,必填 var now = DateTime.Now.ToString("yyyyMMddHHmmssfff"); var out_trade_no = now + CommonBusiness.CreateRandom(); //订单名称,必填 if (string.IsNullOrEmpty(subject)) { subject = "alipay"; } //付款金额,必填 var total_fee = (double.Parse(fee) / 100).ToString(); //商品描述,可空 var body = string.Empty; //////////////////////////////////////////////////////////////////////////////////////////////// //把请求参数打包成数组 var sParaTemp = new SortedDictionary <string, string>(); if (paymentType == PaymentType.Alipay) { sParaTemp.Add("service", Config.directService); sParaTemp.Add("anti_phishing_key", Config.anti_phishing_key); sParaTemp.Add("exter_invoke_ip", Config.exter_invoke_ip); } else { sParaTemp.Add("service", Config.service); sParaTemp.Add("show_url", showUrl); } sParaTemp.Add("partner", Config.partner); sParaTemp.Add("seller_id", Config.seller_id); sParaTemp.Add("_input_charset", Config.input_charset.ToLower()); sParaTemp.Add("payment_type", Config.payment_type); sParaTemp.Add("notify_url", Config.notify_url); sParaTemp.Add("return_url", Config.return_url); sParaTemp.Add("out_trade_no", out_trade_no); sParaTemp.Add("subject", subject); sParaTemp.Add("total_fee", total_fee); sParaTemp.Add("body", body); //其他业务参数根据在线开发文档,添加参数.文档地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.O9yorI&treeId=62&articleId=103740&docType=1 //如sParaTemp.Add("参数名","参数值"); // 本地数据维护 支付宝单位为元 支付宝类型统一为alipay 不好区分 var result = TradeBusiness.AddTrade(out_trade_no, from, fromNo, PaymentType.Alipay, fee, subject, returnUrl, "0"); if (!(bool)result["Flg"]) { throw new Exception("本地数据维护失败"); } //建立请求 //var content = Submit.BuildRequest(sParaTemp, "get", "确认"); //return new JObject( // new JProperty("Trade", ((JObject)result["Object"])["result"]), // new JProperty("Content", content)); DefaultAopClient client = new DefaultAopClient(ConfigurationManager.AppSettings["alipay.port"], ConfigurationManager.AppSettings["alipay.appId"], ConfigurationManager.AppSettings["alipay.privateKey"]); client.return_url = Config.return_url; AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的request // alipayRequest.setReturnUrl("http://domain.com/CallBack/return_url.jsp"); alipayRequest.SetNotifyUrl(Config.notify_url);//在公共参数中设置回跳和通知地址 alipayRequest.BizContent = "{" + string.Format(" \"out_trade_no\":\"{0}\"," + " \"total_amount\":{1}," + " \"subject\":\"{2}\"," + " \"seller_id\":\"{3}\"," + " \"product_code\":\"QUICK_WAP_PAY\"", out_trade_no, total_fee, subject, Config.seller_id) + " }"; //填充业务参数 var form = client.pageExecute(alipayRequest).Body; //调用SDK生成表单 if (form.IndexOf("<form id='alipaysubmit'") > -1) { form = form.Replace("<form id='alipaysubmit'", "<form style='display:none;' id='alipaysubmit'"); } form = "<h3>页面跳转中。。。</h3>" + form; return(new JObject( new JProperty("Trade", ((JObject)result["Object"])["result"]), new JProperty("Content", form))); }