/// <summary> /// 生成小程序码方法 /// </summary> /// <param name="param"></param> public void CreateQrCode(WxPayData param, string httpUrl, ref string imageUrl) { try { System.Net.HttpWebRequest request; request = (System.Net.HttpWebRequest)WebRequest.Create(httpUrl); request.Method = "POST"; request.ContentType = "application/json;charset=UTF-8"; string paraUrlCoded = param.ToJson(); byte[] payload; payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded); request.ContentLength = payload.Length; Stream writer = request.GetRequestStream(); writer.Write(payload, 0, payload.Length); writer.Close(); System.Net.HttpWebResponse response; response = (System.Net.HttpWebResponse)request.GetResponse(); System.IO.Stream s; s = response.GetResponseStream(); //返回图片数据流 byte[] tt = ShopCommon.StreamToBytes(s); //将数据流转为byte[] //在文件名前面加上时间,以防重名 string imgName = "xcx_" + Guid.NewGuid().ToString() + ".png"; //文件存储相对于当前应用目录的虚拟目录 string path = "/upload/qrcode/"; //获取相对于应用的基目录,创建目录 string imgPath = System.AppDomain.CurrentDomain.BaseDirectory + path; //通过此对象获取文件名 if (!Directory.Exists(imgPath)) { Directory.CreateDirectory(imgPath); } //System.IO.File.WriteAllBytes(Server.MapPath(path + imgName), tt);//讲byte[]存储为图片 #region Png MemoryStream stream = new MemoryStream(tt); System.Drawing.Image img = System.Drawing.Image.FromStream(stream); img.Save(Server.MapPath(path + imgName), System.Drawing.Imaging.ImageFormat.Png); #endregion imageUrl = path + imgName; } catch (Exception e) { Log.Error("CreateQrCode", e.ToString()); } }
/** * * 获取收货地址js函数入口参数,详情请参考收货地址共享接口:http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_9 * @return string 共享收货地址js函数需要的参数,json格式可以直接做参数使用 */ public string GetEditAddressParameters() { string parameter = ""; try { string host = page.Request.Url.Host; string path = page.Request.Path; string queryString = page.Request.Url.Query; //这个地方要注意,参与签名的是网页授权获取用户信息时微信后台回传的完整url string url = "http://" + host + path + queryString; //构造需要用SHA1算法加密的数据 WxPayData signData = new WxPayData(); signData.SetValue("appid", WxPayConfig.APPID); signData.SetValue("url", url); signData.SetValue("timestamp", WxPayApi.GenerateTimeStamp()); signData.SetValue("noncestr", WxPayApi.GenerateNonceStr()); signData.SetValue("accesstoken", access_token); string param = signData.ToUrl(); Log.Debug(this.GetType().ToString(), "SHA1 encrypt param : " + param); //SHA1加密 string addrSign = FormsAuthentication.HashPasswordForStoringInConfigFile(param, "SHA1"); Log.Debug(this.GetType().ToString(), "SHA1 encrypt result : " + addrSign); //获取收货地址js函数入口参数 WxPayData afterData = new WxPayData(); afterData.SetValue("appId", WxPayConfig.APPID); afterData.SetValue("scope", "jsapi_address"); afterData.SetValue("signType", "sha1"); afterData.SetValue("addrSign", addrSign); afterData.SetValue("timeStamp", signData.GetValue("timestamp")); afterData.SetValue("nonceStr", signData.GetValue("noncestr")); //转为json格式 parameter = afterData.ToJson(); Log.Debug(this.GetType().ToString(), "Get EditAddressParam : " + parameter); } catch (Exception ex) { Log.Error(this.GetType().ToString(), ex.ToString()); throw new WxPayException(ex.ToString()); } return(parameter); }
/** * * 从统一下单成功返回的数据中获取微信浏览器调起jsapi支付所需的参数, * 微信浏览器调起JSAPI时的输入参数格式如下: * { * "appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入 * "timeStamp":" 1395712654", //时间戳,自1970年以来的秒数 * "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串 * "package" : "prepay_id=u802345jgfjsdfgsdg888", * "signType" : "MD5", //微信签名方式: * "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 * } * @return string 微信浏览器调起JSAPI时的输入参数,json格式可以直接做参数用 * 更详细的说明请参考网页端调起支付API:http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7 * */ public string GetJsApiParameters() { Log.Debug(this.GetType().ToString(), "JsApiPay::GetJsApiParam is processing..."); WxPayData jsApiParam = new WxPayData(); jsApiParam.SetValue("appId", unifiedOrderResult.GetValue("appid")); jsApiParam.SetValue("timeStamp", WxPayApi.GenerateTimeStamp()); jsApiParam.SetValue("nonceStr", WxPayApi.GenerateNonceStr()); jsApiParam.SetValue("package", "prepay_id=" + unifiedOrderResult.GetValue("prepay_id")); jsApiParam.SetValue("signType", "MD5"); jsApiParam.SetValue("paySign", jsApiParam.MakeSign()); string parameters = jsApiParam.ToJson(); Log.Debug(this.GetType().ToString(), "Get jsApiParam : " + parameters); return(parameters); }
public ActionResult Deposit() { CashAccountDepositArgs args = RequestArgs <CashAccountDepositArgs>(); if (args == null || args.Fee <= 0) { return(RespondResult(false, "参数无效。")); } args.Fee = args.Fee * 100; args.MemberId = MemberContext.Member.Id; args.OpenId = MemberContext.Member.OpenId; args.SpbillCreateIp = Request.UserHostAddress; NormalResult <CreatePayOrderResult> depositResult = _payManager.Deposit(args, DomainContext.AuthorizerPay); if (depositResult.Success) { WxPayData jsApiParam = new WxPayData(DomainContext.AuthorizerPay.Key); jsApiParam.SetValue("appId", DomainContext.AppId); jsApiParam.SetValue("timeStamp", WeixinApiHelper.GetTimesTamp().ToString()); jsApiParam.SetValue("nonceStr", WeixinApiHelper.GetNonceStr()); jsApiParam.SetValue("package", "prepay_id=" + depositResult.Data.PrepayId); jsApiParam.SetValue("signType", "MD5"); jsApiParam.SetValue("paySign", jsApiParam.MakeSign()); string parameters = jsApiParam.ToJson(); //WeixinPayGetBrandWCPayRequestArgs result = new WeixinPayGetBrandWCPayRequestArgs(); //result.AppId = this.DomainContext.AppId; //result.TimeStamp = WeixinApiHelper.GetTimesTamp().ToString(); //result.NonceStr = WeixinApiHelper.GetNonceStr(); //result.Package = "prepay_id=" + depositResult.Data.PrepayId; //result.SignType = "MD5"; return(RespondDataResult(parameters)); } else { return(RespondResult(false, depositResult.Message)); } }
/// <summary> /// 获取收货地址js函数入口参数,详情请参考收货地址共享接口:http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_9 /// </summary> /// <returns>共享收货地址js函数需要的参数,json格式可以直接做参数使用</returns> public string GetEditAddressParameters() { string parameter = ""; try { string host = Request.Url.Host; string path = Request.Path; string queryString = Request.Url.Query; //这个地方要注意,参与签名的是网页授权获取用户信息时微信后台回传的完整url string url = "http://" + host + path + queryString; //构造需要用SHA1算法加密的数据 WxPayData signData = new WxPayData(); signData.SetValue("appid", GlobalContext.AppID); signData.SetValue("url", url); signData.SetValue("timestamp", CommonHelper.CreateTimestamp()); signData.SetValue("noncestr", CommonHelper.CreateNonceStr()); signData.SetValue("accesstoken", access_token); string param = signData.ToUrl(); //SHA1加密 string addrSign = FormsAuthentication.HashPasswordForStoringInConfigFile(param, "SHA1"); //获取收货地址js函数入口参数 WxPayData afterData = new WxPayData(); afterData.SetValue("appId", GlobalContext.AppID); afterData.SetValue("scope", "jsapi_address"); afterData.SetValue("signType", "sha1"); afterData.SetValue("addrSign", addrSign); afterData.SetValue("timeStamp", signData.GetValue("timestamp")); afterData.SetValue("nonceStr", signData.GetValue("noncestr")); //转为json格式 parameter = afterData.ToJson(); } catch (Exception ex) { throw new WxPayException(ex.ToString()); } return(parameter); }
// GET: Payover public ActionResult Index() { Log.Debug("收到通知:", "收到通知"); //微信会把付款结果通知到这里 ResultNotify resultNotify = new ResultNotify(System.Web.HttpContext.Current); WxPayData notifyData = resultNotify.GetNotifyData(); //序列化 notifyData NotifyModel notify = new NotifyModel(); notify = JSONHelper.JsonDeserialize <NotifyModel>(notifyData.ToJson()); //////////这个必须给微信的通知回复收到信息,不然微信会一直发8次 /////// WxPayData res = new WxPayData(); res.SetValue("return_code", "SUCCESS"); res.SetValue("return_msg", "OK"); HttpContext.Response.Clear(); HttpContext.Response.Write(res.ToXml()); HttpContext.Response.End(); //////////回复结束////////////// Log.Debug("通知结束:", "通知结束"); if (notify.result_code == "SUCCESS" && notify.return_code == "SUCCESS" && !string.IsNullOrEmpty(notify.out_trade_no) && !string.IsNullOrEmpty(notify.transaction_id)) { //根据后台的充值记录 // Log.Debug("微信支付结果通知:", "序列化后的openid:" + notify.openid); //Log.Debug("微信支付结果通知:", "序列化后的total_fee(该字段返回来的单位是分):" + notify.total_fee); //Log.Debug("微信支付结果通知:", "序列化后的out_trade_no:" + notify.out_trade_no); //Log.Debug("微信支付结果通知:", "序列化后的transaction_id:" + notify.transaction_id); //Log.Debug("微信支付结果通知:", "序列化后的notifyData:" + notifyData.ToJson()); //OverAddFee(out_trade_no,openid) openid? //填写记录 //using (var balancebLL = new BalanceBLL()) //{ // balancebLL.PayOk(notify.out_trade_no).ConfigureAwait(true); //} } return(View()); }
/// <summary> /// 订单查询 /// </summary> /// <param name="requestModel">请求实体</param> /// <returns></returns> public static OrderQueryResponseModel OrderQuery(OrderQueryModel requestModel) { WxPayData data = new WxPayData(); if (!string.IsNullOrEmpty(requestModel.transaction_id)) {//如果微信订单号存在,则以微信订单号为准 data.SetValue("transaction_id", requestModel.transaction_id); } else {//微信订单号不存在,才根据商户订单号去查单 data.SetValue("out_trade_no", requestModel.out_trade_no); } LogUtil.WriteWxpayLog("订单查询请求", "请求参数", data.ToJson()); //提交订单查询请求给API,接收返回数据 WxPayData result = WxPayApi.OrderQuery(data); OrderQueryResponseModel response = LitJson.JsonMapper.ToObject <OrderQueryResponseModel>(result.ToJson()); LogUtil.WriteWxpayLog("订单查询响应", "响应参数", result.ToJson()); //Log.Info("OrderQuery", "OrderQuery process complete, result : " + result.ToXml()); return(response); }
/// <summary> /// 获取前端 WeixinJSBridge.invoke 使用的支付参数的 json 字符串 /// </summary> /// <returns></returns> public ActionResult GetBrandWCPayRequestArgs() { string strPayOrderId = Request.QueryString["payOrderId"]; Guid payOrderId = Guid.Empty; if (String.IsNullOrEmpty(strPayOrderId) || Guid.TryParse(strPayOrderId, out payOrderId) == false) { return(RespondResult(false, "参数无效。")); } PayOrderEntity payOrder = _payManager.GetPayOrder(payOrderId); if (payOrder == null) { return(RespondResult(false, "指定的支付订单不存在。")); } if (payOrder.Member != MemberContext.Member.Id) { return(RespondResult(false, "订单不属于您。")); } if (payOrder.TradeState != EnumPayTradeState.NOTPAY) { return(RespondResult(false, "订单状态不是待支付状态。")); } WxPayData jsApiParam = new WxPayData(DomainContext.AuthorizerPay.Key); jsApiParam.SetValue("appId", DomainContext.AppId); jsApiParam.SetValue("timeStamp", WeixinApiHelper.GetTimesTamp().ToString()); jsApiParam.SetValue("nonceStr", WeixinApiHelper.GetNonceStr()); jsApiParam.SetValue("package", "prepay_id=" + payOrder.PrepayId); jsApiParam.SetValue("signType", "MD5"); jsApiParam.SetValue("paySign", jsApiParam.MakeSign()); string parameters = jsApiParam.ToJson(); return(RespondDataResult(parameters)); }
private string MakeJsSign(string appId, string ticket) { string timeStamp = WxPayApi.GenerateTimeStamp(); string onceStr = WxPayApi.GenerateNonceStr(); string signature = string.Empty; WxPayData jsApiParam = new WxPayData(); jsApiParam.SetValue("appId", appId); jsApiParam.SetValue("timestamp", timeStamp); jsApiParam.SetValue("nonceStr", onceStr); //jsApiParam.SetValue("signature", signature); //string keys = string.Format("jsapi_ticket={0}&noncestr={1}×tamp={2}&url={3}", ticket,onceStr,timeStamp, PathConfig.DomainConfig+"/wechat.html"); Dictionary <string, string> dicParam = new Dictionary <string, string>(); dicParam["jsapi_ticket"] = ticket; dicParam["noncestr"] = onceStr; dicParam["timestamp"] = timeStamp; dicParam["url"] = PathConfig.DomainConfig + "/wechat.html"; signature = Sha1(dicParam, Encoding.UTF8).ToLower(); jsApiParam.SetValue("signature", signature); return(jsApiParam.ToJson()); }
public void ProcessRequest(HttpContext context) { HttpRequest request = context.Request; Stream stream = request.InputStream; if (stream.Length != 0) { int total_fee = Convert.ToInt32(request["total_fee"]); string out_trade_no = request["out_trade_no"]; WxPayData data = new WxPayData(); data.SetValue("body", "微特众包-商家充值");//商品描述 //data.SetValue("attach", "test");//附加数据 //data.SetValue("out_trade_no", WxPayApi.GenerateOutTradeNo());//订单号 data.SetValue("out_trade_no", out_trade_no); //订单号 data.SetValue("total_fee", total_fee); //总金额 data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); //交易起始时间 data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); //交易结束时间 data.SetValue("trade_type", "APP"); //交易类型 WxPayData result = WxPayApi.UnifiedOrder(data); //调用统一下单接口 if (result.IsSet("prepay_id")) { WxPayData order = new WxPayData(); order.SetValue("appid", WxPayConfig.APPID); order.SetValue("partnerid", WxPayConfig.MCHID); order.SetValue("noncestr", WxPayApi.GenerateNonceStr()); order.SetValue("prepayid", result.GetValue("prepay_id")); order.SetValue("timestamp", WxPayApi.GenerateTimeStamp()); order.SetValue("package", "Sign=WXPay"); order.SetValue("sign", order.MakeSign()); context.Response.Write(order.ToJson()); } } else { context.Response.Write(""); } }
/// <summary> /// 统一下单接口 /// </summary> /// <param name="unifiedorderModel">请求参数</param> /// <returns></returns> public static UnifiedOrderResponseModel UnifiedOrder(UnifiedOrderModel unifiedorderModel) { UnifiedOrderResponseModel response = new UnifiedOrderResponseModel(); WxPayData data = new WxPayData(); data.SetValue("body", unifiedorderModel.body); //商品描述 data.SetValue("attach", unifiedorderModel.attach); //附加数据 data.SetValue("out_trade_no", WxPayApi.GenerateOutTradeNo()); //随机字符串 data.SetValue("total_fee", unifiedorderModel.total_fee); //总金额 data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); //交易起始时间 data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); //交易结束时间 data.SetValue("goods_tag", unifiedorderModel.goods_tag); //商品标记 data.SetValue("trade_type", unifiedorderModel.trade_type); //交易类型 data.SetValue("product_id", unifiedorderModel.product_id); //商品ID LogUtil.WriteWxpayLog("统一下单请求", "请求参数", data.ToJson()); WxPayData result = WxPayApi.UnifiedOrder(data); //调用统一下单接口 string resultStr = result.ToJson(); LogUtil.WriteWxpayLog("统一下单响应", "响应参数", resultStr); response = LitJson.JsonMapper.ToObject <UnifiedOrderResponseModel>(resultStr); response.out_trade_no = response.out_trade_no ?? data.GetValue("out_trade_no").ToString(); return(response); //Log.Info(this.GetType().ToString(), "Get native pay mode 2 url : " + url); }
/// <summary> /// 发起统一支付(Demo) /// </summary> /// <param name="wxPayConfig"></param> /// <param name="out_trade_no">商户订单号</param> /// <param name="body">标题</param> /// <param name="total_fee">金额(分)</param> /// <param name="openid">wx openid</param> /// <returns></returns> public static WxPayData JSAPIOrder(WxPayConfig wxPayConfig, string out_trade_no, string body, int total_fee, string openid) { WxPayData data = new WxPayData(); data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); data.SetValue("time_expire", DateTime.Now.AddMinutes(30).ToString("yyyyMMddHHmmss")); data.SetValue("device_info", "WEB"); data.SetValue("body", body); data.SetValue("out_trade_no", out_trade_no); data.SetValue("total_fee", total_fee); data.SetValue("trade_type", "JSAPI"); data.SetValue("openid", openid); WxPayData result = WxPayApi.UnifiedOrder(wxPayConfig, data); if (!result.IsSet("appid") || !result.IsSet("prepay_id") || result.GetValue("prepay_id").ToString() == "") { Log.Error("WeiXinMPPayHelper.UnifiedOrder", "UnifiedOrder response error!"); throw new WxPayException("UnifiedOrder response error!" + result.ToJson()); } return(result); }
/** * 调用统一下单,获得下单结果 * @return 统一下单结果 * @失败时抛异常WxPayException */ private WxPayData GetUnifiedOrderResult(string orderId) { //统一下单 WxPayData data = new WxPayData(); data.SetValue("body", "test"); data.SetValue("attach", orderId); data.SetValue("out_trade_no", orderId); data.SetValue("total_fee", _totalFee); data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); data.SetValue("goods_tag", "test"); data.SetValue("trade_type", "JSAPI"); data.SetValue("openid", _openId); LogHelper.CreateLog(string.Format("WxPayController.GetUnifiedOrderResult 下单数据:{0}", data.ToJson()), "wxdebug"); WxPayData result = WxPayApi.UnifiedOrder(data); if (!result.IsSet("appid") || !result.IsSet("prepay_id") || result.GetValue("prepay_id").ToString() == "") { //Log.Error(this.GetType().ToString(), "UnifiedOrder response error!"); throw new WxPayException("UnifiedOrder response error!"); } _unifiedOrderResult = result; return(result); }
private string OnPay(DataRow row) { #region 获取基本参数 string CommunityId = string.Empty; if (row.Table.Columns.Contains("CommunityId")) { CommunityId = row["CommunityId"].ToString(); } string RoomID = string.Empty; if (row.Table.Columns.Contains("RoomID")) { RoomID = row["RoomID"].ToString(); } string CustID = string.Empty; if (row.Table.Columns.Contains("CustID")) { CustID = row["CustID"].ToString(); } string OpenID = string.Empty; if (row.Table.Columns.Contains("OpenID")) { OpenID = row["OpenID"].ToString(); } if (!row.Table.Columns.Contains("PayChannel") || string.IsNullOrEmpty(row["PayChannel"].ToString())) { return(new ApiResult(false, "参数PayChannel有误").toJson()); } var community = GetCommunity(CommunityId); if (community == null) { return(JSONHelper.FromString(false, "未查询到小区信息")); } int CommID = AppGlobal.StrToInt(community.CommID); PubConstant.hmWyglConnectionString = GetConnectionStr(community); var payChannel = row["PayChannel"].ToString(); var payType = 0; switch (payChannel.ToLower()) { case PayChannelString.Alipay: payType = 1; break; case PayChannelString.WechatPay: payType = 2; break; case PayChannelString.AllInPay_Alipay: payType = 1; break; case PayChannelString.AllInPay_WechatPay: payType = 2; break; default: return(new ApiResult(false, "参数payChannel有误").toJson()); } if (payType == 2) { if (payChannel.ToLower().Equals(PayChannelString.AllInPay_WechatPay) && string.IsNullOrEmpty(OpenID)) { return(new ApiResult(false, "参数OpenID不能为空").toJson()); } } #endregion using (IDbConnection erpConn = new SqlConnection(PubConstant.hmWyglConnectionString)) { dynamic tb_Payment_Config = erpConn.QueryFirstOrDefault <dynamic>("SELECT * FROM Tb_Payment_Config WITH(NOLOCK) WHERE CommID = @CommID", new { CommID }); if (null == tb_Payment_Config) { return(new ApiResult(false, "该项目未开通对应支付方式").toJson()); } // 旧方式获取对应支付配置 AllinConfig allinConfig = null; // 新方式获取支付配置 PaymentConfig paymentConfig = null; if (payChannel == PayChannelString.AllInPay_Alipay || payChannel == PayChannelString.AllInPay_WechatPay) { try { allinConfig = JsonConvert.DeserializeObject <AllinConfig>(tb_Payment_Config.Config); if (null == allinConfig) { return(new ApiResult(false, "该项目支付类型对应配置有误").toJson()); } } catch (Exception) { return(new ApiResult(false, "该项目支付类型对应配置有误").toJson()); } } else { // 新的方式,Config存储多个配置 try { // ERP的配置表,要求存储一个Json数组,用于配置支持不同支付方式 // 配置项要求存储一个 List <PaymentConfig> configs = JsonConvert.DeserializeObject <List <PaymentConfig> >(tb_Payment_Config.Config); if (null == configs || configs.Count <= 0) { return(new ApiResult(false, "该项目支付类型对应配置有误").toJson()); } if (payChannel == PayChannelString.Alipay) { paymentConfig = configs.Find(item => item.type == "AliPay"); } if (payChannel == PayChannelString.WechatPay) { paymentConfig = configs.Find(item => item.type == "WChatPay"); } if (null == paymentConfig) { return(new ApiResult(false, "该项目支付类型对应配置有误").toJson()); } } catch (Exception) { } } #region 计算金额 if (!row.Table.Columns.Contains("PayData") || string.IsNullOrEmpty(row["PayData"].ToString())) { return(new ApiResult(false, "缺少参数PayData").toJson()); } string PayData = row["PayData"].ToString(); if (!CheckPayData(Global_Fun.BurstConnectionString(CommID, Global_Fun.BURST_TYPE_CHARGE), Convert.ToInt64(CustID), Convert.ToInt64(RoomID), PayData, out decimal Amt, out string errMsg, true, false, !"1940".Equals(Global_Var.LoginCorpID))) { return(new ApiResult(false, errMsg).toJson()); } if (Amt <= 0.00M) { return(new ApiResult(false, "金额必须大于0").toJson()); } #endregion JObject PayDataObj = JObject.Parse(PayData); int Type = (int)PayDataObj["Type"]; #region 查询项目名称和房屋编号,拼接费用备注 string FeesMemo = string.Empty; string RoomSign = string.Empty; if (Type == 1) { FeesMemo = "物业综合费用缴纳"; string CommName = erpConn.QueryFirstOrDefault <string>("SELECT CommName FROM Tb_HSPR_Community WHERE CommID = @CommID", new { CommID }); if (string.IsNullOrEmpty(CommName)) { CommName = Convert.ToString(CommID); } RoomSign = erpConn.QueryFirstOrDefault <string>("SELECT ISNULL(RoomSign,RoomName) AS RoomSign FROM Tb_HSPR_Room WHERE RoomID = @RoomID", new { RoomID }); if (string.IsNullOrEmpty(RoomSign)) { RoomSign = Convert.ToString(RoomID); } FeesMemo += string.Format("-{0}-{1}", CommName, RoomSign); } else { FeesMemo = "物业综合费用预存"; string CommName = erpConn.QueryFirstOrDefault <string>("SELECT CommName FROM Tb_HSPR_Community WHERE CommID = @CommID", new { CommID }); if (string.IsNullOrEmpty(CommName)) { CommName = Convert.ToString(CommID); } RoomSign = erpConn.QueryFirstOrDefault <string>("SELECT ISNULL(RoomSign,RoomName) AS RoomSign FROM Tb_HSPR_Room WHERE RoomID = @RoomID", new { RoomID }); if (string.IsNullOrEmpty(RoomSign)) { RoomSign = Convert.ToString(RoomID); } FeesMemo += string.Format("-{0}-{1}", CommName, RoomSign); } #endregion string NoticeId = Guid.NewGuid().ToString(); // 生成订单 if (erpConn.Execute("INSERT INTO Tb_Notice(Id, CommID, RoomID, CustID, PayData, CreateTime) VALUES(@Id, @CommID, @RoomID, @CustID, @PayData, @CreateTime)", new { Id = NoticeId, CommID, RoomID, CustID, PayData, CreateTime = DateTime.Now.ToString() }) <= 0) { return(new ApiResult(false, "创建收款订单失败,请重试").toJson()); } string ChargeMode = "业主APP缴费"; if (payChannel == PayChannelString.AllInPay_Alipay) { ChargeMode = "通联_业主APP(支付宝)"; } else if (payChannel == PayChannelString.AllInPay_WechatPay) { ChargeMode = "通联_业主APP(微信)"; } else { ChargeMode = "通联_业主APP"; } #region 修改收款方式 if (erpConn.QueryFirstOrDefault <int>("SELECT COUNT(1) FROM syscolumns WHERE id=object_id('Tb_Notice') AND name = 'ChargeMode'") > 0) { erpConn.Execute("UPDATE Tb_Notice SET ChargeMode = @ChargeMode WHERE Id = @Id", new { ChargeMode, Id = NoticeId }); } #endregion DateTime dateNow = DateTime.Now; string OrderSN = dateNow.ToString("yyyyMMddHHmmssfff") + Utils.BuildRandomStr(3); string PaymentNotifyUrl = string.Empty; Dictionary <string, string> param = null; if (payChannel == PayChannelString.AllInPay_Alipay || payChannel == PayChannelString.AllInPay_WechatPay) { #region 请求通联支付 #region 获取对应类型的下账地址 if (Type == 1) { PaymentNotifyUrl = AppGlobal.GetAppSetting("AllinPay_Notify_Url") + "?CommID=" + CommID; } else { PaymentNotifyUrl = AppGlobal.GetAppSetting("AllinPay_Prec_Notify_Url") + "?CommID=" + CommID; } #endregion try { param = SybWxPayService.Pay(Convert.ToInt64(Amt * 100), OrderSN, payChannel == PayChannelString.AllInPay_Alipay ? "A01" : "W06", FeesMemo, RoomSign, OpenID, "", PaymentNotifyUrl, "", "", "", "", allinConfig.orgid, allinConfig.appid, allinConfig.custid, allinConfig.appkey, allinConfig.subbranch); if (param == null || !param.ContainsKey("payinfo")) { GetLog().Error("OnPay:" + JsonConvert.SerializeObject(param)); return(new ApiResult(false, "生成支付订单失败,请重试").toJson()); } } catch (Exception ex) { GetLog().Error("OnPay", ex); return(new ApiResult(false, "生成支付订单失败,请重试").toJson()); } if (erpConn.Execute(@"INSERT INTO Tb_Payment_Order(PayType, OrderSN, NoticeId, Amt, CreateTime) VALUES(@PayType, @OrderSN, @NoticeId, @Amt, @CreateTime)", new { PayType = payType, OrderSN = OrderSN, NoticeId = NoticeId, Amt = Amt, CreateTime = dateNow }) <= 0) { return(new ApiResult(false, "生成支付订单失败,请重试(1003)").toJson()); } return(new ApiResult(true, new { OrderSN = OrderSN, QrCode = param["payinfo"].ToString() }).toJson()); #endregion } if (payChannel == PayChannelString.Alipay) { AliConfig aliConfig = null; try { aliConfig = Config.GetConfig <AliConfig>(paymentConfig.config); if (null == aliConfig) { return(new ApiResult(false, "该项目支付类型对应配置有误").toJson()); } } catch (Exception) { return(new ApiResult(false, "该项目支付类型对应配置有误").toJson()); } #region 请求支付宝官方支付 #region 获取对应类型的下账地址 PaymentNotifyUrl = AppGlobal.GetAppSetting("AliPay_Notify_Url"); #endregion AlipayTradeAppPayResponse response = null; try { JObject BizContent = new JObject(); //要求15分钟内支付 BizContent.Add("timeout_express", "15m"); BizContent.Add("total_amount", Amt); BizContent.Add("body", FeesMemo); BizContent.Add("subject", FeesMemo); BizContent.Add("out_trade_no", OrderSN); IAopClient client = new DefaultAopClient("https://openapi.alipay.com/gateway.do", aliConfig.appid, aliConfig.app_private_key, "json", "1.0", "RSA2", aliConfig.alipay_public_key, "UTF-8", false); AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest { BizContent = JsonConvert.SerializeObject(BizContent), }; request.SetNotifyUrl(PaymentNotifyUrl); response = client.SdkExecute(request); } catch (Exception ex) { Log(ex.Message, "AliPayLogs\\"); GetLog().Error(ex.Message + Environment.CommandLine + ex.StackTrace); return(new ApiResult(false, "请求订单失败,请重试").toJson()); } if (erpConn.Execute("INSERT INTO Tb_Payment_Order(PayType, OrderSN, NoticeId, Amt, CreateTime) VALUES(@PayType, @OrderSN, @NoticeId, @Amt, @CreateTime)", new { PayType = 1, OrderSN, NoticeId = NoticeId, Amt = Amt, CreateTime = dateNow }) <= 0) { return(new ApiResult(false, "生成订单失败").toJson()); } return(new ApiResult(true, new { OrderSN = OrderSN, QrCode = response.Body }).toJson()); #endregion } if (payChannel == PayChannelString.WechatPay) { WxConfig wxConfig = null; try { wxConfig = Config.GetConfig <WxConfig>(paymentConfig.config); if (null == wxConfig) { return(new ApiResult(false, "该项目支付类型对应配置有误").toJson()); } } catch (Exception) { return(new ApiResult(false, "该项目支付类型对应配置有误").toJson()); } #region 请求微信官方支付 #region 获取对应类型的下账地址 PaymentNotifyUrl = AppGlobal.GetAppSetting("WxPay_Notify_Url"); #endregion WxPayData wxPayData = new WxPayData(); wxPayData.SetValue("appid", wxConfig.appid); wxPayData.SetValue("body", FeesMemo); wxPayData.SetValue("mch_id", wxConfig.mch_id); wxPayData.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); wxPayData.SetValue("notify_url", PaymentNotifyUrl); wxPayData.SetValue("out_trade_no", OrderSN); wxPayData.SetValue("spbill_create_ip", "8.8.8.8"); wxPayData.SetValue("total_fee", Convert.ToInt32(Amt * 100)); wxPayData.SetValue("trade_type", "APP"); wxPayData.SetValue("sign_type", wxpay.utils.WxPayData.SIGN_TYPE_HMAC_SHA256); wxPayData.SetValue("sign", wxPayData.MakeSign(wxConfig.appkey)); try { wxPayData = WxPayApi.UnifiedOrder(wxPayData); } catch (Exception) { return(new ApiResult(false, "请求超时,请重试").toJson()); } if (!wxPayData.IsSet("return_code") || !"SUCCESS".Equals(wxPayData.GetValue("return_code").ToString())) { return(new ApiResult(false, "请求支付订单失败").toJson()); } if (!wxPayData.IsSet("result_code") || !"SUCCESS".Equals(wxPayData.GetValue("result_code").ToString())) { return(new ApiResult(false, "请求支付订单失败").toJson()); } if (!wxPayData.IsSet("prepay_id")) { return(new ApiResult(false, "请求支付订单失败").toJson()); } string prepay_id = wxPayData.GetValue("prepay_id").ToString(); if (erpConn.Execute("INSERT INTO Tb_Payment_Order(PayType, OrderSN, NoticeId, Amt, CreateTime) VALUES(@PayType, @OrderSN, @NoticeId, @Amt, @CreateTime)", new { PayType = 2, OrderSN, NoticeId = NoticeId, Amt = Amt, CreateTime = dateNow }) <= 0) { return(new ApiResult(false, "生成订单失败").toJson()); } WxPayData result = new WxPayData(); result.SetValue("appid", wxPayData.GetValue("appid").ToString()); result.SetValue("partnerid", wxPayData.GetValue("mch_id").ToString()); result.SetValue("prepayid", prepay_id); result.SetValue("package", "Sign=WXPay"); result.SetValue("noncestr", wxPayData.GetValue("nonce_str").ToString()); result.SetValue("timestamp", WxPayApi.GenerateTimeStamp()); result.SetValue("sign", result.MakeSign(wxpay.utils.WxPayData.SIGN_TYPE_HMAC_SHA256, wxConfig.appkey)); JObject jObj = JObject.Parse(result.ToJson()); return(new ApiResult(true, new { OrderSN = OrderSN, QrCode = jObj }).toJson()); #endregion } return(new ApiResult(false, "不支持的支付方式").toJson()); } }
/**********************************微信退款*******************************/ public int PostRefundW(List <SaleModel> lstSaleModel) { try { if (lstSaleModel.Count == 0) { return(1); } //移动支付配置赋值 PayService pay = new PayService(); WxPayConfig payConfig = pay.GenerateConfigModelW(lstSaleModel[0].MachineId); foreach (SaleModel saleModel in lstSaleModel) { WxPayData data = new WxPayData(); data.SetValue("out_trade_no", saleModel.TradeNo); data.SetValue("total_fee", int.Parse((saleModel.TradeAmount * 100).ToString()));//订单总金额 if (saleModel.RealitySaleNumber == 0) { data.SetValue("refund_fee", int.Parse((saleModel.TradeAmount * 100).ToString()));//退款金额 } else { data.SetValue("refund_fee", int.Parse(((saleModel.TradeAmount * 100) * ((saleModel.SalesNumber - saleModel.RealitySaleNumber) / saleModel.SalesNumber)).ToString()));//退款金额 } data.SetValue("out_refund_no", WxPayApi.GenerateOutTradeNo(payConfig)); //随机生成商户退款单号 data.SetValue("op_user_id", payConfig.MCHID); //操作员,默认为商户号 //Log.Write("wwwww", "开始退款"); WxPayData result = WxPayApi.Refund(data, payConfig); //提交退款申请给API,接收返回数据 //更新销售状态 if (result.GetValue("result_code").ToString().ToUpper() == "SUCCESS") { SaleModel salInfo = new SaleModel(); salInfo.MachineId = saleModel.MachineId; salInfo.GoodsId = saleModel.GoodsId; salInfo.TradeNo = saleModel.TradeNo; if (saleModel.RealitySaleNumber == 0) { salInfo.TradeStatus = 6; //更新成6 } else { //更新成3 salInfo.TradeStatus = 3; } MachineHelper.ClearCacheOrder(saleModel.TradeNo); UpdateRefundResult(salInfo); RefundModel refundInfo = new RefundModel(); refundInfo.OutTradeNo = salInfo.TradeNo; refundInfo.RefundDetail = result.ToJson(); PostRefundDetail(refundInfo); } } return(1); } catch (Exception ex) { return(0); } }
/** * * 从统一下单成功返回的数据中获取微信浏览器调起jsapi支付所需的参数, * 微信浏览器调起JSAPI时的输入参数格式如下: * { * "appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入 * "timeStamp":" 1395712654", //时间戳,自1970年以来的秒数 * "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串 * "package" : "prepay_id=u802345jgfjsdfgsdg888", * "signType" : "MD5", //微信签名方式: * "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 * } * @return string 微信浏览器调起JSAPI时的输入参数,json格式可以直接做参数用 * 更详细的说明请参考网页端调起支付API:http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7 * */ public string GetJsApiParameters() { Log.Debug(this.GetType().ToString(), "JsApiPay::GetJsApiParam is processing..."); WxPayData jsApiParam = new WxPayData(); jsApiParam.SetValue("appId", unifiedOrderResult.GetValue("appid")); jsApiParam.SetValue("timeStamp", WxPayApi.GenerateTimeStamp()); jsApiParam.SetValue("nonceStr", WxPayApi.GenerateNonceStr()); jsApiParam.SetValue("package", "prepay_id=" + unifiedOrderResult.GetValue("prepay_id")); jsApiParam.SetValue("signType", "MD5"); jsApiParam.SetValue("paySign", jsApiParam.MakeSign()); string parameters = jsApiParam.ToJson(); Log.Debug(this.GetType().ToString(), "Get jsApiParam : " + parameters); return parameters; }
/// <summary> /// /// </summary> /// <param name="Ds"></param> /// <returns></returns> public string GenerateOrder(DataSet Ds) { DataRow Row = Ds.Tables[0].Rows[0]; bool IsBankOk = false; bool IsBusinessOk = false; string OrderId = ""; string txnTime = DateTime.Now.ToString("yyyyMMddHHmmss"); string UserId = Row["UserId"].ToString(); string BussId = Row["BussId"].ToString(); WxPayConfig wxPayConfig = GenerateConfig(BussId); if (null == wxPayConfig) { return(JSONHelper.FromString(false, "未配置证书文件")); } string Name = Row["Name"].ToString(); string Mobile = Row["Mobile"].ToString(); string DeliverAddress = Row["DeliverAddress"].ToString(); string subject = ""; int Amount = 0; int CouponAmount = 0; // 俊发需求5896 string communityId = null; if (Row.Table.Columns.Contains("CommunityId") && !string.IsNullOrEmpty(Row["CommunityId"].ToString())) { communityId = Row["CommunityId"].ToString(); } //生成商家账单 string BussinessResult = GenerateBusinessOrder(Ds, communityId, BussId, UserId, txnTime, ref IsBusinessOk, ref Amount, ref CouponAmount, ref OrderId, Name, Mobile, DeliverAddress, wxPayConfig); if (IsBusinessOk == true) { using (IDbConnection Conn = new SqlConnection(ConnectionDb.GetBusinessConnection())) { Tb_System_BusinessCorp bussInfo = Conn.Query <Tb_System_BusinessCorp>(@"SELECT * FROM Tb_System_BusinessCorp WHERE BussId=@BussId", new { BussId = BussId }).FirstOrDefault(); if (bussInfo != null) { subject = bussInfo.BussName + "订单,共" + Ds.Tables["Product"].Rows.Count + "种商品"; } } //生成银行订单,返回银行流水号 WxPayData Data = new WxPayData(); string BankResult = GenerateBankOrder(BussId, OrderId, txnTime, (Amount - CouponAmount), ref IsBankOk, ref Data, wxPayConfig); if (IsBankOk == false) { return(JSONHelper.FromString(false, BankResult)); } else { using (IDbConnection conn = new SqlConnection(ConnectionDb.GetBusinessConnection())) { string sql; if ((Amount - CouponAmount) == 0) { sql = string.Format(@"UPDATE Tb_Charge_Receipt SET PrepayStr=@prepay_str,Method='微信',IsPay='已付款',ReturnCode='TRADE_FINISHED',ReturnMsg='TRADE_FINISHED',PayDate=GetDate(),Amount={0:###.##},CouponAmount={1:###.##},RealAmount=0 WHERE OrderId = @OrderId", Amount / 100, CouponAmount / 100); } else { sql = @"UPDATE Tb_Charge_Receipt SET PrepayStr=@prepay_str WHERE OrderId = @OrderId"; } conn.Execute(sql, new { prepay_str = Data.GetValue("prepay_id").ToString(), OrderId = OrderId }); } //向手机端返回银行记录 WxPayData result = new WxPayData(); result.SetValue("appid", Data.GetValue("appid")); result.SetValue("partnerid", Data.GetValue("mch_id")); result.SetValue("prepayid", Data.GetValue("prepay_id")); result.SetValue("noncestr", Data.GetValue("nonce_str")); result.SetValue("package", "Sign=WXPay"); result.SetValue("timestamp", (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000); result.SetValue("sign", result.MakeSign()); // 上面的顺序不允许变动 result.SetValue("total_fee", Amount); return(JSONHelper.FromJsonString(true, result.ToJson())); } } else { return(JSONHelper.FromString(false, BussinessResult)); } }
public IActionResult AddOrdered(Order s) { var r = new RequestModel(); try { if (db.Orders.FirstOrDefault(c => c.Card == s.Card && c.ActiveId == s.ActiveId && s.Status == 1) != null) { r.code = 0; r.msg = "您已经报过名了"; return(Ok(r)); } var user = db.Users.Find(s.UserId); if (user == null) { r.code = 0; r.msg = "用户信息错误"; return(Ok(r)); } //新增 s.CreateTime = DateTime.Now; s.PayTime = DateTime.Now; s.Payno = WxPayAPI.WxPayApi.GenerateOutTradeNo(); s.Status = 0; //Active active = db.Actives.Find(s.ActiveId); Catory catory = db.Catorys.Find(s.ClassId); s.Grade = catory.Title; s.Money = catory.Price; s.PayMoney = 0.01M; if (s.Id > 0) { db.Orders.Update(s); } else { db.Orders.Add(s); } if (db.SaveChanges() > 0) { //Log.WriteLog("11111111:SUCCESS"); //生成与支付编号 unifiedOrderResult = GetUnifiedOrderResult(s.PayMoney, user.LoginName, s.Payno); //Log.WriteLog("11111111:222222222222222222"); WxPayData jsApiParam = new WxPayData(); jsApiParam.SetValue("appId", unifiedOrderResult.GetValue("appid")); jsApiParam.SetValue("timeStamp", WxPayApi.GenerateTimeStamp()); jsApiParam.SetValue("nonceStr", WxPayApi.GenerateNonceStr()); jsApiParam.SetValue("package", "prepay_id=" + unifiedOrderResult.GetValue("prepay_id")); jsApiParam.SetValue("signType", "MD5"); jsApiParam.SetValue("paySign", jsApiParam.MakeSign()); r.data = jsApiParam.ToJson(); r.code = 1; r.msg = s.Payno; } return(Ok(r)); } catch (Exception e) { //打印日志 r.msg = e.Message; } return(Ok(r)); }
public bool CompleteRechargeOrder(WxPayData queryData, out string msg) { string out_trade_no = queryData.GetValue("out_trade_no").ToString().Substring(10); //取出提交的数据包,原样返回 //object attachData = payData.GetValue("attach"); //交易状态 string trade_state = queryData.GetValue("trade_state").ToString(); //微信支付订单号 string transaction_id = null; if (queryData.IsSet("transaction_id")) { transaction_id = queryData.GetValue("transaction_id").ToString(); } var orderInfo = _userPayOrdeRepository.FirstOrDefault(p => p.Id == out_trade_no); orderInfo.UpdateTime = DateTime.Now; if (trade_state == "SUCCESS")//交易成功 { try { var userInfo = _userRepository.Get(orderInfo.UId); var fee = Convert.ToDecimal(queryData.GetValue("total_fee")) / 100; //_purchaseServiceRepository.UpdateServiceOrder(new UpdateServiceOrder() //{ // ID = out_trade_no, // PayExtendInfo = queryData.ToJson(), // PayState = trade_state, // PayOrderID = transaction_id, // State = 2 //}); orderInfo.PayExtendInfo = queryData.ToJson(); orderInfo.PayState = trade_state; orderInfo.PayOrderID = transaction_id; orderInfo.State = 2; _userPayOrdeRepository.Update(orderInfo); _userRechargeRepository.Insert(new UserRecharge() { Id = OrderHelper.GenerateNewId(), Cost = fee, AdminId = null, CreateTime = DateTime.Now, OrderID = out_trade_no, Remarks = "微信公众号充值", UId = userInfo.Id }); userInfo.Fund += fee; _userRepository.UpdateAsync(userInfo); msg = "充值成功"; return(true); } catch (Exception e) { throw e; } } else if (trade_state == "USERPAYING")//正在支付 { //var result = _purchaseServiceRepository.UpdateServiceOrder(new UpdateServiceOrder() //{ // ID = out_trade_no, // PayExtendInfo = queryData.ToJson(), // PayState = trade_state, // PayOrderID = transaction_id, // State = null //}); orderInfo.PayExtendInfo = queryData.ToJson(); orderInfo.PayState = trade_state; orderInfo.PayOrderID = transaction_id; orderInfo.State = null; _userPayOrdeRepository.Update(orderInfo); msg = "充值失败, 订单正在支付中"; return(false); } else if (trade_state == "NOTPAY") { //算作超时关闭订单 if (orderInfo != null && orderInfo.CreateTime.AddMinutes(20) < DateTime.Now) { //var result1 = _purchaseServiceRepository.UpdateServiceOrder(new UpdateServiceOrder() //{ // ID = out_trade_no, // PayExtendInfo = queryData.ToJson(), // PayState = trade_state, // PayOrderID = transaction_id, // State = 3 //}); orderInfo.PayExtendInfo = queryData.ToJson(); orderInfo.PayState = trade_state; orderInfo.PayOrderID = transaction_id; orderInfo.State = 3; _userPayOrdeRepository.Update(orderInfo); LogHelper.Logger.Debug("超时关闭订单"); msg = "支付超时,订单被关闭"; return(false); } else { //继续等待,还不算结束 //var result1 = _purchaseServiceRepository.UpdateServiceOrder(new UpdateServiceOrder() //{ // ID = out_trade_no, // PayExtendInfo = queryData.ToJson(), // PayState = trade_state, // PayOrderID = transaction_id, // State = null //}); orderInfo.PayExtendInfo = queryData.ToJson(); orderInfo.PayState = trade_state; orderInfo.PayOrderID = transaction_id; orderInfo.State = null; _userPayOrdeRepository.Update(orderInfo); msg = "订单尚未支付"; return(false); } } else { //var result1 = _purchaseServiceRepository.UpdateServiceOrder(new UpdateServiceOrder() //{ // ID = out_trade_no, // PayExtendInfo = queryData.ToJson(), // PayState = trade_state, // PayOrderID = transaction_id, // State = 3 //}); orderInfo.PayExtendInfo = queryData.ToJson(); orderInfo.PayState = trade_state; orderInfo.PayOrderID = transaction_id; orderInfo.State = 3; orderInfo.UpdateTime = DateTime.Now; _userPayOrdeRepository.Update(orderInfo); msg = "支付失败"; return(false); } }
} //支付成功跳转的地址 protected void Page_Load(object sender, EventArgs e) { string openid = DTRequest.GetQueryString("openid"); string order_no = DTRequest.GetQueryString("order_no"); decimal order_amount = 9.28M; //订单金额 string subject1 = "在线支付"; //订单备注1 string subject2 = "在线支付"; //订单备注2 //检查参数是否正确 if (string.IsNullOrEmpty(openid) || string.IsNullOrEmpty(order_no)) { Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,获取OPENID参数有误!"))); return; } //JSAPI支付预处理 try { //统一下单 string sendUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder"; JsApiConfig jsApiConfig = new JsApiConfig(); WxPayData data = new WxPayData(); data.SetValue("body", subject1); //商品描述 data.SetValue("detail", subject2); //商品详情 data.SetValue("out_trade_no", order_no); //商户订单号 data.SetValue("total_fee", (Convert.ToDouble(order_amount) * 100).ToString()); //订单总金额,以分为单位 data.SetValue("trade_type", "JSAPI"); //交易类型 data.SetValue("openid", openid); //公众账号ID data.SetValue("appid", jsApiConfig.AppId); //公众账号ID data.SetValue("mch_id", jsApiConfig.Partner); //商户号 data.SetValue("nonce_str", JsApiPay.GenerateNonceStr()); //随机字符串 data.SetValue("notify_url", jsApiConfig.Notify_url); //异步通知url data.SetValue("spbill_create_ip", DTRequest.GetIP()); //终端IP data.SetValue("sign", data.MakeSign(jsApiConfig.Key)); //签名 string xml = data.ToXml(); //转换成XML var startTime = DateTime.Now; //开始时间 string response = HttpService.Post(xml, sendUrl, false, 6); //发送请求 var endTime = DateTime.Now; //结束时间 int timeCost = (int)((endTime - startTime).TotalMilliseconds); //计算所用时间 WxPayData result = new WxPayData(); result.FromXml(response, jsApiConfig.Key); JsApiPay.ReportCostTime(sendUrl, timeCost, result);//测速上报 LogHelper.WriteDebugLog("[pay]:" + result.ToString()); //获取H5调起JS API参数 WxPayData jsApiParam = new WxPayData(); jsApiParam.SetValue("appId", result.GetValue("appid")); jsApiParam.SetValue("timeStamp", JsApiPay.GenerateTimeStamp()); jsApiParam.SetValue("nonceStr", JsApiPay.GenerateNonceStr()); jsApiParam.SetValue("package", "prepay_id=" + result.GetValue("prepay_id")); jsApiParam.SetValue("signType", "MD5"); jsApiParam.SetValue("paySign", jsApiParam.MakeSign(jsApiConfig.Key)); wxJsApiParam = jsApiParam.ToJson(); LogHelper.WriteDebugLog("[ApiParam]:" + jsApiParam.ToJson()); //支付成功后跳转的URL returnUrl = new Web.UI.BasePage().linkurl("payment", "?action=succeed&order_no=" + order_no); //Response.Redirect(returnUrl); } catch (Exception ex) { Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode(ex.Message))); return; } }
public async Task <ActionResult> WXPay([FromServices] TengoDbContext db , int outTradeNo = 0, string code = null, int orderId = 0, int isDelaySend = 0) { //如果outTradeNo参数为空,那么是第一次进来的情况 if (outTradeNo <= 0) { #region 商场本身业务逻辑 第一次(也就是从订单点击去支付之后)进来的时候会执行这里 if (orderId <= 0) { return(Redirect("/error")); } var order = await db.Order.FirstOrDefaultAsync(p => p.Id == orderId); if (order == null) { return(Redirect("/error")); } if (order.RealAmount == 0) //如果支付金额是0元,那么有可能是活动啥的不用付钱,那么状态应该是已经支付了的,直接跳回去看看 { return(Redirect("/order/detail?id=" + order.Id)); } if (order.PayStatus) { return(Redirect("/order/detail?id=" + order.Id)); } #endregion #region 构造网页授权获取code的URL,并且重定向跳转到微信的地址 var host = HttpContext.Request.Host; var path = Request.Path; //指定获取code之后要跳回来的地址,这里我会加上订单流水号 var redirect_uri = HttpUtility.UrlEncode("https://" + host + "/payment/WXPay?outTradeNo=" + orderId); var data = new WxPayData(); data.SetValue("appid", WxPayConfig.APPID); data.SetValue("redirect_uri", redirect_uri); data.SetValue("response_type", "code"); data.SetValue("scope", "snsapi_base"); data.SetValue("state", "STATE" + "#wechat_redirect"); var url = "https://open.weixin.qq.com/connect/oauth2/authorize?" + data.ToUrl(); //触发微信返回code码 return(Redirect(url));//Redirect函数会抛出ThreadAbortException异常,不用处理这个异常 #endregion } //重定向回来之后包含了code else if (!string.IsNullOrWhiteSpace(code)) { #region GetOpenidAndAccessToken 从Url里面拿取上面第一步重定向之后返回来附带的code,然后进一步获取openid和accessToken,接着再统一下单,获取支付参数 var model = new WXPay(); #region GetOpenidAndAccessTokenFromCode(code); 先通过code构造请求来获取openid和accessToken try { //构造获取openid及access_token的url var data = new WxPayData(); data.SetValue("appid", WxPayConfig.APPID); data.SetValue("secret", WxPayConfig.APPSECRET); //写入code码,以获取openid和access_token data.SetValue("code", code); data.SetValue("grant_type", "authorization_code"); string url = "https://api.weixin.qq.com/sns/oauth2/access_token?" + data.ToUrl(); //请求url以获取数据 string result = HttpService.Get(url); //LogFactory.GetLogger().Info("WXPay", "GetOpenidAndAccessTokenFromCode响应 : " + result); //保存access_token,用于收货地址获取 var jd = JsonMapper.ToObject(result); model.access_token = (string)jd["access_token"]; //获取用户openid model.openid = (string)jd["openid"]; //LogFactory.GetLogger().Info("WXPay", "获取到的openid : " + model.openid); //LogFactory.GetLogger().Info("WXPay", "获取到的access_token : " + model.access_token); } catch (Exception ex) { //LogFactory.GetLogger().Error("WXPay", ex, remark: "GetOpenidAndAccessTokenFromCode错误"); throw new WxPayException(ex.ToString()); } #endregion try { //读取订单信息 var order = await db.Order.FirstOrDefaultAsync(p => p.Id == outTradeNo); //注意这里的订单号就要设置为流水号了 model.out_trade_no = outTradeNo.ToString(); model.total_fee = Convert.ToInt32(order.RealAmount * 100); #region 调用统一下单,获得下单结果 获取prepay_id //统一下单 var data = new WxPayData(); #region 处理商品前缀 var subject = "Teogn电商商品"; #endregion data.SetValue("body", subject); //商品描述 data.SetValue("attach", subject); //附加数据 data.SetValue("out_trade_no", model.out_trade_no); data.SetValue("total_fee", model.total_fee); data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); data.SetValue("goods_tag", "");//订单优惠标记 data.SetValue("trade_type", "JSAPI"); data.SetValue("openid", model.openid); var unifiedOrderResult = WxPayApi.UnifiedOrder(data); if (!unifiedOrderResult.IsSet("appid") || !unifiedOrderResult.IsSet("prepay_id") || unifiedOrderResult.GetValue("prepay_id").ToString() == "") { //LogFactory.GetLogger().Info("WXPay", "统一下单报错:UnifiedOrder response error!"); throw new WxPayException("UnifiedOrder response error!"); } #endregion #region 获取H5调起JS API参数 //LogFactory.GetLogger().Info("WXPay", "JsApiPay::GetJsApiParam is processing..."); var jsApiParam = new WxPayData(); jsApiParam.SetValue("appId", unifiedOrderResult.GetValue("appid")); jsApiParam.SetValue("timeStamp", WxPayApi.GenerateTimeStamp()); jsApiParam.SetValue("nonceStr", WxPayApi.GenerateNonceStr()); jsApiParam.SetValue("package", "prepay_id=" + unifiedOrderResult.GetValue("prepay_id")); jsApiParam.SetValue("signType", "MD5"); jsApiParam.SetValue("paySign", jsApiParam.MakeSign()); model.wxJsApiParam = jsApiParam.ToJson(); //LogFactory.GetLogger().Info("WXPay", "wxJsApiParam : " + model.wxJsApiParam); #endregion ViewData.Model = model; return(View()); } catch (Exception exp) { //LogFactory.GetLogger().Error("微信支付异常", exp); return(Redirect("/error?msg=微信支付异常...")); } #endregion } else //异常情况,不用理会 { return(Redirect("/error?msg=支付异常...")); } }
private ActionResult WeiXinPay(Users Users, decimal Amount, PayConfig PayConfig, SysControl SysControl) { if (Users.Token.IsNullOrEmpty()) { Users.Token = DateTime.Now.ToString().GetMD5(); Entity.SaveChanges(); } int InType = 0; if (SysControl.LagEntryNum > 0) { InType = 1; } #region 微信支付 string PostJson = "{amoney:" + Amount.ToString("F2") + ",token:\"" + Users.Token + "\",payid:\"shop\",otype:8,action:\"Create\",x:\"0\",y:\"0\",intype:\"" + InType + "\",payway:\"" + PayConfig.Id + "\",orderaddress:\"网店收银台,IP:" + Utils.GetAddressAndIp() + "\",ip:\"" + Utils.GetIP() + "\"}"; //提交数据 string PostData = LokFuEncode.LokFuAPIEncode(PostJson, Shop_Keys); PostData = HttpUtility.UrlEncode(PostData); //Post参数 string PostString = "eno=" + Shop_ENO + "&data=" + PostData + "&code=0000"; //AppPath = "http://localhost:2610"; string url = AppPath + "/API/OrderQC/"; string RetString = Utils.PostRequest(url, PostString, "utf-8"); JObject json = new JObject(); try { json = (JObject)JsonConvert.DeserializeObject(RetString); } catch (Exception) { ViewBag.ErrorMsg = "接口数据有误![01]"; return(View("Error")); } if (json == null) { ViewBag.ErrorMsg = "接口数据有误![02]"; return(View("Error")); } string code = ""; string data = ""; try { code = json["code"].ToString(); data = json["data"].ToString(); } catch (Exception) { ViewBag.ErrorMsg = "接口数据有误![03]"; return(View("Error")); } if (code != "0000") { ViewBag.ErrorMsg = "交易有误![" + code + "]"; return(View("Error")); } //解密 string RetData = LokFuEncode.LokFuAPIDecode(data, Shop_Keys); JObject Json = new JObject(); try { Json = (JObject)JsonConvert.DeserializeObject(RetData); } catch (Exception) { ViewBag.ErrorMsg = "数据解析有误![01]"; return(View("Error")); } if (Json == null) { ViewBag.ErrorMsg = "数据解析有误![02]"; return(View("Error")); } Orders Orders = new Orders(); Orders = JsonToObject.ConvertJsonToModel(Orders, Json); if (Orders.PayId.IsNullOrEmpty()) { ViewBag.ErrorMsg = "订单信息有误"; return(View("Error")); } string PayId = Orders.PayId; string[] PayConfigArr = PayConfig.QueryArray.Split(new char[] { ',' }); if (PayConfig.DllName == "WeiXin") { string AppId = PayConfigArr[0]; string AppKey = PayConfigArr[2]; WxPayData jsApiParam = new WxPayData(); jsApiParam.SetValue("appId", AppId); jsApiParam.SetValue("timeStamp", WxPayApi.GenerateTimeStamp()); jsApiParam.SetValue("nonceStr", WxPayApi.GenerateNonceStr()); jsApiParam.SetValue("package", "prepay_id=" + PayId); jsApiParam.SetValue("signType", "MD5"); jsApiParam.SetValue("paySign", jsApiParam.MakeSign(AppKey)); string Parameters = jsApiParam.ToJson(); ViewBag.Parameters = Parameters; Orders = Entity.Orders.FirstOrNew(n => n.TNum == Orders.TNum); ViewBag.Orders = Orders; return(View("WeiXinPay")); } else if (PayConfig.DllName == "HFWeiXin") { //提交结算中心 string merId = PayConfigArr[0]; //商户号 string merKey = PayConfigArr[1]; //商户密钥 string orderId = Orders.TNum; //商户流水号 string myData = "{\"merid\":\"" + merId + "\",\"orderid\":\"" + orderId + "\",\"code\":\"" + PayId + "\"}"; string DataBase64 = LokFuEncode.Base64Encode(myData, "utf-8"); string Sign = (DataBase64 + merKey).GetMD5(); DataBase64 = HttpUtility.UrlEncode(DataBase64); string myUrl = string.Format("req={0}&sign={1}", DataBase64, Sign); string Url = "https://api.zhifujiekou.com/wxjsapi/gopay.html?" + myUrl; //Response.Redirect(Url); return(this.Redirect(Url)); } else { return(View("Null")); } //return View("Null"); #endregion }
/// <summary> /// 创建预支付订单 /// </summary> /// <param name="param"></param> /// <returns></returns> public WeChatResult UnifiedOrder(WeChatInfo param) { WeChatResult wxResult = new WeChatResult(); // 回调地址 string notifyUrl = System.Web.Configuration.WebConfigurationManager.AppSettings["notifyUrl"].ToString(); try { // 检查服务端是否处于调整中 if (CheckServerMantain(param.costCenterCode)) { wxResult.isMantain = true; return(wxResult); } // 检查充值金额和设置是否符合 wxResult.matched = true; if (!CheckRechargeMatched(param)) { wxResult.matched = false; return(wxResult); } string openid = param.openId; string ordertime = SalesOrder.Common.convertDateTime(DateTime.Now.ToString()); bool isTestUser = (new RechargeFactory()).GetUserInfo(openid).isTestUser; // 本地交易号前三位(用于在商户平台上区分支付场景,回调时手动去除不存数据库) string fcode = wcf.paymentCode; int len = fcode.Length; /***统一下单1***/ WxPayData data = new WxPayData(wcf); data.SetValue("body", param.costCenterCode + "-餐卡充值"); data.SetValue("attach", param.appName); data.SetValue("out_trade_no", fcode + WxPayApi.GenerateOutTradeNo(param.costCenterCode)); //data.SetValue("total_fee", param.total_fee); data.SetValue("total_fee", isTestUser ? 1 : param.total_fee); data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); data.SetValue("time_expire", DateTime.Now.AddMinutes(5).ToString("yyyyMMddHHmmss")); //data.SetValue("goods_tag", "test"); data.SetValue("trade_type", "JSAPI"); data.SetValue("openid", openid); data.SetValue("notify_url", notifyUrl); WriteLog(data.ToJson().ToString()); if (param.total_fee > 0) { WxPayData result = WxPayApi.UnifiedOrder(wcf, data); WriteLog(result.ToJson().ToString()); if (!result.IsSet("appid") || !result.IsSet("prepay_id") || result.GetValue("prepay_id").ToString() == "") { Log.Error(this.GetType().ToString(), "UnifiedOrder response error!"); throw new WxPayException("UnifiedOrder response error!"); } wxResult.prepay_id = result.GetValue("prepay_id").ToString(); wxResult.paySign = result.GetValue("sign").ToString(); wxResult.nonceStr = result.GetValue("nonce_str").ToString(); } /***订单写入本地***/ string st = data.GetValue("out_trade_no").ToString(); WxOrder order = new WxOrder { appName = param.appName, type = param.type, cardId = param.cardId, out_trade_no = st.Substring(len, st.Length - len), openid = data.GetValue("openid").ToString(), attach = data.GetValue("attach").ToString(), coupons = param.coupons == null || !param.coupons.Any() ? null : param.coupons.SelectMany(q => q).Where(q => !string.IsNullOrWhiteSpace(q)).GroupBy(q => q) .Select(q => new Coupon { price = int.Parse(q.Key), qty = q.Count() }).ToList(), total_fee = int.Parse(data.GetValue("total_fee").ToString()), time_start = data.GetValue("time_start").ToString(), time_expire = data.GetValue("time_expire").ToString() }; WxOrderFactory wof = new WxOrderFactory(); /***本地没有写成功的话直接返回NULL***/ if (wof.CreatePayOrder(order) <= 0) { return(null); } return(wxResult); } catch (Exception e) { throw e; } }
/// <summary> /// 支付 /// </summary> /// <param name="id"></param> /// <param name="openId"></param> /// <param name="mark"></param> /// <param name="type"></param> /// <returns></returns> public ActionResult CheckOut(string code, string orderNo) { string openid = ""; if (new AppSetting().IsDebug != null && new AppSetting().IsDebug.ToLower() == "true") { openid = "123"; } else { if (Request.Cookies[SystemConfig.WXOpenIDCookieKey] != null) { openid = Request.Cookies[SystemConfig.WXOpenIDCookieKey].Value; } if (string.IsNullOrWhiteSpace(openid) && code == null) { Response.Redirect(CommonHelper.GetRedirect("WxClass%2fClassList")); } try { if (string.IsNullOrWhiteSpace(openid)) { openid = GetOpenId(code).openid; // 合法用户,允许访问 Response.Cookies[SystemConfig.WXOpenIDCookieKey].Value = openid; Response.Cookies[SystemConfig.WXOpenIDCookieKey].Path = "/"; Response.Cookies[SystemConfig.WXOpenIDCookieKey].Expires = DateTime.Now.AddDays(1); } } catch (Exception ex) { } } try { AppSetting setting = new AppSetting(); WxPayClient client = new WxPayClient(); OrderBC bc = new OrderBC(); var order = bc.GetOrderByOrderNo(orderNo); string outTradeNumber = string.Format("{0}{1}", orderNo.ToString(), DateTime.Now.ToString("fff")); UnifiedOrderRequest req = new UnifiedOrderRequest(); req.Body = "万韬财税课程购买"; //商品描述----------------------- req.Attach = openid.ToString(); //附加信息,会原样返回,充值人员微信Openid req.GoodTag = "Pay"; req.TradeType = "JSAPI"; req.OpenId = openid; req.OutTradeNo = outTradeNumber; //---商户订单号---------------- req.TotalFee = 1; //测试总金额 //req.TotalFee = Convert.ToInt32(order.PayPrice * 100);//总金额 req.NotifyUrl = setting.NotifyUrl; //异步通知地址------------------------- var resp = client.UnifiedOrder(req); WxPayData jsApiParam = new WxPayData(); jsApiParam.SetValue("appId", resp.AppId); jsApiParam.SetValue("timeStamp", WxPayApi.GenerateTimeStamp()); jsApiParam.SetValue("nonceStr", WxPayApi.GenerateNonceStr()); jsApiParam.SetValue("package", "prepay_id=" + resp.PrepayId); jsApiParam.SetValue("signType", "MD5"); jsApiParam.SetValue("paySign", jsApiParam.MakeSign()); bc.UpdatePayInfo(outTradeNumber, jsApiParam.ToJson(), orderNo); //--给Viewbag赋值,供前台页面jsapi调用 ViewBag.AppId = (string)jsApiParam.GetValue("appId"); ViewBag.Package = (string)jsApiParam.GetValue("package"); ViewBag.NonceStr = (string)jsApiParam.GetValue("nonceStr"); ViewBag.Paysign = (string)jsApiParam.GetValue("paySign"); ViewBag.TimeStamp = (string)jsApiParam.GetValue("timeStamp"); ViewBag.OpenId = openid; ViewBag.OrderNo = orderNo; ViewBag.OpenId = openid; ViewBag.OrderNo = orderNo; } catch (Exception ex) { } return(View()); }
/// <summary> /// 接收返回的结果,根据结果处理订单状态 /// </summary> public override void ProcessNotify() { WxPayData notifyData = GetNotifyData(); //检查支付结果中transaction_id是否存在 if (!notifyData.IsSet("transaction_id")) { Log.Debug("notifyData", $"notifyData:完成"); //若transaction_id不存在,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "支付结果中微信订单号不存在"); Log.Error(this.GetType().ToString(), "The Pay result is error : " + res.ToXml()); page.Response.Write(res.ToXml()); page.Response.End(); } string transaction_id = notifyData.GetValue("transaction_id").ToString(); string out_trade_no = notifyData.GetValue("out_trade_no").ToString(); //查询订单,判断订单真实性 if (!QueryOrder(transaction_id)) { //若订单查询失败,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "订单查询失败"); Log.Error(this.GetType().ToString(), "Order query failure : " + res.ToXml()); page.Response.Write(res.ToXml()); page.Response.End(); } //查询订单成功 else { int row = 0; #region 更改订单状态,保存支付结果 if (!string.IsNullOrEmpty(out_trade_no)) { using (ApplicationDbContext db = new ApplicationDbContext()) { Order order = db.Orders.FirstOrDefault(p => p.Code == out_trade_no && p.State == Common.Enums.OrderState.UnHandle); if (order != null) { order.Amount = Convert.ToDecimal(notifyData.GetValue("total_fee").ToString()) / 100m; order.PayCode = transaction_id; order.PayResult = notifyData.ToJson(); order.State = notifyData.GetValue("result_code").ToString() == "SUCCESS" ? Common.Enums.OrderState.Success : Common.Enums.OrderState.Failed; order.PayDateTime = DateTime.Now; row = db.SaveChanges(); if (row > 0 && order.State == Common.Enums.OrderState.Success) { var vip = db.Vips.FirstOrDefault(s => s.UserID == order.UserID); vip.Type = Common.Enums.VipRank.Vip99; vip.State = Common.Enums.VipState.Enable; vip.Code = Bll.VipBLL.RandomCode(); db.SaveChanges(); //查看是否需要计算上级收益 VIPAccountBLL bll = new VIPAccountBLL(); bll.CalculateVIPAmount(order.UserID, 1); } } } } #endregion if (row > 0) { WxPayData res = new WxPayData(); res.SetValue("return_code", "SUCCESS"); res.SetValue("return_msg", "OK"); Log.Info(this.GetType().ToString(), "order query success : " + res.ToXml()); page.Response.Write(res.ToXml()); page.Response.End(); } else {//如果没更新成功,就继续接收通知 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "未接收成功"); Log.Error(this.GetType().ToString(), "The recieve result is error : " + res.ToXml()); page.Response.Write(res.ToXml()); page.Response.End(); } } }
public exterData Sign(string openid, string nickname, string UserHostAddress, string city) { city = (city == null) ? "" : city; var Entrustinfo = this.GetEntrustinfo(openid, WxPayConfig.APPID(city), WxPayConfig.getMCHID(city)); var wxuser = this.GetUserInfo(openid, WxPayConfig.APPID(city)); var wxpay = new WxPayApi(); var exdata = new exterData(); exdata.appid = WxPayConfig.APPID(city); exdata.mch_id = WxPayConfig.getMCHID(city); exdata.contract_code = WxPayConfig.getCityCode(city) + Convert.ToString(long.Parse("10000") + Entrustinfo.Id) + DateTime.Now.ToString("ssfff"); exdata.request_serial = Entrustinfo.Id.ToString(); string display_account = string.Empty; if (!string.IsNullOrEmpty(wxuser.Mobile) && wxuser.Mobile.Length == 11) { display_account = wxuser.Mobile.Substring(0, 3) + "****" + wxuser.Mobile.Substring(7, 4); } else { display_account = nickname; } exdata.contract_display_account = display_account; switch (city) { case "福州市": exdata.notify_url = "https://www.cmeeol.com/wechat/FZReceiveSign"; break; case "杭州市": exdata.notify_url = "https://wx.hzgolong.com/wechat/HZReceiveSign"; break; case "杭州市2": exdata.notify_url = "https://wx.hzgolong.com/wechat/wccReceiveSign"; break; default: exdata.notify_url = "https://wx.hzgolong.com/wechat/ReceiveSign"; break; } //exdata.notify_url = HttpUtility.UrlEncode(exdata.notify_url); exdata.plan_id = WxPayConfig.getPlanID(city); exdata.openid = openid; exdata.timestamp = WxPayApi.GenerateTimeStamp(); exdata.clientip = UserHostAddress; exdata.deviceid = ""; exdata.mobile = ""; exdata.email = ""; exdata.qq = ""; exdata.creid = ""; exdata.outerid = ""; WxPayData inputObj = new WxPayData(city); inputObj.SetValue("appid", WxPayConfig.APPID(city)); inputObj.SetValue("contract_code", exdata.contract_code); inputObj.SetValue("contract_display_account", exdata.contract_display_account); inputObj.SetValue("mch_id", exdata.mch_id); inputObj.SetValue("notify_url", exdata.notify_url); inputObj.SetValue("plan_id", exdata.plan_id); inputObj.SetValue("request_serial", exdata.request_serial); inputObj.SetValue("timestamp", exdata.timestamp); inputObj.SetValue("clientip", exdata.clientip); inputObj.SetValue("deviceid", ""); inputObj.SetValue("mobile", ""); inputObj.SetValue("email", ""); inputObj.SetValue("qq", ""); inputObj.SetValue("openid", openid); inputObj.SetValue("creid", ""); inputObj.SetValue("outerid", ""); if (wxuser.Mobile == "13588861726") { Log.Write("luo sign inputObj json:", inputObj.ToJson()); } exdata.sign = inputObj.MakeSign(); return(exdata); }
/// <summary> /// 生成银行及物业订单 /// </summary> /// <param name="Row"></param> /// <returns></returns> public string GenerateOrder(DataRow Row) { bool IsBankOk = false; bool IsPropertyOk = false; string PropertyOrderId = ""; string BankOrderId = ""; string CommunityId = Row["CommunityId"].ToString(); string FeesIds = Row["FeesIds"].ToString(); string txnTime = DateTime.Now.ToString("yyyyMMddHHmmss"); string CustID = Row["CustID"].ToString(); //2017-06-05添加可选参数openId //用于区分是否来自于微信H5支付 //默认为空 string openId = Row.Table.Columns.Contains("openId") ? Row["openId"].ToString() : ""; string UserId = null; if (Row.Table.Columns.Contains("UserID") && !string.IsNullOrEmpty(Row["UserID"].ToString())) { UserId = Row["UserID"].ToString(); } int UsePoints = 0; if (Row.Table.Columns.Contains("UsePoints") && !string.IsNullOrEmpty(Row["UsePoints"].ToString())) { UsePoints = AppGlobal.StrToInt(Row["UsePoints"].ToString()); } //增加FeesIds重复验证 if (FeesIds == "") { return(JSONHelper.FromString(false, "未选择任何费用")); } string[] feesArray = FeesIds.Split(',').Distinct().ToArray(); FeesIds = string.Join(",", feesArray.ToArray()); WxPayConfig wxPayConfig = GenerateConfig(CommunityId); if (null == wxPayConfig) { return(JSONHelper.FromString(false, "该小区不支持微信支付")); } PubConstant.hmWyglConnectionString = GetConnection(CommunityId); using (var appConn = new SqlConnection(PubConstant.UnifiedContionString)) { if (appConn.State == ConnectionState.Closed) { appConn.Open(); } var appTrans = appConn.BeginTransaction(); // 检查数据 string useHistoryID = null; int Amount = 0; // 缴费总额 decimal propertyAmount = 0.0m; // 物业费缴费总额 decimal parkingAmount = 0.0m; // 车位费缴费总额 decimal deductionAmount = 0.0m; // 积分可抵扣金额 decimal propertyMaxDiscountsAmount = 0.0m; // 物管费最大可抵用金额 decimal parkingMaxDiscountsAmount = 0.0m; // 车位费最大可抵用金额 int pointBalance = 0; // 积分余额 var deductionObject = new List <string>(); // 积分可抵扣对象 #region 获取积分抵扣规则 // 要使用的积分是否大于用户积分余额 pointBalance = appConn.Query <int>("SELECT PointBalance FROM Tb_App_UserPoint WHERE UserID=@UserID", new { UserID = UserId }, appTrans).FirstOrDefault(); if (pointBalance < UsePoints) { return(new ApiResult(false, "积分余额不足").toJson()); } // 企业编号 short corpId = appConn.Query <short>("SELECT CorpID FROM Tb_Community WHERE Id=@CommunityId", new { CommunityId = CommunityId }, appTrans).FirstOrDefault(); // 积分权限控制 var controlInfo = appConn.Query <Tb_Control_AppPoint>(@"SELECT * FROM Tb_Control_AppPoint WHERE CorpID=@CorpID AND IsEnable=1 AND (CommunityID=@CommunityId OR CommunityID IS NULL) ORDER BY CommunityID DESC", new { CorpID = corpId, CommunityId = CommunityId }, appTrans).FirstOrDefault(); if (controlInfo == null || controlInfo.IsEnable == false) { controlInfo = Tb_Control_AppPoint.DefaultControl; controlInfo.CorpID = corpId; controlInfo.CommunityID = Guid.Empty.ToString(); } // 允许抵用物业费 if (controlInfo.AllowDeductionPropertyFees) { deductionObject.Add($@"'{AppPointUsableObjectConverter.GetKey(AppPointUsableObject.PropertyFee)}'"); } // 允许抵用车位费 if (controlInfo.AllowDeductionParkingFees) { deductionObject.Add($@"'{AppPointUsableObjectConverter.GetKey(AppPointUsableObject.ParkingFee)}'"); } #endregion #region 获取缴费列表,读取欠费总额 using (IDbConnection erpConn = new SqlConnection(PubConstant.hmWyglConnectionString)) { try { IEnumerable <dynamic> arrearsList = erpConn.Query($@"SELECT * FROM view_HSPR_Fees_Filter WHERE FeesID IN({FeesIds})"); // 允许抵用物业费 if (controlInfo.AllowDeductionPropertyFees) { foreach (dynamic item in arrearsList) { if (item.SysCostSign != null && item.SysCostSign.ToString() == "B0001") { propertyAmount += item.DebtsAmount; } } } // 允许抵用车位费 if (controlInfo.AllowDeductionParkingFees) { foreach (dynamic item in arrearsList) { if (item.SysCostSign != null && item.SysCostSign.ToString() == "B0002") { parkingAmount += item.DebtsAmount; } } } } catch (Exception) { appTrans.Rollback(); return(new ApiResult(false, "验证欠费列表失败").toJson()); } } #endregion if (UsePoints > 0 && !string.IsNullOrEmpty(UserId)) { #region 判断积分是否足够 try { if (deductionObject.Count == 0) { return(new ApiResult(false, "暂不支持积分抵用功能").toJson()); } // 积分抵用规则 var ruleInfo = appConn.Query($@"SELECT IID,ConditionAmount,DiscountsAmount,DeductionObject,b.Remark AS SysCostSign,StartTime,EndTime FROM Tb_App_Point_PropertyDeductionRule a LEFT JOIN Tb_Dictionary_Point_UsableObject b ON a.DeductionObject=b.[Key] WHERE CommunityID=@CommunityId AND DeductionObject IN({string.Join(", ", deductionObject) }) AND getdate() BETWEEN StartTime AND EndTime AND a.IsDelete=0 ORDER BY ConditionAmount,DiscountsAmount", new { CommunityId = CommunityId }, appTrans); if (ruleInfo.Count() == 0) { return(new ApiResult(false, "积分抵用规则未设置或已失效").toJson()); } // 确定物管费可抵用金额 if (propertyAmount > 0) { string key = AppPointUsableObjectConverter.GetKey(AppPointUsableObject.PropertyFee); foreach (var item in ruleInfo) { if (item.DeductionObject == key && propertyAmount >= item.ConditionAmount) { propertyMaxDiscountsAmount = item.DiscountsAmount; } } } // 确定车位费可抵用金额 if (parkingAmount > 0) { string key = AppPointUsableObjectConverter.GetKey(AppPointUsableObject.ParkingFee); foreach (var item in ruleInfo) { if (item.DeductionObject == key && parkingAmount >= item.ConditionAmount) { parkingMaxDiscountsAmount = item.DiscountsAmount; } } } // 要使用积分抵用的金额 deductionAmount = UsePoints / (decimal)controlInfo.PointExchangeRatio; // 积分数量不正常 if (deductionAmount > (parkingMaxDiscountsAmount + propertyMaxDiscountsAmount)) { return(new ApiResult(false, "使用积分超过可抵用最大金额").toJson()); } else { decimal tmp = deductionAmount; // 部分抵扣物业费 if (propertyMaxDiscountsAmount != 0) { if (tmp <= propertyMaxDiscountsAmount) { propertyMaxDiscountsAmount = tmp; tmp = 0; } else { tmp -= propertyMaxDiscountsAmount; } } // 部分抵扣车位费 if (parkingMaxDiscountsAmount != 0 && tmp > 0) { if (tmp <= parkingMaxDiscountsAmount) { parkingMaxDiscountsAmount = tmp; tmp = 0; } else { tmp -= parkingMaxDiscountsAmount; } } if (tmp != 0) { return(new ApiResult(false, "积分抵用出错").toJson()); } } if (UsePoints > 0 && deductionAmount > 0) { useHistoryID = Guid.NewGuid().ToString(); } } catch (Exception) { appTrans.Rollback(); return(new ApiResult(false, "积分验证失败").toJson()); } #endregion } // 积分数量正常,生成订单 try { // 生成ERP账单 string PropertyResult = GeneratePropertyOrder(CommunityId, FeesIds, txnTime, CustID, ref IsPropertyOk, ref Amount, ref PropertyOrderId, wxPayConfig); // ERP订单生成成功 if (IsPropertyOk == true) { // 应缴总金额 Amount = Amount - (int)(deductionAmount * 100); // 微信签名订单信息 WxPayData Data = new WxPayData(); string BankResult = GenerateBankOrder(CommunityId, UserId, feesArray.First(), PropertyOrderId, txnTime, Amount, ref IsBankOk, ref BankOrderId, ref Data, wxPayConfig, openId); if (IsBankOk == true) { // 微信订单信息 WxPayData result = new WxPayData(); result.SetValue("appid", Data.GetValue("appid")); result.SetValue("partnerid", Data.GetValue("mch_id")); result.SetValue("prepayid", Data.GetValue("prepay_id")); result.SetValue("noncestr", Data.GetValue("nonce_str")); result.SetValue("package", "Sign=WXPay"); result.SetValue("timestamp", (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000); result.SetValue("sign", result.MakeSign()); // 计算预赠送积分 new AppPoint().CalcPresentedPointForPropertyFees(CommunityId, propertyAmount - propertyMaxDiscountsAmount, parkingAmount - parkingMaxDiscountsAmount, out int p1, out int p2); result.SetValue("presented_points", (p1 + p2)); if (!string.IsNullOrEmpty(useHistoryID)) { result.SetValue("out_trade_no", PropertyOrderId); result.SetValue("deduction_amount", deductionAmount); result.SetValue("point_use_history_id", useHistoryID); appConn.Execute($@"UPDATE Tb_App_UserPoint SET PointBalance=(PointBalance-@UsePoints) WHERE UserID=@UserID; INSERT INTO Tb_App_Point_UseHistory(IID, UserID, UseWay, UsePoints, PointBalance, DeductionAmount, Remark) VALUES(@UseHistoryID, @UserID, @UseWay, @UsePoints, @PointBalance, @DeductionAmount, @Remark); INSERT INTO Tb_App_Point_Locked(UserID, UseHistoryID, LockedPoints) VALUES (@UserID, @UseHistoryID, @LockedPoints);", new { UsePoints = UsePoints, UserID = UserId, UseHistoryID = useHistoryID, UseWay = AppPointUseWayConverter.GetKey(AppPointUseWay.PropertyFeeDeduction), PointBalance = pointBalance - UsePoints, DeductionAmount = deductionAmount, Remark = AppPointUseWayConverter.GetValue(AppPointUseWay.PropertyFeeDeduction), LockedPoints = UsePoints }, appTrans); string usableObject = string.Join(",", deductionObject.Select(obj => AppPointUsableObjectConverter.GetValue(obj.Replace("'", "")))); // 存储积分使用记录与订单关联关系 appConn.Execute(@"INSERT INTO Tb_App_Point_UseHistoryOrder(UseHistoryID, OrderID, Payment, UsableObject) VALUES(@UseHistoryID, @OrderID, '微信', @UsableObject)", new { UseHistoryID = useHistoryID, OrderID = PropertyOrderId, UsableObject = usableObject }, appTrans); } using (var erpConn = new SqlConnection(PubConstant.hmWyglConnectionString)) { // 更新订单 erpConn.Execute(@"UPDATE Tb_OL_WeiXinPayOrder SET prepay_id=@prepay_id WHERE out_trade_no = @out_trade_no ", new { prepay_id = Data.GetValue("prepay_id").ToString(), out_trade_no = PropertyOrderId }); } appTrans?.Commit(); return(JSONHelper.FromJsonString(true, result.ToJson())); } else { appTrans?.Rollback(); return(JSONHelper.FromString(false, BankResult)); } } else { appTrans?.Rollback(); return(JSONHelper.FromString(false, PropertyResult)); } } catch (Exception ex) { appTrans?.Rollback(); return(JSONHelper.FromString(false, ex.Message + ex.StackTrace)); } } }
/// <summary> /// 生成银行及物业订单 /// </summary> /// <param name="Row"></param> /// <returns></returns> public string GenerateOrder(DataRow Row) { bool IsBankOk = false; bool IsPropertyOk = false; string PropertyOrderId = ""; string BankOrderId = ""; string CommunityId = Row["CommunityId"].ToString(); string CostID = Row["CostID"].ToString(); string RoomID = Row["RoomID"].ToString(); if (!Row.Table.Columns.Contains("HandID") || !long.TryParse(Row["HandID"].ToString(), out long HandID)) { HandID = 0; } string txnTime = DateTime.Now.ToString("yyyyMMddHHmmss"); string CustID = Row["CustID"].ToString(); string Amount = Row["Amount"].ToString(); //2017-06-05添加可选参数openId //用于区分是否来自于微信H5支付 //默认为空 string openId = Row.Table.Columns.Contains("openId") ? Row["openId"].ToString() : ""; WxPayConfig wxPayConfig = GenerateConfig(CommunityId); if (null == wxPayConfig) { return(JSONHelper.FromString(false, "未配置证书文件")); } string erpConnStr = GetConnection(CommunityId); PubConstant.hmWyglConnectionString = erpConnStr; //生成物业账单 string PropertyResult = GeneratePropertyOrder(CommunityId, CostID, RoomID, txnTime, CustID, ref IsPropertyOk, ref Amount, ref PropertyOrderId, wxPayConfig); if (IsPropertyOk == true) { #region 物业订单创建成功就保存车位ID if (HandID != 0) { if (!Tb_OL_ParkCar_Insert(erpConnStr, PropertyOrderId, HandID)) { return(JSONHelper.FromString(false, "保存车位预存明细失败")); } } #endregion //生成银行订单,返回银行流水号 WxPayData Data = new WxPayData(); string BankResult = GenerateBankOrder(CommunityId, CustID, RoomID, PropertyOrderId, txnTime, Amount, ref IsBankOk, ref BankOrderId, ref Data, wxPayConfig, openId); if (IsBankOk == false) { return(JSONHelper.FromString(false, BankResult)); } else { //更新订单银行流水号 IDbConnection Conn = new SqlConnection(GetConnection(CommunityId)); string Query = "UPDATE Tb_OL_WeiXinPayOrder SET prepay_id=@prepay_id WHERE out_trade_no = @out_trade_no "; Conn.Execute(Query, new { prepay_id = Data.GetValue("prepay_id").ToString(), out_trade_no = PropertyOrderId }); //向手机端返回银行记录 WxPayData result = new WxPayData(); result.SetValue("appid", Data.GetValue("appid")); result.SetValue("partnerid", Data.GetValue("mch_id")); result.SetValue("prepayid", Data.GetValue("prepay_id")); result.SetValue("noncestr", Data.GetValue("nonce_str")); result.SetValue("package", "Sign=WXPay"); result.SetValue("timestamp", (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000); result.SetValue("sign", result.MakeSign()); result.SetValue("out_trade_no", PropertyOrderId); return(JSONHelper.FromJsonString(true, result.ToJson())); } } else { return(JSONHelper.FromString(false, PropertyResult)); } }
} //支付成功跳转的地址 protected void Page_Load(object sender, EventArgs e) { string openid = DTRequest.GetQueryString("openid"); string order_no = DTRequest.GetQueryString("order_no"); decimal order_amount = 0; //订单金额 string subject1 = string.Empty; //订单备注1 string subject2 = string.Empty; //订单备注2 //检查参数是否正确 if (string.IsNullOrEmpty(openid) || string.IsNullOrEmpty(order_no)) { Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,获取OPENID参数有误!"))); return; } if (order_no.StartsWith("R")) //R开头为在线充值订单 { Model.user_recharge model = new BLL.user_recharge().GetModel(order_no); if (model == null) { Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,您充值的订单号不存在或已删除!"))); return; } order_amount = model.amount; //订单金额 subject1 = "充值订单"; subject2 = "用户名:" + model.user_name; } else //B开头为商品订单 { Model.orders model = new BLL.orders().GetModel(order_no); if (model == null) { Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,您支付的订单号不存在或已删除!"))); return; } order_amount = model.order_amount; //订单金额 subject1 = "商品订单"; if (model.user_id > 0) { subject2 = "用户名:" + model.user_name; } else { subject2 = "匿名用户"; } } //JSAPI支付预处理 try { //统一下单 string sendUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder"; JsApiConfig jsApiConfig = new JsApiConfig(); WxPayData data = new WxPayData(); data.SetValue("body", subject1); //商品描述 data.SetValue("detail", subject2); //商品详情 data.SetValue("out_trade_no", order_no); //商户订单号 data.SetValue("total_fee", (Convert.ToDouble(order_amount) * 100).ToString()); //订单总金额,以分为单位 data.SetValue("trade_type", "JSAPI"); //交易类型 data.SetValue("openid", openid); //公众账号ID data.SetValue("appid", jsApiConfig.AppId); //公众账号ID data.SetValue("mch_id", jsApiConfig.Partner); //商户号 data.SetValue("nonce_str", JsApiPay.GenerateNonceStr()); //随机字符串 data.SetValue("notify_url", jsApiConfig.Notify_url); //异步通知url data.SetValue("spbill_create_ip", DTRequest.GetIP()); //终端IP data.SetValue("sign", data.MakeSign(jsApiConfig.Key)); //签名 string xml = data.ToXml(); //转换成XML var startTime = DateTime.Now; //开始时间 string response = HttpService.Post(xml, sendUrl, false, 6); //发送请求 var endTime = DateTime.Now; //结束时间 int timeCost = (int)((endTime - startTime).TotalMilliseconds); //计算所用时间 WxPayData result = new WxPayData(); result.FromXml(response, jsApiConfig.Key); JsApiPay.ReportCostTime(sendUrl, timeCost, result);//测速上报 //获取H5调起JS API参数 WxPayData jsApiParam = new WxPayData(); jsApiParam.SetValue("appId", result.GetValue("appid")); jsApiParam.SetValue("timeStamp", JsApiPay.GenerateTimeStamp()); jsApiParam.SetValue("nonceStr", JsApiPay.GenerateNonceStr()); jsApiParam.SetValue("package", "prepay_id=" + result.GetValue("prepay_id")); jsApiParam.SetValue("signType", "MD5"); jsApiParam.SetValue("paySign", jsApiParam.MakeSign(jsApiConfig.Key)); wxJsApiParam = jsApiParam.ToJson(); //支付成功后跳转的URL returnUrl = new Web.UI.BasePage().linkurl("payment", "?action=succeed&order_no=" + order_no); } catch (Exception ex) { Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("调用JSAPI下单失败,请检查微信授权目录是否已注册!"))); return; } }
/** * * 获取收货地址js函数入口参数,详情请参考收货地址共享接口:http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_9 * @return string 共享收货地址js函数需要的参数,json格式可以直接做参数使用 */ public string GetEditAddressParameters() { string parameter = ""; try { string host = page.Request.Url.Host; string path = page.Request.Path; string queryString = page.Request.Url.Query; //这个地方要注意,参与签名的是网页授权获取用户信息时微信后台回传的完整url string url = "http://" + host + path + queryString; //构造需要用SHA1算法加密的数据 WxPayData signData = new WxPayData(); signData.SetValue("appid",Config.APPID); signData.SetValue("url", url); signData.SetValue("timestamp",WxPayApi.GenerateTimeStamp()); signData.SetValue("noncestr",WxPayApi.GenerateNonceStr()); signData.SetValue("accesstoken",access_token); string param = signData.ToUrl(); Log.Debug(this.GetType().ToString(), "SHA1 encrypt param : " + param); //SHA1加密 string addrSign = FormsAuthentication.HashPasswordForStoringInConfigFile(param, "SHA1"); Log.Debug(this.GetType().ToString(), "SHA1 encrypt result : " + addrSign); //获取收货地址js函数入口参数 WxPayData afterData = new WxPayData(); afterData.SetValue("appId",Config.APPID); afterData.SetValue("scope","jsapi_address"); afterData.SetValue("signType","sha1"); afterData.SetValue("addrSign",addrSign); afterData.SetValue("timeStamp",signData.GetValue("timestamp")); afterData.SetValue("nonceStr",signData.GetValue("noncestr")); //转为json格式 parameter = afterData.ToJson(); Log.Debug(this.GetType().ToString(), "Get EditAddressParam : " + parameter); } catch (Exception ex) { Log.Error(this.GetType().ToString(), ex.ToString()); throw new WxPayException(ex.ToString()); } return parameter; }
/// <summary> /// 获取提现结果 /// </summary> /// <param name="item"></param> /// <param name="code"></param> /// <param name="msg"></param> public void GetDrawCashResult(DrawCashApply item, ref int code, ref string msg, out C_UserInfo userinfo) { item.drawState = (int)DrawCashState.提现失败; userinfo = C_UserInfoBLL.SingleModel.GetModel(item.userId); if (userinfo != null) { PayCenterSetting setting = PayCenterSettingBLL.SingleModel.GetPayCenterSetting(userinfo.appId); if (setting == null) { msg = "提现失败更新提现申请记录失败PayCenterSetting为NULL"; } else { WxPayData data = new WxPayData(); data.SetValue("openid", userinfo.OpenId); //openid data.SetValue("amount", item.cashMoney); //取款金额 data.SetValue("re_user_name", ReplaceSpecialChar(userinfo.NickName, '?')); //收款用户姓名 data.SetValue("desc", string.Format("{0},小程序{1}提现{2}元", ReplaceSpecialChar(userinfo.NickName, '?'), Enum.GetName(typeof(DrawCashApplyType), item.applyType), item.cashMoneyStr)); data.SetValue("partner_trade_no", item.partner_trade_no); //订单号 data.SetValue("spbill_create_ip", ConfigurationManager.AppSettings["IP"]); //订单号 WxPayData result = WxPayApi.CompanyPay(data, setting); if (result != null) { try { string resultStr = result.ToJson(); //企业付款(客户提现),接收返回数据 //---------------------- //判断执行提现结果 //---------------------- int i = DrawResult(result, item.cashMoney, setting); if (i == 1) { msg = "提现成功"; code = 1; item.drawState = (int)DrawCashState.提现成功; } else if (i == -2) { code = -1; //表示微信那边返回错误码为“SYSTEMERROR”时,一定要使用原单号重试,否则可能造成重复支付等资金风险。 //该提现记录不能算失败也不能算成功,维持原状等待下次提现队列 msg = "返回错误码为“SYSTEMERROR”等待下次提现队列提现返回结果" + resultStr; } else { code = 0; msg = result.GetValue("err_code_des").ToString(); } } catch (Exception ex) { msg = "提现失败发生异常" + ex.Message; } } else { msg = "提现失败(证书路径不存在)"; } } } else { msg = "提现用户不存在"; } item.DrawTime = DateTime.Now; DrawCashApplyBLL.SingleModel.Update(item, "drawState,DrawTime"); writeLog(msg); }
/// <summary> /// 订单继续支付 /// </summary> public string GoOnGenerateOrder(DataSet Ds) { DataRow Row = Ds.Tables[0].Rows[0]; bool IsBankOk = false; bool IsBusinessOk = true;//商家订单是否生成成功 string OrderId = Row["OrderId"].ToString(); string prepay_str = ""; //取得上一次商家订单信息 IDbConnection ConnOrder = new SqlConnection(ConnectionDb.GetBusinessConnection()); string OrderQuery = "SELECT * FROM Tb_Charge_Receipt WHERE OrderId=@OrderId"; Model.Model.Buss.Tb_Charge_Receipt TOrder = ConnOrder.Query <Model.Model.Buss.Tb_Charge_Receipt>(OrderQuery, new { OrderId = OrderId }).SingleOrDefault(); if (TOrder != null) { IsBusinessOk = true; } string txnTime = TOrder.txnTime.ToString(); string BussId = TOrder.BussId.ToString(); WxPayConfig wxPayConfig = GenerateConfig(BussId); if (null == wxPayConfig) { return(JSONHelper.FromString(false, "未配置证书文件")); } decimal realAmount = 0.0m; string sql = @"SELECT * FROM Tb_Charge_ReceiptDetail WHERE ReceiptCode=@ReceiptCode"; IEnumerable <Tb_Charge_ReceiptDetail> ReceiptDetails = ConnOrder.Query <Tb_Charge_ReceiptDetail>(sql, new { ReceiptCode = TOrder.Id }); foreach (Tb_Charge_ReceiptDetail item in ReceiptDetails) { // 计算此时应该多少钱 sql = @"SELECT * FROM Tb_Resources_Details WHERE ResourcesID=@ResourcesID"; Tb_Resources_Details resources = ConnOrder.Query <Tb_Resources_Details>(sql, new { ResourcesID = item.ResourcesID }).FirstOrDefault(); if (resources != null) { if (resources.IsGroupBuy == "是" && resources.GroupBuyEndDate.HasValue && resources.GroupBuyEndDate.Value > DateTime.Now) { realAmount += (resources.GroupBuyPrice.Value + item.Quantity); } else { realAmount += (resources.ResourcesSalePrice - resources.ResourcesDisCountPrice) * item.Quantity; } if (item.OffsetMoney.HasValue) { realAmount -= item.OffsetMoney.Value; } if (item.OffsetMoney2.HasValue) { realAmount -= item.OffsetMoney2.Value; } } } if (IsBusinessOk == true) { sql = "SELECT * FROM Tb_System_BusinessCorp WHERE BussId=@BussId"; Tb_System_BusinessCorp bussInfo = ConnOrder.Query <Tb_System_BusinessCorp>(sql, new { BussId = TOrder.BussId }).FirstOrDefault(); //生成银行订单,返回银行流水号 WxPayData Data = new WxPayData(); string BankResult = GenerateBankOrder(BussId, OrderId, txnTime, (int)(realAmount * 100), ref IsBankOk, ref Data, wxPayConfig); if (IsBankOk == false) { return(JSONHelper.FromString(false, BankResult)); } else { //更新订单银行流水号 IDbConnection Conn = new SqlConnection(ConnectionDb.GetBusinessConnection()); string Query = "UPDATE Tb_Charge_Receipt SET PrepayStr=@prepay_str WHERE OrderId = @OrderId "; Conn.Execute(Query, new { prepay_str = prepay_str.ToString(), OrderId = OrderId }); //返回请求字符串 //向手机端返回银行记录 WxPayData result = new WxPayData(); result.SetValue("appid", Data.GetValue("appid")); result.SetValue("partnerid", Data.GetValue("mch_id")); result.SetValue("prepayid", Data.GetValue("prepay_id")); result.SetValue("noncestr", Data.GetValue("nonce_str")); result.SetValue("package", "Sign=WXPay"); result.SetValue("timestamp", (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000); result.SetValue("sign", result.MakeSign()); return(JSONHelper.FromJsonString(true, result.ToJson())); } } return(JSONHelper.FromString(false, "生成订单失败")); }