protected void Page_Load(object sender, EventArgs e) { StringBuilder strLog = new StringBuilder(); strLog.AppendFormat("【网银充值,DateTime:{0}】\r\n", DateTime.Now.ToString("yyyyMMdd HH:mm:ss")); if (!IsPostBack) { try { //客户ID,账户号,订单号 String CustID, BestPayAccount, OrderSeq; //充值金额,账户余额 long RechargeBalance, Balance; #region 获取支付平台post过来的一些变量 //获取支付平台post过来的一些变量 String uptranSeq = Request.Form["UPTRANSEQ"]; //支付平台交易流水号 String tranDate = Request.Form["TRANDATE"]; //支付平台交易日期 String retnCode = Request.Form["RETNCODE"]; //处理结果码 String retnInfo = Request.Form["RETNINFO"]; //处理结果解释码 String orderReqtranSeq = Request.Form["ORDERREQTRANSEQ"]; //订单请求交易流水号 String orderSeq = Request.Form["ORDERSEQ"]; //订单号 String orderAmount = Request.Form["ORDERAMOUNT"]; //订单总金额 String productAmount = Request.Form["PRODUCTAMOUNT"]; //产品金额 String attachAmount = Request.Form["ATTACHAMOUNT"]; //附加金额 String curType = Request.Form["CURTYPE"]; //币种 String encodeType = Request.Form["ENCODETYPE"]; //加密方式 String attach = Request.Form["ATTACH"]; //SP附加信息 String sign = Request.Form["SIGN"]; //数字签名 strLog.AppendFormat("[网银返回参数]:uptranSeq:{0},tranDate:{1},retnCode:{2},retnInfo:{3},orderReqtranSeq:{4},orderSeq:{5},orderAmount:{6},productAmount:{7},attachAmount:{8},curType:{9},attach:{10},sign:{11},", uptranSeq, tranDate, retnCode, retnInfo, orderReqtranSeq, orderSeq, orderAmount, productAmount, attachAmount, curType, attach, sign); if (retnCode != "0000") { return; } //验证签名:16进制转换(MD5加密) String newSign = String.Format("UPTRANSEQ={0}&MERCHANTID={1}&ORDERID={2}&PAYMENT={3}&RETNCODE={4}&RETNINFO={5}&PAYDATE={6}&KEY={7}", uptranSeq, BesttoneAccountConstDefinition.DefaultInstance.MERCHANTID, orderSeq, orderAmount, retnCode, retnInfo, tranDate, BesttoneAccountConstDefinition.DefaultInstance.MERCHANTID_KEY); String md5EncodingSign = BesttoneAccountHelper.MACSign(newSign); strLog.AppendFormat("newSign:{0},md5EncodingSign:{1}\r\n", newSign, md5EncodingSign); if (!md5EncodingSign.Equals(sign)) { strLog.Append("[签名验证]:签名验证有误"); return; } String responseXml = String.Format("UPTRANSEQ_{0}", uptranSeq); strLog.AppendFormat("[返回给网银参数]:ResponseXml:{0}\r\n", responseXml); #endregion #region 更新银行扣款订单状态 //查询订单,检查订单状态 RechargeOrder _recharge_order = _rechargeOrder_dao.QueryByOrderSeq(orderSeq); BankRechargeRecord _bankRecharge_record = _bankRechargeRecord_dao.QueryByOrderTransacntionID(orderReqtranSeq); if (_recharge_order == null) { return; } if (_bankRecharge_record == null) { return; } CustID = _recharge_order.CustID; BestPayAccount = _recharge_order.TargetAccount; OrderSeq = _recharge_order.OrderSeq; RechargeBalance = _recharge_order.OrderAmount; strLog.AppendFormat("[订单信息]:CustID:{0},BestPayAccount:{1},OrderSeq:{2},RechargeBalance:{3},订单状态:{4}\r\n", CustID, BestPayAccount, OrderSeq, RechargeBalance, _recharge_order.Status); //检查订单状态 6 扣款异常 主表 if (_recharge_order.Status == 6) { return; } else if (_recharge_order.Status == 2 || _recharge_order.Status == 3 || _recharge_order.Status == 5 || _recharge_order.Status == 9) { Response.Write(responseXml.ToString()); // 2 扣款成功 3 已充成功 5 充值失败 9 已对账 } // Response.Write 后,不会再往下执行 // 0 ,1, 4, 7 往下做 先把主表状态改为2,然后将扣款子表状态改为1 意味着扣款成功 Boolean result = false; //修改订单状态 _recharge_order.Status = 2; _recharge_order.PayTime = DateTime.Now; _recharge_order.UptranSeq = uptranSeq; result = _rechargeOrder_dao.Update(_recharge_order); strLog.AppendFormat("[修改订单结果]:{0}\r\n", result); if (!result) { return; } //修改扣款记录状态 _bankRecharge_record.UptranSeq = uptranSeq; _bankRecharge_record.Sign = sign; _bankRecharge_record.TranDate = tranDate; _bankRecharge_record.ReturnCode = retnCode; _bankRecharge_record.ReturnDesc = retnInfo; _bankRecharge_record.PayTime = DateTime.Now; _bankRecharge_record.Status = 1; result = _bankRechargeRecord_dao.Update(_bankRecharge_record); if (!result) { return; } #endregion #region 向账户进行充值 //生成一条充值流水号记录 DateTime rechargeTime = DateTime.Now; String transactionid = BesttoneAccountHelper.CreateTransactionID(); AccountRechargeRecord rechargeRecord_entity = new AccountRechargeRecord(); rechargeRecord_entity.RechargeTransactionID = transactionid; rechargeRecord_entity.RechargeDate = rechargeTime.ToString("yyyyMMdd"); rechargeRecord_entity.OrderSeq = OrderSeq; rechargeRecord_entity.OrderAmount = RechargeBalance; rechargeRecord_entity.RechargeType = "0"; rechargeRecord_entity.OrderDesc = "网银充值"; rechargeRecord_entity.ReqTime = rechargeTime; rechargeRecord_entity.CompleteTime = new DateTime(1900, 1, 1); rechargeRecord_entity.Status = 0; rechargeRecord_entity.ReturnCode = ""; rechargeRecord_entity.ReturnDesc = ""; strLog.AppendFormat("[开始给账户充值]:transactionid:{0},", transactionid); try { //开始调用接口充值 Result = BesttoneAccountHelper.AccountRecharge(transactionid, BestPayAccount, RechargeBalance, rechargeTime, out Balance, out ErrMsg); if (Result == 0) { strLog.Append("充值状态:充值成功\r\n"); //充值成功,则更新订单状态 _recharge_order = _rechargeOrder_dao.QueryByOrderSeq(OrderSeq); _recharge_order.CompleteTime = DateTime.Now; _recharge_order.Status = 3; _recharge_order.RechargeCount = _recharge_order.RechargeCount + 1; _recharge_order.ReturnCode = "0000"; _recharge_order.ReturnDesc = "充值成功"; _rechargeOrder_dao.Update(_recharge_order); //如果需要开发票 -- 插入发票表 2013-04-14 add-start System.Text.StringBuilder datalog = new System.Text.StringBuilder(); _rechargeOrder_dao.UpdateInvoice(orderSeq, "0", out datalog); //将发票状态改为申请中. strLog.Append("更新发票状态:" + datalog.ToString()); //2013-04-14 add-end //更新流水号状态 rechargeRecord_entity.Status = 1; rechargeRecord_entity.CompleteTime = DateTime.Now; rechargeRecord_entity.ReturnCode = "0000"; rechargeRecord_entity.ReturnDesc = "充值成功"; } else { strLog.Append("充值状态:充值失败\r\n"); //充值失败,则更新订单状态 _recharge_order = _rechargeOrder_dao.QueryByOrderSeq(OrderSeq); _recharge_order.RechargeCount = _recharge_order.RechargeCount + 1; _recharge_order.ReturnCode = Result.ToString(); _recharge_order.ReturnDesc = ErrMsg; _rechargeOrder_dao.Update(_recharge_order); //更新流水号状态 rechargeRecord_entity.Status = 2; rechargeRecord_entity.CompleteTime = DateTime.Now; rechargeRecord_entity.ReturnCode = Result.ToString(); rechargeRecord_entity.ReturnDesc = ErrMsg; } } catch (Exception ex) { strLog.AppendFormat("充值异常1:{0}\r\n", ex.Message); } finally { //插入充值流水记录 _accountRechargeRecord_dao.Insert(rechargeRecord_entity); Response.Write(responseXml.ToString()); } #endregion } catch (Exception ex) { strLog.AppendFormat("异常2:{0}\r\n", ex.Message); } finally { log(strLog.ToString()); } } }
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { try { String custid = Request["hiddenCustID"]; String spid = Request["hiddenSPID"]; String InvoiceType = Request["InvoiceType"]; String InvoiceTitle = Request["InvoiceTitle"]; String InvoiceContent = Request["InvoiceContent"]; String ContactPerson = Request["ContactPerson"]; String ContactPhone = Request["ContactPhone"]; String Address = Request["Address"]; String Zip = Request["Zip"]; String Mem = Request["Mem"]; String NeedInvoice = Request["NeedInvoice"]; long balance = Convert.ToInt64(Convert.ToDouble(Request["TranAmount"]) * 100); DateTime reqTime = DateTime.Now; //查询账户信息 BesttoneAccountDAO _besttoneAccount_dao = new BesttoneAccountDAO(); BesttoneAccount account_entity = _besttoneAccount_dao.QueryByCustID(custid); if (account_entity == null) { CommonBizRules.ErrorHappenedRedircet(result, ErrMsg, "账户信息异常", this.Context); return; } #region 账户充值金额上限校验 long OnceRechargeLimit = BesttoneAccountConstDefinition.DefaultInstance.AccountRechargeLimitedOne; //单笔充值金额上限 long RechargeAmountLimit = BesttoneAccountConstDefinition.DefaultInstance.AccountRechargeLimitedDay; //账户单日充值额度上限 long CurrentAmountLimit = BesttoneAccountConstDefinition.DefaultInstance.AccountBalanceLimited; //账户余额上限 if (OnceRechargeLimit > 0) { //检测用户单笔充值金额是否超限(10000元) if (balance > OnceRechargeLimit) { result = 100003; ErrMsg = String.Format("单笔充值金额最多不能超过{0}元", BesttoneAccountHelper.ConvertAmountToYuan(OnceRechargeLimit)); CommonBizRules.ErrorHappenedRedircet(result, ErrMsg, "充值金额超过上限", this.Context); return; } } if (RechargeAmountLimit > 0) { //检测用户当日充值是否超限(当日充值金额不能超过50000元) long hadRechargeAmount = _rechargeOrder_dao.QueryCurrentRechargeAmount(account_entity.BestPayAccount); if ((hadRechargeAmount + balance) > RechargeAmountLimit) { result = 100001; ErrMsg = String.Format("您今日累计充值金额:{0}元,本次充值将超过您的当日累计充值限额:{1}元,请改日再进行充值操作!", BesttoneAccountHelper.ConvertAmountToYuan(hadRechargeAmount), BesttoneAccountHelper.ConvertAmountToYuan(RechargeAmountLimit)); CommonBizRules.ErrorHappenedRedircet(result, ErrMsg, "充值金额超过上限", this.Context); return; } } if (CurrentAmountLimit > 0) { long accountBalance = 0; //检测用户帐户余额(个人账户余额不能超过100000元) result = BesttoneAccountHelper.QueryAccountBalance(account_entity.BestPayAccount, out accountBalance, out ErrMsg); if (result != 0) { CommonBizRules.ErrorHappenedRedircet(result, ErrMsg, "账户信息异常", this.Context); return; } if ((accountBalance + balance) > CurrentAmountLimit) { result = 100002; ErrMsg = String.Format("您的账户余额为:{0}元,本次充值将超过您的账户余额上限:{1}元,请消费后再进行充值操作!", BesttoneAccountHelper.ConvertAmountToYuan(accountBalance), BesttoneAccountHelper.ConvertAmountToYuan(CurrentAmountLimit)); CommonBizRules.ErrorHappenedRedircet(result, ErrMsg, "充值金额超过上限", this.Context); return; } } #endregion bool Result = false; #region 生成订单信息 /***************************************************************************/ String orderSeq = BesttoneAccountHelper.CreateOrderSeq(); //订单号 String transactionID = BesttoneAccountHelper.CreateTransactionID(); //流水号 // 在发起网银扣款请求,主表状态为1,扣款子表状态为0 //初始化充值订单 //2013-04-13 add -start if (String.IsNullOrEmpty(NeedInvoice)) { NeedInvoice = "0"; } //2013-04-13 add -end RechargeOrder _recharge_order = new RechargeOrder(orderSeq, transactionID, reqTime.ToString("yyyyMMdd"), "RMB", balance, balance, 0, "网银充值", custid, account_entity.BestPayAccount, "0", spid, reqTime, new DateTime(1900, 1, 1), new DateTime(1900, 1, 1), 1, 0, "", "", "", NeedInvoice); //2013-04-13 add NeedInvoice 字段 //初始化网银扣款流水记录 BankRechargeRecord _bankRecharge_record = new BankRechargeRecord(orderSeq, transactionID, reqTime.ToString("yyyyMMdd"), "RMB", balance, balance, 0, "网银充值", account_entity.BestPayAccount, 0, reqTime, new DateTime(1900, 1, 1), "", "", "", "", ""); Result = _rechargeOrder_dao.Insert(_recharge_order); if (!Result) { CommonBizRules.ErrorHappenedRedircet(result, ErrMsg, "网银充值失败1", this.Context); return; } //如果需要开发票 -- 插入发票表 2013-04-14 add-start if ("1".Equals(NeedInvoice)) { System.Text.StringBuilder datalog = new System.Text.StringBuilder(); //Result = _rechargeOrder_dao.InsertInvoice(orderSeq, InvoiceType, "", InvoiceTitle, ContactPerson, ContactPhone, Address, Zip, Mem, out datalog); if ("0".Equals("InvoiceType")) { InvoiceTitle = "个人"; } if (String.IsNullOrEmpty(InvoiceTitle)) { InvoiceTitle = "个人"; } if (String.IsNullOrEmpty(InvoiceContent)) { InvoiceContent = "日用品"; } Result = _rechargeOrder_dao.InsertInvoice(orderSeq, InvoiceType, InvoiceContent, InvoiceTitle, ContactPerson, ContactPhone, Address, Zip, Mem, "9", out datalog); // "9" 代表需要开票 if (!Result) { CommonBizRules.ErrorHappenedRedircet(result, ErrMsg, "网银充值失败-发票生成失败", this.Context); return; } } //2013-04-14 add-end Result = _bankRechargeRecord_dao.Insert(_bankRecharge_record); if (!Result) { CommonBizRules.ErrorHappenedRedircet(result, ErrMsg, "网银充值失败2", this.Context); return; } /***************************************************************************/ #endregion this._ORDERSEQ = orderSeq; this._ORDERREQTRANSEQ = transactionID; this._ORDERDATE = reqTime.ToString("yyyyMMddHHmmss"); this._ORDERAMOUNT = balance.ToString(); this._PRODUCTAMOUNT = balance.ToString(); //MAC签名 String mac = String.Format("MERCHANTID={0}&ORDERSEQ={1}&ORDERDATE={2}&ORDERAMOUNT={3}", this.MERCHANTID, this._ORDERSEQ, this._ORDERDATE, this._ORDERAMOUNT); mac = BesttoneAccountHelper.MACSign(mac); this._MAC = mac; } catch (Exception ex) { CommonBizRules.ErrorHappenedRedircet(result, ErrMsg, "网银充值失败", this.Context); return; } } }