1.请求支付:
控制器:
public ActionResult Index(decimal amount, string submitType, string relationCode, int? couponId = 0) { var model = new TenpayModel(); amount = Math.Round((amount * 0.035M) + amount, 2); if (amount < 1) { model.ErrorMsg = "The amount cannot be less than 1USD."; return View(model); } if (amount > 2000) { model.ErrorMsg = "The amount cannot be less than 2000USD."; return View(model); } string relationId; relationId = submitType == "AddMoney" ? CurrentUserId.ToString() : relationCode; model.IsSend = false; RelationTypeEnum relationType = (RelationTypeEnum)Enum.Parse(typeof(RelationTypeEnum), submitType); var ourPaymentNumber = AddMoneyDataService.GetOrderId(); //我们的交易号 model.Request = TenpayManager.CreateTenPayRequest(amount, relationId, CurrentUserId.ToString(), ourPaymentNumber, LanguageType.En); model.sign = TenpayManager.createRequestSign(model.Request); var TenpayBegin = AddMoneyDataService.TenpayAddMoney(CurrentUserId, amount, ourPaymentNumber, relationType, relationId, model.ToJson(), LanguageType.En); //begin if (TenpayBegin) { model.IsSend = true; } else { model.ErrorMsg = "System Error"; } YOYBuyComLogDataService.Log("提交TenPay充值信息", LogType.TenpaySend, CurrentUserId, null, model.ToJson()); return View(model); }
view:
@if (Model.IsSend) { <div class="floR status"> <h2 class="clear ove mar10 font18 parbor">Credit Card - Online Payment</h2> <div class="clear ove mar40"> Processing… </div> </div> <script type="text/javascript" language="javascript"> $(document).ready(function () { $("#tenpayForm").submit(); }); </script> if (Model != null && Model.Request != null) { using (Html.BeginForm(null, null, FormMethod.Post, new { action = Model.Request.gateUrl, target = "_self", id = "tenpayForm", name = "tenpayForm", style = "display:none;" })) { <input type="text" id="attach" name="attach" value="@Model.Request.attach" /> <input type="text" id="body" name="body" value="@Model.Request.body" /> <input type="text" id="fee_type" name="fee_type" value="@Model.Request.fee_type"/> <input type="text" id="input_charset" name="input_charset" value="@Model.Request.input_charset" /> <input type="text" id="language" name="language" value="@Model.Request.language" /> <input type="text" id="notify_url" name="notify_url" value="@Model.Request.notify_url" /> <input type="text" id="out_trade_no" name="out_trade_no" value="@Model.Request.out_trade_no" /> <input type="text" id="partner" name="partner" value="@Model.Request.partner" /> <input type="text" id="project_type" name="project_type" value="@Model.Request.project_type" /> <input type="text" id="return_url" name="return_url" value="@Model.Request.return_url" /> <input type="text" id="spbill_create_ip" name="spbill_create_ip" value="@Model.Request.spbill_create_ip" /> <input type="text" id="total_fee" name="total_fee" value="@Model.Request.total_fee" /> @*<input type="text" id="key" name="key" value="@Model.Request.key" />*@ <input type="text" id="sign" name="sign" value="@Model.sign" /> } } } else { <div class="floR status"> <h2 class="clear ove mar10 font18 parbor">Tenpay - Online Payment</h2> <div class="clear ove mar40"> <span style="color: red">Error: @Model.ErrorMsg</span> </div> </div> }
用到的方法:
public static class TenpayManager { //生成实体类 public static PayRequest CreateTenPayRequest(decimal amount, string ticketId, string userId, string ourPaymentNumber, LanguageType lan) { var result = new PayRequest(); result.gateUrl = ConfigurationManager.AppSettings["TenpayPostUrl"];//请求地址 result.key = ConfigurationManager.AppSettings["TenpayKey"];//密钥 result.partner = ConfigurationManager.AppSettings["TenpayPartner"];//商户号 result.return_url = ConfigurationManager.AppSettings["TenpayReturn_url"];//同步 result.notify_url = ConfigurationManager.AppSettings["TenpayNotify_url"];//异步 //语种 switch (lan) { case LanguageType.En: result.language = "EN"; result.body = "YOYBUY Deposit";//商品描述! break; case LanguageType.Cn: result.language = "CN"; result.body = "YOYBUY 充值";//商品描述! break; case LanguageType.Ru: result.language = "RU"; result.body = "YOYBUY депозит";//商品描述! break; case LanguageType.Es: result.language = "SP"; result.body = " YOYBUY Depositar";//商品描述! break; default: result.language = "EN"; result.body = "YOYBUY Deposit";//商品描述! break; } result.project_type = 1; //外卡 result.spbill_create_ip = HttpContext.Current.Request.UserHostAddress; //客户机ip //result.spbill_create_ip = "124.207.35.178"; //客户机ip result.fee_type = "USD"; //币种 result.total_fee = Convert.ToInt32(amount * 100).ToString();//钱 result.out_trade_no = ourPaymentNumber; //商家订单号 result.input_charset = "UTF-8";//编码 var whiteUser = UserLimitedDataService.CheckUserIsInUserGroup(int.Parse(userId)); result.attach = whiteUser ? "is_white_user=1" : "is_white_user=0"; return result; } //第一次请求支付 public static string createRequestSign(PayRequest Request) { var parameters = new Hashtable(); parameters.Add("attach", Request.attach); parameters.Add("body", Request.body); parameters.Add("input_charset", Request.input_charset); parameters.Add("notify_url", Request.notify_url); parameters.Add("return_url", Request.return_url); parameters.Add("partner", Request.partner); parameters.Add("out_trade_no", Request.out_trade_no); parameters.Add("total_fee", Request.total_fee); parameters.Add("fee_type", Request.fee_type); parameters.Add("spbill_create_ip", Request.spbill_create_ip); parameters.Add("project_type", Request.project_type); parameters.Add("language", Request.language); return createSign(parameters); } //第一次相应参数 public static Hashtable getResponseParameters(NameValueCollection collection) { var parameters = new Hashtable(); //添加相应参数 foreach (string k in collection) { string v = (string)collection[k]; if (!string.IsNullOrEmpty(k)) { parameters.Add(k, v); } } return parameters; } //根据相应参数生成实体 public static PayResponse getResponseModel(Hashtable parameters) { var response = new PayResponse(); response.Sign = parameters["sign"]?.ToString() ?? ""; response.notify_id = parameters["notify_id"]?.ToString() ?? ""; return response; } //通知查询 第二次请求 public static string Call(string notify_id) { var url = ConfigurationManager.AppSettings["TenpaySearchUrl"];//通知请求地址; var partner = ConfigurationManager.AppSettings["TenpayPartner"]; //商户号 var parameters = new Hashtable(); parameters.Add("input_charset", "UTF-8"); parameters.Add("partner", partner); parameters.Add("notify_id", notify_id); var sign = createSign(parameters); parameters.Add("sign", sign); var content = getCallUrl(url, parameters); string[] sArray = Regex.Split(content, "\?"); HttpWebRequest hp = (HttpWebRequest)WebRequest.Create(sArray[0]); hp.Timeout = 5000; var encoding = System.Text.Encoding.GetEncoding("UTF-8"); string postData = ""; if (sArray.Length >= 2) { postData = sArray[1]; } if (postData != null) { byte[] data = encoding.GetBytes(postData); hp.Method = "POST"; hp.ContentType = "application/x-www-form-urlencoded"; hp.ContentLength = data.Length; var ws = hp.GetRequestStream(); // 发送数据 ws.Write(data, 0, data.Length); ws.Close(); } var wr = (HttpWebResponse)hp.GetResponse(); var sr = new StreamReader(wr.GetResponseStream(), encoding); var responseData = sr.ReadToEnd(); sr.Close(); wr.Close(); return responseData; } //获取查询通知路径 public static string getCallUrl(string url, Hashtable parameters) { var sb = new StringBuilder(); ArrayList keys = new ArrayList(parameters.Keys); keys.Sort(); foreach (string k in keys) { var v = parameters[k].ToString(); if (null != v && "key".CompareTo(k) != 0) { sb.Append(k + "=" + HttpUtility.UrlEncode(v, Encoding.GetEncoding("UTF-8")) + "&"); } } if (sb.Length > 0) { sb.Remove(sb.Length - 1, 1); } return url + "?" + sb.ToString(); } //解析第二次获取xml public static Hashtable getCallBackParameters(string xml) { var parameters = new Hashtable(); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xml); XmlNode root = xmlDoc.SelectSingleNode("root"); XmlNodeList xnl = root.ChildNodes; foreach (XmlNode xnf in xnl) { parameters.Add(xnf.Name, xnf.InnerXml); } return parameters; } public static CallBack getCallBackModel(Hashtable parameters) { var call = new CallBack(); call.Sign = parameters["sign"]?.ToString() ?? ""; call.out_trade_no = parameters["out_trade_no"]?.ToString() ?? ""; call.transaction_id = parameters["transaction_id"]?.ToString() ?? ""; if (!string.IsNullOrEmpty(parameters["total_fee"].ToString())) { call.total_fee= Convert.ToDecimal(parameters["total_fee"].ToString()) / 100; } call.trade_state = parameters["trade_state"]?.ToString() ?? ""; call.trade_mode = parameters["trade_mode"]?.ToString() ?? ""; call.retcode = parameters["retcode"]?.ToString() ?? ""; return call; } //生成sign public static string createSign(Hashtable parameters) { var key = ConfigurationManager.AppSettings["TenpayKey"];//密钥 StringBuilder sb = new StringBuilder(); ArrayList akeys = new ArrayList(parameters.Keys); akeys.Sort(); foreach (string k in akeys) { string v = parameters[k].ToString(); if (null != v && "".CompareTo(v) != 0 && "sign".CompareTo(k) != 0 && "key".CompareTo(k) != 0) { sb.Append(k + "=" + v + "&"); } } sb.Append("key=" + key); string sign = Encryption.MD5(sb.ToString(), 32).ToUpper(); return sign; } }
public class CallBack { public string Sign { get; set; } public string out_trade_no { get; set; } public string transaction_id { get; set; } public decimal total_fee { get; set; } public string trade_state { get; set; } public string trade_mode { get; set; } public string retcode { get; set; } }
public class PayResponse { //签名 public string Sign { get; set; } //相应id public string notify_id { get; set; } }
public class PayRequest { //编码 public string input_charset { get; set; } //白名单 1是 0否 附加项 public string attach { get; set; } //商品描述 public string body { get; set; } //同步url public string return_url { get; set; } //异步url public string notify_url { get; set; } //商户号 public string partner { get; set; } //商家订单号 public string out_trade_no { get; set; } //商品金额 public string total_fee { get; set; } //币种 public string fee_type { get; set; } //用户ip public string spbill_create_ip { get; set; } //业务类型 public int project_type { get; set; } //语种 public string language { get; set; } // 密钥 public string key { get; set; } // 请求地址 public string gateUrl { get; set; } }
2.响应支付同步和异步的,自动补单机制,每5分钟左右会一直异步请求,直到返回success为止。
public ActionResult returnurl() { var collection = Request.HttpMethod == "POST" ? Request.Form : Request.QueryString; var responseParameters = TenpayManager.getResponseParameters(collection); var responseModel = TenpayManager.getResponseModel(responseParameters); var responseSign = TenpayManager.createSign(responseParameters); if (responseModel.Sign.Equals(responseSign)) { //通知查询 var xml = TenpayManager.Call(responseModel.notify_id); var callBackParameters = TenpayManager.getCallBackParameters(xml); var callBackSign = TenpayManager.createSign(callBackParameters); var callBackModel = TenpayManager.getCallBackModel(callBackParameters); if (callBackModel.Sign.Equals(callBackSign)) { //我们的交易号 var out_trade_no = callBackModel.out_trade_no; //财付通交易号 var transaction_id = callBackModel.transaction_id; //金额,以分为单位 var amount = callBackModel.total_fee; //支付结果 var trade_state = callBackModel.trade_state; //交易模式,1即时到帐 2中介担保 var trade_mode = callBackModel.trade_mode; var retcode = callBackModel.retcode; if (retcode == "0" || trade_mode == "1" || trade_state == "1") { var successModel = new SuccessModel(); successModel.TradeNo = transaction_id; successModel.Amount = amount > 0 ? amount : 0; var failModel = new FailModel(); failModel.TradeNo = transaction_id; var result = AddMoneyDataService.TenpayPayFinished(transaction_id, out_trade_no, amount, true, callBackModel.ToJson()); switch (result.Status) { case CommonEnum.DataExisted: switch (result.Data.Language) { case LanguageType.En: switch (result.Data.RelationType) { case RelationTypeEnum.AddMoney: //充值 return View("/Views/Tenpay/Success.cshtml", successModel); case RelationTypeEnum.DirectOrderPay: //直购支付成功 case RelationTypeEnum.DirectOrderOncePay: return Redirect("http://order.yoybuy.com/en/orderv5/orderlist"); case RelationTypeEnum.PurchasingOrderOncePay: //代购订单支付成功 case RelationTypeEnum.PurchasingOrderPay: return Redirect("http://shoppingcart.yoybuy.com/en/Purchase/paySuccessful?goodsBelongsType=order&totleAmount=" + amount + "&tracking=" + result.Data.RelationCode + "&returnUrl=http://order.yoybuy.com/en/order?ot=pp&pt=alipay&tid=" + result.Data.RelationCode); case RelationTypeEnum.PurchasingWaybillOncePay: //代购运单补款成功 return Redirect("http://shoppingcart.yoybuy.com/en/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + result.Data.RelationCode + "&returnUrl=http://order.yoybuy.com/en/myparcels"); case RelationTypeEnum.PurchasingWaybillPay: //代购运单支付成功 return Redirect("http://shoppingcart.yoybuy.com/en/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + result.Data.RelationCode + "&returnUrl=http://order.yoybuy.com/en/myparcels"); case RelationTypeEnum.ForwardingWaybillOncePay: //转运运单支付成功 case RelationTypeEnum.ForwardingWaybillPay: return Redirect("http://shoppingcart.yoybuy.com/en/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + result.Data.RelationCode + "&returnUrl=http://order.yoybuy.com/en/myforwardingparcels"); default: return View("/Views/Tenpay/Fail.cshtml", failModel); } case LanguageType.Cn: switch (result.Data.RelationType) { case RelationTypeEnum.AddMoney: //充值 return View("/Areas/Cn/Views/Tenpay/Success.cshtml", successModel); case RelationTypeEnum.DirectOrderPay: //直购支付成功 case RelationTypeEnum.DirectOrderOncePay: return Redirect("http://order.yoybuy.com/cn/orderv5/orderlist"); case RelationTypeEnum.PurchasingOrderOncePay: //代购订单支付成功 case RelationTypeEnum.PurchasingOrderPay: return Redirect("http://shoppingcart.yoybuy.com/cn/Purchase/paySuccessful?goodsBelongsType=order&totleAmount=" + amount + "&tracking=" + result.Data.RelationCode + "&returnUrl=http://order.yoybuy.com/cn/order?ot=pp&pt=alipay&tid=" + result.Data.RelationCode); case RelationTypeEnum.PurchasingWaybillOncePay: //代购运单补款成功 return Redirect("http://shoppingcart.yoybuy.com/cn/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + result.Data.RelationCode + "&returnUrl=http://order.yoybuy.com/cn/myparcels"); case RelationTypeEnum.PurchasingWaybillPay: //代购运单支付成功 return Redirect("http://shoppingcart.yoybuy.com/cn/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + result.Data.RelationCode + "&returnUrl=http://order.yoybuy.com/cn/myparcels"); case RelationTypeEnum.ForwardingWaybillOncePay: //转运运单支付成功 case RelationTypeEnum.ForwardingWaybillPay: return Redirect("http://shoppingcart.yoybuy.com/cn/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + result.Data.RelationCode + "&returnUrl=http://order.yoybuy.com/cn/myforwardingparcels"); default: return View("/Areas/Cn/Views/Tenpay/Fail.cshtml", failModel); } case LanguageType.Es: switch (result.Data.RelationType) { case RelationTypeEnum.AddMoney: //充值 return View("/Areas/Es/Views/Tenpay/Success.cshtml", successModel); case RelationTypeEnum.DirectOrderPay: //直购支付成功 case RelationTypeEnum.DirectOrderOncePay: return Redirect("http://order.yoybuy.com/es/orderv5/orderlist"); case RelationTypeEnum.PurchasingOrderOncePay: //代购订单支付成功 case RelationTypeEnum.PurchasingOrderPay: return Redirect("http://shoppingcart.yoybuy.com/es/Purchase/paySuccessful?goodsBelongsType=order&totleAmount=" + amount + "&tracking=" + result.Data.RelationCode + "&returnUrl=http://order.yoybuy.com/es/order?ot=pp&pt=alipay&tid=" + result.Data.RelationCode); case RelationTypeEnum.PurchasingWaybillOncePay: //代购运单补款成功 return Redirect("http://shoppingcart.yoybuy.com/es/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + result.Data.RelationCode + "&returnUrl=http://order.yoybuy.com/es/myparcels"); case RelationTypeEnum.PurchasingWaybillPay: //代购运单支付成功 return Redirect("http://shoppingcart.yoybuy.com/es/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + result.Data.RelationCode + "&returnUrl=http://order.yoybuy.com/es/myparcels"); case RelationTypeEnum.ForwardingWaybillOncePay: //转运运单支付成功 case RelationTypeEnum.ForwardingWaybillPay: return Redirect("http://shoppingcart.yoybuy.com/es/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + result.Data.RelationCode + "&returnUrl=http://order.yoybuy.com/es/myforwardingparcels"); default: return View("/Areas/Es/Views/Tenpay/Fail.cshtml", failModel); } case LanguageType.Ru: switch (result.Data.RelationType) { case RelationTypeEnum.AddMoney: //充值 return View("/Areas/Ru/Views/Tenpay/Success.cshtml", successModel); case RelationTypeEnum.DirectOrderPay: //直购支付成功 case RelationTypeEnum.DirectOrderOncePay: return Redirect("http://order.yoybuy.com/ru/orderv5/orderlist"); case RelationTypeEnum.PurchasingOrderOncePay: //代购订单支付成功 case RelationTypeEnum.PurchasingOrderPay: return Redirect("http://shoppingcart.yoybuy.com/ru/Purchase/paySuccessful?goodsBelongsType=order&totleAmount=" + amount + "&tracking=" + result.Data.RelationCode + "&returnUrl=http://order.yoybuy.com/ru/order?ot=pp&pt=alipay&tid=" + result.Data.RelationCode); case RelationTypeEnum.PurchasingWaybillOncePay: //代购运单补款成功 return Redirect("http://shoppingcart.yoybuy.com/ru/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + result.Data.RelationCode + "&returnUrl=http://order.yoybuy.com/ru/myparcels"); case RelationTypeEnum.PurchasingWaybillPay: //代购运单支付成功 return Redirect("http://shoppingcart.yoybuy.com/ru/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + result.Data.RelationCode + "&returnUrl=http://order.yoybuy.com/ru/myparcels"); case RelationTypeEnum.ForwardingWaybillOncePay: //转运运单支付成功 case RelationTypeEnum.ForwardingWaybillPay: return Redirect("http://shoppingcart.yoybuy.com/ru/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + result.Data.RelationCode + "&returnUrl=http://order.yoybuy.com/ru/myforwardingparcels"); default: return View("/Areas/Ru/Views/Tenpay/Fail.cshtml", failModel); } default: switch (result.Data.RelationType) { case RelationTypeEnum.AddMoney: //充值 return View("/Views/Tenpay/Success.cshtml", successModel); case RelationTypeEnum.DirectOrderPay: //直购支付成功 case RelationTypeEnum.DirectOrderOncePay: return Redirect("http://order.yoybuy.com/en/orderv5/orderlist"); case RelationTypeEnum.PurchasingOrderOncePay: //代购订单支付成功 case RelationTypeEnum.PurchasingOrderPay: return Redirect("http://shoppingcart.yoybuy.com/en/Purchase/paySuccessful?goodsBelongsType=order&totleAmount=" + amount + "&tracking=" + result.Data.RelationCode + "&returnUrl=http://order.yoybuy.com/en/order?ot=pp&pt=alipay&tid=" + result.Data.RelationCode); case RelationTypeEnum.PurchasingWaybillOncePay: //代购运单补款成功 return Redirect("http://shoppingcart.yoybuy.com/en/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + result.Data.RelationCode + "&returnUrl=http://order.yoybuy.com/en/myparcels"); case RelationTypeEnum.PurchasingWaybillPay: //代购运单支付成功 return Redirect("http://shoppingcart.yoybuy.com/en/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + result.Data.RelationCode + "&returnUrl=http://order.yoybuy.com/en/myparcels"); case RelationTypeEnum.ForwardingWaybillOncePay: //转运运单支付成功 case RelationTypeEnum.ForwardingWaybillPay: return Redirect("http://shoppingcart.yoybuy.com/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + result.Data.RelationCode + "&returnUrl=http://order.yoybuy.com/en/myforwardingparcels"); default: return View("/Views/Tenpay/Fail.cshtml", failModel); } } case CommonEnum.Success: #region 更新相关订单、运单的状态 var relationType = result.Data.RelationType; var relationCode = result.Data.RelationCode; var userId = result.Data.UserId; switch (relationType) { case RelationTypeEnum.AddMoney: break; case RelationTypeEnum.PurchasingOrderPay: //代购订单支付成功 var res = GoodsDataService.PaySucessWebOrder(relationCode, userId, PaymentTypeEnum.CreditCard.ToString()); #region 代购订单支付 添加日志 if (res == CreateProcureListStatus.Success) { YOYBuyComLogDataService.Log("使用CreditCard代购订单支付成功[ReturnData],订单号:" + relationCode, LogType.AlipayNotify, null, null, res.ToJson()); } else { YOYBuyComLogDataService.Log("使用CreditCard代购订单支付失败[ReturnData],订单号:" + relationCode, LogType.AlipayNotify, null, null, res.ToJson()); } #endregion break; case RelationTypeEnum.PurchasingOrderOncePay: //代购订单补款成功 var returnState = OrderDataService.RefundForProcure(int.Parse(relationCode), userId); #region 代购订单补款 添加日志 if (returnState == 0) { YOYBuyComLogDataService.Log("使用CreditCard代购订单补款成功[ReturnData],订单号:" + relationCode, LogType.AlipayNotify, null, null, null); } else { YOYBuyComLogDataService.Log("使用CreditCard代购订单补款失败[ReturnData],订单号:" + relationCode, LogType.AlipayNotify, null, null, returnState.ToString()); } #endregion break; case RelationTypeEnum.PurchasingWaybillPay: //代购运单支付成功 var backState = OrderDataService.PaySuccessWaybill(relationCode, userId, PaymentTypeEnum.CreditCard.ToString()); #region 代购运单支付 添加日志 if (backState.Status == CreateOrderStatus.Success) { YOYBuyComLogDataService.Log("使用CreditCard代购运单支付成功[ReturnData],运单号:" + relationCode, LogType.AlipayNotify, null, null, backState.ToJson()); } else { YOYBuyComLogDataService.Log("使用CreditCard代购运单支付失败[ReturnData],运单号:" + relationCode, LogType.AlipayNotify, null, null, backState.ToJson()); } #endregion break; case RelationTypeEnum.PurchasingWaybillOncePay: //代购运单补款支付成功 var payRebackState = OrderDataService.PaySecondFeight20120823(relationCode, userId); #region 代购运单补款支付 添加日志 if (payRebackState == 1) { YOYBuyComLogDataService.Log("使用CreditCard代购运单补款成功[ReturnData],运单号:" + relationCode, LogType.AlipayNotify, null, null, null); } else { YOYBuyComLogDataService.Log("使用CreditCard代购运单补款失败[ReturnData],运单号:" + relationCode, LogType.AlipayNotify, null, null, null); } #endregion break; case RelationTypeEnum.ForwardingWaybillPay: //转运运单支付成功 var forwardingWaybillPay = OrderDataService.PaySuccessWaybill(relationCode, userId, PaymentTypeEnum.CreditCard.ToString()); #region 转运运单支付 添加日志 if (forwardingWaybillPay.Status == CreateOrderStatus.Success) { YOYBuyComLogDataService.Log("使用CreditCard转运运单支付成功[ReturnData],运单号:" + relationCode, LogType.AlipayNotify, null, null, forwardingWaybillPay.ToJson()); } else { YOYBuyComLogDataService.Log("使用CreditCard转运运单支付失败[ReturnData],运单号:" + relationCode, LogType.AlipayNotify, null, null, forwardingWaybillPay.ToJson()); } #endregion break; case RelationTypeEnum.ForwardingWaybillOncePay: //转运运单补款成功 var forwardingWaybillOncePay = OrderDataService.PaySecondFeight20120823(relationCode, userId); #region 转运运单补款 添加日志 if (forwardingWaybillOncePay == 1) { YOYBuyComLogDataService.Log("使用CreditCard转运运单补款成功[ReturnData],运单号:" + relationCode, LogType.AlipayNotify, null, null, null); } else { YOYBuyComLogDataService.Log("使用CreditCard转运运单补款失败[ReturnData],运单号:" + relationCode, LogType.AlipayNotify, null, null, null); } #endregion break; default: YOYBuyComLogDataService.Log("接收CreditCard异常[ReturnData]支付失败,单号:" + relationCode, LogType.AlipayNotify, null, null, null); break; } #endregion switch (result.Data.Language) { case LanguageType.En: switch (relationType) { case RelationTypeEnum.AddMoney: //充值 return View("/Views/Tenpay/Success.cshtml", successModel); case RelationTypeEnum.DirectOrderPay: //直购支付成功 case RelationTypeEnum.DirectOrderOncePay: return Redirect("http://order.yoybuy.com/en/orderv5/orderlist"); case RelationTypeEnum.PurchasingOrderOncePay: //代购订单支付成功 case RelationTypeEnum.PurchasingOrderPay: YOYBuyComLogDataService.Log("Tenpay代购订单支付", LogType.Info, userId, null, "http://order.yoybuy.com/en/order/?ot=pp&pt=alipay&tid=" + relationCode); return Redirect("http://shoppingcart.yoybuy.com/en/Purchase/paySuccessful?goodsBelongsType=order&totleAmount=" + amount + "&tracking=" + relationCode + "&returnUrl=http://order.yoybuy.com/en/order?ot=pp&pt=alipay&tid=" + relationCode); case RelationTypeEnum.PurchasingWaybillOncePay: //代购运单补款成功 return Redirect("http://shoppingcart.yoybuy.com/en/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + relationCode + "&returnUrl=http://order.yoybuy.com/en/myparcels"); case RelationTypeEnum.PurchasingWaybillPay: //代购运单支付成功 return Redirect("http://shoppingcart.yoybuy.com/en/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + relationCode + "&returnUrl=http://order.yoybuy.com/en/myparcels"); case RelationTypeEnum.ForwardingWaybillOncePay: //转运运单支付成功 case RelationTypeEnum.ForwardingWaybillPay: return Redirect("http://shoppingcart.yoybuy.com/en/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + relationCode + "&returnUrl=http://order.yoybuy.com/en/myforwardingparcels"); default: return View("/Views/Tenpay/Fail.cshtml", failModel); } case LanguageType.Cn: switch (relationType) { case RelationTypeEnum.AddMoney: //充值 return View("/Areas/Cn/Views/Tenpay/Success.cshtml", successModel); case RelationTypeEnum.DirectOrderPay: //直购支付成功 case RelationTypeEnum.DirectOrderOncePay: return Redirect("http://order.yoybuy.com/cn/orderv5/orderlist"); case RelationTypeEnum.PurchasingOrderOncePay: //代购订单支付成功 case RelationTypeEnum.PurchasingOrderPay: YOYBuyComLogDataService.Log("Tenpay代购订单支付", LogType.Info, userId, null, "http://order.yoybuy.com/cn/order/?ot=pp&pt=alipay&tid=" + relationCode); return Redirect("http://shoppingcart.yoybuy.com/cn/Purchase/paySuccessful?goodsBelongsType=order&totleAmount=" + amount + "&tracking=" + relationCode + "&returnUrl=http://order.yoybuy.com/cn/order?ot=pp&pt=alipay&tid=" + relationCode); case RelationTypeEnum.PurchasingWaybillOncePay: //代购运单补款成功 return Redirect("http://shoppingcart.yoybuy.com/cn/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + relationCode + "&returnUrl=http://order.yoybuy.com/cn/myparcels"); case RelationTypeEnum.PurchasingWaybillPay: //代购运单支付成功 return Redirect("http://shoppingcart.yoybuy.com/cn/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + relationCode + "&returnUrl=http://order.yoybuy.com/cn/myparcels"); case RelationTypeEnum.ForwardingWaybillOncePay: //转运运单支付成功 case RelationTypeEnum.ForwardingWaybillPay: return Redirect("http://shoppingcart.yoybuy.com/cn/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + relationCode + "&returnUrl=http://order.yoybuy.com/cn/myforwardingparcels"); default: return View("/Areas/Cn/Views/Tenpay/Fail.cshtml", failModel); } case LanguageType.Es: switch (relationType) { case RelationTypeEnum.AddMoney: //充值 return View("/Areas/Es/Views/Tenpay/Success.cshtml", successModel); case RelationTypeEnum.DirectOrderPay: //直购支付成功 case RelationTypeEnum.DirectOrderOncePay: return Redirect("http://order.yoybuy.com/es/orderv5/orderlist"); case RelationTypeEnum.PurchasingOrderOncePay: //代购订单支付成功 case RelationTypeEnum.PurchasingOrderPay: YOYBuyComLogDataService.Log("Tenpay代购订单支付", LogType.Info, userId, null, "http://order.yoybuy.com/es/order/?ot=pp&pt=alipay&tid=" + relationCode); return Redirect("http://shoppingcart.yoybuy.com/es/Purchase/paySuccessful?goodsBelongsType=order&totleAmount=" + amount + "&tracking=" + relationCode + "&returnUrl=http://order.yoybuy.com/es/order?ot=pp&pt=alipay&tid=" + relationCode); case RelationTypeEnum.PurchasingWaybillOncePay: //代购运单补款成功 return Redirect("http://shoppingcart.yoybuy.com/es/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + relationCode + "&returnUrl=http://order.yoybuy.com/es/myparcels"); case RelationTypeEnum.PurchasingWaybillPay: //代购运单支付成功 return Redirect("http://shoppingcart.yoybuy.com/es/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + relationCode + "&returnUrl=http://order.yoybuy.com/es/myparcels"); case RelationTypeEnum.ForwardingWaybillOncePay: //转运运单支付成功 case RelationTypeEnum.ForwardingWaybillPay: return Redirect("http://shoppingcart.yoybuy.com/es/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + relationCode + "&returnUrl=http://order.yoybuy.com/es/myforwardingparcels"); default: return View("/Areas/Es/Views/Tenpay/Fail.cshtml", failModel); } case LanguageType.Ru: switch (relationType) { case RelationTypeEnum.AddMoney: //充值 return View("/Areas/Ru/Views/Tenpay/Success.cshtml", successModel); case RelationTypeEnum.DirectOrderPay: //直购支付成功 case RelationTypeEnum.DirectOrderOncePay: return Redirect("http://order.yoybuy.com/ru/orderv5/orderlist"); case RelationTypeEnum.PurchasingOrderOncePay: //代购订单支付成功 case RelationTypeEnum.PurchasingOrderPay: YOYBuyComLogDataService.Log("Tenpay代购订单支付", LogType.Info, userId, null, "http://order.yoybuy.com/ru/order/?ot=pp&pt=alipay&tid=" + relationCode); return Redirect("http://shoppingcart.yoybuy.com/ru/Purchase/paySuccessful?goodsBelongsType=order&totleAmount=" + amount + "&tracking=" + relationCode + "&returnUrl=http://order.yoybuy.com/ru/order?ot=pp&pt=alipay&tid=" + relationCode); case RelationTypeEnum.PurchasingWaybillOncePay: //代购运单补款成功 return Redirect("http://shoppingcart.yoybuy.com/ru/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + relationCode + "&returnUrl=http://order.yoybuy.com/ru/myparcels"); case RelationTypeEnum.PurchasingWaybillPay: //代购运单支付成功 return Redirect("http://shoppingcart.yoybuy.com/ru/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + relationCode + "&returnUrl=http://order.yoybuy.com/ru/myparcels"); case RelationTypeEnum.ForwardingWaybillOncePay: //转运运单支付成功 case RelationTypeEnum.ForwardingWaybillPay: return Redirect("http://shoppingcart.yoybuy.com/ru/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + relationCode + "&returnUrl=http://order.yoybuy.com/ru/myforwardingparcels"); default: return View("/Areas/Ru/Views/Tenpay/Fail.cshtml", failModel); } default: switch (relationType) { case RelationTypeEnum.AddMoney: //充值 return View("/Views/Tenpay/Success.cshtml", successModel); case RelationTypeEnum.DirectOrderPay: //直购支付成功 case RelationTypeEnum.DirectOrderOncePay: return Redirect("http://order.yoybuy.com/en/orderv5/orderlist"); case RelationTypeEnum.PurchasingOrderOncePay: //代购订单支付成功 case RelationTypeEnum.PurchasingOrderPay: YOYBuyComLogDataService.Log("Tenpay代购订单支付", LogType.Info, userId, null, "http://order.yoybuy.com/en/order/?ot=pp&pt=alipay&tid=" + relationCode); return Redirect("http://shoppingcart.yoybuy.com/en/Purchase/paySuccessful?goodsBelongsType=order&totleAmount=" + amount + "&tracking=" + relationCode + "&returnUrl=http://order.yoybuy.com/en/order?ot=pp&pt=alipay&tid=" + relationCode); case RelationTypeEnum.PurchasingWaybillOncePay: //代购运单补款成功 return Redirect("http://shoppingcart.yoybuy.com/en/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + relationCode + "&returnUrl=http://order.yoybuy.com/en/myparcels"); case RelationTypeEnum.PurchasingWaybillPay: //代购运单支付成功 return Redirect("http://shoppingcart.yoybuy.com/en/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + relationCode + "&returnUrl=http://order.yoybuy.com/en/myparcels"); case RelationTypeEnum.ForwardingWaybillOncePay: //转运运单支付成功 case RelationTypeEnum.ForwardingWaybillPay: return Redirect("http://shoppingcart.yoybuy.com/Purchase/paySuccessful?goodsBelongsType=waybill&totleAmount=" + amount + "&tracking=" + relationCode + "&returnUrl=http://order.yoybuy.com/en/myforwardingparcels"); default: return View("/Views/Tenpay/Fail.cshtml", failModel); } } case CommonEnum.Failed: switch (result.Data.Language) { case LanguageType.En: return View("/Views/Tenpay/Fail.cshtml", failModel); case LanguageType.Cn: return View("/Areas/Cn/Views/Tenpay/Fail.cshtml", failModel); case LanguageType.Es: return View("/Areas/Es/Views/Tenpay/Fail.cshtml", failModel); case LanguageType.Ru: return View("/Areas/Ru/Views/Tenpay/Fail.cshtml", failModel); default: return View("/Views/Tenpay/Fail.cshtml", failModel); } default: switch (result.Data.Language) { case LanguageType.En: return View("/Views/Tenpay/Fail.cshtml", failModel); case LanguageType.Cn: return View("/Areas/Cn/Views/Tenpay/Fail.cshtml", failModel); case LanguageType.Es: return View("/Areas/Es/Views/Tenpay/Fail.cshtml", failModel); case LanguageType.Ru: return View("/Areas/Ru/Views/Tenpay/Fail.cshtml", failModel); default: return View("/Views/Tenpay/Fail.cshtml", failModel); } } } else { var failModel = new FailModel(); failModel.TradeNo = ""; var result = AddMoneyDataService.TenpayPayFinished(transaction_id, out_trade_no, amount, false, callBackModel.ToJson()); YOYBuyComLogDataService.Log("接收TenPay信息", LogType.TenpaySend, CurrentUserId, null, "第三方支付失败"); return View("/Views/Tenpay/Fail.cshtml", failModel); } } else { var failModel = new FailModel(); failModel.TradeNo = ""; YOYBuyComLogDataService.Log("接收TenPay信息", LogType.TenpaySend, CurrentUserId, null, "签名认证失败"); return View("/Views/Tenpay/Fail.cshtml", failModel); //非空 错误原因 //var retmsg = parameters["retmsg"].ToString(); } } else { var failModel = new FailModel(); failModel.TradeNo = ""; YOYBuyComLogDataService.Log("接收TenPay信息", LogType.TenpaySend, CurrentUserId, null, "签名认证失败"); return View("/Views/Tenpay/Fail.cshtml", failModel); } }
public ActionResult notifyurl() { var collection = Request.HttpMethod == "POST" ? Request.Form : Request.QueryString; var responseParameters = TenpayManager.getResponseParameters(collection); var responseModel = TenpayManager.getResponseModel(responseParameters); var responseSign = TenpayManager.createSign(responseParameters); if (responseModel.Sign.Equals(responseSign)) { //通知查询 var xml = TenpayManager.Call(responseModel.notify_id); var callBackParameters = TenpayManager.getCallBackParameters(xml); var callBackSign = TenpayManager.createSign(callBackParameters); var callBackModel = TenpayManager.getCallBackModel(callBackParameters); if (callBackModel.Sign.Equals(callBackSign)) { //我们的交易号 var out_trade_no = callBackModel.out_trade_no; //财付通交易号 var transaction_id = callBackModel.transaction_id; //金额,以分为单位 var amount = callBackModel.total_fee; //支付结果 var trade_state = callBackModel.trade_state; //交易模式,1即时到帐 2中介担保 var trade_mode = callBackModel.trade_mode; var retcode = callBackModel.retcode; if (retcode == "0" || trade_mode == "1" || trade_state == "1") { var successModel = new SuccessModel(); successModel.TradeNo = transaction_id; successModel.Amount = amount > 0 ? amount : 0; var failModel = new FailModel(); failModel.TradeNo = transaction_id; var result = AddMoneyDataService.TenpayPayFinished(transaction_id, out_trade_no, amount, true, callBackModel.ToJson()); switch (result.Status) { case CommonEnum.DataExisted: YOYBuyComLogDataService.Log("接收TenPay信息", LogType.TenpaySend, CurrentUserId, null, "付款成功"); return Content("Success"); case CommonEnum.Success: var relationType = result.Data.RelationType; var relationCode = result.Data.RelationCode; var userId = result.Data.UserId; #region 更新相关订单、运单的状态 switch (relationType) { case RelationTypeEnum.AddMoney: break; case RelationTypeEnum.PurchasingOrderPay: //代购订单支付成功 var res = GoodsDataService.PaySucessWebOrder(relationCode, userId, PaymentTypeEnum.CreditCard.ToString()); #region 代购订单支付 添加日志 if (res == CreateProcureListStatus.Success) { YOYBuyComLogDataService.Log( "使用CreditCard代购订单支付成功[ReturnData],订单号:" + relationCode, LogType.AlipayNotify, null, null, res.ToJson()); } else { YOYBuyComLogDataService.Log( "使用CreditCard代购订单支付失败[ReturnData],订单号:" + relationCode, LogType.AlipayNotify, null, null, res.ToJson()); } #endregion break; case RelationTypeEnum.PurchasingOrderOncePay: //代购订单补款成功 var returnState = OrderDataService.RefundForProcure(int.Parse(relationCode), userId); #region 代购订单补款 添加日志 if (returnState == 0) { YOYBuyComLogDataService.Log( "使用CreditCard代购订单补款成功[ReturnData],订单号:" + relationCode, LogType.AlipayNotify, null, null, null); } else { YOYBuyComLogDataService.Log( "使用CreditCard代购订单补款失败[ReturnData],订单号:" + relationCode, LogType.AlipayNotify, null, null, returnState.ToString()); } #endregion break; case RelationTypeEnum.PurchasingWaybillPay: //代购运单支付成功 var backState = OrderDataService.PaySuccessWaybill(relationCode, userId, PaymentTypeEnum.CreditCard.ToString()); #region 代购运单支付 添加日志 if (backState.Status == CreateOrderStatus.Success) { YOYBuyComLogDataService.Log( "使用CreditCard代购运单支付成功[ReturnData],运单号:" + relationCode, LogType.AlipayNotify, null, null, backState.ToJson()); } else { YOYBuyComLogDataService.Log( "使用CreditCard代购运单支付失败[ReturnData],运单号:" + relationCode, LogType.AlipayNotify, null, null, backState.ToJson()); } #endregion break; case RelationTypeEnum.PurchasingWaybillOncePay: //代购运单补款支付成功 var payRebackState = OrderDataService.PaySecondFeight20120823(relationCode, userId); #region 代购运单补款支付 添加日志 if (payRebackState == 1) { YOYBuyComLogDataService.Log( "使用CreditCard代购运单补款成功[ReturnData],运单号:" + relationCode, LogType.AlipayNotify, null, null, null); } else { YOYBuyComLogDataService.Log( "使用CreditCard代购运单补款失败[ReturnData],运单号:" + relationCode, LogType.AlipayNotify, null, null, null); } #endregion break; case RelationTypeEnum.ForwardingWaybillPay: //转运运单支付成功 var forwardingWaybillPay = OrderDataService.PaySuccessWaybill(relationCode, userId, PaymentTypeEnum.CreditCard.ToString()); #region 转运运单支付 添加日志 if (forwardingWaybillPay.Status == CreateOrderStatus.Success) { YOYBuyComLogDataService.Log( "使用CreditCard转运运单支付成功[ReturnData],运单号:" + relationCode, LogType.AlipayNotify, null, null, forwardingWaybillPay.ToJson()); } else { YOYBuyComLogDataService.Log( "使用CreditCard转运运单支付失败[ReturnData],运单号:" + relationCode, LogType.AlipayNotify, null, null, forwardingWaybillPay.ToJson()); } #endregion break; case RelationTypeEnum.ForwardingWaybillOncePay: //转运运单补款成功 var forwardingWaybillOncePay = OrderDataService.PaySecondFeight20120823(relationCode, userId); #region 转运运单补款 添加日志 if (forwardingWaybillOncePay == 1) { YOYBuyComLogDataService.Log( "使用CreditCard转运运单补款成功[ReturnData],运单号:" + relationCode, LogType.AlipayNotify, null, null, null); } else { YOYBuyComLogDataService.Log( "使用CreditCard转运运单补款失败[ReturnData],运单号:" + relationCode, LogType.AlipayNotify, null, null, null); } #endregion break; default: YOYBuyComLogDataService.Log( "接收CreditCard异常[ReturnData]支付失败,单号:" + relationCode, LogType.AlipayNotify, null, null, null); break; } #endregion YOYBuyComLogDataService.Log("接收TenPay信息", LogType.TenpaySend, CurrentUserId, null, "付款成功"); return Content("Success"); case CommonEnum.Failed: YOYBuyComLogDataService.Log("接收TenPay信息", LogType.TenpaySend, CurrentUserId, null, "付款失败"); return Content("Failed"); default: YOYBuyComLogDataService.Log("接收TenPay信息", LogType.TenpaySend, CurrentUserId, null, "付款失败"); return Content("Failed"); } } else { var result = AddMoneyDataService.TenpayPayFinished(transaction_id, out_trade_no, amount, false, callBackModel.ToJson()); YOYBuyComLogDataService.Log("接收TenPay信息", LogType.TenpaySend, CurrentUserId, null, "第三方支付失败"); return Content("Failed"); } } else { YOYBuyComLogDataService.Log("接收TenPay信息", LogType.TenpaySend, CurrentUserId, null, "签名认证失败"); return Content("Failed"); } } else { //签名认证失败 YOYBuyComLogDataService.Log("接收TenPay信息", LogType.TenpaySend, CurrentUserId, null, "签名认证失败"); } return Content(""); }
3.web.config
<!--Tenpay在线充值开始--> <!--Tenpay提交地址--> <add key="TenpayPostUrl" value="https://payment.tenpay.com/cgi-bin/icard/icard_pay_gate.cgi" /> <!--Tenpay商户号--> <add key="TenpayPartner" value="111111111" /> <!--Tenpay密钥--> <add key="TenpayKey" value="asdasdasdasd" /> <!--Tenpay同步回调--> <add key="TenpayReturn_url" value="https://account.yoybuy.com/en/returnurl" /> <!--Tenpay异步回调--> <add key="TenpayNotify_url" value="https://account.yoybuy.com/en/notifyurl" /> <!--<add key="TenpayNotify_url" value="http://114.215.130.252/en/notifyurl" />--> <!--Tenpay请求通知地址--> <add key="TenpaySearchUrl" value="https://payment.tenpay.com/cgi-bin/icard/icard_verifynotifyid.cgi" /> <!--Tenpay在线充值结束-->