public override void ProcessNotify() { WxPayData notifyData = GetNotifyData(); //检查openid和product_id是否返回 if (!notifyData.IsSet("openid") || !notifyData.IsSet("product_id")) { WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "回调数据异常"); Log.Info(this.GetType().ToString(), "The data WeChat post is error : " + res.ToXml()); page.Response.Write(res.ToXml()); page.Response.End(); } //调统一下单接口,获得下单结果 string openid = notifyData.GetValue("openid").ToString(); string product_id = notifyData.GetValue("product_id").ToString(); WxPayData unifiedOrderResult = new WxPayData(); try { unifiedOrderResult = UnifiedOrder(openid, product_id); } catch(Exception ex)//若在调统一下单接口时抛异常,立即返回结果给微信支付后台 { WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "统一下单失败"); Log.Error(this.GetType().ToString(), "UnifiedOrder failure : " + res.ToXml()); page.Response.Write(res.ToXml()); page.Response.End(); } //若下单失败,则立即返回结果给微信支付后台 if (!unifiedOrderResult.IsSet("appid") || !unifiedOrderResult.IsSet("mch_id") || !unifiedOrderResult.IsSet("prepay_id")) { WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "统一下单失败"); Log.Error(this.GetType().ToString(), "UnifiedOrder failure : " + res.ToXml()); page.Response.Write(res.ToXml()); page.Response.End(); } //统一下单成功,则返回成功结果给微信支付后台 WxPayData data = new WxPayData(); data.SetValue("return_code", "SUCCESS"); data.SetValue("return_msg", "OK"); data.SetValue("appid", Config.APPID); data.SetValue("mch_id", Config.MCHID); data.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); data.SetValue("prepay_id", unifiedOrderResult.GetValue("prepay_id")); data.SetValue("result_code", "SUCCESS"); data.SetValue("err_code_des", "OK"); data.SetValue("sign", data.MakeSign()); Log.Info(this.GetType().ToString(), "UnifiedOrder success , send data to WeChat : " + data.ToXml()); page.Response.Write(data.ToXml()); page.Response.End(); }
public void ProcessRequest(HttpContext context) { try { List <string> list = new List <string>(); foreach (var item in context.Request.Params.AllKeys) { list.Add($"{item}={context.Request.Params[item]}"); } Business.Alipay.Log("收到微信通知" + context.Request.RawUrl + "?" + string.Join("&", list)); HttpRequest Request = context.Request; context.Response.ContentType = "text/plain"; string respcode = ""; string respmsg = ""; string orderId = ""; string CommunityId = ""; //返回报文中不包含UPOG,表示Server端正确接收交易请求,则需要验证Server端返回报文的签名 bool IsValidate = false; WxPayData WxPostData = new WxPayData(); string Result = Notify.NotifyDataFromContext(context, ref IsValidate, ref WxPostData); respcode = WxPostData.GetValue("result_code").ToString(); respmsg = WxPostData.GetValue("result_code").ToString(); orderId = WxPostData.GetValue("out_trade_no").ToString(); CommunityId = WxPostData.GetValue("attach").ToString(); string userId = null; if (CommunityId.Contains(",")) { userId = CommunityId.Split(',')[1]; CommunityId = CommunityId.Split(',')[0]; } if (IsValidate == false) { Business.WeiXinPay.Log("验签失败:" + CommunityId + "," + orderId.ToString()); Result = SetNotifyResult("FAIL", Result); context.Response.Write(Result); return; } Business.WeiXinPay.Log("微信支付验签成功:" + CommunityId + "," + orderId.ToString()); if (IsValidate == true) { //初始化参数 new Business.WeiXinPay().GenerateConfig(CommunityId); //更新订单返回状态 Business.WeiXinPay.UpdateProperyOrder(CommunityId, orderId, respcode, respmsg); //已收到应答,无需再通知 context.Response.Write(SetNotifyResult("SUCCESS", "OK")); if (respcode == "SUCCESS") { string useHistoryId = null; if (!string.IsNullOrEmpty(userId)) { // 查询是否使用了积分 UsePoint(orderId, userId, out useHistoryId); } decimal total_fee = AppGlobal.StrToDec(WxPostData.GetValue("total_fee").ToString()) / 100.0m; //下账 string ReceResult = Business.WeiXinPay.ReceProperyOrder(total_fee, CommunityId, orderId, useHistoryId); if (!string.IsNullOrEmpty(userId)) { // 下账成功,赠送积分 PresentedPoint(CommunityId, orderId, userId, useHistoryId, total_fee); } Business.WeiXinPay.Log("微信支付下账:" + CommunityId.ToString() + "," + orderId + "," + ReceResult); } Business.WeiXinPay.Log("微信支付流程:" + CommunityId.ToString() + "," + orderId + ",SUCCESS"); } } catch (Exception E) { Business.WeiXinPay.Log(E.Message.ToString()); context.Response.ContentType = "text/plain"; context.Response.Write(SetNotifyResult("FAIL", E.Message.ToString())); } }
/** * 刷卡支付完整业务流程逻辑 * @param body 商品描述 * @param total_fee 总金额 * @param auth_code 支付授权码 * @throws WxPayException * @return 刷卡支付结果 */ public static string Run(string body, string total_fee, string auth_code) { Log.Info("MicroPay", "Micropay is processing..."); WxPayData data = new WxPayData(); data.SetValue("auth_code", auth_code);//授权码 data.SetValue("body", body);//商品描述 data.SetValue("total_fee", int.Parse(total_fee));//总金额 data.SetValue("out_trade_no", WxPayApi.GenerateOutTradeNo());//产生随机的商户订单号 WxPayData result = WxPayApi.Micropay(data, 10); //提交被扫支付,接收返回结果 //如果提交被扫支付接口调用失败,则抛异常 if (!result.IsSet("return_code") || result.GetValue("return_code").ToString() == "FAIL") { string returnMsg = result.IsSet("return_msg") ? result.GetValue("return_msg").ToString() : ""; Log.Error("MicroPay", "Micropay API interface call failure, result : " + result.ToXml()); throw new WxPayException("Micropay API interface call failure, return_msg : " + returnMsg); } //签名验证 result.CheckSign(); Log.Debug("MicroPay", "Micropay response check sign success"); //刷卡支付直接成功 if(result.GetValue("return_code").ToString() == "SUCCESS" && result.GetValue("result_code").ToString() == "SUCCESS") { Log.Debug("MicroPay", "Micropay business success, result : " + result.ToXml()); return result.ToPrintStr(); } /****************************************************************** * 剩下的都是接口调用成功,业务失败的情况 * ****************************************************************/ //1)业务结果明确失败 if(result.GetValue("err_code").ToString() != "USERPAYING" && result.GetValue("err_code").ToString() != "SYSTEMERROR") { Log.Error("MicroPay", "micropay API interface call success, business failure, result : " + result.ToXml()); return result.ToPrintStr(); } //2)不能确定是否失败,需查单 //用商户订单号去查单 string out_trade_no = data.GetValue("out_trade_no").ToString(); //确认支付是否成功,每隔一段时间查询一次订单,共查询10次 int queryTimes = 10;//查询次数计数器 while(queryTimes-- > 0) { int succResult = 0;//查询结果 WxPayData queryResult = Query(out_trade_no, out succResult); //如果需要继续查询,则等待2s后继续 if(succResult == 2) { Thread.Sleep(2000); continue; } //查询成功,返回订单查询接口返回的数据 else if(succResult == 1) { Log.Debug("MicroPay", "Mircopay success, return order query result : " + queryResult.ToXml()); return queryResult.ToPrintStr(); } //订单交易失败,直接返回刷卡支付接口返回的结果,失败原因会在err_code中描述 else { Log.Error("MicroPay", "Micropay failure, return micropay result : " + result.ToXml()); return result.ToPrintStr(); } } //确认失败,则撤销订单 Log.Error("MicroPay", "Micropay failure, Reverse order is processing..."); if(!Cancel(out_trade_no)) { Log.Error("MicroPay", "Reverse order failure"); throw new WxPayException("Reverse order failure!"); } return result.ToPrintStr(); }
/// <summary> /// 处理通知 /// </summary> public override void ProcessNotify() { WxPayData notifyData = GetNotifyData(); //检查openid和product_id是否返回 if (!notifyData.IsSet("openid") || !notifyData.IsSet("product_id")) { WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "回调数据异常"); LogHelper.Info(this.GetType().ToString(), "The data WeChat post is error : " + res.ToXml()); page.Response.Write(res.ToXml()); page.Response.End(); } //调统一下单接口,获得下单结果 string openid = notifyData.GetValue("openid").ToString(); string product_id = notifyData.GetValue("product_id").ToString(); WxPayData unifiedOrderResult = new WxPayData(); try { unifiedOrderResult = UnifiedOrder(openid, product_id); } catch (Exception ex)//若在调统一下单接口时抛异常,立即返回结果给微信支付后台 { WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "统一下单失败"); LogHelper.Error(this.GetType().ToString(), "UnifiedOrder failure : " + res.ToXml() + " 异常信息:" + ex.Message); page.Response.Write(res.ToXml()); page.Response.End(); } //若下单失败,则立即返回结果给微信支付后台 if (!unifiedOrderResult.IsSet("appid") || !unifiedOrderResult.IsSet("mch_id") || !unifiedOrderResult.IsSet("prepay_id")) { WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "统一下单失败"); LogHelper.Error(this.GetType().ToString(), "UnifiedOrder failure : " + res.ToXml()); page.Response.Write(res.ToXml()); page.Response.End(); } //统一下单成功,则返回成功结果给微信支付后台 WxPayData data = new WxPayData(); data.SetValue("return_code", "SUCCESS"); data.SetValue("return_msg", "OK"); data.SetValue("appid", WxPayConfig.AppId); data.SetValue("mch_id", WxPayConfig.MchId); data.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); data.SetValue("prepay_id", unifiedOrderResult.GetValue("prepay_id")); data.SetValue("result_code", "SUCCESS"); data.SetValue("err_code_des", "OK"); data.SetValue("sign", data.MakeSign()); LogHelper.Info(this.GetType().ToString(), "UnifiedOrder success , send data to WeChat : " + data.ToXml()); page.Response.Write(data.ToXml()); page.Response.End(); }
/// <summary> /// 退款申请 /// </summary> /// <param name="orderCode">商户订单号</param> /// <param name="UserID">用户ID</param> /// <returns></returns> public object RefundApply(string orderCode, string UserID) { if (string.IsNullOrEmpty(orderCode) || string.IsNullOrEmpty(UserID)) { return(new { retCode = "Error", retMsg = "商户订单号和用户ID均不能为空", objectData = "" }); } int rows = 0; WxPayData refundreturnData = null; try { using (ApplicationDbContext db = new ApplicationDbContext()) { //1.查询本地订单 Order order = db.Orders.FirstOrDefault(p => p.Code == orderCode); if (order != null) { if (order.UserID.Equals(UserID)) { if (order.State == Common.Enums.OrderState.Success) { string OrderCode = CreateOrderCode(UserID);//创建退款订单号 //退款参数 RefundApplyData refundData = new RefundApplyData() { out_refund_no = OrderCode, out_trade_no = order.Code, refund_fee = ((int)(order.Amount * 100)).ToString(), total_fee = ((int)(order.Amount * 100)).ToString(), transaction_id = order.PayCode }; //2.创建本地退款订单 Order refund = new Order() { Channel = Common.Enums.PayChannel.WxPay, Code = OrderCode, CreateDateTime = DateTime.Now, PayCode = string.Empty, PayInput = JsonConvert.SerializeObject(refundData), ReceivableAmount = order.Amount, State = Common.Enums.OrderState.UnHandle, Type = Common.Enums.OrderType.Refund, UserID = UserID }; db.Orders.Add(refund); rows = db.SaveChanges(); if (rows > 0) { //3.微信退款申请 RequestResult payResult = payment.RefundApply(refundData); refundreturnData = payResult.objectData; if (payResult.retCode != ReqResultCode.success || refundreturnData == null) { return(new { retCode = "Error", retMsg = "请求微信退款失败", objectData = "" }); } //4.更新订单状态 refund.PayCode = refundreturnData.GetValue("refund_id").ToString();//微信退款单号 refund.State = Common.Enums.OrderState.Success; refund.Amount = Convert.ToDecimal(refundreturnData.GetValue("refund_fee").ToString()) / 100m; refund.PayDateTime = DateTime.Now; refund.PayResult = refundreturnData.ToJson(); rows = db.SaveChanges(); } } else { return(new { retCode = "Error", retMsg = "订单未支付成功,不能退款", objectData = "" }); } } else { return(new { retCode = "Error", retMsg = "此订单不是当前用户的订单", objectData = "" }); } } else { return(new { retCode = "Error", retMsg = "订单不存在", objectData = "" }); } } } catch (Exception ex) { return(new { retCode = "Error", retMsg = $"申请微信退款发生异常:{ex.Message}", objectData = "" }); } return(new { retCode = "Success", retMsg = "成功", objectData = refundreturnData }); }
/** * * 统一下单 * @param WxPaydata inputObj 提交给统一下单API的参数 * @param int timeOut 超时时间 * @throws WxPayException * @return 成功时返回,其他抛异常 */ public static WxPayData UnifiedOrder(WxPayData inputObj, int timeOut = 6) { string url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; //检测必填参数 if (!inputObj.IsSet("out_trade_no")) { throw new WxPayException("缺少统一支付接口必填参数out_trade_no!"); } else if (!inputObj.IsSet("body")) { throw new WxPayException("缺少统一支付接口必填参数body!"); } else if (!inputObj.IsSet("total_fee")) { throw new WxPayException("缺少统一支付接口必填参数total_fee!"); } else if (!inputObj.IsSet("trade_type")) { throw new WxPayException("缺少统一支付接口必填参数trade_type!"); } //关联参数 if (inputObj.GetValue("trade_type").ToString() == "JSAPI" && !inputObj.IsSet("openid")) { throw new WxPayException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!"); } if (inputObj.GetValue("trade_type").ToString() == "NATIVE" && !inputObj.IsSet("product_id")) { throw new WxPayException("统一支付接口中,缺少必填参数product_id!trade_type为JSAPI时,product_id为必填参数!"); } //异步通知url未设置,则使用配置文件中的url if (!inputObj.IsSet("notify_url")) { inputObj.SetValue("notify_url", WxPayConfig.NOTIFY_URL);//异步通知url } inputObj.SetValue("appid", WxPayConfig.APPID); //公众账号ID inputObj.SetValue("mch_id", WxPayConfig.MCHID); //商户号 inputObj.SetValue("spbill_create_ip", WxPayConfig.IP); //终端ip inputObj.SetValue("nonce_str", GenerateNonceStr()); //随机字符串 //签名 inputObj.SetValue("sign", inputObj.MakeSign()); string xml = inputObj.ToXml(); var start = DateTime.Now; Log.Debug("WxPayApi", "UnfiedOrder request : " + xml); string response = HttpService.Post(xml, url, false, timeOut); Log.Debug("WxPayApi", "UnfiedOrder response : " + response); var end = DateTime.Now; int timeCost = (int)((end - start).TotalMilliseconds); WxPayData result = new WxPayData(); result.FromXml(response); ReportCostTime(url, timeCost, result);//测速上报 return(result); }
protected void Page_Load(object sender, EventArgs e) { WxPayData notifyData = NativePay.GetNotifyData(); //检查支付结果中transaction_id是否存在 if (!notifyData.IsSet("transaction_id")) { //若transaction_id不存在,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "支付结果中微信订单号不存在"); Response.Write(res.ToXml()); return; } string transaction_id = notifyData.GetValue("transaction_id").ToString(); //微信支付订单号 //查询订单,判断订单真实性 if (!QueryOrder(transaction_id)) { //若订单查询失败,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "订单查询失败"); Response.Write(res.ToXml()); return; } //获取订单信息 string order_no = notifyData.GetValue("out_trade_no").ToString(); //商户订单号 string total_fee = notifyData.GetValue("total_fee").ToString(); //获取总金额 if (order_no.StartsWith("R")) //充值订单 { BLL.user_recharge bll = new BLL.user_recharge(); Model.user_recharge model = bll.GetModel(order_no); if (model == null) { WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "该订单号不存在"); Response.Write(res.ToXml()); return; } if (model.status == 1) //已成功 { WxPayData res = new WxPayData(); res.SetValue("return_code", "SUCCESS"); res.SetValue("return_msg", "OK"); Response.Write(res.ToXml()); return; } if (model.amount != (decimal.Parse(total_fee) / 100)) { WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "订单金额和支付金额不相符"); Response.Write(res.ToXml()); return; } bool result = bll.Confirm(order_no); if (!result) { WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "修改订单状态失败"); Response.Write(res.ToXml()); return; } } else if (order_no.StartsWith("B")) //商品订单 { BLL.orders bll = new BLL.orders(); Model.orders model = bll.GetModel(order_no); if (model == null) { WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "该订单号不存在"); Response.Write(res.ToXml()); return; } if (model.payment_status == 2) //已付款 { WxPayData res = new WxPayData(); res.SetValue("return_code", "SUCCESS"); res.SetValue("return_msg", "OK"); Response.Write(res.ToXml()); return; } if (model.order_amount != (decimal.Parse(total_fee) / 100)) { WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "订单金额和支付金额不相符"); Response.Write(res.ToXml()); return; } bool result = bll.UpdateField(order_no, "trade_no='" + transaction_id + "',status=2,payment_status=2,payment_time='" + DateTime.Now + "'"); if (!result) { WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "修改订单状态失败"); Response.Write(res.ToXml()); return; } //扣除积分 if (model.point < 0) { new BLL.user_point_log().Add(model.user_id, model.user_name, model.point, "换购扣除积分,订单号:" + model.order_no, false); } } //返回成功通知 WxPayData res1 = new WxPayData(); res1.SetValue("return_code", "SUCCESS"); res1.SetValue("return_msg", "OK"); Response.Write(res1.ToXml()); return; }
public string ChargeByWeixin(string productName, decimal amount, string orderNo, string notifyUrl) { var config = ConfigInfo; WxPayConfig.APPID = config.WeixinAppId; WxPayConfig.MCHID = config.WeixinMchId; WxPayConfig.KEY = config.WeixinKey; WxPayConfig.APPSECRET = config.WeixinAppSecret; //=======【支付结果通知url】===================================== /* 支付结果通知回调url,用于商户接收支付结果 */ WxPayConfig.NOTIFY_URL = notifyUrl; //=======【商户系统后台机器IP】===================================== /* 此参数可手动配置也可在程序中自动获取 */ WxPayConfig.IP = "8.8.8.8"; //=======【代理服务器设置】=================================== /* 默认IP和端口号分别为0.0.0.0和0,此时不开启代理(如有需要才设置) */ WxPayConfig.PROXY_URL = "http://10.152.18.220:8080"; //=======【上报信息配置】=================================== /* 测速上报等级,0.关闭上报; 1.仅错误时上报; 2.全量上报 */ WxPayConfig.REPORT_LEVENL = 1; //=======【日志级别】=================================== /* 日志等级,0.不输出日志;1.只输出错误信息; 2.输出错误和正常信息; 3.输出错误信息、正常信息和调试信息 */ WxPayConfig.LOG_LEVENL = 0; var data = new WxPayData(); data.SetValue("body", productName); //商品描述 data.SetValue("attach", string.Empty); //附加数据 data.SetValue("out_trade_no", WxPayApi.GenerateOutTradeNo()); //随机字符串 data.SetValue("total_fee", Convert.ToInt32(amount * 100)); //总金额 data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); //交易起始时间 data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); //交易结束时间 data.SetValue("goods_tag", "jjj"); //商品标记 data.SetValue("trade_type", "NATIVE"); //交易类型 data.SetValue("product_id", "productId"); //商品ID string url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; //检测必填参数 if (!data.IsSet("out_trade_no")) { throw new WxPayException("缺少统一支付接口必填参数out_trade_no!"); } if (!data.IsSet("body")) { throw new WxPayException("缺少统一支付接口必填参数body!"); } if (!data.IsSet("total_fee")) { throw new WxPayException("缺少统一支付接口必填参数total_fee!"); } if (!data.IsSet("trade_type")) { throw new WxPayException("缺少统一支付接口必填参数trade_type!"); } //关联参数 if (data.GetValue("trade_type").ToString() == "JSAPI" && !data.IsSet("openid")) { throw new WxPayException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!"); } if (data.GetValue("trade_type").ToString() == "NATIVE" && !data.IsSet("product_id")) { throw new WxPayException("统一支付接口中,缺少必填参数product_id!trade_type为JSAPI时,product_id为必填参数!"); } //异步通知url未设置,则使用配置文件中的url if (!data.IsSet("notify_url")) { data.SetValue("notify_url", WxPayConfig.NOTIFY_URL);//异步通知url } data.SetValue("appid", WxPayConfig.APPID); //公众账号ID data.SetValue("mch_id", WxPayConfig.MCHID); //商户号 data.SetValue("spbill_create_ip", WxPayConfig.IP); //终端ip data.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", "")); //随机字符串 //签名 data.SetValue("sign", data.MakeSign()); var xml = data.ToXml(); var response = HttpService.Post(xml, url, false, 6); var result = new WxPayData(); result.FromXml(response); Log.Info(GetType().ToString(), "ChargeByWeixin : " + response); Log.Info(GetType().ToString(), "notify_url : " + data.GetValue("notify_url")); if (!result.IsSet("code_url")) { throw new Exception($"code: {result.GetValue("return_code")}, msg: {result.GetValue("return_msg")}"); } return(result.GetValue("code_url").ToString()); //获得统一下单接口返回的二维码链接 }
/// <summary> /// 添加卡 /// </summary> /// <param name="openid"></param> /// <param name="city"></param> /// <returns></returns> public JsonResult addUserCard(string openid, string city) { var pay = new JsApiPay(this.Request); string appid = string.Empty, appSecret = string.Empty, card_id = string.Empty; switch (city) { case "乐清市": appid = "wx8a8f4c94ea99c3c6"; appSecret = "d08019f391fc2a7113e5efea6fc4c9dc"; card_id = "pszDVt2lJKXxOYA3alLVdbezrLTY"; break; case "常熟市": appid = "wx48a67a2aaf02f77a"; appSecret = "d788725d971438371f8a0b8c39221b2a"; card_id = "p__l8t2MvHkqBTDdGtiazSI_hSR0"; break; case "福州市": appid = "wxc20b289e21d1b606"; appSecret = "10711737c1c6b58b029f70c624bbb7e2"; card_id = "p4erJ0oPLrLMDhWcKZPLwF2Psdr8"; break; } //乐清的订阅号appid pay.GetAccessToken(appid, appSecret, this.DataSource); var bus = new Bus(this.DataSource); string mch_id = WxPayConfig.getMCHID(city); var Entrustinfo = bus.GetEntrustinfo(openid, WxPayConfig.APPID(city), mch_id); var card = bus.GetCard(openid, WxPayConfig.APPID(city), mch_id); string result = string.Empty; bool hasCard = !string.IsNullOrEmpty(card.CardCode) && card.IsRemove == 0; /* * if (!string.IsNullOrEmpty(card.CardCode)&&card.OperateTime.AddMinutes(10).CompareTo(DateTime.Now)<0) * { * string cardstate= bus.DeCardCode(pay.access_token, card.CardId, card.CardCode); * if (cardstate.ToLower().IndexOf("\"user_card_status\": \"NORMAL\"") == -1) * { * card.DataDriver = this.DataSource; * card.IsRemove = 1; * card.Store(); * hasCard = false; * } * } */ if (!hasCard) { if (Entrustinfo != null) { WxPayData inputObj = new WxPayData(city); inputObj.SetValue("appid", WxPayConfig.APPID(city)); inputObj.SetValue("mch_id", mch_id); inputObj.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); inputObj.SetValue("contract_id", Entrustinfo.FldContractId); inputObj.SetValue("sign_type", "MD5"); inputObj.SetValue("card_id", card_id); inputObj.SetValue("openid", openid); inputObj.SetValue("sign", inputObj.MakeSign()); string url = "https://api.mch.weixin.qq.com/transit/card/addcard"; string xml = inputObj.ToXml(); result = HttpService.Post(xml, url, false, 10); WxPayData data = new WxPayData(); data.FromXml(result); card.Remark = result; card.DataDriver = this.DataSource; if (data.GetValue("return_code").ToString().iEquals("success") && data.GetValue("result_code").ToString().iEquals("success")) { card.CardId = data.GetValue("card_id").ToString(); card.CardCode = data.GetValue("card_code").ToString(); card.OperateTime = DateTime.Now; card.IsRemove = 0; } card.Store(); } string signature = "", timestamp = WxPayApi.GenerateTimeStamp(); WxPayData exdata = new WxPayData(city); exdata.SetValue("code", card.CardCode); exdata.SetValue("openid", openid); exdata.SetValue("timestamp", timestamp); //exdata.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); string ticket = bus.getTicket(appid, pay.access_token); string sign = string.Empty; string[] ArrTmp = { card.CardCode, openid, timestamp, appSecret }; //ticket Array.Sort(ArrTmp); //字典排序 string tmpStr = string.Join("", ArrTmp); sign = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1"); exdata.SetValue("signature", sign);//exdata.sha1() var cardList = new List <Card>(); var card1 = new Card(); card1.cardId = card.CardId; card1.cardExt = exdata.ToJson(); cardList.Add(card1); return(Json(new { hasCard = false, ticket = ticket, cardList = cardList, addcardCallback = result }, JsonRequestBehavior.AllowGet)); } else { //var pay = new JsApiPay(this.Request); ////乐清的订阅号appid //pay.GetAccessToken("wx8a8f4c94ea99c3c6", "d08019f391fc2a7113e5efea6fc4c9dc"); //bus.DeCardCode(pay.access_token, card.CardId, card.CardCode); } var cardList2 = new List <Cardv>(); var card2 = new Cardv(); card2.cardId = card.CardId; card2.code = card.CardCode; cardList2.Add(card2); return(Json(new { hasCard = true, cardList = cardList2 }, JsonRequestBehavior.AllowGet)); }
public ContentResult ReceivePubWechat(string echostr, string signature, string timestamp, string nonce) { Log.Write("ReceivePubWechat", echostr + signature + timestamp + nonce); //string path = Server.MapPath("~/business") + "\\delCardxml.xml"; var bus = new Bus(this.DataSource); WxPayData res = new WxPayData(false); var notify = new Notify(this.Request); string content = notify.GetData();//bus.ReadJson(path); if (!string.IsNullOrEmpty(content)) { Log.Write("ReceivePubWechat", content); res.FromXml(content); } if (res.IsSet("CardId") && res.IsSet("UserCardCode") && res.IsSet("Event")) { string Event = res.GetValue("Event").ToString(); string CardId = res.GetValue("CardId").ToString(); string UserCardCode = res.GetValue("UserCardCode").ToString(); Log.Write("Event", Event); Log.Write("CardId", CardId); Log.Write("UserCardCode", UserCardCode); if (Event.iEquals("user_del_card")) { var card = bus.GetCard(CardId, UserCardCode); if (card != null) { card.DataDriver = this.DataSource; card.IsRemove = 1; card.Store(); } } } else if (res.IsSet("ToUserName") && res.IsSet("FromUserName") && res.IsSet("MsgType")) { WxPayData rdata = new WxPayData(); string ToUserName = res.GetValue("ToUserName").ToString(); string FromUserName = res.GetValue("FromUserName").ToString(); string MsgType = res.GetValue("MsgType").ToString(); rdata.SetValue("ToUserName", FromUserName); rdata.SetValue("FromUserName", ToUserName); rdata.SetValue("CreateTime", DateTime.Now.Ticks); rdata.SetValue("MsgType", "text"); switch (MsgType) { case "event": string Event = res.GetValue("Event").ToString(); if (Event.iEquals("subscribe")) //订阅时推送 { rdata.SetValue("Content", "欢迎您关注乐清城市公交官方微信平台。\n--------------------------\n1、发送公交线路数字可查询该线路走向:例如查“8路”发送“8”即可。\n2、点击<a href=\"http://www.yqbus.cn/wx/map/index.html\">【线路走向图】</a>查看城市公交全部线路走向。\n3、点击<a href=\"http://m.yqbus.cn/WeixinMP/WMPWeb/MPages/BM.GJ.ShiShiGJ/XianLuQuery.aspx\">【实时公交】</a>菜单,可为您提供公交车到站信息实时查询服务。"); } break; case "text": default: if (res.IsSet("Content")) { string con = res.GetValue("Content").ToString(); string result = bus.getMsgContent(con); Log.Write("ReceivePubWechat-content", con + result); if (!string.IsNullOrEmpty(result)) { } else { result = "欢迎关注!"; } rdata.SetValue("Content", result); echostr = rdata.ToXml(); Log.Write("ReceivePubWechat-back", echostr); } else { echostr = ""; } break; } } return(Content(echostr)); }
/// <summary> /// 退款支付 /// </summary> /// <param name="refundPaymentRequest">请求</param> /// <returns>Result</returns> public RefundPaymentResult Refund(RefundPaymentRequest refundPaymentRequest) { var result = new RefundPaymentResult(); //获取供运商ID ICollection <OrderItem> list = refundPaymentRequest.Order.OrderItems; ConfigurationModel wenxinConfig = new ConfigurationModel(); var modelList = refundPaymentRequest.Order.OrderItems as List <OrderItem>; // var totalFee = postProcessPaymentRequest.Order.OrderTotal.ToString("0.00", CultureInfo.InvariantCulture); var vendorId = modelList[0].Product.VendorId; var wenxin = _vendorService.GetVendorById(vendorId); wenxinConfig.APPID = wenxin.APPID.Trim(); wenxinConfig.APPSECRET = wenxin.APPSECRET.Trim(); wenxinConfig.KEY = wenxin.KEY.Trim(); wenxinConfig.MCHID = wenxin.MCHID.Trim(); wenxinConfig.IP = refundPaymentRequest.Order.CustomerIp; //wenxinConfig.SSLCERT_PATH = _webHelper.GetStoreLocation(false) + wenxin.SSLCERT_PATH.Trim().Substring(1, wenxin.SSLCERT_PATH.Trim().Length - 1); wenxinConfig.SSLCERT_PATH = wenxin.SSLCERT_PATH.Trim(); wenxinConfig.SSLCERT_PASSWORD = wenxin.MCHID.Trim(); OrderDetails orderdetails = new OrderDetails { Attach = wenxin.Name, OrderId = refundPaymentRequest.Order.Id, Body = modelList[0].Product.Name, Detail = modelList[0].Product.ShortDescription, ProductId = modelList[0].Product.Id.ToString(), Total_fee = (Convert.ToDouble(refundPaymentRequest.Order.OrderTotal) * 100).ToString() }; wenxinConfig.orderDetails = orderdetails; //退款 string amountToRefund = Convert.ToInt32(refundPaymentRequest.AmountToRefund * 100).ToString(); Refund refund = new Refund(wenxinConfig); //调用订单退款接口,如果内部出现异常则在页面上显示异常原因 if (refundPaymentRequest.Order.WxTransactionId == null) { result.AddError("没有查询到微信支付订单"); return(result); } try { string returnMess = refund.Run(refundPaymentRequest.Order.WxTransactionId, refundPaymentRequest.Order.Id.ToString(), orderdetails.Total_fee, amountToRefund); string[] cpTypeArray = returnMess.Replace("<br>", ",").Split(','); WxPayData res = new WxPayData(); foreach (var item in cpTypeArray) { if (!string.IsNullOrWhiteSpace(item)) { res.SetValue(item.Split('=')[0], item.Split('=')[1]); } } if (res.GetValue("return_code").ToString() != "SUCCESS" || res.GetValue("result_code").ToString() != "SUCCESS") { //退款提示 result.AddError(res.GetValue("err_code_des").ToString()); return(result); } else { //添加退款记录表 RefundOrderItem item = new RefundOrderItem(); item.OrderId = refundPaymentRequest.Order.Id; item.CustomNumber = refundPaymentRequest.Order.Customer.Id; item.VendorId = vendorId; item.WxTransactionId = res.GetValue("transaction_id").ToString(); item.WxRefunId = res.GetValue("refund_id").ToString(); item.WxOutRefunNo = res.GetValue("out_refund_no").ToString(); item.OrderTotal = refundPaymentRequest.Order.OrderTotal; item.RefundedAmount = refundPaymentRequest.AmountToRefund; item.CreatedOnUtc = System.DateTime.Now; item.Deleted = false; _refundOrderItemService.InsertRefundOrderItem(item); } } catch (WxPayException ex) { result.AddError(ex.ToString()); } catch (Exception ex) { result.AddError(ex.ToString()); } return(result); }
/** * 刷卡支付完整业务流程逻辑 * @param body 商品描述 * @param total_fee 总金额 * @param auth_code 支付授权码 * @throws WxPayException * @return 刷卡支付结果 */ public static string Run(string body, string total_fee, string auth_code) { Log <T> .Info("MicroPay", "Micropay is processing..."); WxPayData <T> data = new WxPayData <T>(); data.SetValue("auth_code", auth_code); //授权码 data.SetValue("body", body); //商品描述 data.SetValue("total_fee", int.Parse(total_fee)); //总金额 data.SetValue("out_trade_no", WxPayApi <T> .GenerateOutTradeNo()); //产生随机的商户订单号 WxPayData <T> result = WxPayApi <T> .Micropay(data, 10); //提交被扫支付,接收返回结果 //如果提交被扫支付接口调用失败,则抛异常 if (!result.IsSet("return_code") || result.GetValue("return_code").ToString() == "FAIL") { string returnMsg = result.IsSet("return_msg") ? result.GetValue("return_msg").ToString() : ""; Log <T> .Error("MicroPay", "Micropay API interface call failure, result : " + result.ToXml()); throw new WxPayException("Micropay API interface call failure, return_msg : " + returnMsg); } //签名验证 result.CheckSign(); Log <T> .Debug("MicroPay", "Micropay response check sign success"); //刷卡支付直接成功 if (result.GetValue("return_code").ToString() == "SUCCESS" && result.GetValue("result_code").ToString() == "SUCCESS") { Log <T> .Debug("MicroPay", "Micropay business success, result : " + result.ToXml()); return(result.ToPrintStr()); } /****************************************************************** * 剩下的都是接口调用成功,业务失败的情况 * ****************************************************************/ //1)业务结果明确失败 if (result.GetValue("err_code").ToString() != "USERPAYING" && result.GetValue("err_code").ToString() != "SYSTEMERROR") { Log <T> .Error("MicroPay", "micropay API interface call success, business failure, result : " + result.ToXml()); return(result.ToPrintStr()); } //2)不能确定是否失败,需查单 //用商户订单号去查单 string out_trade_no = data.GetValue("out_trade_no").ToString(); //确认支付是否成功,每隔一段时间查询一次订单,共查询10次 int queryTimes = 10; //查询次数计数器 while (queryTimes-- > 0) { int succResult = 0; //查询结果 WxPayData <T> queryResult = Query(out_trade_no, out succResult); //如果需要继续查询,则等待2s后继续 if (succResult == 2) { Thread.Sleep(2000); continue; } //查询成功,返回订单查询接口返回的数据 else if (succResult == 1) { Log <T> .Debug("MicroPay", "Mircopay success, return order query result : " + queryResult.ToXml()); return(queryResult.ToPrintStr()); } //订单交易失败,直接返回刷卡支付接口返回的结果,失败原因会在err_code中描述 else { Log <T> .Error("MicroPay", "Micropay failure, return micropay result : " + result.ToXml()); return(result.ToPrintStr()); } } //确认失败,则撤销订单 Log <T> .Error("MicroPay", "Micropay failure, Reverse order is processing..."); if (!Cancel(out_trade_no)) { Log <T> .Error("MicroPay", "Reverse order failure"); throw new WxPayException("Reverse order failure!"); } return(result.ToPrintStr()); }
protected void Page_Load(object sender, EventArgs e) { //读取站点配置信息 Model.siteconfig siteConfig = new BLL.siteconfig().loadConfig(); //=============================获得订单信息================================ order_no = DTRequest.GetFormString("pay_order_no").ToUpper(); decimal order_amount = DTRequest.GetFormDecimal("pay_order_amount", 0); string user_name = DTRequest.GetFormString("pay_user_name"); string subject = DTRequest.GetFormString("pay_subject"); //检查参数是否正确 if (string.IsNullOrEmpty(order_no) || order_amount == 0) { Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,您提交的参数有误!"))); 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; } if (model.amount != order_amount) { Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,您充值的订单金额与实际金额不一致!"))); return; } if (model.status == 1) { Response.Redirect(new Web.UI.BasePage().linkurl("payment", "?action=succeed&order_no=" + order_no)); return; } } 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; } if (model.order_amount != order_amount) { Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,您支付的订单金额与实际金额不一致!"))); return; } if (model.payment_status == 2) { Response.Redirect(new Web.UI.BasePage().linkurl("payment", "?action=succeed&order_no=" + order_no)); return; } } if (user_name != "") { user_name = "支付会员:" + user_name; } else { user_name = "匿名用户"; } //===========================调用统一下单接口============================== string sendUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder"; NativeConfig nativeConfig = new NativeConfig(); WxPayData data = new WxPayData(); data.SetValue("body", user_name); //商品描述 data.SetValue("detail", siteConfig.webname + "-" + subject); //商品详情 data.SetValue("out_trade_no", order_no); //商户订单号 data.SetValue("total_fee", (Convert.ToDouble(order_amount) * 100).ToString()); //订单总金额,以分为单位 data.SetValue("trade_type", "NATIVE"); //交易类型 data.SetValue("product_id", order_no); //商品ID data.SetValue("notify_url", nativeConfig.Notify_url); //异步通知url data.SetValue("spbill_create_ip", DTRequest.GetIP()); //终端IP data.SetValue("appid", nativeConfig.AppId); //公众账号ID data.SetValue("mch_id", nativeConfig.Partner); //商户号 data.SetValue("nonce_str", NativePay.GenerateNonceStr()); //随机字符串 data.SetValue("sign", data.MakeSign(nativeConfig.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, nativeConfig.Key); NativePay.ReportCostTime(sendUrl, timeCost, result); //测速上报 string codeUrl = result.GetValue("code_url").ToString(); //获得统一下单接口返回的二维码链接 imgQRCode.ImageUrl = "qrcode.aspx?data=" + HttpUtility.UrlEncode(codeUrl); litText.Text = order_amount.ToString("#0.00"); }
public int CompleteServiceOrder(WxPayData queryData) { 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); if (trade_state == "SUCCESS")//交易成功 { //支付金额 return(_purchaseServiceRepository.CompleteServiceOrder(new CompleteServiceOrder() { OrderID = out_trade_no, Cost = Convert.ToDouble(queryData.GetValue("total_fee")) / 100, NewID = OrderHelper.GenerateNewId(), PayExtendInfo = queryData.ToJson(), PayState = trade_state, PayOrderID = transaction_id, Remarks = "微信公众号支付", })); } 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 }); if (result != 0) { LogHelper.Logger.Error("更新订单失败"); } return(-4); } 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 }); if (result1 != 0) { LogHelper.Logger.Error("更新订单失败"); } LogHelper.Logger.Debug("超时关闭订单"); return(-4); } else { //继续等待,还不算结束 var result1 = _purchaseServiceRepository.UpdateServiceOrder(new UpdateServiceOrder() { ID = out_trade_no, PayExtendInfo = queryData.ToJson(), PayState = trade_state, PayOrderID = transaction_id, State = null }); return(-4); } } else { var result1 = _purchaseServiceRepository.UpdateServiceOrder(new UpdateServiceOrder() { ID = out_trade_no, PayExtendInfo = queryData.ToJson(), PayState = trade_state, PayOrderID = transaction_id, State = 3 }); if (result1 != 0) { LogHelper.Logger.Error("更新订单失败"); } LogHelper.Logger.Error("支付失败"); return(-4); } }
public ActionResult OrderConfirm() { string paycode = QueryString.SafeQ("code"); int success = QueryString.IntSafeQ("s"); //是否需要订单成功提醒 int freshnum = QueryString.IntSafeQ("fn"); //循环次数,超过10次自动关闭 if (freshnum > 10) { return(null); } VWPayOrderEntity _payen = PayOrderBLL.Instance.GetVWPayOrderByPayCode(paycode); if (_payen.PayMethod == (int)PayType.WeChat)//微信支付 { if (Globals.IsWeiXinDevice()) { string wechatcode = ""; wechatcode = QueryString.SafeQ("wechatcode"); //是微信客户端走这边 if (string.IsNullOrEmpty(wechatcode)) { //没有获取微信授权码 string url = Request.Url.ToString(); string redirecturl = string.Format(WeiXinConfig.URL_WeiXin_Redirect, WeiXinConfig.GetAppId(), System.Web.HttpContext.Current.Server.UrlEncode(url), "0"); return(Redirect(redirecturl)); } else { //有微信授权码 JsApiPay jsApiPay = new JsApiPay(); try { jsApiPay.GetOpenidAndAccessTokenFromCode(wechatcode); } catch (Exception ex) { //授权码过期 string baseurl; Dictionary <string, string> nvc = new Dictionary <string, string>(); string oldurl = Request.Url.ToString(); StringUtils.ParseUrl(oldurl, out baseurl, out nvc); nvc.Remove("wechatcode"); if (nvc.ContainsKey("fn")) { nvc["fn"] = (StringUtils.GetDbInt(nvc["fn"]) + 1).ToString(); } else { nvc.Add("fn", "1"); } string url = baseurl + "?"; foreach (string key in nvc.Keys) { url += "&" + key + "=" + nvc[key]; } string redirecturl = string.Format(WeiXinConfig.URL_WeiXin_Redirect, WeiXinConfig.GetAppId(), System.Web.HttpContext.Current.Server.UrlEncode(url), "0"); return(Redirect(redirecturl)); } WxPayData paydata = jsApiPay.GetUnifiedOrderResult(_payen); string wxJsApiParam = jsApiPay.GetJsApiParameters();//获取H5调起JS API参数 ViewBag.WeiXinJsApiParam = wxJsApiParam; } } else { //网站类调出微信端支付通道 DateTime dtnow = DateTime.Now; NativePay nativePay = new NativePay(); WxPayData data = nativePay.GetPayUrl(_payen, "MWEB");//得到调用微信接口的路径 string url = data.GetValue("mweb_url").ToString(); return(Redirect(url)); } } ViewBag.PayOrderEntity = _payen; ViewBag.Success = success; return(View()); }
/// <summary> /// 重写推送方法 /// </summary> /// <param name="accessTokenModel"></param> /// <param name="contentModel"></param> /// <returns></returns> public override string Push(U_AccessToken accessTokenModel, U_Content contentModel) { //获取AccessToken bool isSuccess = SetCorpAccount(accessTokenModel); if (isSuccess) { var listRedPacket = new List <Business_Redpacket_Push_Information>(); //List<U_WeChatUser> weChatUserList = SearchWeChatUserList(); //string pushObject = GetPushObject(contentModel, weChatUserList);//13788907365|15618738991|18301914615 string pushObject = GetPushObject(contentModel); string[] pushObjs = pushObject.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries); //推送的人数 int[] redPacket = new int[pushObjs.Length - 1]; try { //固定金额红包推送 总金额固定,按照人数计算每个红包金额(每个红包金额需一致) // 注:如果无法平均分配,则最后一人多出(例:10元分给3人,则金额为3.3、3.3、3.4) if (contentModel.RedpacketType == 1) { int money = (int)(contentModel.RedpacketMoney * 100); //总金额(分) redPacket = GetAvgRedPacket(pushObjs.Length, money); } else if (contentModel.RedpacketType == 2) //红包总金额(RMB),推送给每人的金额随机。 { int money = (int)(contentModel.RedpacketMoney * 100); //总金额(分) redPacket = GetRandomRedPacket(pushObjs.Length, money); } else if (contentModel.RedpacketType == 3) //输入单个红包随机金额区间(RMB),发给每人红包的金额在此区间内 { int moneyFrom = (int)(contentModel.RedpacketMoneyFrom * 100); int moneyTo = (int)(contentModel.RedpacketMoneyTo * 100); redPacket = GetSingleRandomRedPacket(pushObjs.Length, moneyFrom, moneyTo); } for (int i = 0; i < pushObjs.Length; i++) { WxPayData data = new WxPayData(); Business_Redpacket_Push_Information redpacketPushInfo = new Business_Redpacket_Push_Information(); redpacketPushInfo.Business_WeChatPushVguid = contentModel.VGUID; //推送主键 data.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); //随机字符串 var outTradeNo = WxPayApi.GenerateOutTradeNo(); redpacketPushInfo.OrderNumber = outTradeNo; data.SetValue("mch_billno", outTradeNo); //商户订单号 data.SetValue("mch_id", WxPayConfig.MCHID); //商户号 data.SetValue("wxappid", WxPayConfig.APPID); //公众账号ID data.SetValue("sender_name", "大众交通出租分公司"); //商户名称 //string filePath = AppDomain.CurrentDomain.BaseDirectory + "logo.png"; //string mediaid = UploadTempResource(filePath); data.SetValue("sender_header_media_id", "1G6nrLmr5EC3MMb_-zK1dDdzmd0p7cNliYu9V5w7o8K0"); //发送者头像,此id为微信默认的头像 string openid = ConvertToOpenidByUserId(_accessToken, pushObjs[i]); var openInfo = JsonHelper.JsonToModel <U_OpenInfo>(openid); JsonConvert.DeserializeObject <U_OpenInfo>(openid); data.SetValue("re_openid", openInfo.openid); //用户openid data.SetValue("total_amount", redPacket[i]); //付款金额,单位分 redpacketPushInfo.RedpacketMoney = (decimal)(redPacket[i] * 1.0 / 100); //红包金额 data.SetValue("wishing", contentModel.Message); //红包祝福语 data.SetValue("act_name", contentModel.Title); //活动名称 data.SetValue("remark", "快来抢"); //备注 data.SetValue("scene_id", "PRODUCT_4"); //场景(金额大于200元时必填) data.SetValue("workwx_sign", data.MakeWorkWxSign("redPacket")); //企业微信签名 data.SetValue("sign", data.MakeSign()); //微信支付签名 redpacketPushInfo.UserID = pushObjs[i]; //红包接收人的微信号 string xml = data.ToXml(); const string postUrl = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendworkwxredpack"; //发送企业红包接口地址 string response = PostWebRequest(postUrl, xml, Encoding.UTF8, true); //调用HTTP通信接口提交数据到API WxPayData result = new WxPayData(); result.FromXml(response); if (result.GetValue("return_code").ToString() == "SUCCESS" && result.GetValue("result_code").ToString() == "SUCCESS") { redpacketPushInfo.RedpacketStatus = 2; //已发送待领取 } else { redpacketPushInfo.RedpacketStatus = 3; //发送失败 redpacketPushInfo.Reson = result.GetValue("err_code_des").ToString(); LogManager.WriteLog(LogFile.Error, result.GetValue("err_code") + ":" + result.GetValue("err_code_des")); } redpacketPushInfo.VGUID = Guid.NewGuid(); redpacketPushInfo.CreatedDate = DateTime.Now; redpacketPushInfo.CreatedUser = "******"; listRedPacket.Add(redpacketPushInfo); } } catch (Exception ex) { LogManager.WriteLog(LogFile.Error, ex.ToString()); return("推送失败!"); } UpdatePushStatus(contentModel); InsertRedPacketInfo(listRedPacket); return("推送成功!"); } return("推送失败!"); }
/// <summary> /// 执行退款请求 /// </summary> /// <param name="out_trade_no">商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。</param> /// <param name="out_refund_no">商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。</param> /// <param name="total_fee">订单金额,注意,单位为分</param> /// <param name="refund_fee">退款金额,注意,单位为分</param> /// <param name="refund_desc">退款原因,非必填</param> /// <returns></returns> public JsonResultObj Excute(string out_trade_no, string out_refund_no, int total_fee, int refund_fee, string refund_desc = "正常退款") { try { WxPayData data = new WxPayData(); //商户账号appid data.SetValue("appid", WxPayConfig.APPID); //商户号 data.SetValue("mch_id", WxPayConfig.MCHID); //随机字符串 data.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", "")); //商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。 data.SetValue("out_trade_no", out_trade_no); //商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。 data.SetValue("out_refund_no", out_refund_no); //订单金额 data.SetValue("total_fee", total_fee); //退款金额 data.SetValue("refund_fee", refund_fee); //退款货币种类 data.SetValue("refund_fee_type", "CNY"); data.SetValue("refund_desc", refund_desc); data.SetValue("refund_account", "REFUND_SOURCE_UNSETTLED_FUNDS"); data.SetValue("notify_url", ""); data.SetValue("sign", data.MakeSign()); var xml = data.ToXml();//转换xml格式 int timeOut = 10; var start = DateTime.Now; //请求开始时间 string response = HttpService.Post(xml, url, true, timeOut); //调用HTTP通信接口以提交数据到API var end = DateTime.Now; int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时 WxPayData result = new WxPayData(); //将xml格式的结果转换为对象以返回 result.FromXml(response); var result_code = result.GetValue("result_code").ToString(); var return_code = result.GetValue("result_code").ToString(); if (result_code.Equals("SUCCESS", StringComparison.OrdinalIgnoreCase) && return_code.Equals("SUCCESS", StringComparison.OrdinalIgnoreCase)) { return(new JsonResultObj { code = 1000, msg = "退款成功!金额" + result.GetValue("refund_fee") + "(单位:分)已经成功原路退款至该用户" }); } else { var err_code_des = result.GetValue("err_code_des").ToString(); return(new JsonResultObj { msg = err_code_des, }); } } catch (Exception ex) { //LogFactory.GetLogger().Error("微信退款请求异常", ex); return(new JsonResultObj { msg = ex.Message, }); } }
/* * 仅支持支付单 */ protected void Page_Load(object sender, EventArgs e) { B_User.CheckIsLogged(Request.RawUrl); M_UserInfo mu = buser.GetLogin(false); if (string.IsNullOrEmpty(SiteConfig.SiteInfo.SiteUrl)) { function.WriteErrMsg("错误,管理员未定义网站地址,SiteUrl"); } string siteurl = (SiteConfig.SiteInfo.SiteUrl.TrimEnd('/') + "/PayOnline/"); if (string.IsNullOrEmpty(PayNo)) { function.WriteErrMsg("请传入支付单号"); } pinfo = paymentBll.SelModelByPayNo(PayNo); if (pinfo == null || pinfo.PaymentID < 1) { function.WriteErrMsg("支付单不存在"); } M_PayPlat payPlat = payPlatBll.GetPayPlatByid(pinfo.PayPlatID); if (!IsPostBack) { #region 母版页中信息 logged_div.Visible = true; #endregion if (pinfo.Status != (int)M_Payment.PayStatus.NoPay) { function.WriteErrMsg("支付单不能重复付款"); } Rurl_Href.NavigateUrl = "/User/Order/OrderList";//返回我的订单 if (pinfo.PaymentNum.Contains("IDC")) { Rurl_Href.NavigateUrl = "/Plugins/Domain/ViewHave.aspx"; } string url = Request.CurrentExecutionFilePath; urlReq1 = Request.Url.AbsoluteUri.ToString().Substring(0, Request.Url.AbsoluteUri.ToString().LastIndexOf('/')); double vmoney = pinfo.MoneyReal; //支付金额 string v_amount = pinfo.MoneyReal.ToString("f2"); //实际支付金额 if (string.IsNullOrEmpty(PayMethod)) { #region 现金支付 DataTable orderDB1 = orderBll.GetOrderbyOrderNo(pinfo.PaymentNum);//订单表,ZL_OrderInfo int orderType = 0; if (orderDB1.Rows.Count > 0) { orderType = DataConvert.CLng(orderDB1.Rows[0]["OrderType"]); } if (orderType == 8)//有需要检测库存的订单类型,放此 { if (!cartBll.CheckStock(Convert.ToInt32(orderDB1.Rows[0]["OrderType"]))) { function.WriteErrMsg("商品库存数量不足,请重新购买"); } } DataTable ordertable = orderBll.GetOrderbyOrderNo(pinfo.PaymentNum); int DeliveryID = 0; //送货方式ID if (ordertable != null && ordertable.Rows.Count > 0) { DeliveryID = DataConverter.CLng(ordertable.Rows[0]["Delivery"]); } if (pinfo.PayPlatID == 0 && !string.IsNullOrEmpty(pinfo.PlatformInfo))//支付宝网银支付 { payPlat = payPlatBll.GetPayPlatByClassID("15"); alipayBank(pinfo.PlatformInfo); } if (payPlat.PayClass == 99)//线下支付 { function.WriteSuccessMsg("信息已记录,请等待商家联系完成线下付款", Rurl_Href.NavigateUrl); } if (payPlat == null || payPlat.PayPlatID < 1) { function.WriteErrMsg("没有找到对应的支付平台信息!"); } //StringBuilder v_urlBuilder = new StringBuilder(); //构造返回URL //StringBuilder strHiddenField = new StringBuilder(); //string applicationName = paymentBll.GetApplicationName(); //if (!applicationName.EndsWith("/")) //{ // applicationName = applicationName + "/"; //} //v_urlBuilder.Append("http://"); //v_urlBuilder.Append(applicationName); //string v_ShowResultUrl = v_urlBuilder.ToString() + "PayOnline/ShowReturn.aspx?"; if (payPlat.PayClass == 100)//货到付款 { payinfo_div.Visible = false; AfterPay_Tb.Visible = true; Title = "下单成功!"; } else { payinfo_div.Visible = true; AfterPay_Tb.Visible = false; } switch ((M_PayPlat.Plat)payPlat.PayClass)//现仅开通 12:支付宝即时到账和支付宝网银服务,15支付宝网银服务(上方代码中处理),银币与余额服务 { #region 各种支付方式 case M_PayPlat.Plat.UnionPay: #region 银联在线 //gateway = "https://pay3.chinabank.com.cn/PayGate?encoding=UTF-8"; //必要的交易信息 string wv_amount = v_amount; // 订单金额 string wv_moneytype = "CNY"; // 币种 string wv_md5info; // 对拼凑串MD5私钥加密后的值 string wv_mid = payPlat.AccountID; // 商户号 //v_urlBuilder.Append("http://localhost:86/PayOnline/PayReceive.aspx?PayID=" +payid); string wv_url = urlReq1 + "/PayReceive.aspx?PayNo=" + PayNo; // 返回页地址 string wv_oid = pinfo.PayNo; // 推荐订单号构成格式为 年月日-商户号-小时分钟秒 //两个备注 // wv_mid = "1001"; 商户号,这里为测试商户号20000400,替换为自己的商户号即可 // wv_url = "http://localhost/chinabank/Receive.aspx"; 商户自定义返回接收支付结果的页面 // MD5密钥要跟订单提交页相同,如Send.asp里的 key = "test" ,修改""号内 test 为您的密钥 string wkey = payPlat.MD5Key; // 如果您还没有设置MD5密钥请登录我们为您提供商户后台,地址:https://merchant3.chinabank.com.cn/ // 登录后在上面的导航栏里可能找到“B2C”,在二级导航栏里有“MD5密钥设置” // 建议您设置一个16位以上的密钥或更高,密钥最多64位,但设置16位已经足够了 wv_amount = v_amount; // 订单金额 wv_moneytype = "CNY"; // 币种 //对拼凑串MD5私钥加密后的值 wv_mid = payPlat.AccountID; // 商户号 wv_oid = pinfo.PayNo; // 推荐订单号构成格式为 年月日-商户号-小时分钟秒 if (wv_oid == null || wv_oid.Equals("")) { DateTime dt = DateTime.Now; string wv_ymd = dt.ToString("yyyyMMdd"); // yyyyMMdd string wtimeStr = dt.ToString("HHmmss"); // HHmmss wv_oid = wv_ymd + wv_mid + wtimeStr; } string text = wv_amount + wv_moneytype + wv_oid + wv_mid + wv_url + wkey; // 拼凑加密串 wv_md5info = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(text, "md5").ToUpper(); //strHiddenField.Append("<input type='hidden' name='v_md5info' value='" + wv_md5info + "'>\n"); //strHiddenField.Append("<input type='hidden' name='v_mid' value='" + wv_mid + "'>\n"); //strHiddenField.Append("<input type='hidden' name='v_oid' value='" + wv_oid + "'>\n"); //strHiddenField.Append("<input type='hidden' name='v_amount' value='" + wv_amount + "' >\n"); //strHiddenField.Append("<input type='hidden' name='v_moneytype' value='" + wv_moneytype + "'>\n"); //strHiddenField.Append("<input type='hidden' name='v_url' value='" + wv_url + "'>\n"); // //以下几项只是用来记录客户信息,可以不用,不影响支付 // strHiddenField.Append("<input type='hidden' name='v_rcvname' value='" + "" + "'>\n"); // strHiddenField.Append("<input type='hidden' name='v_rcvaddr' value='" + "" + "'>\n"); // strHiddenField.Append("<input type='hidden' name='v_rcvtel' value='" + "" + "'>\n"); // strHiddenField.Append("<input type='hidden' name='v_rcvpost' value='" + "" + "' >\n"); // strHiddenField.Append("<input type='hidden' name='v_rcvemail' value='" + "" + "'>\n"); // strHiddenField.Append("<input type='hidden' name='v_rcvmobile' value='" + "" + "'>\n"); // strHiddenField.Append("<input type='hidden' name='v_ordername' value='" + "" + "' >\n"); // strHiddenField.Append("<input type='hidden' name='v_orderaddr' value='" + "" + "'>\n"); // strHiddenField.Append("<input type='hidden' name='v_ordertel' value='" + "" + "'>\n"); // strHiddenField.Append("<input type='hidden' name='v_orderpost' value='" + "" + "' >\n"); // strHiddenField.Append("<input type='hidden' name='v_orderemail' value='" + "" + "'>\n"); // strHiddenField.Append("<input type='hidden' name='v_ordermobile' value='" + "" + "'>\n"); // strHiddenField.Append("<input type='hidden' name='Package' value='" + Request.QueryString["Package"] + "'>\n"); #endregion break; case M_PayPlat.Plat.Alipay_Instant: #region 支付宝[即时到帐] string input_charset1 = "utf-8"; string notify_url1 = urlReq1 + "/Return/AlipayNotify.aspx"; //付完款后服务器AJAX通知的页面 要用 http://格式的完整路径,不允许加?id=123这类自定义参数 string return_url1 = urlReq1 + "/Return/AlipayReturn.aspx"; //付完款后跳转的页面 要用 http://格式的完整路径,不允许加?id=123这类自定义参数 string show_url1 = ""; string sign_type1 = "MD5"; ///////////////////////以下参数是需要通过下单时的订单数据传入进来获得//////////////////////////////// //必填参数 string price1 = pinfo.MoneyReal.ToString("f2"); //订单总金额,显示在支付宝收银台里的“商品单价”里 string logistics_fee1 = "0.00"; //物流费用,即运费。 string logistics_type1 = "POST"; //物流类型,三个值可选:EXPRESS(快递)、POST(平邮)、EMS(EMS) string logistics_payment1 = "SELLER_PAY"; //物流支付方式,两个值可选:SELLER_PAY(卖家承担运费)、BUYER_PAY(买家承担运费) string out_trade_no1 = pinfo.PayNo; //请与贵网站订单系统中的唯一订单号匹配 string subject1 = pinfo.Remark; //订单名称,显示在支付宝收银台里的“商品名称”里,显示在支付宝的交易管理的“商品名称”的列表里。 string body1 = pinfo.Remark; //订单描述、订单详细、订单备注,显示在支付宝收银台里的“商品描述”里 string quantity1 = "1"; //商品数量,建议默认为1,不改变值,把一次交易看成是一次下订单而非购买一件商品。 string receive_name1 = ""; //收货人姓名,如:张三 string receive_address1 = ""; //收货人地址,如:XX省XXX市XXX区XXX路XXX小区XXX栋XXX单元XXX号 string receive_zip1 = ""; //收货人邮编,如:123456 string receive_phone1 = ""; //收货人电话号码,如:0571-81234567 string receive_mobile1 = ""; //收货人手机号码,如:13312341234 //--------------------- string receive_name = orderDB1.Rows[0]["Reuser"] + ""; //收货人姓名,如:张三 string receive_address = orderDB1.Rows[0]["Jiedao"] + ""; //收货人地址,如:XX省XXX市XXX区XXX路XXX小区XXX栋XXX单元XXX号 string receive_zip = orderDB1.Rows[0]["ZipCode"] + ""; //收货人邮编,如:123456 string receive_phone = orderDB1.Rows[0]["Phone"] + ""; //收货人电话号码,如:0571-81234567 string receive_mobile = orderDB1.Rows[0]["MobileNum"] + ""; //收货人手机号码,如:13312341234 //扩展参数——第二组物流方式 //物流方式是三个为一组成组出现。若要使用,三个参数都需要填上数据;若不使用,三个参数都需要为空 //有了第一组物流方式,才能有第二组物流方式,且不能与第一个物流方式中的物流类型相同, //即logistics_type="EXPRESS",那么logistics_type_1就必须在剩下的两个值(POST、EMS)中选择 string logistics_fee_3 = ""; //物流费用,即运费。 string logistics_type_3 = ""; //物流类型,三个值可选:EXPRESS(快递)、POST(平邮)、EMS(EMS) string logistics_payment_3 = ""; //物流支付方式,两个值可选:SELLER_PAY(卖家承担运费)、BUYER_PAY(买家承担运费) //扩展参数——第三组物流方式 //物流方式是三个为一组成组出现。若要使用,三个参数都需要填上数据;若不使用,三个参数都需要为空 //有了第一组物流方式和第二组物流方式,才能有第三组物流方式,且不能与第一组物流方式和第二组物流方式中的物流类型相同, //即logistics_type="EXPRESS"、logistics_type_1="EMS",那么logistics_type_2就只能选择"POST" string logistics_fee_4 = ""; //物流费用,即运费。 string logistics_type_4 = ""; //物流类型,三个值可选:EXPRESS(快递)、POST(平邮)、EMS(EMS) string logistics_payment_4 = ""; //物流支付方式,两个值可选:SELLER_PAY(卖家承担运费)、BUYER_PAY(买家承担运费) //扩展功能参数——其他 string buyer_email1 = ""; //默认买家支付宝账号 string discount1 = ""; //折扣,是具体的金额,而不是百分比。若要使用打折,请使用负数,并保证小数点最多两位数 ///////////////////////////////////////////////////////////////////////////////////////////////////// //构造请求函数,无需修改 B_AliPay_trades_Services aliService1 = new B_AliPay_trades_Services( payPlat.AccountID, payPlat.SellerEmail, return_url1, notify_url1, show_url1, out_trade_no1, subject1, body1, price1, logistics_fee1, logistics_type1, logistics_payment1, quantity1, receive_name1, receive_address1, receive_zip1, receive_phone1, receive_mobile1, logistics_fee_3, logistics_type_3, logistics_payment_3, logistics_fee_4, logistics_type_4, logistics_payment_4, buyer_email1, discount1, payPlat.MD5Key, input_charset1, sign_type1); Alipay_Btn.Visible = true; LblHiddenValue.InnerHtml = aliService1.Build_Form(); #endregion break; case M_PayPlat.Plat.Alipay_Bank: //支付宝网银,已上方处理 break; case M_PayPlat.Plat.Mobo: #region 成都MO宝支付 { string pfxFilePath = Server.MapPath("/muzi.pfx"); string cerFilePath = Server.MapPath("/mobaopay.cer"); string passwd = payPlat.MD5Key; if (!File.Exists(pfxFilePath) || !File.Exists(cerFilePath)) { function.WriteErrMsg("证书文件不存在"); } Mobo360SignUtil.Instance.init(pfxFilePath, cerFilePath, passwd); //-------------------------------------------------------------------- Dictionary <string, string> payData = new Dictionary <string, string>(); payData.Add("apiName", "WEB_PAY_B2C"); payData.Add("apiVersion", "1.0.0.0"); payData.Add("platformID", payPlat.PayPlatinfo); //平台ID,商户号 payData.Add("merchNo", payPlat.AccountID); payData.Add("orderNo", pinfo.PayNo); //订单号, payData.Add("tradeDate", DateTime.Now.ToString("yyyyMMdd")); payData.Add("amt", pinfo.MoneyReal.ToString("f2")); payData.Add("merchUrl", urlReq1 + "/Return/MoBaoReturn.aspx"); payData.Add("merchParam", ""); payData.Add("tradeSummary", pinfo.Remark); payData.Add("signMsg", Mobo360SignUtil.Instance.sign(payData)); string payReqUrl = Mobo360Merchant.Instance.generatePayUrl(payData, "https://trade.mobaopay.com/cgi-bin/netpayment/pay_gate.cgi"); Response.ContentEncoding = System.Text.Encoding.UTF8; Alipay_Btn.Visible = true; LblHiddenValue.InnerHtml = new Pay_BaoFa().BuildForm(payReqUrl, null); //Response.Redirect(payReqUrl);// 重定向客户端到收银台 //Confirm_VMoney_Btn.Visible = true; } #endregion break; case M_PayPlat.Plat.WXPay: #region 微信扫码支付 { pinfo.PlatformInfo = "0"; paymentBll.Update(pinfo); WxPayData wxdata = new WxPayData(); wxdata.SetValue("out_trade_no", pinfo.PayNo); wxdata.SetValue("body", string.IsNullOrEmpty(pinfo.Remark) ? "微信支付" : pinfo.Remark); wxdata.SetValue("total_fee", Convert.ToInt32(pinfo.MoneyReal * 100)); wxdata.SetValue("trade_type", "NATIVE"); wxdata.SetValue("notify_url", urlReq1 + "/Return/WxPayReturn.aspx"); wxdata.SetValue("product_id", "1"); WxPayData result = WxPayApi.UnifiedOrder(wxdata, WxPayApi.Pay_GetByID()); if (result.GetValue("return_code").ToString().Equals("FAIL")) { function.WriteErrMsg("商户" + result.GetValue("return_msg")); } Response.Redirect("/PayOnline/WxCodePay.aspx?PayNo=" + pinfo.PayNo + "&wxcode=" + result.GetValue("code_url")); } #endregion break; case M_PayPlat.Plat.BaoFo: #region 宝付 { Pay_BaoFa baofaBll = new Pay_BaoFa(); //测试使用 payPlat.AccountID = "100000178"; payPlat.MD5Key = "abcdefg"; payPlat.PayPlatinfo = "10000001"; Dictionary <string, string> dics = new Dictionary <string, string>(); dics.Add("MemberID", payPlat.AccountID); //"100000178", dics.Add("PayID", ""); dics.Add("TradeDate", DateTime.Now.ToString("yyyyMMddHHmmss")); dics.Add("TerminalID", payPlat.PayPlatinfo); //19534 dics.Add("InterfaceVersion", "4.0"); dics.Add("KeyType", "1"); dics.Add("TransID", pinfo.PayNo); dics.Add("OrderMoney", (pinfo.MoneyReal * 100).ToString("f0")); //金额必须相等,否则会报签名失败 dics.Add("ProductName", pinfo.Remark); dics.Add("Amount", pinfo.MoneyReal.ToString("f2")); dics.Add("Username", mu.UserName); dics.Add("AdditionalInfo", ""); //可填sessionid等 dics.Add("PageUrl", siteurl + "/Return/BaoFaoShow.aspx"); dics.Add("ReturnUrl", siteurl + "/Return/BaoFaoNotify.aspx"); //是否必须正式才会有回调 dics.Add("NoticeType", "1"); string signature = baofaBll.GetMd5Sign(dics["MemberID"], dics["PayID"], dics["TradeDate"] , dics["TransID"], dics["OrderMoney"] , dics["PageUrl"], dics["ReturnUrl"], dics["NoticeType"], payPlat.MD5Key); dics.Add("Signature", signature); Alipay_Btn.Visible = true; //测试URL:http://tgw.bfopay.com/payindex //正式:http://gw.bfopay.com/payindex LblHiddenValue.InnerHtml = baofaBll.BuildForm("http://tgw.bfopay.com/payindex", dics); } #endregion break; case M_PayPlat.Plat.EPay95: #region 双乾 { Dictionary <string, string> epay_dics = new Dictionary <string, string>(); epay_dics.Add("MerNo", payPlat.AccountID); epay_dics.Add("BillNo", pinfo.PayNo); epay_dics.Add("Amount", pinfo.MoneyReal.ToString("f2")); epay_dics.Add("ReturnURL", siteurl + "Return/EPay95Result.aspx"); epay_dics.Add("NotifyURL", siteurl + "Return/EPay95Notify.aspx"); string EpayMD5Key = payPlat.MD5Key; string md5md5 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(EpayMD5Key, "MD5").ToUpper(); //注意这里和示例不同,其示例是错误的. string md5src = StringHelper.MD5("Amount=" + pinfo.MoneyReal.ToString("f2") + "&BillNo=" + pinfo.PayNo + "&MerNo=" + payPlat.AccountID + "&ReturnURL=" + siteurl + "EPay95Result.aspx" + "&" + md5md5).ToUpper(); epay_dics.Add("MD5info", md5src); epay_dics.Add("PayType", "CSPAY"); epay_dics.Add("MerRemark", "双乾支付"); epay_dics.Add("products", pinfo.Remark); LblHiddenValue.InnerHtml = new Pay_BaoFa().BuildForm("https://www.95epay.cn/sslpayment", epay_dics); Alipay_Btn.Visible = true; } #endregion break; case M_PayPlat.Plat.Ebatong: #region Ebatong { Dictionary <string, string> ebatong_dics = new Dictionary <string, string>(); ebatong_dics.Add("sign_type", "MD5"); ebatong_dics.Add("service", "create_direct_pay_by_user"); ebatong_dics.Add("partner", payPlat.AccountID); ebatong_dics.Add("input_charset", "UTF-8"); ebatong_dics.Add("notify_url", siteurl + "Return/EbatongNotify.aspx"); //服务器异步通知页面路径 ebatong_dics.Add("return_url", siteurl + "Return/EbatongReturn.aspx"); //服务器跳转页面 ebatong_dics.Add("out_trade_no", pinfo.PayNo); ebatong_dics.Add("subject", pinfo.Remark); ebatong_dics.Add("exter_invoke_ip", Request.UserHostAddress); ebatong_dics.Add("payment_type", "1"); ebatong_dics.Add("seller_id", payPlat.AccountID); ebatong_dics.Add("total_fee", pinfo.MoneyReal.ToString("f2")); ebatong_dics.Add("error_notify_url", ""); ebatong_dics.Add("anti_phishing_key", new ZoomLa.BLL.Ebatong.AskForTimestamp().askFor(payPlat.AccountID, payPlat.MD5Key)); ebatong_dics.Add("seller_email", ""); ebatong_dics.Add("buyer_email", ""); ebatong_dics.Add("buyer_id", ""); ebatong_dics.Add("price", ""); ebatong_dics.Add("quantity", ""); ebatong_dics.Add("body", ""); ebatong_dics.Add("show_url", ""); ebatong_dics.Add("pay_method", "bankPay"); ebatong_dics.Add("extra_common_para", ""); ebatong_dics.Add("extend_param", ""); ebatong_dics.Add("it_b_pay", ""); ebatong_dics.Add("royalty_type", ""); ebatong_dics.Add("royalty_parameters", ""); ebatong_dics.Add("default_bank", ""); string[] paramts = new string[ebatong_dics.Keys.Count]; //参数排序数组 ebatong_dics.Keys.CopyTo(paramts, 0); Array.Sort(paramts); //参数排序操作 string paramstr = ""; foreach (string item in paramts) { paramstr += string.Format("{0}={1}&", item, ebatong_dics[item]); } //throw new Exception(paramstr.Trim('&')); string md5md5 = new ZoomLa.BLL.Ebatong.CommonHelper().md5("UTF-8", paramstr.Trim('&') + payPlat.MD5Key).ToLower(); ebatong_dics.Add("sign", md5md5); LblHiddenValue.InnerHtml = new Pay_BaoFa().BuildForm("https://www.ebatong.com/direct/gateway.htm", ebatong_dics); Alipay_Btn.Visible = true; } #endregion break; case M_PayPlat.Plat.CCB: #region 江西建行 { Dictionary <string, string> ccb_dics = new Dictionary <string, string>(); ccb_dics.Add("MERCHANTID", payPlat.AccountID); //商户代码 ccb_dics.Add("POSID", payPlat.PrivateKey); //柜台代码 ccb_dics.Add("BRANCHID", payPlat.PublicKey); //分行代码 ccb_dics.Add("ORDERID", pinfo.PayNo); ccb_dics.Add("PAYMENT", pinfo.MoneyReal.ToString("f2")); ccb_dics.Add("CURCODE", "01"); ccb_dics.Add("REMARK1", ""); //备注信息1(具体信息待测试) ccb_dics.Add("REMARK2", ""); //备注信息2 ccb_dics.Add("TXCODE", "520100"); string ccb_paramstr = ""; foreach (String item in ccb_dics.Keys) { ccb_paramstr += string.Format("{0}={1}&", item, ccb_dics[item]); } string md5str = new ZoomLa.BLL.Ebatong.CommonHelper().md5("UTF-8", ccb_paramstr.Trim('&')).ToLower(); ccb_dics.Add("MAC", md5str); LblHiddenValue.InnerHtml = new Pay_BaoFa().BuildForm("https://ibsbjstar.ccb.com.cn/app/ccbMain", ccb_dics); Alipay_Btn.Visible = true; //Response.Redirect("https://ibsbjstar.ccb.com.cn/app/ccbMain?" + ccb_paramstr + "MAC=" + md5str); } #endregion break; case M_PayPlat.Plat.ECPSS: #region 汇潮支付 { Dictionary <string, string> payData = new Dictionary <string, string>(); payData.Add("OrderDesc", "test"); //订单描述 payData.Add("Remark", "汇潮支付"); //备注 payData.Add("AdviceURL", siteurl + "Return/ECPSSNotfy.aspx"); //回调通知地址 payData.Add("ReturnURL", siteurl + "Return/ECPSSResult.aspx"); //返回地址 payData.Add("BillNo", pinfo.PayNo); //订单号 payData.Add("MerNo", payPlat.AccountID); //商户号 payData.Add("Amount", pinfo.MoneyReal.ToString("f2")); //交易价格 string md5key = payPlat.MD5Key; string md5str = payData["MerNo"] + "&" + payData["BillNo"] + "&" + payData["Amount"] + "&" + payData["ReturnURL"] + "&" + md5key; payData.Add("SignInfo", System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(md5str, "MD5")); //签名 payData.Add("defaultBankNumber", ""); //银行代码(选填) payData.Add("orderTime", DateTime.Now.ToString("yyyyMMddHHmmss")); //交易时间yyyyMMddHHmmss payData.Add("products", pinfo.Remark); //物品信息 LblHiddenValue.InnerHtml = new Pay_BaoFa().BuildForm("https://pay.ecpss.com/sslpayment", payData); Alipay_Btn.Visible = true; } #endregion break; case M_PayPlat.Plat.ICBC_NC: #region 南昌工行 { function.WriteErrMsg("工行支付组件未注册,请联系管理员"); //ICBCHelper icbc = new ICBCHelper(); //infosecapiLib.infosecClass obj = new infosecapiLib.infosecClass(); //Dictionary<string, string> dics = new Dictionary<string, string>(); //string posturl = "https://B2C.icbc.com.cn/servlet/ICBCINBSEBusinessServlet"; //---Debug //payPlat.AccountID = "1502EC24392836"; //payPlat.SellerEmail = "1502201009004747554"; //payPlat.PrivateKey = "/Cert/cs.key"; //payPlat.PublicKey = "/Cert/cs.cer"; //posturl = "https://myipad.dccnet.com.cn/servlet/NewB2cMerPayReqServlet"; //throw new Exception(payPlat.PrivateKey + ":" + payPlat.PublicKey + ":" + payPlat.AccountID + ":" + payPlat.SellerEmail); //Debug End //*.z01.com根据需要更改如*.hx008.com //string data = icbc.SpliceTranData(pinfo, payPlat.AccountID.Trim(), payPlat.SellerEmail.Trim(), "*.z01.com", siteurl + "ICBCNotify.aspx"); //string sign = obj.sign(data, Server.MapPath(payPlat.PrivateKey), payPlat.MD5Key.Trim());//私钥虚拟路径与私钥密钥 //dics.Add("interfaceName", "ICBC_PERBANK_B2C"); //dics.Add("interfaceVersion", "1.0.0.11"); //dics.Add("tranData", obj.base64enc(data)); //dics.Add("merSignMsg", sign); //dics.Add("merCert", icbc.ReadCertToBase64(payPlat.PublicKey));//公钥路径 //LblHiddenValue.InnerHtml = new Pay_BaoFa().BuildForm(posturl, dics); //Alipay_Btn.Visible = true; } #endregion break; case M_PayPlat.Plat.CashOnDelivery: #region 货到付款 zfpt.Text = payPlat.PayPlatName; ddh.Text = pinfo.PaymentNum; PayNum_L2.Text = Convert.ToDecimal(vmoney).ToString("F2") + " 元"; sxf.Text = payPlat.Rate.ToString() + " %"; sjhbje.Text = v_amount + " 元"; #endregion break; default: throw new Exception("错误:支付方式不存在"); #endregion } VMoneyPayed_L.Text = payPlat.PayPlatName; OrderNo_L.Text = pinfo.PaymentNum; LblRate.Text = payPlat.Rate.ToString() + " %"; #endregion } else//非现金支付,给用户显示确认支付页,实际支付行为在Confirm_Click { Confirm_VMoney_Btn.Visible = true; payinfo_div.Visible = true; AfterPay_Tb.Visible = false; OrderNo_L.Text = pinfo.PaymentNum; DataTable ordertable = orderBll.GetOrderbyOrderNo(pinfo.PaymentNum); if (ordertable != null && ordertable.Rows.Count > 0) { switch (PayMethod) { case "Purse": //Titles.Text = "余额支付操作(确认支付款项)"; Fee.Text = "帐户余额:"; LblRate.Text = mu.Purse + " 元"; VMoneyPayed_L.Text = "帐户余额"; break; case "SilverCoin": //Titles.Text = "银币支付操作(确认支付款项)"; Fee.Text = "帐户银币:"; LblRate.Text = mu.SilverCoin + " 个"; VMoneyPayed_L.Text = "账户银币"; break; case "Score": //Titles.Text = "积分支付操作(确认支付款项)"; Fee.Text = "帐户积分:"; LblRate.Text = mu.UserExp + " 分"; VMoneyPayed_L.Text = "账户积分"; break; default: break; } } else { payinfo_div.Visible = false; AfterPay_Tb.Visible = false; function.WriteErrMsg("订单不存在"); } } //显示金额信息 LblPayMoney.Text = pinfo.MoneyReal.ToString("F2") + " 元";//应付金额 //string priceJson = orderCom.GetTotalJson(ordertable);//多虚拟币支付,暂取消 //M_LinPrice priceMod = JsonConvert.DeserializeObject<M_LinPrice>(priceJson); //if (orderCom.HasPrice(priceJson)) //{ // if (priceMod.Purse > 0) // { // LblPayMoney.Text += " 余额:" + priceMod.Purse.ToString("f2"); // } // if (priceMod.Sicon > 0) // { LblPayMoney.Text += " 银币:" + priceMod.Sicon.ToString("f2"); } // if (priceMod.Point > 0) // { // LblPayMoney.Text += " 积分:" + priceMod.Point.ToString("f2"); // } //} } //------------------检测End; }
public void NotifyByWeixin(HttpRequest request, out bool isPaied, out string responseXml) { isPaied = false; var config = ConfigInfo; WxPayConfig.APPID = config.WeixinAppId; WxPayConfig.MCHID = config.WeixinMchId; WxPayConfig.KEY = config.WeixinKey; WxPayConfig.APPSECRET = config.WeixinAppSecret; //=======【商户系统后台机器IP】===================================== /* 此参数可手动配置也可在程序中自动获取 */ WxPayConfig.IP = "8.8.8.8"; //=======【代理服务器设置】=================================== /* 默认IP和端口号分别为0.0.0.0和0,此时不开启代理(如有需要才设置) */ WxPayConfig.PROXY_URL = "http://10.152.18.220:8080"; //=======【上报信息配置】=================================== /* 测速上报等级,0.关闭上报; 1.仅错误时上报; 2.全量上报 */ WxPayConfig.REPORT_LEVENL = 1; //=======【日志级别】=================================== /* 日志等级,0.不输出日志;1.只输出错误信息; 2.输出错误和正常信息; 3.输出错误信息、正常信息和调试信息 */ WxPayConfig.LOG_LEVENL = 0; //接收从微信后台POST过来的数据 System.IO.Stream s = request.InputStream; int count; byte[] buffer = new byte[1024]; StringBuilder builder = new StringBuilder(); while ((count = s.Read(buffer, 0, 1024)) > 0) { builder.Append(Encoding.UTF8.GetString(buffer, 0, count)); } s.Flush(); s.Close(); s.Dispose(); Log.Info(GetType().ToString(), "NotifyByWeixin : " + builder); //转换数据格式并验证签名 WxPayData notifyData = new WxPayData(); try { notifyData.FromXml(builder.ToString()); } catch (WxPayException ex) { //若签名错误,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", ex.Message); Log.Error(GetType().ToString(), "Sign check error : " + res.ToXml()); responseXml = res.ToXml(); return; } if (!notifyData.IsSet("return_code") || notifyData.GetValue("return_code").ToString() != "SUCCESS") { WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "回调数据异常"); Log.Info(GetType().ToString(), "The data WeChat post is error : " + res.ToXml()); responseXml = res.ToXml(); return; } //统一下单成功,则返回成功结果给微信支付后台 WxPayData data = new WxPayData(); data.SetValue("return_code", "SUCCESS"); data.SetValue("return_msg", "OK"); Log.Info(GetType().ToString(), "UnifiedOrder success , send data to WeChat : " + data.ToXml()); isPaied = true; responseXml = data.ToXml(); }
public IActionResult PayOnline() { M_UserInfo mu = buser.GetLogin(false); if (string.IsNullOrEmpty(SiteConfig.SiteInfo.SiteUrl)) { return(WriteErr("错误,管理员未定义网站地址,SiteUrl")); } if (string.IsNullOrEmpty(PayNo)) { return(WriteErr("请传入支付单号")); } M_Payment pinfo = payBll.SelModelByPayNo(PayNo); if (pinfo == null || pinfo.PaymentID < 1) { return(WriteErr("支付单不存在")); } M_PayPlat payPlat = platBll.SelReturnModel(pinfo.PayPlatID); if (pinfo.Status != (int)M_Payment.PayStatus.NoPay) { return(WriteErr("支付单不能重复付款")); } string siteurl = (SiteConfig.SiteInfo.SiteUrl.TrimEnd('/') + "/PayOnline/"); string urlReq1 = SiteConfig.SiteInfo.SiteUrl + "/PayOnline"; ViewBag.formHtml = ""; if (string.IsNullOrEmpty(PayMethod)) { #region 现金支付 DataTable orderDB1 = orderBll.GetOrderbyOrderNo(pinfo.PaymentNum);//订单表,ZL_OrderInfo int orderType = 0; if (orderDB1.Rows.Count > 0) { orderType = DataConvert.CLng(orderDB1.Rows[0]["OrderType"]); } if (orderType == 8)//有需要检测库存的订单类型,放此 { if (!cpBll.CheckStock(Convert.ToInt32(orderDB1.Rows[0]["OrderType"]))) { return(WriteErr("商品库存数量不足,请重新购买")); } } DataTable ordertable = orderBll.GetOrderbyOrderNo(pinfo.PaymentNum); //if (pinfo.PayPlatID == 0 && !string.IsNullOrEmpty(pinfo.PlatformInfo))//支付宝网银支付 //{ // payPlat = platBll.SelModelByClass(M_PayPlat.Plat.Alipay_Bank); // alipayBank(pinfo.PlatformInfo); //} if (payPlat.PayClass == 99)//线下支付 { return(WriteErr("信息已记录,请等待商家联系完成线下付款", "/User/Order/OrderList")); } if (payPlat == null || payPlat.PayPlatID < 1) { return(WriteErr("没有找到对应的支付平台信息!")); } switch ((M_PayPlat.Plat)payPlat.PayClass)//现仅开通 12:支付宝即时到账和支付宝网银服务,15支付宝网银服务(上方代码中处理),银币与余额服务 { #region 各种支付方式 case M_PayPlat.Plat.UnionPay: break; case M_PayPlat.Plat.ChinaUnionPay: break; case M_PayPlat.Plat.Alipay_Instant: #region 支付宝[即时到帐] string input_charset1 = "utf-8"; string notify_url1 = urlReq1 + "/Return/AlipayNotify"; //付完款后服务器AJAX通知的页面 要用 http://格式的完整路径,不允许加?id=123这类自定义参数 string return_url1 = urlReq1 + "/Return/AlipayReturn"; //付完款后跳转的页面 要用 http://格式的完整路径,不允许加?id=123这类自定义参数 string show_url1 = ""; string sign_type1 = "MD5"; ///////////////////////以下参数是需要通过下单时的订单数据传入进来获得//////////////////////////////// //必填参数 string price1 = pinfo.MoneyReal.ToString("f2"); //订单总金额,显示在支付宝收银台里的“商品单价”里 string logistics_fee1 = "0.00"; //物流费用,即运费。 string logistics_type1 = "POST"; //物流类型,三个值可选:EXPRESS(快递)、POST(平邮)、EMS(EMS) string logistics_payment1 = "SELLER_PAY"; //物流支付方式,两个值可选:SELLER_PAY(卖家承担运费)、BUYER_PAY(买家承担运费) string out_trade_no1 = pinfo.PayNo; //请与贵网站订单系统中的唯一订单号匹配 string subject1 = pinfo.Remark; //订单名称,显示在支付宝收银台里的“商品名称”里,显示在支付宝的交易管理的“商品名称”的列表里。 string body1 = pinfo.Remark; //订单描述、订单详细、订单备注,显示在支付宝收银台里的“商品描述”里 string quantity1 = "1"; //商品数量,建议默认为1,不改变值,把一次交易看成是一次下订单而非购买一件商品。 string receive_name1 = ""; //收货人姓名,如:张三 string receive_address1 = ""; //收货人地址,如:XX省XXX市XXX区XXX路XXX小区XXX栋XXX单元XXX号 string receive_zip1 = ""; //收货人邮编,如:123456 string receive_phone1 = ""; //收货人电话号码,如:0571-81234567 string receive_mobile1 = ""; //收货人手机号码,如:13312341234 //--------------------- string receive_name = orderDB1.Rows[0]["Reuser"] + ""; //收货人姓名,如:张三 string receive_address = orderDB1.Rows[0]["Jiedao"] + ""; //收货人地址,如:XX省XXX市XXX区XXX路XXX小区XXX栋XXX单元XXX号 string receive_zip = orderDB1.Rows[0]["ZipCode"] + ""; //收货人邮编,如:123456 string receive_phone = orderDB1.Rows[0]["Phone"] + ""; //收货人电话号码,如:0571-81234567 string receive_mobile = orderDB1.Rows[0]["MobileNum"] + ""; //收货人手机号码,如:13312341234 //扩展参数——第二组物流方式 //物流方式是三个为一组成组出现。若要使用,三个参数都需要填上数据;若不使用,三个参数都需要为空 //有了第一组物流方式,才能有第二组物流方式,且不能与第一个物流方式中的物流类型相同, //即logistics_type="EXPRESS",那么logistics_type_1就必须在剩下的两个值(POST、EMS)中选择 string logistics_fee_3 = ""; //物流费用,即运费。 string logistics_type_3 = ""; //物流类型,三个值可选:EXPRESS(快递)、POST(平邮)、EMS(EMS) string logistics_payment_3 = ""; //物流支付方式,两个值可选:SELLER_PAY(卖家承担运费)、BUYER_PAY(买家承担运费) //扩展参数——第三组物流方式 //物流方式是三个为一组成组出现。若要使用,三个参数都需要填上数据;若不使用,三个参数都需要为空 //有了第一组物流方式和第二组物流方式,才能有第三组物流方式,且不能与第一组物流方式和第二组物流方式中的物流类型相同, //即logistics_type="EXPRESS"、logistics_type_1="EMS",那么logistics_type_2就只能选择"POST" string logistics_fee_4 = ""; //物流费用,即运费。 string logistics_type_4 = ""; //物流类型,三个值可选:EXPRESS(快递)、POST(平邮)、EMS(EMS) string logistics_payment_4 = ""; //物流支付方式,两个值可选:SELLER_PAY(卖家承担运费)、BUYER_PAY(买家承担运费) //扩展功能参数——其他 string buyer_email1 = ""; //默认买家支付宝账号 string discount1 = ""; //折扣,是具体的金额,而不是百分比。若要使用打折,请使用负数,并保证小数点最多两位数 ///////////////////////////////////////////////////////////////////////////////////////////////////// //构造请求函数,无需修改 B_AliPay_trades_Services aliService1 = new B_AliPay_trades_Services( payPlat.AccountID, payPlat.SellerEmail, return_url1, notify_url1, show_url1, out_trade_no1, subject1, body1, price1, logistics_fee1, logistics_type1, logistics_payment1, quantity1, receive_name1, receive_address1, receive_zip1, receive_phone1, receive_mobile1, logistics_fee_3, logistics_type_3, logistics_payment_3, logistics_fee_4, logistics_type_4, logistics_payment_4, buyer_email1, discount1, payPlat.MD5Key, input_charset1, sign_type1); ViewBag.formHtml = aliService1.Build_Form(); //LblHiddenValue.InnerHtml = aliService1.Build_Form(); #endregion break; case M_PayPlat.Plat.Alipay_H5: { Response.Redirect("/API/Pay/Alipay_H5?Payno=" + PayNo); } break; case M_PayPlat.Plat.Alipay_Bank: //支付宝网银,已上方处理 break; case M_PayPlat.Plat.Bill: break; case M_PayPlat.Plat.WXPay: #region 微信扫码支付 { //if (DeviceHelper.GetBrower() == DeviceHelper.Brower.Micro) //{ // Response.Redirect("/PayOnline/wxpay_mp?payno=" + pinfo.PayNo); // return; //} pinfo.PlatformInfo = "0"; payBll.Update(pinfo); WxPayData wxdata = new WxPayData(); wxdata.SetValue("out_trade_no", pinfo.PayNo); wxdata.SetValue("body", string.IsNullOrEmpty(pinfo.Remark) ? "微信支付" : pinfo.Remark); wxdata.SetValue("total_fee", Convert.ToInt32(pinfo.MoneyReal * 100)); wxdata.SetValue("trade_type", "NATIVE"); wxdata.SetValue("notify_url", urlReq1 + "/Return/WxPayReturn"); wxdata.SetValue("product_id", "1"); WxPayData result = WxPayApi.UnifiedOrder(wxdata, WxPayApi.Pay_GetByID()); if (result.GetValue("return_code").ToString().Equals("FAIL")) { return(WriteErr("商户" + result.GetValue("return_msg"))); } Response.Redirect("/PayOnline/WxCodePay?PayNo=" + pinfo.PayNo + "&wxcode=" + result.GetValue("code_url")); } #endregion break; case M_PayPlat.Plat.Ebatong: break; case M_PayPlat.Plat.CCB: break; case M_PayPlat.Plat.ECPSS: break; case M_PayPlat.Plat.ICBC_NC: break; case M_PayPlat.Plat.PayPal: { Response.Redirect("PP/Pay?Payno=" + pinfo.PayNo); } break; default: throw new Exception("错误:支付方式不存在:" + payPlat.PayClass); #endregion } ViewBag.vname = payPlat.PayPlatName; #endregion } else//非现金支付,给用户显示确认支付页,实际支付行为在Confirm_Click { switch (PayMethod) { case "Purse": ViewBag.vname = "帐户余额"; ViewBag.vmoney = mu.Purse.ToString("F2"); break; case "SilverCoin": ViewBag.vname = "帐户银币"; ViewBag.vmoney = mu.SilverCoin.ToString("F2"); break; case "Score": ViewBag.vname = "帐户积分"; ViewBag.vmoney = mu.UserExp.ToString("F2"); //Fee.Text = "帐户积分:"; //LblRate.Text = mu.UserExp + " 分"; //VMoneyPayed_L.Text = "账户积分"; break; default: throw new Exception("支付类型错误"); } } ViewBag.mu = mu; ViewBag.platMod = payPlat; return(View(pinfo)); }
} //支付成功跳转的地址 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; } }
public override void ProcessNotify() { WxPayData notifyData = GetNotifyData(); //检查支付结果中transaction_id是否存在 if (!notifyData.IsSet("transaction_id")) { //若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(); MySqlHelp.ExecuteNonQuery("update t_order set transaction_id=" + UtilityFn.formatstring(transaction_id) + " where outtradeno=" + UtilityFn.formatstring(out_trade_no)); Log.Info(this.GetType().ToString(), "update transaction_id success : " + transaction_id + "/" + out_trade_no); //查询订单,判断订单真实性 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()); try { MySqlHelp.ExecuteNonQuery(@"update t_order set status='PaidQueryFailed',statusid='6'" + " where outtradeno=" + UtilityFn.formatstring(out_trade_no) + " and transaction_id=" + UtilityFn.formatstring(transaction_id)); } catch (Exception ex) { Log.Error(this.GetType().ToString(), "status update failure:" + ex.Message); } page.Response.Write(res.ToXml()); page.Response.End(); } //查询订单成功 else { WxPayData res = new WxPayData(); res.SetValue("return_code", "SUCCESS"); res.SetValue("return_msg", "OK"); Log.Info(this.GetType().ToString(), "order query success : " + res.ToXml()); try { MySqlHelp.ExecuteNonQuery(@"update t_order set status='PaidSuccessed',statusid='2'" + " where outtradeno=" + UtilityFn.formatstring(out_trade_no) + " and transaction_id=" + UtilityFn.formatstring(transaction_id)); DataTable dt = MySqlHelp.ExecuteDataTable(@"select * from t_order" + " where outtradeno=" + UtilityFn.formatstring(out_trade_no) + " and transaction_id=" + UtilityFn.formatstring(transaction_id)); EmailHelper eh = new EmailHelper(); eh.SendMail("Squirel New Order Payment", UtilityFn.JsonToHTMLTable(JsonUtility.ToJson(dt))); Log.Info(this.GetType().ToString(), "update status success : " + transaction_id + "/" + out_trade_no); } catch (Exception ex) { Log.Error(this.GetType().ToString(), "status update failure:" + ex.Message); } page.Response.Write(res.ToXml()); page.Response.End(); } }
/** * * 测速上报 * @param string interface_url 接口URL * @param int timeCost 接口耗时 * @param WxPayData inputObj参数数组 */ private static void ReportCostTime(string interface_url, int timeCost, WxPayData inputObj) { //如果不需要进行上报 if (WxPayConfig.REPORT_LEVENL == 0) { return; } //如果仅失败上报 if (WxPayConfig.REPORT_LEVENL == 1 && inputObj.IsSet("return_code") && inputObj.GetValue("return_code").ToString() == "SUCCESS" && inputObj.IsSet("result_code") && inputObj.GetValue("result_code").ToString() == "SUCCESS") { return; } //上报逻辑 WxPayData data = new WxPayData(); data.SetValue("interface_url", interface_url); data.SetValue("execute_time_", timeCost); //返回状态码 if (inputObj.IsSet("return_code")) { data.SetValue("return_code", inputObj.GetValue("return_code")); } //返回信息 if (inputObj.IsSet("return_msg")) { data.SetValue("return_msg", inputObj.GetValue("return_msg")); } //业务结果 if (inputObj.IsSet("result_code")) { data.SetValue("result_code", inputObj.GetValue("result_code")); } //错误代码 if (inputObj.IsSet("err_code")) { data.SetValue("err_code", inputObj.GetValue("err_code")); } //错误代码描述 if (inputObj.IsSet("err_code_des")) { data.SetValue("err_code_des", inputObj.GetValue("err_code_des")); } //商户订单号 if (inputObj.IsSet("out_trade_no")) { data.SetValue("out_trade_no", inputObj.GetValue("out_trade_no")); } //设备号 if (inputObj.IsSet("device_info")) { data.SetValue("device_info", inputObj.GetValue("device_info")); } try { Report(data); } catch (WxPayException ex) { //不做任何处理 } }
public static object ChargeByWeixin(string productName, decimal amount, string guid, string notifyUrl) { WxPayConfig.APPID = "wx7d306eb1fef3c5eb"; WxPayConfig.MCHID = "1512892151"; WxPayConfig.KEY = "qUpaKcqjU5IeMJCF0q1A3AN5DKOaFMyG"; //=======【支付结果通知url】===================================== /* 支付结果通知回调url,用于商户接收支付结果 */ WxPayConfig.NOTIFY_URL = notifyUrl; //=======【商户系统后台机器IP】===================================== /* 此参数可手动配置也可在程序中自动获取 */ WxPayConfig.IP = "8.8.8.8"; //=======【代理服务器设置】=================================== /* 默认IP和端口号分别为0.0.0.0和0,此时不开启代理(如有需要才设置) */ WxPayConfig.PROXY_URL = "http://10.152.18.220:8080"; //=======【上报信息配置】=================================== /* 测速上报等级,0.关闭上报; 1.仅错误时上报; 2.全量上报 */ WxPayConfig.REPORT_LEVENL = 1; //=======【日志级别】=================================== /* 日志等级,0.不输出日志;1.只输出错误信息; 2.输出错误和正常信息; 3.输出错误信息、正常信息和调试信息 */ WxPayConfig.LOG_LEVENL = 0; var data = new WxPayData(); data.SetValue("body", productName); //商品描述 data.SetValue("attach", string.Empty); //附加数据 data.SetValue("out_trade_no", WxPayApi.GenerateOutTradeNo()); //随机字符串 data.SetValue("total_fee", Convert.ToInt32(amount * 100)); //总金额 data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); //交易起始时间 data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); //交易结束时间 data.SetValue("goods_tag", "jjj"); //商品标记 data.SetValue("trade_type", "APP"); //交易类型 data.SetValue("product_id", "productId"); //商品ID string url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; //检测必填参数 if (!data.IsSet("out_trade_no")) { throw new WxPayException("缺少统一支付接口必填参数out_trade_no!"); } if (!data.IsSet("body")) { throw new WxPayException("缺少统一支付接口必填参数body!"); } if (!data.IsSet("total_fee")) { throw new WxPayException("缺少统一支付接口必填参数total_fee!"); } if (!data.IsSet("trade_type")) { throw new WxPayException("缺少统一支付接口必填参数trade_type!"); } //关联参数 if (data.GetValue("trade_type").ToString() == "JSAPI" && !data.IsSet("openid")) { throw new WxPayException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!"); } if (data.GetValue("trade_type").ToString() == "NATIVE" && !data.IsSet("product_id")) { throw new WxPayException("统一支付接口中,缺少必填参数product_id!trade_type为JSAPI时,product_id为必填参数!"); } //异步通知url未设置,则使用配置文件中的url if (!data.IsSet("notify_url")) { data.SetValue("notify_url", WxPayConfig.NOTIFY_URL);//异步通知url } data.SetValue("appid", WxPayConfig.APPID); //公众账号ID data.SetValue("mch_id", WxPayConfig.MCHID); //商户号 data.SetValue("spbill_create_ip", WxPayConfig.IP); //终端ip data.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", "")); //随机字符串 //签名 data.SetValue("sign", data.MakeSign()); var xml = data.ToXml(); var response = HttpService.Post(xml, url, false, 6); var result = new WxPayData(); result.FromXml(response); //"request": "<xml><appid><![CDATA[wx7d306eb1fef3c5eb]]></appid><attach><![CDATA[]]></attach><body><![CDATA[producta]]></body><goods_tag><![CDATA[jjj]]></goods_tag><mch_id><![CDATA[1512892151]]></mch_id><nonce_str><![CDATA[152b6698c8f44b9b9aa16f471c3e27b2]]></nonce_str><notify_url><![CDATA[http://cms.chinacampus.org/api/plugins/SS.Magazine/WeiXinNotify]]></notify_url><out_trade_no><![CDATA[151289215120180830085619872]]></out_trade_no><product_id><![CDATA[productId]]></product_id><sign><![CDATA[A4BF095E298130577E98F8CAAEBB496D]]></sign><spbill_create_ip><![CDATA[8.8.8.8]]></spbill_create_ip><time_expire><![CDATA[20180830090619]]></time_expire><time_start><![CDATA[20180830085619]]></time_start><total_fee>100</total_fee><trade_type><![CDATA[APP]]></trade_type></xml>", //"response": "<xml><return_code><![CDATA[SUCCESS]]></return_code>\n<return_msg><![CDATA[OK]]></return_msg>\n<appid><![CDATA[wx7d306eb1fef3c5eb]]></appid>\n<mch_id><![CDATA[1512892151]]></mch_id>\n<nonce_str><![CDATA[JL38tGchjgYcDECR]]></nonce_str>\n<sign><![CDATA[BD9DD927EDF0020E519B94FF0ABCD100]]></sign>\n<result_code><![CDATA[SUCCESS]]></result_code>\n<prepay_id><![CDATA[wx300856189223833b9ee467051757080666]]></prepay_id>\n<trade_type><![CDATA[APP]]></trade_type>\n</xml>" //Log.Info(GetType().ToString(), "ChargeByWeixin : " + response); //Log.Info(GetType().ToString(), "notify_url : " + data.GetValue("notify_url")); var appid = result.GetValue("appid"); var mch_id = result.GetValue("mch_id"); var nonce_str = result.GetValue("nonce_str"); var sign = result.GetValue("sign"); var prepay_id = result.GetValue("prepay_id"); return(new { appid, mch_id, nonce_str, sign, prepay_id, guid }); }
/// <summary> /// 创建升级支付订单 /// </summary> /// <param name="code"></param> /// <param name="userID"></param> /// <returns></returns> public object CreateUpGradeOrder(string code, string userID) { //1.调用小程序登录API,获取openID IConfig config = new ConfigMiniPersonal(); WeChatMinApi miniApi = new WeChatMinApi(config); Jscode2sessionResult openIDResule = miniApi.Jscode2session(code); if (openIDResule == null || string.IsNullOrWhiteSpace(openIDResule.OpenID)) { return(new { retCode = "Error", retMsg = "无法获取openID,请确认code是否正确", objectData = "" }); } //using (ApplicationDbContext db = new ApplicationDbContext()) //{ // //防止用户重复提交订单,把Vip状态设为升级中 // var vip = db.Vips.FirstOrDefault(s => s.UserID == userID); // vip.State = Common.Enums.VipState.Uploading; // db.SaveChanges(); //} string OrderCode = CreateOrderCode(userID); //创建订单号 decimal Amount = Comm.UpGradeAmount(); //升级费用 if (string.IsNullOrEmpty(OrderCode)) { return(new { retCode = "Error", retMsg = "订单号生成失败", objectData = "" }); } //2.调用支付统一下单API #region 调用支付统一下单API UnifiedPayData payData = new UnifiedPayData() { attach = string.Empty, body = "个人升级成为VIP,提交支付费用", goods_tag = string.Empty, openid = openIDResule.OpenID, out_trade_no = OrderCode, total_fee = (int)Amount * 100, //total_fee = 1,//测试10分订单 trade_type = "JSAPI" }; RequestResult payResult = payment.GetUnifiedOrderResult(payData); WxPayData payreturnData = payResult.objectData; if (payResult.retCode != ReqResultCode.success || payreturnData == null) { return(new { retCode = "Error", retMsg = "请求微信支付统一下单失败", objectData = "" }); } #endregion //3.生成商户订单 #region 生成商户订单 int rows = 0; using (ApplicationDbContext db = new ApplicationDbContext()) { //2.生成商户订单 Order order = new Order() { Amount = 0, Code = OrderCode, ReceivableAmount = Amount, State = Common.Enums.OrderState.UnHandle, Channel = Common.Enums.PayChannel.WxPay, Type = Common.Enums.OrderType.Receivable, UserID = userID, CreateDateTime = DateTime.Now, PayCode = string.Empty, PayInput = JsonConvert.SerializeObject(payData) }; db.Orders.Add(order); rows = db.SaveChanges(); } if (rows <= 0) { return(new { retCode = "Error", retMsg = "保存订单数据失败", objectData = "" }); } #endregion //4.返回支付参数:5个参数,生成签名再返回 System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 当地时区 long ts = (long)(DateTime.Now - startTime).TotalSeconds; // 相差秒数 System.Text.StringBuilder paySignpar = new System.Text.StringBuilder(); paySignpar.Append($"appId={payreturnData.GetValue("appid")?.ToString()}"); paySignpar.Append($"&nonceStr={payreturnData.GetValue("nonce_str")?.ToString()}"); paySignpar.Append($"&package=prepay_id={payreturnData.GetValue("prepay_id")?.ToString()}"); paySignpar.Append($"&signType=MD5"); paySignpar.Append($"&timeStamp={ts.ToString()}"); paySignpar.Append($"&key={ConfigurationManager.AppSettings["wxPayKey"] ?? string.Empty}"); string strPaySignpar = paySignpar.ToString(); var sign = GetMd5Hash(strPaySignpar).ToUpper(); dynamic retModel = new { timeStamp = ts.ToString(), nonceStr = payreturnData.GetValue("nonce_str")?.ToString(), package = "prepay_id=" + payreturnData.GetValue("prepay_id")?.ToString(), signType = "MD5", paySign = sign, total_fee = payData.total_fee / 100m, }; return(new { retCode = "Success", retMsg = "成功", objectData = retModel }); }
/// <summary> /// 支付回调 /// </summary> /// <returns></returns> public ContentResult WxNotify() { //接收从微信后台POST过来的数据 System.IO.Stream s = Request.InputStream; int count = 0; byte[] buffer = new byte[1024]; StringBuilder builder = new StringBuilder(); while ((count = s.Read(buffer, 0, 1024)) > 0) { builder.Append(Encoding.UTF8.GetString(buffer, 0, count)); } s.Flush(); s.Close(); s.Dispose(); //转换数据格式并验证签名 WxPayData notifyData = new WxPayData(); WxPayData res = new WxPayData(); try { notifyData.FromXml(builder.ToString()); } catch (WxPayException ex) { //若签名错误,则立即返回结果给微信支付后台 res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", ex.Message); return(Content(res.ToXml())); } //检查支付结果中transaction_id是否存在 if (!notifyData.IsSet("transaction_id")) { //若transaction_id不存在,则立即返回结果给微信支付后台 res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "支付结果中微信订单号不存在"); return(Content(res.ToXml())); } string transaction_id = notifyData.GetValue("transaction_id").ToString(); string out_trade_no = notifyData.GetValue("out_trade_no").ToString(); //查询订单,判断订单真实性 if (!QueryOrder(transaction_id)) { //若订单查询失败,则立即返回结果给微信支付后台 res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "订单查询失败"); } //查询订单成功 else { var orderService = new OrderService(); var result = orderService.Complete(out_trade_no); if (result.Code == ResultCode.Error) { res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "订单查询失败"); } else { res.SetValue("return_code", "SUCCESS"); res.SetValue("return_msg", "OK"); } } return(Content(res.ToXml())); }
/** * * 获取收货地址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; }
public override void ProcessNotify(UpdateOrderStateHandler UpdateOrderState, string appId) { var WxPayConfig = Configuration.GetAppPayConfig <Config.Sections.Pay.WXPay>(appId); WxPayData notifyData = GetNotifyData(WxPayConfig.KEY); //检查openid和product_id是否返回 if (!notifyData.IsSet("openid") || !notifyData.IsSet("product_id")) { WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "回调数据异常"); Log.Info(this.GetType().ToString(), "The data WeChat post is error : " + res.ToXml()); HttpContext.Current.Response.Write(res.ToXml()); HttpContext.Current.Response.End(); } //调统一下单接口,获得下单结果 string openid = notifyData.GetValue("openid").ToString(); string product_id = notifyData.GetValue("product_id").ToString(); WxPayData unifiedOrderResult = new WxPayData(); try { unifiedOrderResult = UnifiedOrder(openid, product_id, appId); } catch (Exception ex)//若在调统一下单接口时抛异常,立即返回结果给微信支付后台 { WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "统一下单失败"); Log.Error(this.GetType().ToString(), "UnifiedOrder failure : " + res.ToXml()); HttpContext.Current.Response.Write(res.ToXml()); HttpContext.Current.Response.End(); } //若下单失败,则立即返回结果给微信支付后台 if (!unifiedOrderResult.IsSet("appid") || !unifiedOrderResult.IsSet("mch_id") || !unifiedOrderResult.IsSet("prepay_id")) { WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "统一下单失败"); Log.Error(this.GetType().ToString(), "UnifiedOrder failure : " + res.ToXml()); HttpContext.Current.Response.Write(res.ToXml()); HttpContext.Current.Response.End(); } //统一下单成功,则返回成功结果给微信支付后台 WxPayData data = new WxPayData(); data.SetValue("return_code", "SUCCESS"); data.SetValue("return_msg", "OK"); data.SetValue("appid", WxPayConfig.APPID); data.SetValue("mch_id", WxPayConfig.MCHID); data.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); data.SetValue("prepay_id", unifiedOrderResult.GetValue("prepay_id")); data.SetValue("result_code", "SUCCESS"); data.SetValue("err_code_des", "OK"); data.SetValue("sign", data.MakeSign(WxPayConfig.KEY)); Log.Info(this.GetType().ToString(), "UnifiedOrder success , send data to WeChat : " + data.ToXml()); HttpContext.Current.Response.Write(data.ToXml()); HttpContext.Current.Response.End(); }
public static string SendRequest(PayInfo pay, PayConfig config) { IDictionary <string, string> dictionary = new Dictionary <string, string>(); WxPayData wxPayData = new WxPayData(); wxPayData.SetValue("auth_code", pay.Attach); wxPayData.SetValue("body", pay.OutTradeNo); WxPayData wxPayData2 = wxPayData; decimal totalFee = pay.TotalFee; wxPayData2.SetValue("total_fee", int.Parse(totalFee.ToString())); wxPayData.SetValue("out_trade_no", pay.OutTradeNo); dictionary.Add("auth_code", pay.AuthCode); dictionary.Add("body", pay.OutTradeNo); IDictionary <string, string> dictionary2 = dictionary; totalFee = pay.TotalFee; dictionary2.Add("total_fee", totalFee.ToString()); dictionary.Add("out_trade_no", pay.OutTradeNo); dictionary.Add("AppId", config.AppId); dictionary.Add("AppSecret", config.AppSecret); dictionary.Add("MchID", config.MchID); dictionary.Add("Key", config.Key); dictionary.Add("NOTIFY_URL", config.NOTIFY_URL); WxPayData wxPayData3 = WxPayApi.Micropay(wxPayData, config, 10); if (!wxPayData3.IsSet("return_code") || wxPayData3.GetValue("return_code").ToString() == "FAIL") { string msg = wxPayData3.IsSet("return_msg") ? wxPayData3.GetValue("return_msg").ToString() : ""; WxPayLog.writeLog(dictionary, "", HttpContext.Current.Request.Url.ToString(), msg, LogType.MicroPay); } wxPayData3.CheckSign(config.Key); if (wxPayData3.GetValue("return_code").ToString() == "SUCCESS" && wxPayData3.GetValue("result_code").ToString() == "SUCCESS") { return(wxPayData3.ToPrintStr()); } if (wxPayData3.GetValue("err_code").ToString() != "USERPAYING" && wxPayData3.GetValue("err_code").ToString() != "SYSTEMERROR") { return(wxPayData3.ToPrintStr()); } string out_trade_no = wxPayData.GetValue("out_trade_no").ToString(); int num = 10; while (num-- > 0) { int num3 = 0; WxPayData wxPayData4 = MicroPay.Query(out_trade_no, config, out num3); switch (num3) { case 2: break; case 1: return(wxPayData4.ToPrintStr()); default: return(wxPayData3.ToPrintStr()); } Thread.Sleep(2000); } if (!MicroPay.Cancel(out_trade_no, config, 0)) { WxPayLog.writeLog(dictionary, "", HttpContext.Current.Request.Url.ToString(), "支付失败并且撤销订单失败", LogType.MicroPay); throw new WxPayException("Reverse order failure!"); } return(wxPayData3.ToPrintStr()); }
public ActionResult ToOrder(Enums.Enums.OrderType body, RechargeType type, string userID) { if (!db.tb_userinfos.Any(s => s.UserID == userID)) { return(Json(Comm.ToJsonResult("Error", "用户不存在"), JsonRequestBehavior.AllowGet)); } if (body != Enums.Enums.OrderType.Recharge && body != Enums.Enums.OrderType.OrderPay) { return(Json(Comm.ToJsonResult("Error", "请求参数错误"), JsonRequestBehavior.AllowGet)); } if (type != Enums.Enums.RechargeType.Fifty && type != Enums.Enums.RechargeType.FiveHundred && type != Enums.Enums.RechargeType.Hundred && type != Enums.Enums.RechargeType.Ten && type != Enums.Enums.RechargeType.Thirty && type != Enums.Enums.RechargeType.TwoHundred) { return(Json(Comm.ToJsonResult("Error", "请求参数错误"), JsonRequestBehavior.AllowGet)); } WxPayData parmdata = new WxPayData(); string out_trade_no = WxPayApi.GenerateOutTradeNo(); parmdata.SetValue("body", ((Enums.Enums.OrderType)body).GetDisplayName()); //商品描述 parmdata.SetValue("attach", "逸趣网络科技有限公司"); //附加数据 parmdata.SetValue("out_trade_no", out_trade_no); //商户订单号 parmdata.SetValue("total_fee", Convert.ToInt32(type.GetDisplayName())); //总金额 * 100 parmdata.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); //交易起始时间 parmdata.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); //交易结束时间 parmdata.SetValue("goods_tag", ""); //商品标记 parmdata.SetValue("trade_type", "APP"); //交易类型 //parmdata.SetValue("product_id", productid);//商品ID WxPayData resultdata = WxPayApi.UnifiedOrder(parmdata); string resultcode = resultdata.GetValue("return_code").ToString(); if (resultcode.Equals("SUCCESS")) { string signstr = resultdata.GetValue("sign").ToString(); string noncestr = WxPayApi.GenerateNonceStr(); string result_code = resultdata.GetValue("result_code").ToString(); string prepay_id = string.Empty; if (result_code.Equals("SUCCESS")) { prepay_id = resultdata.GetValue("prepay_id").ToString(); //var stringA = $"appid={WxPayConfig.APPID}&noncestr={noncestr}&package=Sign=WXPay&partnerid={WxPayConfig.MCHID}&prepayid={prepay_id}×tamp={Unite.GenerateTimeStamp(DateTime.Now)}&key={WxPayConfig.KEY}"; //var sign = Unite.ToMD5New(stringA).ToUpper(); //保存下单信息到数据库 PayOrder model = new PayOrder(); model.OrderState = Enums.Enums.OrderState.UnHandle; model.out_trade_no = out_trade_no; model.Paynoncestr = noncestr; model.PayPrepay_id = prepay_id; model.settlement_total_fee = Convert.ToInt32(type.GetDisplayName()); model.CreateTime = DateTime.Now; model.Sign = signstr; model.total_fee = Convert.ToInt32(type.GetDisplayName()); model.User_ID = userID; model.OrderType = body; db.PayOrders.Add(model); int resultrow = db.SaveChanges(); //保存订单数据结果 if (resultrow > 0) { System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 当地时区 long ts = (long)(DateTime.Now - startTime).TotalSeconds; // 相差秒数 System.Text.StringBuilder paySignpar = new System.Text.StringBuilder(); paySignpar.Append($"appid={resultdata.GetValue("appid")?.ToString()}"); paySignpar.Append($"&noncestr={noncestr}"); paySignpar.Append($"&package=Sign=WXPay&partnerid={WxPayConfig.MCHID}"); paySignpar.Append($"&prepayid={resultdata.GetValue("prepay_id")?.ToString()}"); //paySignpar.Append($"&signType=MD5"); paySignpar.Append($"×tamp={ts.ToString()}"); paySignpar.Append($"&key={WxPayConfig.KEY ?? string.Empty}"); string strPaySignpar = paySignpar.ToString(); var sign = Unite.GetMd5Hash(strPaySignpar).ToUpper(); //dynamic retModel = new //{ // timeStamp = ts.ToString(), // nonceStr = resultdata.GetValue("nonce_str")?.ToString(), // package = "prepay_id=" + resultdata.GetValue("prepay_id")?.ToString(), // signType = "MD5", // paySign = sign, // total_fee = model.total_fee / 100m, //}; var returndata = new { result = resultcode, timestamp = ts.ToString(), prepay_id = prepay_id, noncestr = noncestr, sign = sign }; return(Json(Comm.ToJsonResult("Success", "成功", returndata), JsonRequestBehavior.AllowGet)); } else { return(Json(Comm.ToJsonResult("Error", "下单失败"), JsonRequestBehavior.AllowGet)); } } else { return(Json(Comm.ToJsonResult("Error", "下单失败"), JsonRequestBehavior.AllowGet)); } } else { return(Json(Comm.ToJsonResult("Error", "下单失败"), JsonRequestBehavior.AllowGet)); } }