/** * * 查询退款 * 提交退款申请后,通过该接口查询退款状态。退款有一定延时, * 用零钱支付的退款20分钟内到账,银行卡支付的退款3个工作日后重新查询退款状态。 * out_refund_no、out_trade_no、transaction_id、refund_id四个参数必填一个 * @param WxPayData inputObj 提交给查询退款API的参数 * @param int timeOut 接口超时时间 * @throws WxPayException * @return 成功时返回,其他抛异常 */ public static WxPayData RefundQuery(WxPayData inputObj, int timeOut = 6) { string url = "https://api.mch.weixin.qq.com/pay/refundquery"; //检测必填参数 if (!inputObj.IsSet("out_refund_no") && !inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id") && !inputObj.IsSet("refund_id")) { throw new WxPayException("退款查询接口中,out_refund_no、out_trade_no、transaction_id、refund_id四个参数必填一个!"); } inputObj.SetValue("appid", WxPayConfig.APPID); //公众账号ID inputObj.SetValue("mch_id", WxPayConfig.MCHID); //商户号 inputObj.SetValue("nonce_str", GenerateNonceStr()); //随机字符串 inputObj.SetValue("sign", inputObj.MakeSign()); //签名 string xml = inputObj.ToXml(); var start = DateTime.Now;//请求开始时间 Log.Debug("WxPayApi", "RefundQuery request : " + xml); string response = HttpService.Post(xml, url, false, timeOut);//调用HTTP通信接口以提交数据到API Log.Debug("WxPayApi", "RefundQuery response : " + response); var end = DateTime.Now; int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时 //将xml格式的结果转换为对象以返回 WxPayData result = new WxPayData(); result.FromXml(response); ReportCostTime(url, timeCost, result);//测速上报 return(result); }
/// <summary> /// 接收从微信支付后台发送过来的数据并验证签名 /// </summary> /// <returns>微信支付后台返回的数据</returns> public WxPayData GetNotifyData() { //接收从微信后台POST过来的数据 System.IO.Stream s = page.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(); Log.Info(this.GetType().ToString(), "Receive data from WeChat : " + builder.ToString()); //转换数据格式并验证签名 WxPayData data = new WxPayData(); try { data.FromXml(builder.ToString()); } catch(WxPayException ex) { //若签名错误,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", ex.Message); Log.Error(this.GetType().ToString(), "Sign check error : " + res.ToXml()); page.Response.Write(res.ToXml()); page.Response.End(); } Log.Info(this.GetType().ToString(), "Check sign success"); return data; }
/** * 下载对账单 * @param WxPayData inputObj 提交给下载对账单API的参数 * @param int timeOut 接口超时时间 * @throws WxPayException * @return 成功时返回,其他抛异常 */ public static WxPayData DownloadBill(WxPayData inputObj, int timeOut = 6) { string url = "https://api.mch.weixin.qq.com/pay/downloadbill"; //检测必填参数 if (!inputObj.IsSet("bill_date")) { throw new WxPayException("对账单接口中,缺少必填参数bill_date!"); } inputObj.SetValue("appid", WxPayConfig.APPID); //公众账号ID inputObj.SetValue("mch_id", WxPayConfig.MCHID); //商户号 inputObj.SetValue("nonce_str", GenerateNonceStr()); //随机字符串 inputObj.SetValue("sign", inputObj.MakeSign()); //签名 string xml = inputObj.ToXml(); Log.Debug("WxPayApi", "DownloadBill request : " + xml); string response = HttpService.Post(xml, url, false, timeOut);//调用HTTP通信接口以提交数据到API Log.Debug("WxPayApi", "DownloadBill result : " + response); WxPayData result = new WxPayData(); //若接口调用失败会返回xml格式的结果 if (response.Substring(0, 5) == "<xml>") { result.FromXml(response); } //接口调用成功则返回非xml格式的数据 else { result.SetValue("result", response); } return(result); }
private WxPayData GetNotifyData(HttpRequestBase Request, HttpResponseBase Response) { //接收从微信后台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 data = new WxPayData(); try { data.FromXml(builder.ToString()); } catch (WxPayException ex) { //若签名错误,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", ex.Message); ClassLoger.Error("WeChartPayCallBackController.GetNotifyData:Sign check error", res.ToXml()); Response.Write(res.ToXml()); Response.End(); } return(data); }
/// <summary> /// 接收从微信支付后台发送过来的数据并验证签名 /// </summary> /// <returns>微信支付后台返回的数据</returns> public WxPayData GetNotifyData() { //接收从微信后台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(); Log.Info(this.GetType().ToString(), "Receive data from WeChat : " + builder.ToString()); //转换数据格式并验证签名 WxPayData data = new WxPayData(); try { data.FromXml(builder.ToString()); } catch (WxPayException ex) { //若签名错误,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", ex.Message); Log.Error(this.GetType().ToString(), "Sign check error : " + res.ToXml()); return(res); } return(data); }
/// <summary> /// 查询签约关系 /// </summary> /// <param name="contract_id"></param> /// <returns></returns> public bool QueryContract(string city, string contract_id, out string outxml) { WxPayData inputObj = new WxPayData(city); inputObj.SetValue("appid", WxPayConfig.APPID(city)); inputObj.SetValue("mch_id", WxPayConfig.getMCHID(city)); inputObj.SetValue("contract_id", contract_id); inputObj.SetValue("version", "1.0"); inputObj.SetValue("sign", inputObj.MakeSign()); string url = "https://api.mch.weixin.qq.com/papay/querycontract"; string xml = inputObj.ToXml(); string result = HttpService.Post(xml, url, false, 10); WxPayData data = new WxPayData(); data.FromXml(result); outxml = result; bool isSign = false; if (data.IsSet("contract_state") && data.GetValue("contract_state").ToString() == "0") { isSign = true; } return(isSign); }
/** * * 查询订单 * @param WxPayData inputObj 提交给查询订单API的参数 * @param int timeOut 超时时间 * @throws WxPayException * @return 成功时返回订单查询结果,其他抛异常 */ public static WxPayData OrderQuery(WxPayData inputObj, int timeOut = 6) { string url = "https://api.mch.weixin.qq.com/pay/orderquery"; //检测必填参数 if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id")) { throw new WxPayException("订单查询接口中,out_trade_no、transaction_id至少填一个!"); } inputObj.SetValue("appid", SystemSet.Serviceappid); //公众账号ID inputObj.SetValue("mch_id", SystemSet.Mch_id); //商户号 inputObj.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); //随机字符串 inputObj.SetValue("sign", inputObj.MakeSign()); //签名 string xml = inputObj.ToXml(); var start = DateTime.Now; ClassLoger.DEBUG("WxPayApi", "OrderQuery request : " + xml); string response = HttpService.Post(xml, url, false, timeOut);//调用HTTP通信接口提交数据 ClassLoger.DEBUG("WxPayApi", "OrderQuery response : " + response); var end = DateTime.Now; int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时 //将xml格式的数据转化为对象以返回 WxPayData result = new WxPayData(); result.FromXml(response); ReportCostTime(url, timeCost, result);//测速上报 return(result); }
public void ProcessRequest(HttpContext context) { System.IO.Stream s = context.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(); Log.Info(this.GetType().ToString(), "从微信服务器收到数据 : " + builder.ToString()); WxPayData data = new WxPayData(); try { data.FromXml(builder.ToString()); } catch (WxPayException ex) { //若签名错误,则立即返回结果给微信支付后台 WxPayData wxres = new WxPayData(); wxres.SetValue("return_code", "FAIL"); wxres.SetValue("return_msg", ex.Message); Log.Error(this.GetType().ToString(), "Sign check error : " + wxres.ToXml()); context.Response.Write(wxres.ToXml()); context.Response.End(); } Log.Info(this.GetType().ToString(), "Check sign success"); var money = Convert.ToDouble(data.GetValue("total_fee").ToString()); var model = "record"; var id = data.GetValue("out_trade_no").ToString(); var result = JObject.Parse(sysconf.toget(model, id)); //判断订单状态为未处理,以及微信服务器返回的APPID是否正确 if (Convert.ToInt32(result["status"]) == 0 && data.GetValue("appid").ToString() == WxPayAPI.WxPayConfig.APPID) { var list = new List <Object>(); // 修改订单状态 list.Add(new { method = "PUT", path = "/mcm/api/record/" + result["id"], body = new { status = 1, //0-处理中, 1-已处理 from = data.GetValue("openid").ToString() } }); // 增加商户账户余额 string inc = "{\"$inc\":{\"balance\":" + money / 100.0 + "}}"; list.Add(new { method = "PUT", path = "/mcm/api/user/" + result["user"], body = JObject.Parse(inc) }); var res = JArray.Parse(sysconf.tobatch(list)); //打印结果 //Log.Info(this.GetType().ToString(), res.ToString()); var err = 0; for (var i = 0; i < res.Count; i++) { if (res[i]["id"] == null) { err += 1; } } if (err > 0) { Log.Error(this.GetType().ToString(), "微信服务器端处理成功,本地服务器端处理失败"); // 写入系统日志 var log = new List <Object>(); log.Add(new { method = "POST", path = "/mcm/api/log", body = new { type = 1, //0-成功,1-失败 title = "微信充值处理失败", money = money / 100.0, record = id } }); sysconf.tobatch(log); } else { Log.Info(this.GetType().ToString(), "微信充值处理成功"); // 写入系统日志 var log = new List <Object>(); log.Add(new { method = "POST", path = "/mcm/api/log", body = new { type = 0, //0-成功,1-失败 title = "微信充值处理成功", money = money / 100.0, record = id } }); sysconf.tobatch(log); WxPayData wxres1 = new WxPayData(); wxres1.SetValue("return_code", "SUCCESS"); wxres1.SetValue("return_msg", ""); context.Response.Write(wxres1.ToXml()); context.Response.End(); } } }
/// <summary> /// 微信付款到银行卡 /// </summary> public static WxPayData DoWxBankTransfer(string bankAccountNo, string wechatRealName, string bankName, decimal transferAmount, string remark, string transferNo) { string url = "https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank"; string enc_bank_no = bankAccountNo; //银行卡卡号 string enc_true_name = wechatRealName; //收款方用户名 string bank_code = bankName; //开户行 int amount = (Int32)(transferAmount * 100); //付款金额 string desc = remark; //付款说明 string partner_trade_no = transferNo; //订单编号 //https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_4&index=5 switch (bank_code) { case "工商银行": bank_code = "1002"; break; case "农业银行": bank_code = "1005"; break; case "中国银行": bank_code = "1026"; break; case "建设银行": bank_code = "1003"; break; case "招商银行": bank_code = "1001"; break; case "邮储银行": bank_code = "1066"; break; case "交通银行": bank_code = "1020"; break; case "浦发银行": bank_code = "1004"; break; case "民生银行": bank_code = "1006"; break; case "兴业银行": bank_code = "1009"; break; case "平安银行": bank_code = "1010"; break; case "中信银行": bank_code = "1021"; break; case "华夏银行": bank_code = "1025"; break; case "广发银行": bank_code = "1027"; break; case "北京银行": bank_code = "1032"; break; case "宁波银行": bank_code = "1056"; break; default: break; } int timeOut = 10; WxRSA obj = new WxRSA(); obj.getkey(); enc_bank_no = WxRSA.EncryptCSharp(enc_bank_no, "UTF-8"); enc_true_name = WxRSA.EncryptCSharp(enc_true_name, "UTF-8"); WxPayData request = new WxPayData(); request.SetValue("mch_id", WxPayConfig.MCHID); //商户号 request.SetValue("partner_trade_no", partner_trade_no); //订单号 request.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", "")); // );//随机字符串 request.SetValue("enc_bank_no", enc_bank_no); //银行卡卡号 request.SetValue("enc_true_name", enc_true_name); //收款方用户名 request.SetValue("bank_code", bank_code); //开户行编码 request.SetValue("amount", amount); //付款金额 request.SetValue("desc", desc); //付款说明 request.SetValue("sign", request.MakeSign()); //签名 string xml = request.ToXml(); //转换xml格式 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); return(result); }
} //支付成功跳转的地址 protected void Page_Load(object sender, EventArgs e) { string openid = DTRequest.GetQueryString("openid"); string order_no = DTRequest.GetQueryString("order_no"); decimal order_amount = 9.28M; //订单金额 string subject1 = "在线支付"; //订单备注1 string subject2 = "在线支付"; //订单备注2 //检查参数是否正确 if (string.IsNullOrEmpty(openid) || string.IsNullOrEmpty(order_no)) { Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode("对不起,获取OPENID参数有误!"))); return; } //JSAPI支付预处理 try { //统一下单 string sendUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder"; JsApiConfig jsApiConfig = new JsApiConfig(); WxPayData data = new WxPayData(); data.SetValue("body", subject1); //商品描述 data.SetValue("detail", subject2); //商品详情 data.SetValue("out_trade_no", order_no); //商户订单号 data.SetValue("total_fee", (Convert.ToDouble(order_amount) * 100).ToString()); //订单总金额,以分为单位 data.SetValue("trade_type", "JSAPI"); //交易类型 data.SetValue("openid", openid); //公众账号ID data.SetValue("appid", jsApiConfig.AppId); //公众账号ID data.SetValue("mch_id", jsApiConfig.Partner); //商户号 data.SetValue("nonce_str", JsApiPay.GenerateNonceStr()); //随机字符串 data.SetValue("notify_url", jsApiConfig.Notify_url); //异步通知url data.SetValue("spbill_create_ip", DTRequest.GetIP()); //终端IP data.SetValue("sign", data.MakeSign(jsApiConfig.Key)); //签名 string xml = data.ToXml(); //转换成XML var startTime = DateTime.Now; //开始时间 string response = HttpService.Post(xml, sendUrl, false, 6); //发送请求 var endTime = DateTime.Now; //结束时间 int timeCost = (int)((endTime - startTime).TotalMilliseconds); //计算所用时间 WxPayData result = new WxPayData(); result.FromXml(response, jsApiConfig.Key); JsApiPay.ReportCostTime(sendUrl, timeCost, result);//测速上报 LogHelper.WriteDebugLog("[pay]:" + result.ToString()); //获取H5调起JS API参数 WxPayData jsApiParam = new WxPayData(); jsApiParam.SetValue("appId", result.GetValue("appid")); jsApiParam.SetValue("timeStamp", JsApiPay.GenerateTimeStamp()); jsApiParam.SetValue("nonceStr", JsApiPay.GenerateNonceStr()); jsApiParam.SetValue("package", "prepay_id=" + result.GetValue("prepay_id")); jsApiParam.SetValue("signType", "MD5"); jsApiParam.SetValue("paySign", jsApiParam.MakeSign(jsApiConfig.Key)); wxJsApiParam = jsApiParam.ToJson(); LogHelper.WriteDebugLog("[ApiParam]:" + jsApiParam.ToJson()); //支付成功后跳转的URL returnUrl = new Web.UI.BasePage().linkurl("payment", "?action=succeed&order_no=" + order_no); //Response.Redirect(returnUrl); } catch (Exception ex) { Response.Redirect(new Web.UI.BasePage().linkurl("error", "?msg=" + Utils.UrlEncode(ex.Message))); return; } }
protected void Page_Load(object sender, EventArgs e) { //读取站点配置信息 Model.sysconfig sysConfig = new BLL.sysconfig().loadConfig(); int site_payment_id = 0; //订单支付方式 //=============================获得订单信息================================ 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; } site_payment_id = model.payment_id; //站点支付方式ID } 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; } site_payment_id = model.payment_id; //站点支付方式ID } if (user_name != "") { user_name = "支付会员:" + user_name; } else { user_name = "匿名用户"; } //===========================调用统一下单接口============================== string sendUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder"; NativeConfig nativeConfig = new NativeConfig(site_payment_id); WxPayData data = new WxPayData(); data.SetValue("body", user_name); //商品描述 data.SetValue("detail", sysConfig.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(site_payment_id, 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 static Dictionary <string, string> APPWxPayUnifiedorder(string trade_no, string body, string total_fee, bool IsOrder = true, bool IsChongZhi = false) { string url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; string wx_appid = PaymentConfig.WeiXinConfig.MobileAppID; string wx_mch_id = PaymentConfig.WeiXinConfig.MobileMCHID; string notify_url = string.Empty; if (IsChongZhi) { notify_url = WeixinConfig.app_chongzhi_notify_url; } else if (IsOrder) { notify_url = WeixinConfig.app_notify_url; } //统一下单 WxPayData data = new WxPayData(); data.SetValue("body", body); data.SetValue("attach", "test"); data.SetValue("out_trade_no", trade_no); data.SetValue("total_fee", total_fee); data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); data.SetValue("goods_tag", "yongyouapp"); data.SetValue("trade_type", "APP"); data.SetValue("notify_url", notify_url); //异步通知url data.SetValue("appid", wx_appid); //公众账号ID data.SetValue("mch_id", wx_mch_id); //商户号 data.SetValue("spbill_create_ip", WxPayConfig.IP); //终端ip data.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); //随机字符串 data.SetValue("sign", data.MakeAPPSign()); string xml = data.ToXml(); string response = HttpService.Post(xml, url, false, 6); WxPayData result = new WxPayData(); result.FromXml(response); if (!result.IsSet("appid") || !result.IsSet("prepay_id") || result.GetValue("prepay_id").ToString() == "") { throw new Exception("UnifiedOrder response error!"); } WxPayData appApiParam = new WxPayData(); appApiParam.SetValue("appid", wx_appid); appApiParam.SetValue("partnerid", wx_mch_id); appApiParam.SetValue("prepayid", result.GetValue("prepay_id")); appApiParam.SetValue("package", "Sign=WXPay"); appApiParam.SetValue("noncestr", WxPayApi.GenerateNonceStr()); appApiParam.SetValue("timestamp", WxPayApi.GenerateTimeStamp()); //appApiParam.SetValue("signType", "MD5"); appApiParam.SetValue("sign", appApiParam.MakeAPPSign()); //通信成功 var res = new Dictionary <string, string> { { "appid", appApiParam.GetValue("appid").ToString() }, { "partnerid", appApiParam.GetValue("partnerid").ToString() }, { "prepayid", appApiParam.GetValue("prepayid").ToString() }, { "package", appApiParam.GetValue("package").ToString() }, { "noncestr", appApiParam.GetValue("noncestr").ToString() }, { "timestamp", appApiParam.GetValue("timestamp").ToString() }, { "sign", appApiParam.GetValue("sign").ToString() } }; //在服务器上签名 return(res); }
public void WxRefundNotify() { WxPayData res = new WxPayData(); try { Notify notify = new Notify(this); WxPayData notifyData = notify.GetRefundNotifyData(); if (!notifyData.IsSet("return_code") || notifyData.GetValue("return_code").ToString() != "SUCCESS") { goto TheEnd; } // 回调通知成功,取得密文 var reqCiphertext = notifyData.GetValue("req_info").ToString(); // 解密 var key = MD5Helper.ToMd5Bit32(PayConfig.WxKey()); var clearText = MD5Helper.AESDecrypt(reqCiphertext, key); //转换数据格式 WxPayData reqCipherData = new WxPayData(); try { reqCipherData.FromXml(clearText, false); } catch (WxPayException) { } var refundStatus = reqCipherData.GetValue("refund_status").ToString(); var otherRefundNum = reqCipherData.GetValue("out_refund_no").ToString(); var refundNo = reqCipherData.GetValue("out_trade_no").ToString(); if (refundStatus.ToUpper() == "SUCCESS") { // 修改订单状态 ResultModel <Bis_Record> result = new RecordService().ModifyOrderStatusRefund(refundNo, otherRefundNum); if (result.status > 0) { if (result.data != null) { // 修改退款单状态 new RefundService().UpdateRefundStatus(result.data.RecordID, otherRefundNum, Order_Status.Refunded); // 退款成功,修改订单状态成功之后 // 推送微信通知消息 SendMsgRefund(result.data); } res.SetValue("return_code", "SUCCESS"); res.SetValue("return_msg", "OK"); Response.Write(res.ToXml()); Response.End(); return; } } TheEnd: res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "FAIL"); Response.Write(res.ToXml()); Response.End(); } catch (Exception ex) { res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "FAIL"); Response.Write(res.ToXml()); Response.End(); MYLog.Error("退款回调", ex.ToString()); } }
public PaymentCallback Notify(RenderContext context) { string postdata = context.Request.Body; var result = new PaymentCallback(); if (context.Request.Method == "GET") { result.RawData = context.Request.RawRelativeUrl; } else { result.RawData = postdata; } WxPayData data = new WxPayData(); try { data.FromXml(postdata); } catch (WxPayException ex) { //若签名错误,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", ex.Message); // Log.Error(this.GetType().ToString(), "Sign check error : " + res.ToXml()); // page.Response.Write(res.ToXml()); // page.Response.End(); result.CallbackResponse = new CallbackResponse() { Content = res.ToXml(), ContentType = "Application/Xml" }; return(result); } // Log.Info(this.GetType().ToString(), "Check sign success"); // return data; //检查支付结果中transaction_id是否存在 if (!data.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(); result.CallbackResponse = new CallbackResponse() { Content = res.ToXml(), ContentType = "Application/Xml" }; return(result); } var obj = data.GetValue("out_trade_no"); Guid RequestId; if (obj == null || !System.Guid.TryParse(obj.ToString(), out RequestId)) { WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "订单查询失败"); result.CallbackResponse = new CallbackResponse() { Content = res.ToXml(), ContentType = "Application/Xml" }; return(result); } else { WxPayData res = new WxPayData(); res.SetValue("return_code", "SUCCESS"); res.SetValue("return_msg", "OK"); result.CallbackResponse = new CallbackResponse() { Content = res.ToXml(), ContentType = "Application/Xml" }; result.RequestId = RequestId; var objcode = data.GetValue("result_code"); if (objcode != null) { string code = objcode.ToString().ToUpper(); if (code == "SUCCESS") { result.Status = PaymentStatus.Paid; } if (code == "FAIL") { result.Status = PaymentStatus.Rejected; } //业务结果 result_code 是 String(16) SUCCESS SUCCESS/ FAIL } return(result); } }
protected void btnSumit_Click(object sender, EventArgs e) { StringBuilder sb = new StringBuilder(); sb.Append(@" select * from Finance where id= @ID "); SqlParam[] param = new SqlParam[] { new SqlParam("@ID", hdId.Value) }; DataTable dt = DataFactory.SqlDataBase().GetDataTableBySQL(sb, param); if (dt != null && dt.Rows.Count > 0) { string adminHotelid = dt.Rows[0]["AdminHotelid"].ToString(); int hotelid = CommonHelper.GetInt(dt.Rows[0]["HotelId"].ToString()); string orderNum = dt.Rows[0]["Number"].ToString(); string name = dt.Rows[0]["Name"].ToString(); string phone = dt.Rows[0]["Phone"].ToString(); string memberId = dt.Rows[0]["MemberId"].ToString(); string openid = dt.Rows[0]["openid"].ToString(); int money = CommonHelper.GetInt(dt.Rows[0]["Monery"].ToString());//订单金额 double cancel_money = CommonHelper.GetDouble(txtMoney.Text);//取消金额 if (cancel_money > money) { ShowMsgHelper.Alert_Error("操作失败,退回金额不能大于订单支付金额!"); return; } if (cancel_money > 0)//退回金额 { switch (hdPayType.Value) { case "1": //到店支付 break; case "2": //积分兑换 break; case "3": //会员卡支付 break; case "4": //微信支付 #region ******** 微信原路退回 ******** try { string transaction_id = dt.Rows[0]["wxddh"].ToString(); if (transaction_id == "") { ShowMsgHelper.Alert_Error("操作失败,未找到微信支付单号!"); return; } string ssl_path = WxPayConfig.SSLCERT_PATH(adminHotelid, hotelid); if (ssl_path == "") { ShowMsgHelper.Alert_Error("操作失败,请联系开发人员配置API证书!"); return; } //判断文件的存在 if (System.IO.File.Exists(HttpContext.Current.Server.MapPath("~" + ssl_path))) { //存在文件 } else { ShowMsgHelper.Alert_Error("操作失败,API证书不存在!"); return; } string total_fee = (money * 100).ToString(); string refund_fee = (cancel_money * 100).ToString(); string result = Refund.Run(transaction_id, orderNum, total_fee, refund_fee, adminHotelid, hotelid); WxPayData data = new WxPayData(); data.FromXml(result); //把XML转换成对象 string GetReturnCode = data.GetValue("return_code").ToString(); if (GetReturnCode == "SUCCESS") { string GetResultCode = data.GetValue("result_code").ToString(); if (GetResultCode == "SUCCESS") { string refund_id = data.GetValue("refund_id").ToString(); Dictionary <string, object> datas = new Dictionary <string, object>(); datas.Add("transaction_id", data.GetValue("transaction_id")); //微信订单号 datas.Add("out_trade_no", data.GetValue("out_trade_no")); //商户订单号 datas.Add("out_refund_no", data.GetValue("out_refund_no")); //商户退款单号 datas.Add("refund_id", data.GetValue("refund_id")); //微信退款单号 //财务记录 int iVal = CommonClass.InsertFinance(orderNum, name, phone, cancel_money, 41, "充值退款", memberId, transaction_id, adminHotelid, hotelid, refund_id, openid); if (iVal > 0) { try { Hashtable hs = new Hashtable(); hs["vipkh"] = dt.Rows[0]["Phone"]; hs["bmcode"] = "99"; hs["yddh"] = orderNum; hs["je"] = CommonHelper.GetDouble(cancel_money); //hs["fhcs"] = "T"; hs["OUT_fhcs"] = null; Hashtable rs = new Hashtable(); DataFactory.SqlDataBase(adminHotelid).ExecuteByProcReturn("PROC_WXCZKK", hs, ref rs); } catch (Exception ex) { } CommonMethod.Base_Log("充值退款", "Reservation", "ID:" + hdId.Value, "退款金额:" + cancel_money + "," + txtReason.Text, "订单编号:" + orderNum); } } else { //https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_4 if (GetResultCode == "NOTENOUGH") //余额不足 { ShowMsgHelper.ShowScript("cancelTips()"); return; } ShowMsgHelper.Alert_Error("操作失败," + data.GetValue("err_code_des") + "!"); return; } } else { ShowMsgHelper.Alert_Error("签名验证失败!"); return; } } catch (Exception ex) { ShowMsgHelper.Alert_Error("操作错误,签名验证失败"); return; } #endregion break; default: ShowMsgHelper.Alert_Error("操作失败!"); return; break; } } Hashtable ht = new Hashtable(); //ht["CancelNumber"] = cancel_night; ht["CancelTime"] = DateTime.Now; //string qxtxt = cancel_night + "间夜"; CommonMethod.Base_Log("充值退款", "Finance", "ID:" + hdId.Value, "退款原因:" + txtReason.Text, "订单编号:" + orderNum); //int val = DataFactory.SqlDataBase().UpdateByHashtable("Reservation", "id", hdId.Value, ht); //if (val > 0) //{ ShowMsgHelper.OpenClose("退款成功!"); //} } }
//private ILogger _logger; //public UnifiedOrderResponse UnifiedOrder(UnifiedOrderRequest request) //{ // //_logger = new LoggerFactory().SetCurrent(new Log4NetLoggerFactory("Wechat_Verify")).CreateLogger(); // UnifiedOrderResponse resp = new UnifiedOrderResponse(); // //统一下单 // try // { // //_logger.Debug("exPay:in"); // WxPayData data = new WxPayData(); // data.SetValue("body", request.Body); // data.SetValue("attach", request.Attach); // data.SetValue("out_trade_no", request.OutTradeNo); // data.SetValue("total_fee", request.TotalFee); // data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); // data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); // data.SetValue("goods_tag", request.GoodTag); // data.SetValue("trade_type", request.TradeType); // data.SetValue("openid", request.OpenId); // data.SetValue("notify_url", request.NotifyUrl);//异步通知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", WxPayApi.GenerateNonceStr());//随机字符串 // //签名 // data.SetValue("sign", data.MakeSign()); // string xml = data.ToXml(); // LogHelp.WriteLog(DateTime.Now + "payInxml:" + xml); // RestClient client = new RestClient("https://api.mch.weixin.qq.com/pay/unifiedorder"); // RestRequest req = new RestRequest(Method.POST); // req.RequestFormat = DataFormat.Xml; // req.AddParameter("text/xml", xml, ParameterType.RequestBody); // var content = client.Execute(req).Content; // LogHelp.WriteLog(DateTime.Now + "payIn:" + content); // WxPayData result = new WxPayData(); // result.FromXml(content); // if (!result.IsSet("appid") || !result.IsSet("prepay_id") || result.GetValue("prepay_id").ToString() == "") // { // resp.Success = false; // if (result.IsSet("return_msg")) // { // resp.ErrMsg = (string)result.GetValue("return_msg"); // } // return resp; // } // resp.Success = (string)result.GetValue("return_code") == "SUCCESS"; // if (!resp.Success) // { // resp.ErrMsg = (string)result.GetValue("return_msg"); // return resp; // } // else // resp.ErrMsg = string.Empty; // resp.AppId = (string)result.GetValue("appid"); // resp.MchId = (string)result.GetValue("mch_id"); // resp.NonceStr = (string)result.GetValue("nonce_str"); // resp.Sign = (string)result.GetValue("sign"); // resp.PrepayId = (string)result.GetValue("prepay_id"); // resp.TradeType = (string)result.GetValue("trade_type"); // } // catch (Exception ex) // { // LogHelp.WriteLog(DateTime.Now + "UnifiedOrderError:" + ex.Message); // } // return resp; //} //public RefundOrderResponse RefundOrder(RefundOrderRequest request) //{ // RefundOrderResponse resp = new RefundOrderResponse(); // RestClient client = new RestClient("https://api.mch.weixin.qq.com/secapi/pay/refund"); // X509Certificate2[] certs = new X509Certificate2[] { // new X509Certificate2(request.SSLCertRootPath + WxPayConfig.SSLCERT_PATH, WxPayConfig.SSLCERT_PASSWORD) // }; // client.ClientCertificates = new X509CertificateCollection(certs); // WxPayData data = new WxPayData(); // data.SetValue("transaction_id", request.TransactionId); // data.SetValue("out_refund_no", request.OutRefundNo); // data.SetValue("total_fee", request.TotalFee); // data.SetValue("refund_fee", request.RefundFee); // data.SetValue("op_user_id", WxPayConfig.MCHID); // data.SetValue("appid", WxPayConfig.APPID); // data.SetValue("mch_id", WxPayConfig.MCHID); // data.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); // data.SetValue("sign", data.MakeSign()); // string xml = data.ToXml(); // RestRequest req = new RestRequest(Method.POST); // req.RequestFormat = DataFormat.Xml; // req.AddParameter("text/xml", xml, ParameterType.RequestBody); // var content = client.Execute(req).Content; // WxPayData result = new WxPayData(); // result.FromXml(content); // resp.Success = (string)result.GetValue("return_code") == "SUCCESS"; // if (!resp.Success) // { // resp.ErrCode = (string)result.GetValue("err_code"); // resp.ErrMsg = (string)result.GetValue("err_code_des"); // return resp; // } // else // { // resp.ErrCode = string.Empty; // resp.ErrMsg = string.Empty; // } // resp.AppId = (string)result.GetValue("appid"); // resp.MchId = (string)result.GetValue("mch_id"); // resp.TransactionId = (string)result.GetValue("transaction_id"); // resp.OutTradeNo = (string)result.GetValue("out_trade_no"); // resp.OutRefundNo = (string)result.GetValue("out_refund_no"); // resp.RefundId = (string)result.GetValue("refund_id"); // resp.RefundChannel = (string)result.GetValue("refund_channel"); // resp.RefundFee = int.Parse((string)result.GetValue("refund_fee")); // resp.TotalFee = int.Parse((string)result.GetValue("total_fee")); // return resp; //} public WxPayData Refund(WxPayData inputObj, int timeOut = 6) { string url = "https://api.mch.weixin.qq.com/secapi/pay/refund"; //检测必填参数 if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id")) { throw new WxPayException("退款申请接口中,out_trade_no、transaction_id至少填一个!"); } else if (!inputObj.IsSet("out_refund_no")) { throw new WxPayException("退款申请接口中,缺少必填参数out_refund_no!"); } else if (!inputObj.IsSet("total_fee")) { throw new WxPayException("退款申请接口中,缺少必填参数total_fee!"); } else if (!inputObj.IsSet("refund_fee")) { throw new WxPayException("退款申请接口中,缺少必填参数refund_fee!"); } inputObj.SetValue("op_user_id", WxPayConfig.MCHID); inputObj.SetValue("appid", WxPayConfig.APPID); //公众账号ID inputObj.SetValue("mch_id", WxPayConfig.MCHID); //商户号 inputObj.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", "")); //随机字符串 inputObj.SetValue("sign", inputObj.MakeSign()); //签名 string xml = inputObj.ToXml(); var start = DateTime.Now; LogHelp.WriteLog(DateTime.Now + "Refund request:" + xml); byte[] data = System.Text.Encoding.UTF8.GetBytes(xml); HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(url); webrequest.Method = "POST"; webrequest.ContentType = "application/x-www-form-urlencoded"; webrequest.Timeout = 6 * 1000;; webrequest.ContentLength = data.Length; //string path = "/cert/apiclient_cert.p12"; X509Certificate2 cert = new X509Certificate2(WxPayConfig.SSLCERT_PATH, WxPayConfig.SSLCERT_PASSWORD); webrequest.ClientCertificates.Add(cert); webrequest.KeepAlive = false; webrequest.ProtocolVersion = HttpVersion.Version10; Stream stream = webrequest.GetRequestStream(); stream.Write(data, 0, data.Length); stream.Close(); HttpWebResponse webresponse = (HttpWebResponse)webrequest.GetResponse(); StreamReader sr = new StreamReader(webresponse.GetResponseStream(), Encoding.UTF8); string response = sr.ReadToEnd(); //string response = HttpService.Post(xml, url, true, timeOut);//调用HTTP通信接口提交数据到API LogHelp.WriteLog(DateTime.Now + "Refund response:" + response); var end = DateTime.Now; int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时 //将xml格式的结果转换为对象以返回 WxPayData result = new WxPayData(); result.FromXml(response); return(result); }
/// <summary> /// 微信支付回调 /// </summary> /// <returns></returns> public string wx() { Stream s = System.Web.HttpContext.Current.Request.InputStream; byte[] b = new byte[s.Length]; s.Read(b, 0, (int)s.Length); string postStr = Encoding.UTF8.GetString(b); //解析xml WxPayData notifyData = new WxPayData(); try { notifyData.FromXml(postStr); } catch (WxPayException ex) { WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", ex.Message); return(res.ToXml()); } //检查xml数据 if (!notifyData.IsSet("transaction_id") || !notifyData.IsSet("total_fee") || !notifyData.IsSet("out_trade_no")) { WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "缺少参数"); return(res.ToXml()); } string transaction_id = notifyData.GetValue("transaction_id").ToString(); string out_trade_no = notifyData.GetValue("out_trade_no").ToString(); int total_fee = Convert.ToInt32(notifyData.GetValue("total_fee")); //保存日志文件 System.IO.File.WriteAllText(Server.MapPath($"~/wxpaylog/{out_trade_no}.txt"), postStr); //查询订单,判断订单真实性 if (!QueryOrder(transaction_id)) { //若订单查询失败,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "订单查询失败"); return(res.ToXml()); } //执行存储过程-发货 using (shhouseEntities ent = new shhouseEntities()) { try { ObjectParameter payresult = new ObjectParameter("payresult", typeof(int)); ObjectParameter state = new ObjectParameter("state", typeof(int)); ObjectParameter msg = new ObjectParameter("msg", typeof(string)); ent.order_pay_jjr2018(out_trade_no, 2, total_fee, payresult, state, msg); int _state = (int)state.Value; if (_state == 1) { WxPayData res = new WxPayData(); res.SetValue("return_code", "SUCCESS"); res.SetValue("return_msg", "OK"); return(res.ToXml()); } else { WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "订单处理失败"); return(res.ToXml()); } } catch (Exception e) { WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", e.Message); return(res.ToXml()); } } }
// GET: PayCommon /// <summary> /// /// </summary> /// <returns></returns> public ActionResult Notify() { Edu.Tools.LogHelper.Info("开始执行微信回调"); Response.ContentType = "text/plain"; Response.Write("Hello World"); string xmlData = getPostStr();//获取请求数据 Edu.Tools.LogHelper.Info("微信回调数据" + xmlData); //转换数据格式并验证签名 WxPayData data = new WxPayData(); try { data.FromXml(xmlData); } catch (WxPayException ex) { //若签名错误,则立即返回结果给微信支付后台 WxPayData ress = new WxPayData(); ress.SetValue("return_code", "FAIL"); ress.SetValue("return_msg", ex.Message); } Edu.Tools.LogHelper.Info("result_code:" + data.IsSet("result_code").ToString()); //只有return_code为SUCCESS时才返回result_code if (data.IsSet("result_code")) { string transaction_id = data.GetValue("transaction_id").ToString(); string out_trade_no = data.GetValue("out_trade_no").ToString(); string result_code = data.GetValue("result_code").ToString(); Edu.Tools.LogHelper.Info("out_trade_no:" + data.GetValue("out_trade_no").ToString()); var order = unitOfWork.DOrder.Get(p => p.out_trade_no == out_trade_no).FirstOrDefault(); Edu.Tools.LogHelper.Info("result_code:" + data.GetValue("result_code").ToString()); if (result_code == "SUCCESS") { Edu.Tools.LogHelper.Info("order:" + order.ID.ToString()); order.PayStatus = 1; } else { Edu.Tools.LogHelper.Info("order:" + order.ID.ToString()); order.PayStatus = 2; } order.transaction_id = transaction_id; unitOfWork.DOrder.Update(order); OperationResult result = unitOfWork.Save(); if (result.ResultType == OperationResultType.Success) { Edu.Tools.LogHelper.Info("保存成功:" + order.ID.ToString()); } else { Edu.Tools.LogHelper.Info("保存失败:" + order.ID.ToString()); } } //微信要求的回复格式 WxPayData res = new WxPayData(); res.SetValue("return_code", "SUCCESS"); res.SetValue("return_msg", "OK"); return(View()); }
public async Task <WeChatNotifyRequest> WeChatNotify(Stream weChatReturnData) { //接收从微信后台POST过来的数据 var s = weChatReturnData; int count; var buffer = new byte[1024]; var builder = new StringBuilder(); while ((count = s.Read(buffer, 0, 1024)) > 0) { builder.Append(Encoding.UTF8.GetString(buffer, 0, count)); } s.Flush(); s.Dispose(); var notifyData = new WxPayData(); try { notifyData.FromXml(builder.ToString()); } catch (Exception e) { var res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", e.Message); return(new WeChatNotifyRequest { IsVerify = false, PayNo = "", TradeIds = "", PayTime = "", Sign = "", Content = res.ToXml() }); } //检查支付结果中transaction_id是否存在 if (!notifyData.IsSet("transaction_id")) { //若transaction_id不存在,则立即返回结果给微信支付后台 var res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "支付结果中微信订单号不存在"); return(new WeChatNotifyRequest { IsVerify = false, PayNo = "", TradeIds = "", PayTime = "", Sign = "", Content = res.ToXml() }); } var transactionId = notifyData.GetValue("transaction_id").ToString(); var tradeIds = notifyData.GetValue("out_trade_no").ToString(); var payTime = notifyData.GetValue("time_end").ToString(); //查询订单,判断订单真实性 if (!await QueryOrder(transactionId)) { //若订单查询失败,则立即返回结果给微信支付后台 var res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "订单查询失败"); return(new WeChatNotifyRequest { IsVerify = false, PayNo = "", TradeIds = "", PayTime = "", Sign = "", Content = res.ToXml() }); } //查询订单成功 else { var res = new WxPayData(); res.SetValue("return_code", "SUCCESS"); res.SetValue("return_msg", "OK"); return(new WeChatNotifyRequest { IsVerify = true, PayNo = transactionId, TradeIds = tradeIds, PayTime = payTime, Sign = "", Content = res.ToXml() }); } }
public ActionResult PayNotifyUrl() { try { //接收从微信后台POST过来的数据 System.IO.Stream s = HttpContext.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(); //Log.Info(this.GetType().ToString(), "Receive data from WeChat : " + builder.ToString()); WxPayData res = new WxPayData(); //转换数据格式并验证签名 WxPayData data = new WxPayData(); try { data.FromXml(builder.ToString()); } catch (WxPayException ex) { //若签名错误,则立即返回结果给微信支付后台 res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", ex.Message); //Log.Error(this.GetType().ToString(), "Sign check error : " + res.ToXml()); //page.Response.Write(res.ToXml()); //page.Response.End(); return(Content(res.ToXml())); } //检查支付结果中transaction_id是否存在 if (!data.IsSet("transaction_id")) { //若transaction_id不存在,则立即返回结果给微信支付后台 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(); return(Content(res.ToXml())); } string transaction_id = data.GetValue("transaction_id").ToString(); string attach = data.GetValue("attach").ToString(); int id = int.Parse(attach); res.SetValue("return_code", "SUCCESS"); res.SetValue("return_msg", "OK"); return(Content(res.ToXml())); } catch (Exception ex) { } return(Content("")); }
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()); //获得统一下单接口返回的二维码链接 }
static void Main(string[] args) { log4net.Config.XmlConfigurator.ConfigureAndWatch( new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.config"))); Console.WriteLine("请输入微信授权码:"); string code = Console.ReadLine(); Console.WriteLine("正在支付。。。。"); CreateOrder createParam = new CreateOrder { auth_code = code.Trim(), //device_info = "test_device_id", device_info = "hlgxczs", partner_id = partner_id, nonce_str = Guid.NewGuid().ToString().Replace("-", ""), total_fee = "1", time_expire = "5", no_rebate_money = "0", spbill_create_ip = "127.0.0.1", operation_id = "0" }; var createResponeXml = CommonSDK.CommonSDK.CreateOrder(createParam, key, ltCreateOrderUrl); Log.InfoFormat("{0}", createResponeXml); Console.WriteLine(); Console.WriteLine(); Console.WriteLine(".......................下单返回......................"); Console.WriteLine(string.Format("下单返回{0}", createResponeXml)); Console.WriteLine(".......................执行查询......................"); WxPayData responseData = new WxPayData(); responseData.FromXml(createResponeXml, key); object shop_id = string.Empty; //窝窝门店ID object supplier_id = string.Empty; //窝窝商户ID object order_id = string.Empty; //窝窝流水号 shop_id = responseData.GetValue("shop_id") ?? ""; supplier_id = responseData.GetValue("supplier_id") ?? ""; order_id = responseData.GetValue("order_id") ?? ""; QueryOrder queryParam = new QueryOrder { nonce_str = Guid.NewGuid().ToString().Replace("-", ""), partner_id = partner_id, shop_id = shop_id.ToString(), supplier_id = supplier_id.ToString(), order_id = order_id.ToString() }; var queryResponeXml = CommonSDK.CommonSDK.QueryOrder(queryParam, key, ltQueryOrderUrl); Log.InfoFormat("查询返回{0}", queryResponeXml); Console.WriteLine(); Console.WriteLine(); Console.WriteLine(".......................查询返回......................"); Console.WriteLine(string.Format("{0}", queryResponeXml)); Console.ReadKey(); }
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 ActionResult WXNotify() { #region //接收从微信后台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(); Log.Info(this.GetType().ToString(), "Receive data from WeChat : " + builder.ToString()); //转换数据格式并验证签名 WxPayData data = new WxPayData(); try { data.FromXml(builder.ToString()); } catch (WxPayException ex) { //若签名错误,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", ex.Message); Log.Error(this.GetType().ToString(), "Sign check error : " + res.ToXml()); Response.Write(res.ToXml()); Response.End(); } Log.Info(this.GetType().ToString(), "Check sign success"); #endregion WriteLog("notify", "", data.ToXml() + "----" + data.GetValue("return_code")); try { ViewOrder order = new ViewOrder(); if (data.GetValue("return_code").ToString() == ("SUCCESS")) { order.Id = int.Parse(data.GetValue("attach").ToString()); OrderServiceClient osc = new OrderServiceClient(); order = osc.Get(order.Id); order.PayTime = DateTime.ParseExact(data.GetValue("time_end").ToString(), "yyyyMMddHHmmss", null); order.IsPaid = true; order.Status = 2; order.OpenID = data.GetValue("openid").ToString(); //osc.Edit(order); osc.updateEntity(order); data = new WxPayData(); data.SetValue("return_code", "SUCCESS"); data.SetValue("return_msg", "OK"); Response.Write(data.ToXml()); Response.End(); //Log.Error("成功", ""); //return RedirectToAction("viewactivity", "class", new { id = order.ClassId, isOrder = true }); //View(); } else { data = new WxPayData(); data.SetValue("return_code", "FAIL"); data.SetValue("return_msg", "FAIL"); Response.Write(data.ToXml()); Response.End(); //Log.Error("失败", ""); return(View()); } } catch (Exception ex) { WriteLog("notify", "", ex.Message); //Log.Error("错误", ""); } return(View()); }
public PayNotify GetPayNotify(string xml) { DataTable dataTable = this.ErrorTable("Notify"); DataRow dataRow = dataTable.NewRow(); dataRow["OperTime"] = DateTime.Now; PayNotify result; try { if (string.IsNullOrEmpty(xml)) { dataRow["Error"] = "InStream Null"; dataRow["Param"] = "null"; dataTable.Rows.Add(dataRow); this.WriteLog(dataTable); result = null; } else { PayNotify notifyObject = Utils.GetNotifyObject <PayNotify>(xml); WxPayData wxPayData = new WxPayData(); try { wxPayData.FromXml(xml, this._payAccount.PartnerKey); } catch (WxPayException ex) { Utils.WxPaylog("支付出错了:" + ex.Message, "_WxPaylog.txt"); } SortedDictionary <string, object> values = wxPayData.GetValues(); if (notifyObject == null || values == null || values.Keys.Count == 0 || (values.ContainsKey("return_code") && values["return_code"].ToString() == "FAIL") || (values.ContainsKey("result_code") && values["result_code"].ToString() == "FAIL")) { Utils.WxPaylog(xml, "_WxPaylog.txt"); result = null; } else { notifyObject.PayInfo = new PayInfo { SignType = "MD5", Sign = notifyObject.sign, TradeMode = 0, BankType = notifyObject.bank_type, BankBillNo = "", TotalFee = notifyObject.total_fee / 100m, FeeType = ((notifyObject.fee_type == "CNY") ? 1 : 0), NotifyId = "", TransactionId = notifyObject.transaction_id, OutTradeNo = notifyObject.out_trade_no, TransportFee = 0m, ProductFee = 0m, Discount = 1m, BuyerAlias = "" }; result = notifyObject; } } } catch (Exception ex2) { dataRow["Error"] = ex2.Message; dataRow["Param"] = xml; dataTable.Rows.Add(dataRow); this.WriteLog(dataTable); result = null; } return(result); }
} //支付成功跳转的地址 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 ActionResult Callback(FormCollection form) { try { var processor = _paymentService.LoadPaymentMethodBySystemName("Payments.WeiXin") as WeiXinPaymentProcessor; if (processor == null || !processor.IsPaymentMethodActive(_paymentSettings) || !processor.PluginDescriptor.Installed) { throw new NopException("Payments.WeiXin Not Found"); } var s = Request.InputStream; var count = 0; var buffer = new byte[1024]; var 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(); _logger.InsertLog(LogLevel.Information, GetType() + "Receive data from WeChat : " + builder); var data = new WxPayData(); data.FromXml(builder.ToString(), _weiXinPaymentSettings.AppSecret); if (!data.IsSet("product_id")) { var res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "支付结果中微信订单号不存在"); Response.Write(res.ToXml()); Response.End(); } else if (!data.IsSet("appid") || !data.IsSet("appid") || !data.IsSet("appid") || !data.IsSet("appid") || !data.IsSet("appid") || !data.IsSet("appid")) { var res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "缺少参数"); Response.Write(res.ToXml()); Response.End(); } else { var orderIdStr = data.GetValue("product_id").ToString(); int orderId; if (!int.TryParse(orderIdStr, out orderId)) { return(Content("error")); } var order = _orderService.GetOrderById(orderId); if (order == null) { var res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "订单号错误"); Response.Write(res.ToXml()); Response.End(); } else { var result = processor.Unifiedorder(orderIdStr, "宁尼可在线商城订单" + orderId, "宁尼可在线商城订单" + orderId, orderIdStr, ((int)(order.OrderTotal * 100)).ToString(CultureInfo.InvariantCulture)); var wxModel = new WxPayData(); wxModel.FromXml(result, _weiXinPaymentSettings.AppSecret); if (wxModel.IsSet("return_code") && (string)wxModel.GetValue("return_code") != "SUCCESS") { Response.Write(wxModel.ToXml()); Response.End(); } else if (!wxModel.IsSet("prepay_id")) { var res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "预支付ID 不存在"); Response.Write(res.ToXml()); Response.End(); } else { var res = new WxPayData(); res.SetValue("return_code", "SUCCESS"); res.SetValue("appid", _weiXinPaymentSettings.AppId); res.SetValue("mch_id", _weiXinPaymentSettings.MchId); res.SetValue("nonce_str", Guid.NewGuid().ToString("N")); res.SetValue("prepay_id", wxModel.GetValue("prepay_id")); res.SetValue("result_code", "SUCCESS"); var sign = res.MakeSign(_weiXinPaymentSettings.AppSecret); res.SetValue("sign", sign); Response.Write(res.ToXml()); Response.End(); } } } } catch (NopException ex) { var res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", ex.Message); Response.Write(res.ToXml()); Response.End(); } return(Content("")); }
/// <summary> /// 2-付款成功 1-未付款 3-异常 /// </summary> /// <param name="out_trade_no"></param> /// <returns></returns> public static int OrderQuery(string out_trade_no) { var exist_payment = Foresight.DataAccess.Payment.GetPaymentByTradeNo(out_trade_no); if (exist_payment == null) { return(1); } if (string.IsNullOrEmpty(exist_payment.PaymentType)) { return(1); } if (exist_payment.PaymentType.Equals(Utility.EnumModel.PaymentTypeDefine.wx.ToString())) { if (exist_payment.Status == 2) { Web.APPCode.PaymentHelper.SaveRoomFee(out_trade_no, "微信公众号微信支付", "微信支付"); return(2); } WxPayData data = new WxPayData(); data.SetValue("out_trade_no", out_trade_no); WxPayData result = WxPayApi.OrderQuery(data);//提交订单查询请求给API,接收返回数据 var sort_list = data.FromXml(result.ToXml()); var trade_state = result.GetValue("trade_state"); if (trade_state != null && trade_state.ToString() == "SUCCESS") { Web.APPCode.PaymentHelper.SaveRoomFee(out_trade_no, "微信公众号微信支付", "微信支付"); return(2); } return(1); } if (exist_payment.PaymentType.Equals(Utility.EnumModel.PaymentTypeDefine.alipay.ToString())) { if (exist_payment.Status == 2) { Web.APPCode.PaymentHelper.SaveRoomFee(out_trade_no, "微信公众号支付宝支付", "支付宝"); return(2); } return(AlipayOrderQuery(out_trade_no)); } if (exist_payment.PaymentType.Equals(Utility.EnumModel.PaymentTypeDefine.app_wx.ToString())) { if (exist_payment.Status == 2) { Web.APPCode.PaymentHelper.SaveRoomFee(out_trade_no, "APP微信支付", "微信支付"); return(2); } WxPayData data = new WxPayData(); data.SetValue("out_trade_no", out_trade_no); WxPayData result = WxPayApi.OrderQueryAPP(data);//提交订单查询请求给API,接收返回数据 var sort_list = data.FromXml(result.ToXml()); var trade_state = result.GetValue("trade_state"); if (trade_state != null && trade_state.ToString() == "SUCCESS") { Web.APPCode.PaymentHelper.SaveRoomFee(out_trade_no, "APP微信支付", "微信支付"); return(2); } return(1); } if (exist_payment.PaymentType.Equals(Utility.EnumModel.PaymentTypeDefine.app_alipay.ToString())) { if (exist_payment.Status == 2) { Web.APPCode.PaymentHelper.SaveRoomFee(out_trade_no, "APP支付宝支付", "支付宝"); return(2); } return(AlipayAPPOrderQuery(out_trade_no)); } return(1); }
public ActionResult ProcessPayment(FormCollection form) { var model = new WeiXinPaymentModel(Path.Combine(_webHelper.GetStoreHost(_webHelper.IsCurrentConnectionSecured()), "Plugins/PaymentWeiXin/QueryOrder")); var error = new WeiXinPaymentErrorModel(); var processor = _paymentService.LoadPaymentMethodBySystemName("Payments.WeiXin") as WeiXinPaymentProcessor; if (processor == null || !processor.IsPaymentMethodActive(_paymentSettings) || !processor.PluginDescriptor.Installed) { error.Message = "微信支付服务终止"; } else { try { if (form.HasKeys()) { if (!string.IsNullOrWhiteSpace(form["result"])) { var wxModel = new WxPayData(); wxModel.FromXml(HttpUtility.HtmlDecode(form["result"]), _weiXinPaymentSettings.AppSecret); if (wxModel.IsSet("code_url")) { model.QRCode = processor.GetQrCode(wxModel.GetValue("code_url").ToString()); if (!string.IsNullOrWhiteSpace(form["orderid"])) { int orderId; if (int.TryParse(form["orderid"], out orderId)) { var order = _orderService.GetOrderById(orderId); if (order != null) { if (order.Customer.Id == _workContext.CurrentCustomer.Id) { if (_orderProcessingService.CanMarkOrderAsPaid(order)) { if (!string.IsNullOrWhiteSpace(form["total"]) && form["total"] == order.OrderTotal.ToString("0.00")) { model.OrderId = order.Id.ToString(CultureInfo.InvariantCulture); model.Total = order.OrderTotal.ToString("¥0.00"); } else { error.Message = "价格不匹配"; } } else { if (order.PaymentStatus == PaymentStatus.Paid) { error.Message = "您已付款,请勿重复提交"; } else { error.Message = "订单状态错误"; } } } else { error.Message = "用户不匹配"; } } else { error.Message = "订单号不存在"; } } else { error.Message = "无法读取订单号"; } } else { error.Message = "订单号丢失"; } } else { error.Message = "无法读取二维码"; } } else if (!string.IsNullOrWhiteSpace(form["nativeUrl"])) { model.QRCode = processor.GetQrCode(form["nativeUrl"]); if (!string.IsNullOrWhiteSpace(form["orderid"])) { int orderId; if (int.TryParse(form["orderid"], out orderId)) { var order = _orderService.GetOrderById(orderId); if (order != null) { if (order.Customer.Id == _workContext.CurrentCustomer.Id) { if (_orderProcessingService.CanMarkOrderAsPaid(order)) { if (!string.IsNullOrWhiteSpace(form["total"]) && form["total"] == order.OrderTotal.ToString("0.00")) { model.OrderId = order.Id.ToString(CultureInfo.InvariantCulture); model.Total = order.OrderTotal.ToString("¥0.00"); } else { error.Message = "价格不匹配"; } } else { if (order.PaymentStatus == PaymentStatus.Paid) { error.Message = "您已付款,请勿重复提交"; } else { error.Message = "订单状态错误"; } } } else { error.Message = "用户不匹配"; } } else { error.Message = "订单号不存在"; } } else { error.Message = "无法读取订单号"; } } else { error.Message = "订单号丢失"; } } else { error.Message = "参数错误"; } } else { error.Message = "没有参数"; } } catch (NopException ex) { error.Message = ex.Message; } } if (error.HasError) { return(View("~/Plugins/Payments.WeiXin/Views/PaymentWeiXin/Error.cshtml", error)); } return(View("~/Plugins/Payments.WeiXin/Views/PaymentWeiXin/ProcessPayment.cshtml", model)); }
/** * * 统一下单 * @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 Exception("缺少统一支付接口必填参数out_trade_no!"); } else if (!inputObj.IsSet("body")) { throw new Exception("缺少统一支付接口必填参数body!"); } else if (!inputObj.IsSet("total_fee")) { throw new Exception("缺少统一支付接口必填参数total_fee!"); } else if (!inputObj.IsSet("trade_type")) { throw new Exception("缺少统一支付接口必填参数trade_type!"); } //关联参数 if (inputObj.GetValue("trade_type").ToString() == "JSAPI" && !inputObj.IsSet("openid")) { throw new Exception("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!"); } if (inputObj.GetValue("trade_type").ToString() == "NATIVE" && !inputObj.IsSet("product_id")) { throw new Exception("统一支付接口中,缺少必填参数product_id!trade_type为JSAPI时,product_id为必填参数!"); } //异步通知url未设置,则使用配置文件中的url if (!inputObj.IsSet("notify_url")) { inputObj.SetValue("notify_url", ApiHelper.GetWebLocation() + "/api/pay/alinotify");//异步通知url } inputObj.SetValue("appid", WxPayConfig.APPID); //公众账号ID inputObj.SetValue("mch_id", WxPayConfig.MCHID); //商户号 inputObj.SetValue("spbill_create_ip", ApiHelper.GetClientIP()); //终端ip inputObj.SetValue("nonce_str", GenerateNonceStr()); //随机字符串 //签名 inputObj.SetValue("sign", inputObj.MakeSign()); string xml = ""; xml = inputObj.ToXml(); var start = DateTime.Now; string response = ""; try { response = HttpService.Post(xml, url, false, timeOut); } catch (Exception eeee) { } var end = DateTime.Now; int timeCost = (int)((end - start).TotalMilliseconds); WxPayData result = new WxPayData(); result.FromXml(response); ReportCostTime(url, timeCost, result);//测速上报 return(result); }
/// <summary> /// 将XML转换成实体类 /// </summary> /// <param name="ds"></param> /// <returns></returns> public WxPayNotifyData GetWxPayNotifyData(string xml) { WxPayData tempObj = new WxPayData(wcf); WxPayNotifyData wxObj = new WxPayNotifyData(); SortedDictionary <string, Object> dic = tempObj.FromXml(xml); // 微信开放平台审核通过的应用APPID var wx_appid = ""; // 微信支付的订单名称 var wx_attach = ""; // 微信支付分配的商户号 var wx_mch_id = ""; // 随机字符串,不长于32位 var wx_nonce_str = ""; // 签名,详见签名算法 var wx_sign = ""; // 回执:SUCCESS/FAIL var wx_result_code = ""; // 回执:SUCCESS/FAIL var wx_return_code = ""; // 用户在商户appid下的唯一标识 var wx_openid = ""; // 用户是否关注公众账号,Y-关注,N-未关注,仅在公众账号类型支付有效 var wx_is_subscribe = ""; // APP var wx_trade_type = ""; // 银行类型,采用字符串类型的银行标识,银行类型见银行列表 var wx_bank_type = ""; // 货币类型,符合ISO4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型 var wx_fee_type = ""; // 微信支付订单号 var wx_transaction_id = ""; // 商户系统的订单号,与请求一致 var wx_out_trade_no = ""; // 支付完成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则 var wx_time_end = ""; // 订单总金额,单位为分 var wx_total_fee = 1; // 现金支付金额订单现金支付金额,详见支付金额 var wx_cash_fee = 1; var result_code = dic.Where(r => "result_code".Equals(r.Key)); var return_code = dic.Where(r => "returen_code".Equals(r.Key)); //wx_appid if (dic.ContainsKey("appid")) { wx_appid = dic["appid"].ToString(); if (!string.IsNullOrEmpty(wx_appid)) { wxObj.appid = wx_appid; } } //wx_attach if (dic.ContainsKey("attach")) { wx_attach = dic["attach"].ToString(); if (!string.IsNullOrEmpty(wx_attach)) { wxObj.attch = wx_attach; } } //wx_bank_type if (dic.ContainsKey("bank_type")) { wx_bank_type = dic["bank_type"].ToString(); if (!string.IsNullOrEmpty(wx_bank_type)) { wxObj.bank_type = wx_bank_type; } } //wx_cash_fee if (dic.ContainsKey("cash_fee")) { wx_cash_fee = Convert.ToInt32(dic["cash_fee"].ToString()); wxObj.cash_fee = wx_cash_fee; } //wx_fee_type if (dic.ContainsKey("fee_type")) { wx_fee_type = dic["fee_type"].ToString(); if (!string.IsNullOrEmpty(wx_fee_type)) { wxObj.fee_type = wx_fee_type; } } //wx_is_subscribe if (dic.ContainsKey("is_subscribe")) { wx_is_subscribe = dic["is_subscribe"].ToString(); if (!string.IsNullOrEmpty(wx_is_subscribe)) { wxObj.is_subscribe = wx_is_subscribe; } } //wx_mch_id if (dic.ContainsKey("mch_id")) { wx_mch_id = dic["mch_id"].ToString(); if (!string.IsNullOrEmpty(wx_mch_id)) { wxObj.mch_id = wx_mch_id; } } //wx_nonce_str if (dic.ContainsKey("nonce_str")) { wx_nonce_str = dic["nonce_str"].ToString(); if (!string.IsNullOrEmpty(wx_nonce_str)) { wxObj.nonce_str = wx_nonce_str; } } //wx_openid if (dic.ContainsKey("openid")) { wx_openid = dic["openid"].ToString(); if (!string.IsNullOrEmpty(wx_openid)) { wxObj.openid = wx_openid; } } //wx_out_trade_no if (dic.ContainsKey("out_trade_no")) { wx_out_trade_no = dic["out_trade_no"].ToString(); if (!string.IsNullOrEmpty(wx_out_trade_no)) { wxObj.out_trade_no = wx_out_trade_no; } } //wx_result_code if (dic.ContainsKey("result_code")) { wx_result_code = dic["result_code"].ToString(); if (!string.IsNullOrEmpty(wx_result_code)) { wxObj.result_code = wx_result_code; } } //wx_result_code if (dic.ContainsKey("return_code")) { wx_return_code = dic["return_code"].ToString(); if (!string.IsNullOrEmpty(wx_return_code)) { wxObj.return_code = wx_return_code; } } //wx_sign if (dic.ContainsKey("sign")) { wx_sign = dic["sign"].ToString(); wxObj.sign = wx_sign; } //wx_time_end if (dic.ContainsKey("time_end")) { wx_time_end = dic["time_end"].ToString(); if (!string.IsNullOrEmpty(wx_time_end)) { wxObj.time_end = wx_time_end; } } //wx_total_fee if (dic.ContainsKey("total_fee")) { wx_total_fee = Convert.ToInt32(dic["total_fee"].ToString()); wxObj.total_fee = wx_total_fee; } //wx_trade_type if (dic.ContainsKey("trade_type")) { wx_trade_type = dic["trade_type"].ToString(); if (!string.IsNullOrEmpty(wx_trade_type)) { wxObj.trade_type = wx_trade_type; } } //wx_transaction_id if (dic.ContainsKey("transaction_id")) { wx_transaction_id = dic["transaction_id"].ToString(); if (!string.IsNullOrEmpty(wx_transaction_id)) { wxObj.transaction_id = wx_transaction_id; } } return(wxObj); }