/// <summary> /// 转换短链接,该接口主要用于扫码原生支付模式一中的二维码链接转成短链接(weixin://wxpay/s/XXXXXX),减小二维码数据量,提升扫描速度和精确度。 /// </summary> /// <param name="inputObj">提交给转换短连接API的参数</param> /// <param name="timeOut">接口超时时间</param> /// <returns></returns> public static WxPayData ShortUrl(WxPayData inputObj, PayCenterSetting setting, int timeOut = 20) { string url = "https://api.mch.weixin.qq.com/tools/shorturl"; //检测必填参数 if (!inputObj.IsSet("long_url")) { throw new WxPayException("需要转换的URL,签名用原串,传输需URL encode!"); } string appid = WxPayConfig.APPID; string mch_id = WxPayConfig.MCHID; string key = string.Empty; if (setting != null && setting.Id > 0) { appid = setting.Appid; mch_id = setting.Mch_id; key = setting.Key; } inputObj.SetValue("appid", appid); //公众账号ID inputObj.SetValue("mch_id", mch_id); //商户号 inputObj.SetValue("nonce_str", GenerateNonceStr()); //随机字符串 inputObj.SetValue("sign", inputObj.MakeSign(key)); //签名 string xml = inputObj.ToXml(); string response = WxHelper.Post(xml, url, false, setting, timeOut); WxPayData result = new WxPayData(); result.FromXml(response); return(result); }
/// <summary> /// 判断提现结果 只有返回为1才表示提现成功 /// </summary> /// <param name="result"></param> /// <param name="amout"></param> /// <param name="setting"></param> /// <returns></returns> public int DrawResult(WxPayData result, int amout, PayCenterSetting setting) { if (result == null || result.GetValue("return_code") == null)//微信服务器有返回值 { log4net.LogHelper.WriteInfo(this.GetType(), "提现出错,错误信息:" + result.ToJson()); return(-1); } //业务结果:result_code(SUCCESS/FAIL,为SUCCESS才是付款成功) if (result.GetValue("result_code").ToString() != "SUCCESS")//提现失败 { if (result.GetValue("err_code_des").ToString().Contains("原单号")) { //表示微信那边返回系统错误 则该提现记录不能算失败也不能算成功,维持原状等待下次提现队列 return(-2); } //如果是账户余额不足,推送消息给管理员 if (result.GetValue("err_code").ToString() == "NOTENOUGH") { return(-3); } log4net.LogHelper.WriteInfo(this.GetType(), "提现出错,错误信息2:" + result.ToJson()); return(0); } else//成功,修改记录 { log4net.LogHelper.WriteInfo(this.GetType(), "提现成功:" + result.ToJson()); return(1); } }
/// <summary> /// 关闭订单 /// </summary> /// <param name="inputObj">提交给关闭订单API的参数</param> /// <param name="timeOut">接口超时时间</param> /// <returns></returns> public static WxPayData CloseOrder(WxPayData inputObj, PayCenterSetting setting, int timeOut = 20) { string url = "https://api.mch.weixin.qq.com/pay/closeorder"; //检测必填参数 if (!inputObj.IsSet("out_trade_no")) { throw new WxPayException("关闭订单接口中,out_trade_no必填!"); } string appid = WxPayConfig.APPID; string mch_id = WxPayConfig.MCHID; string key = string.Empty; if (setting != null && setting.Id > 0) { appid = setting.Appid; mch_id = setting.Mch_id; key = setting.Key; } inputObj.SetValue("appid", appid); //公众账号ID inputObj.SetValue("mch_id", mch_id); //商户号 inputObj.SetValue("nonce_str", GenerateNonceStr()); //随机字符串 inputObj.SetValue("sign", inputObj.MakeSign(key)); //签名 string xml = inputObj.ToXml(); string response = WxHelper.Post(xml, url, false, setting, timeOut); WxPayData result = new WxPayData(); result.FromXml(response); return(result); }
public void NOTENOUGH(string amout, PayCenterSetting setting = null) { if (WebSiteConfig.IsSendToAdmin != "1") { return; } if (setting == null) { setting = new PayCenterSetting(); setting.Appid = "wx9dc9ddc7b3eb7f8d"; } if (WebConfigBLL.WzCompanyAppidList.Contains(setting.Appid)) { int[] userids = new int[] { 10475223, 483747, 181993615 }; string tid = "faxeaBv8TpcHNzgH5g_-23_yFSwXnI_fJqqJ5QYsVFY"; string openid = ""; string title = "报警:用户提现余额不足,请尽快充值!用户提现金额:" + amout + "(元),提现APPID:" + setting.Appid; string fromName = "微赞"; string remark = "如10分钟之后发现提现余额不足,会继续提醒"; string datajson = "{\"first\": {\"value\":\"" + title + "\",\"color\":\"#FF0000\"},\"keyword1\":{\"value\":\"" + fromName + "\",\"color\":\"#333333\"},\"keyword2\": {\"value\":\"" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "\",\"color\":\"#333333\"},\"keyword3\": {\"value\":\"点击查看详情\",\"color\":\"#333333\"},\"remark\":{\"value\":\"" + remark + "\",\"color\":\"#17b5ee\"}}";; string postjson = ""; string _mySerId = WebSiteConfig.WxSerId; foreach (int uid in userids) { openid = new OAuthUserBll("3").GetModel(uid).Openid; postjson = "{\"touser\":\"" + openid + "\",\"template_id\":\"" + tid + "\",\"url\":\"\",\"data\":" + datajson + "}"; string posturl = string.Format(this.DomainName(_mySerId) + "/cgi-bin/message/template/send?access_token={0}", _mySerId); Utility.Net.JKClient.DoPostJson(posturl, postjson); //new PushMsgBLL().SendTips(_minisnsid, model.openid, url, "您好,[" + nickName + "]回复帖子[" + _titletips + "]: " + _contenttips, _forumname, "点击查看详情.祝您生活愉快^.^"); } } else { if (setting.BindingType == (int)PayCenterSettingType.City) { C_CityInfo city = new C_CityInfoBLL().GetModelByAreaCode(setting.BindingId); C_UserInfo info = new C_UserInfoBLL().GetModelFromCache(city.OpenId); string tid = "faxeaBv8TpcHNzgH5g_-23_yFSwXnI_fJqqJ5QYsVFY"; string openid = city.OpenId; string title = "报警:用户提现余额不足,请尽快充值!用户提现金额:" + amout + "(元),提现APPID:" + setting.Appid + "。充值之后请登陆PC管理后台->同城流水,找到余额不足的提现流水,点击重新提现(重新提现不会造成重复提现的现象)"; string fromName = "微赞"; string remark = "如10分钟之后发现提现余额不足,会继续提醒"; string datajson = "{\"first\": {\"value\":\"" + title + "\",\"color\":\"#FF0000\"},\"keyword1\":{\"value\":\"" + fromName + "\",\"color\":\"#333333\"},\"keyword2\": {\"value\":\"" + DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "\",\"color\":\"#333333\"},\"keyword3\": {\"value\":\"点击查看详情\",\"color\":\"#333333\"},\"remark\":{\"value\":\"" + remark + "\",\"color\":\"#17b5ee\"}}";; string postjson = ""; string _mySerId = WebSiteConfig.WxSerId; postjson = "{\"touser\":\"" + openid + "\",\"template_id\":\"" + tid + "\",\"url\":\"\",\"data\":" + datajson + "}"; string posturl = string.Format(this.DomainName(_mySerId) + "/cgi-bin/message/template/send?access_token={0}", _mySerId); Utility.Net.JKClient.DoPostJson(posturl, postjson); } } }
/// <summary> /// 提交被扫支付API,收银员使用扫码设备读取微信用户刷卡授权码以后,二维码或条码信息传送至商户收银台,由商户收银台或者商户后台调用该接口发起支付。 /// </summary> /// <param name="inputObj">提交给被扫支付API的参数</param> /// <param name="timeOut">超时时间</param> /// <returns>成功时返回调用结果</returns> //public static WxPayData Micropay(WxPayData inputObj, PayCenterSetting setting = null, int timeOut = 20) //{ // string url = "https://api.mch.weixin.qq.com/pay/micropay"; // //检测必填参数 // if (!inputObj.IsSet("body")) // { // throw new WxPayException("提交被扫支付API接口中,缺少必填参数body!"); // } // else if (!inputObj.IsSet("out_trade_no")) // { // throw new WxPayException("提交被扫支付API接口中,缺少必填参数out_trade_no!"); // } // else if (!inputObj.IsSet("total_fee")) // { // throw new WxPayException("提交被扫支付API接口中,缺少必填参数total_fee!"); // } // else if (!inputObj.IsSet("auth_code")) // { // throw new WxPayException("提交被扫支付API接口中,缺少必填参数auth_code!"); // } // string appid = WxPayConfig.APPID; // string mch_id = WxPayConfig.MCHID; // string key = string.Empty; // if (setting != null && setting.Id > 0) // { // appid = setting.Appid; // mch_id = setting.Mch_id; // key = setting.Key; // } // inputObj.SetValue("spbill_create_ip", WxPayConfig.IP);//终端ip // inputObj.SetValue("appid", appid);//公众账号ID // inputObj.SetValue("mch_id", mch_id);//商户号 // inputObj.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", ""));//随机字符串 // inputObj.SetValue("sign", inputObj.MakeSign(key));//签名 // string xml = inputObj.ToXml(); // //var start = DateTime.Now;//请求开始时间 // string response = WxHelper.Post(xml, url, false, setting, timeOut);//调用HTTP通信接口以提交数据到API // // 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> /// <param name="inputObj">提交给查询订单API的参数</param> /// <param name="timeOut">超时时间</param> /// <returns>成功时返回订单查询结果</returns> public static WxPayData OrderQuery(WxPayData inputObj, PayCenterSetting setting, int timeOut = 60) { WxPayData result = new WxPayData(); 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至少填一个!"); } string appid = WxPayConfig.APPID; string mch_id = WxPayConfig.MCHID; string key = string.Empty; if (setting != null && setting.Id > 0) { appid = setting.Appid; mch_id = setting.Mch_id; key = setting.Key; } inputObj.SetValue("appid", appid); //公众账号ID inputObj.SetValue("mch_id", mch_id); //商户号 inputObj.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); //随机字符串 inputObj.SetValue("sign", inputObj.MakeSign(key)); //签名 string xml = inputObj.ToXml(); DateTime start = DateTime.Now; string response = string.Empty; try { response = WxHelper.Post(xml, url, false, setting, timeOut);//调用HTTP通信接口提交数据 } catch (WxPayException) { PayTimeOutOrder addModel = new PayTimeOutOrder(); addModel.transaction_id = inputObj.GetValue("transaction_id") == null ? "" : inputObj.GetValue("transaction_id").ToString(); //记录查询超时的订单 //new PayTimeOutOrderBLL().Add(addModel); result.SetValue("return_code", "FAILE"); return(result); } // var end = DateTime.Now; //int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时 //将xml格式的数据转化为对象以返回 result.FromXml(response); //ReportCostTime(url, timeCost, result);//测速上报 return(result); }
/// <summary> /// 测速上报接口实现 /// </summary> /// <param name="inputObj">提交给测速上报接口的参数</param> /// <param name="timeOut">测速上报接口超时时间</param> /// <returns></returns> public static WxPayData Report(WxPayData inputObj, PayCenterSetting setting, int timeOut = 20) { string url = "https://api.mch.weixin.qq.com/payitil/report"; //检测必填参数 if (!inputObj.IsSet("interface_url")) { throw new WxPayException("接口URL,缺少必填参数interface_url!"); } if (!inputObj.IsSet("return_code")) { throw new WxPayException("返回状态码,缺少必填参数return_code!"); } if (!inputObj.IsSet("result_code")) { throw new WxPayException("业务结果,缺少必填参数result_code!"); } if (!inputObj.IsSet("user_ip")) { throw new WxPayException("访问接口IP,缺少必填参数user_ip!"); } if (!inputObj.IsSet("execute_time_")) { throw new WxPayException("接口耗时,缺少必填参数execute_time_!"); } string appid = WxPayConfig.APPID; string mch_id = WxPayConfig.MCHID; string key = string.Empty; if (setting != null && setting.Id > 0) { appid = setting.Appid; mch_id = setting.Mch_id; key = setting.Key; } inputObj.SetValue("appid", appid); //公众账号ID inputObj.SetValue("mch_id", mch_id); //商户号 inputObj.SetValue("user_ip", WxPayConfig.IP); //终端ip inputObj.SetValue("time", DateTime.Now.ToString("yyyyMMddHHmmss")); //商户上报时间 inputObj.SetValue("nonce_str", GenerateNonceStr()); //随机字符串 inputObj.SetValue("sign", inputObj.MakeSign(key)); //签名 string xml = inputObj.ToXml(); string response = WxHelper.Post(xml, url, false, setting, timeOut); WxPayData result = new WxPayData(); result.FromXml(response); return(result); }
//查询订单 private bool QueryOrder(string transactionId, PayCenterSetting setting) { WxPayData req = new WxPayData(); req.SetValue("transaction_id", transactionId); WxPayData res = WxPayApi.OrderQuery(req, setting); if (res.GetValue("return_code").ToString() == "SUCCESS" && res.GetValue("result_code").ToString() == "SUCCESS") { return(true); } return(false); }
/// <summary> /// 申请退款 /// </summary> /// <param name="inputObj">提交给申请退款API的参数</param> /// <param name="timeOut">超时时间</param> /// <returns>成功时返回接口调用结果</returns> public static WxPayData Refund(WxPayData inputObj, PayCenterSetting setting, int timeOut = 20) { 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!"); } else if (!inputObj.IsSet("op_user_id")) { throw new WxPayException("退款申请接口中,缺少必填参数op_user_id!"); } string appid = WxPayConfig.APPID; string mch_id = WxPayConfig.MCHID; string key = string.Empty; if (setting != null && setting.Id > 0) { appid = setting.Appid; mch_id = setting.Mch_id; key = setting.Key; } inputObj.SetValue("appid", appid); //公众账号ID inputObj.SetValue("mch_id", mch_id); //商户号 inputObj.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", "")); //随机字符串 inputObj.SetValue("sign", inputObj.MakeSign(key)); //签名 string xml = inputObj.ToXml(); //调用HTTP通信接口提交数据到API string response = WxHelper.Post(xml, url, true, setting, timeOut); //将xml格式的结果转换为对象以返回 WxPayData result = new WxPayData(); result.FromXml(response); return(result); }
/// <summary> /// 查询订单 /// </summary> /// <param name="inputObj">提交给查询订单API的参数</param> /// <param name="timeOut">超时时间</param> /// <returns>成功时返回订单查询结果</returns> public static WxPayData OrderQuery(WxPayData inputObj, PayCenterSetting setting, int timeOut = 60) { WxPayData result = new WxPayData(); 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至少填一个!"); } string appid = WxPayConfig.APPID; string mch_id = WxPayConfig.MCHID; string key = string.Empty; if (setting != null && setting.Id > 0) { appid = setting.Appid; mch_id = setting.Mch_id; key = setting.Key; } inputObj.SetValue("appid", appid); //公众账号ID inputObj.SetValue("mch_id", mch_id); //商户号 inputObj.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); //随机字符串 inputObj.SetValue("sign", inputObj.MakeSign(key)); //签名 string xml = inputObj.ToXml(); DateTime start = DateTime.Now; string response = string.Empty; try { response = WxHelper.Post(xml, url, false, setting, timeOut);//调用HTTP通信接口提交数据 } catch (WxPayException) { log4net.LogHelper.WriteInfo(typeof(WxPayApi), $"微信订单查询超时:{(inputObj.GetValue("transaction_id") == null ? "" : inputObj.GetValue("transaction_id").ToString())}"); result.SetValue("return_code", "FAILE"); return(result); } //将xml格式的数据转化为对象以返回 result.FromXml(response); return(result); }
/// <summary> /// 查询订单 /// </summary> /// <param name="inputObj">提交给查询订单API的参数</param> /// <param name="timeOut">超时时间</param> /// <returns>成功时返回订单查询结果</returns> //public static string CompanyPayQuery(WxPayData inputObj, PayCenterSetting setting, int timeOut = 60) //{ // string url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo"; // //检测必填参数 // if (!inputObj.IsSet("partner_trade_no")) // { // throw new WxPayException("订单查询接口中,partner_trade_no!"); // } // string appid = WxPayConfig.APPID; // string mch_id = WxPayConfig.MCHID; // string key = string.Empty; // if (setting != null && setting.Id > 0) // { // appid = setting.Appid; // mch_id = setting.Mch_id; // key = setting.Key; // } // inputObj.SetValue("appid", appid);//公众账号ID // inputObj.SetValue("mch_id", mch_id);//商户号 // inputObj.SetValue("nonce_str", WxPayApi.GenerateNonceStr());//随机字符串 // inputObj.SetValue("sign", inputObj.MakeSign(key));//签名 // string xml = inputObj.ToXml(); // //log4net.LogHelper.WriteError(typeof(CompanyPay), new Exception(xml)); // //var start = DateTime.Now; // string response = WxHelper.Post(xml, url, true, setting, timeOut);//调用HTTP通信接口提交数据 // //log4net.LogHelper.WriteError(typeof(CompanyPay), new Exception(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; // return response; //} /// <summary> /// 查询订单 /// </summary> /// <param name="inputObj">提交给查询订单API的参数</param> /// <param name="timeOut">超时时间</param> /// <returns>成功时返回订单查询结果</returns> //public static WxPayData CompanyPayQueryData(WxPayData inputObj, PayCenterSetting setting, int timeOut = 60) //{ // string url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo"; // //检测必填参数 // if (!inputObj.IsSet("partner_trade_no")) // { // throw new WxPayException("订单查询接口中,partner_trade_no!"); // } // string appid = WxPayConfig.APPID; // string mch_id = WxPayConfig.MCHID; // string key = string.Empty; // if (setting != null && setting.Id > 0) // { // appid = setting.Appid; // mch_id = setting.Mch_id; // key = setting.Key; // } // inputObj.SetValue("appid", appid);//公众账号ID // inputObj.SetValue("mch_id", mch_id);//商户号 // inputObj.SetValue("nonce_str", WxPayApi.GenerateNonceStr());//随机字符串 // inputObj.SetValue("sign", inputObj.MakeSign(key));//签名 // string xml = inputObj.ToXml(); // //log4net.LogHelper.WriteError(typeof(CompanyPay), new Exception(xml)) // //log4net.LogHelper.WriteError(typeof(CompanyPay), new Exception(xml)); // //var start = DateTime.Now; // string response = WxHelper.Post(xml, url, true, setting, timeOut);//调用HTTP通信接口提交数据 // //log4net.LogHelper.WriteError(typeof(CompanyPay), new Exception(response)); // //var end = DateTime.Now; // //int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时 // //将xml格式的数据转化为对象以返回 // WxPayData result = new WxPayData(); // result.FromXml(response, false); // //ReportCostTime(url, timeCost, result);//测速上报 // return result; //} /// <summary> /// 撤销订单API接口 /// </summary> /// <param name="inputObj">提交给撤销订单API接口的参数,out_trade_no和transaction_id必填一个</param> /// <param name="timeOut">接口超时时间</param> /// <returns>成功时返回API调用结果</returns> public static WxPayData Reverse(WxPayData inputObj, PayCenterSetting setting, int timeOut = 60) { string url = "https://api.mch.weixin.qq.com/secapi/pay/reverse"; //检测必填参数 if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id")) { throw new WxPayException("撤销订单API接口中,参数out_trade_no和transaction_id必须填写一个!"); } string appid = WxPayConfig.APPID; string mch_id = WxPayConfig.MCHID; string key = string.Empty; if (setting != null && setting.Id > 0) { appid = setting.Appid; mch_id = setting.Mch_id; key = setting.Key; } inputObj.SetValue("appid", appid); //公众账号ID inputObj.SetValue("mch_id", mch_id); //商户号 inputObj.SetValue("nonce_str", GenerateNonceStr()); //随机字符串 inputObj.SetValue("sign", inputObj.MakeSign(key)); //签名 string xml = inputObj.ToXml(); DateTime start = DateTime.Now;//请求开始时间 string response = WxHelper.Post(xml, url, true, setting, timeOut); DateTime end = DateTime.Now; int timeCost = (int)((end - start).TotalMilliseconds); WxPayData result = new WxPayData(); result.FromXml(response); ReportCostTime(url, timeCost, result, setting);//测速上报 return(result); }
/** * * 检测签名是否正确 * 正确返回true,错误抛异常 */ public bool CheckSign() { //如果没有设置签名,则跳过检测 if (!IsSet("sign")) { WxPayException exx = new WxPayException("WxPayData签名存在但不合法!"); log4net.LogHelper.WriteError(this.GetType(), exx); throw exx; } //如果设置了签名但是签名为空,则抛异常 else if (GetValue("sign") == null || GetValue("sign").ToString() == "") { WxPayException exx = new WxPayException("WxPayData签名存在但不合法!"); log4net.LogHelper.WriteError(this.GetType(), exx); throw exx; } //获取接收到的签名 string return_sign = GetValue("sign").ToString(); //第三方支付需要查询KEY的值 string key = string.Empty; if (IsSet("appid")) { string appid = GetValue("appid").ToString(); PayCenterSetting setting = PayCenterSettingBLL.SingleModel.GetPayCenterSetting(appid); if (setting != null && setting.Id > 0) { key = setting.Key; } } //在本地计算新的签名 string cal_sign = MakeSign(key); if (cal_sign == return_sign) { return(true); } WxPayException ex = new WxPayException("WxPayData签名验证错误!"); log4net.LogHelper.WriteError(this.GetType(), ex); throw ex;; }
/// <summary> /// 下载对账单 /// </summary> /// <param name="inputObj">提交给下载对账单API的参数</param> /// <param name="timeOut">接口超时时间</param> /// <returns></returns> public static WxPayData DownloadBill(WxPayData inputObj, PayCenterSetting setting, int timeOut = 20) { string url = "https://api.mch.weixin.qq.com/pay/downloadbill"; //检测必填参数 if (!inputObj.IsSet("bill_date")) { throw new WxPayException("对账单接口中,缺少必填参数bill_date!"); } string appid = WxPayConfig.APPID; string mch_id = WxPayConfig.MCHID; string key = string.Empty; if (setting != null && setting.Id > 0) { appid = setting.Appid; mch_id = setting.Mch_id; key = setting.Key; } inputObj.SetValue("appid", appid); //公众账号ID inputObj.SetValue("mch_id", mch_id); //商户号 inputObj.SetValue("nonce_str", GenerateNonceStr()); //随机字符串 inputObj.SetValue("sign", inputObj.MakeSign(key)); //签名 string xml = inputObj.ToXml(); string response = WxHelper.Post(xml, url, false, setting, timeOut);//调用HTTP通信接口以提交数据到API WxPayData result = new WxPayData(); //若接口调用失败会返回xml格式的结果 if (response.Substring(0, 5) == "<xml>") { result.FromXml(response); } //接口调用成功则返回非xml格式的数据 else { result.SetValue("result", response); } return(result); }
/// <summary> /// 查找当前用户管理的所有账户(找出当前小程序商户号下当前用户管理的分店账号) /// </summary> /// <returns></returns> public List <MultiStoreAccount> GetListByMasterAccountId(Guid AccountId, int appId) { if (appId <= 0) { return(null); } XcxAppAccountRelation role = XcxAppAccountRelationBLL.SingleModel.GetModel(appId); if (role == null) { return(null); } PayCenterSetting userPaySetting = PayCenterSettingBLL.SingleModel.GetPayCenterSettingByappid(role.AppId); if (userPaySetting == null) { return(null); } return(GetListByMasterAccountId(AccountId, userPaySetting.Mch_id)); }
public string GetJsApiParametersnew(PayCenterSetting setting) { WxPayData jsApiParam = new WxPayData(); jsApiParam.SetValue("appId", unifiedOrderResult.GetValue("appid")); jsApiParam.SetValue("timeStamp", WxPayApi.GenerateTimeStamp()); jsApiParam.SetValue("nonceStr", unifiedOrderResult.GetValue("nonce_str")); //jsApiParam.SetValue("nonceStr2", WxPayApi.GenerateNonceStr()); jsApiParam.SetValue("package", "prepay_id=" + unifiedOrderResult.GetValue("prepay_id")); jsApiParam.SetValue("signType", "MD5"); //第三方支付需要查询KEY的值 string key = string.Empty; string appid = unifiedOrderResult.GetValue("appid").ToString(); //PayCenterSetting setting = new PayCenterSettingBLL().GetPayCenterSetting(appid); if (setting != null && setting.Id > 0) { key = setting.Key; } jsApiParam.SetValue("paySign", jsApiParam.MakeSign(key)); //jsApiParam.SetValue("openid", openid); return(jsApiParam.ToJson()); }
/// <summary> /// 查询退款,提交退款申请后,通过该接口查询退款状态。退款有一定延时,用零钱支付的退款20分钟内到账,银行卡支付的退款3个工作日后重新查询退款状态。out_refund_no、out_trade_no、transaction_id、refund_id四个参数必填一个 /// </summary> /// <param name="inputObj">提交给查询退款API的参数</param> /// <param name="timeOut">接口超时时间</param> /// <returns>成功时返回</returns> public static WxPayData RefundQuery(WxPayData inputObj, PayCenterSetting setting, int timeOut = 20) { 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四个参数必填一个!"); } string appid = WxPayConfig.APPID; string mch_id = WxPayConfig.MCHID; string key = string.Empty; if (setting != null && setting.Id > 0) { appid = setting.Appid; mch_id = setting.Mch_id; key = setting.Key; } inputObj.SetValue("appid", appid); //公众账号ID inputObj.SetValue("mch_id", mch_id); //商户号 inputObj.SetValue("nonce_str", GenerateNonceStr()); //随机字符串 inputObj.SetValue("sign", inputObj.MakeSign(key)); //签名 string xml = inputObj.ToXml(); string response = WxHelper.Post(xml, url, false, setting, timeOut);//调用HTTP通信接口以提交数据到API //将xml格式的结果转换为对象以返回 WxPayData result = new WxPayData(); result.FromXml(response); return(result); }
public static string Post(string xml, string url, bool isUseCert, PayCenterSetting setting, int timeout = 20) { // System.GC.Collect();//垃圾回收,回收没有正常关闭的http连接 string result = ""; //返回结果 HttpWebRequest request = null; Stream reqStream = null; try { //设置最大连接数 ServicePointManager.DefaultConnectionLimit = 10000; //设置https验证方式 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); } request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.Timeout = timeout * 1000; //设置POST的数据类型和长度 request.ContentType = "text/xml"; byte[] data = System.Text.Encoding.UTF8.GetBytes(xml); request.ContentLength = data.Length; //是否使用证书 if (isUseCert) { //string path = HttpContext.Current.Request.PhysicalApplicationPath; if (setting == null || setting.Appid == WxPayConfig.APPID) { X509Certificate2 cert = new X509Certificate2(WxPayConfig.SSLCERT_PATH, WxPayConfig.SSLCERT_PASSWORD); request.ClientCertificates.Add(cert); } else { if (string.IsNullOrEmpty(setting.SSLCERT_PATH)) //安装路劲没有设置就用默认目录 { int index = WxPayConfig.SSLCERT_PATH.LastIndexOf(@"\"); setting.SSLCERT_PATH = WxPayConfig.SSLCERT_PATH.Substring(0, index + 1) + setting.Mch_id + "\\" + WxPayConfig.SSLCERT_PATH.Substring(index + 1); } if (string.IsNullOrEmpty(setting.SSLCERT_PASSWORD)) //证书密码没有设置就用默认商户号 { setting.SSLCERT_PASSWORD = setting.Mch_id; } X509Certificate2 cert = new X509Certificate2(setting.SSLCERT_PATH, setting.SSLCERT_PASSWORD); request.ClientCertificates.Add(cert); } } //往服务器写入数据 using (reqStream = request.GetRequestStream()) { reqStream.Write(data, 0, data.Length); // reqStream.Close(); } //获取服务端返回 using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) //获取服务端返回数据 using (StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { result = sr.ReadToEnd().Trim(); //sr.Close(); } } catch (System.Threading.ThreadAbortException e) { log4net.LogHelper.WriteError(typeof(System.Threading.ThreadAbortException), e); System.Threading.Thread.ResetAbort(); } catch (WebException e) { log4net.LogHelper.WriteError(typeof(WebException), e); if (e.Status == WebExceptionStatus.ProtocolError) { log4net.LogHelper.WriteInfo(typeof(WebException), "StatusCode : " + ((HttpWebResponse)e.Response).StatusCode.ToString()); log4net.LogHelper.WriteInfo(typeof(WebException), "StatusDescription : " + ((HttpWebResponse)e.Response).StatusCode.ToString()); } throw new WxPayException(e.ToString()); } catch (Exception e) { log4net.LogHelper.WriteError(typeof(Exception), e); throw new WxPayException(e.ToString()); } finally { if (request != null) { request.Abort(); } } return(result); }
/// <summary> /// 抛弃使用(用GetUnifiedOrderResult) /// </summary> /// <param name="setting"></param> /// <param name="morder"></param> /// <param name="notify_url"></param> /// <returns></returns> public WxPayData GetUnifiedOrderResultByCity(PayCenterSetting setting, CityMorders morder, string notify_url) { //统一下单 string out_trade_no = morder.orderno;//商户订单号 if (string.IsNullOrEmpty(morder.orderno)) { throw new WxPayException("UnifiedOrder response error!"); } string body = string.Empty; if (!string.IsNullOrEmpty(morder.ShowNote)) { body = morder.ShowNote; } else { string paytype = string.Empty; switch (morder.OrderType) { case (int)ArticleTypeEnum.MiniappGoods: paytype = "小程序电商模板订单"; break; case (int)ArticleTypeEnum.MiniappFoodGoods: paytype = "小程序餐饮模板订单"; break; case (int)ArticleTypeEnum.MiniappSaveMoneySet: paytype = "小程序餐饮储值"; break; case (int)ArticleTypeEnum.MiniappBargain: paytype = "小程序砍价"; break; case (int)ArticleTypeEnum.MiniappEnt: paytype = "小程序专业版"; break; case (int)ArticleTypeEnum.MiniappWXDirectPay: paytype = "小程序直接微信转账"; break; case (int)ArticleTypeEnum.PlatChildOrderPay: paytype = "平台子模版支付"; break; case (int)ArticleTypeEnum.PlatChildOrderInPlatPay: paytype = "子模版订单平台支付"; break; } body = string.Format("支付中心,{0}支付{1}元", paytype, (morder.payment_free * 0.01)); //商品描述; } string attach = string.Format("paytype={0}&orderid={1}&orderno={2}&from=city", morder.OrderType, morder.Id, morder.orderno); //自带的信息 //统一下单 WxPayData data = new WxPayData(); data.SetValue("body", body); data.SetValue("attach", attach); data.SetValue("out_trade_no", out_trade_no); data.SetValue("total_fee", total_fee); data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); data.SetValue("goods_tag", "test"); data.SetValue("trade_type", "JSAPI"); data.SetValue("openid", openid); data.SetValue("notify_url", notify_url); WxPayData result = WxPayApi.UnifiedOrder(data, setting); if (result != null && (!result.IsSet("appid") || !result.IsSet("prepay_id") || !result.IsSet("prepay_id"))) { throw new WxPayException(result.ToJson()); } unifiedOrderResult = result; return(result); }
/// <summary> /// 返回是否关闭成功 /// </summary> /// <param name="setting"></param> /// <param name="morder"></param> /// <param name="notify_url"></param> /// <returns></returns> public bool CloseCityMorder(int citymorederId, ref string errorMsg) { CityMorders morder = new CityMordersBLL().GetModel(citymorederId); if (morder == null) { errorMsg = "未找到citymorder订单"; return(false); } PayCenterSetting setting = PayCenterSettingBLL.SingleModel.GetPayCenterSetting(morder.appid); if (setting == null) { errorMsg = "未找到用户的商户配置"; return(false); } string out_trade_no = morder.orderno;//商户订单号 if (string.IsNullOrEmpty(morder.orderno)) { return(false); } WxPayData data = new WxPayData(); data.SetValue("out_trade_no", out_trade_no); WxPayData result = WxPayApi.CloseOrder(data, setting); if (result == null || !result.GetValue("return_code").ToString().Equals("SUCCESS")) { errorMsg = "请求关闭订单失败,原因为:"; switch (data.GetValue("return_code").ToString()) { case "ORDERPAID": errorMsg += "订单已支付,不能发起关单"; break; case "SYSTEMERROR": errorMsg += "系统异常,请重新调用该API"; break; case "ORDERCLOSED": errorMsg += "订单已关闭,无法重复关闭"; break; case "SIGNERROR": errorMsg += "签名错误"; break; case "REQUIRE_POST_METHOD": errorMsg += "未使用post传递参数"; break; case "XML_FORMAT_ERROR": errorMsg += "XML格式错误"; break; } return(false); } return(true); }
/** * * 网页授权获取用户基本信息的全部过程 * 详情请参看网页授权获取用户基本信息:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html * 第一步:利用url跳转获取code * 第二步:利用code去获取openid和access_token * */ //public void GetOpenidAndAccessToken() //{ // if (!string.IsNullOrEmpty(context.Request.QueryString["code"])) // { // //获取code码,以获取openid和access_token // string code = context.Request.QueryString["code"]; // log4net.LogHelper.WriteInfo(this.GetType(), "Get code : " + code); // GetOpenidAndAccessTokenFromCode(code); // } // else // { // //构造网页授权获取code的URL // string host = context.Request.Url.Host; // string path = context.Request.Path; // string redirect_uri = HttpUtility.UrlEncode("http://" + host + path); // WxPayData data = new WxPayData(); // data.SetValue("appid", WxPayConfig.APPID); // data.SetValue("redirect_uri", redirect_uri); // data.SetValue("response_type", "code"); // data.SetValue("scope", "snsapi_base"); // data.SetValue("state", "STATE" + "#wechat_redirect"); // string url = "https://open.weixin.qq.com/connect/oauth2/authorize?" + data.ToUrl(); // log4net.LogHelper.WriteInfo(this.GetType(), "Will Redirect to URL : " + url); // try // { // //触发微信返回code码 // context.Response.Redirect(url);//Redirect函数会抛出ThreadAbortException异常,不用处理这个异常 // } // catch (System.Threading.ThreadAbortException ) // { // } // } //} /** * * 通过code换取网页授权access_token和openid的返回数据,正确时返回的JSON数据包如下: * { * "access_token":"ACCESS_TOKEN", * "expires_in":7200, * "refresh_token":"REFRESH_TOKEN", * "openid":"OPENID", * "scope":"SCOPE", * "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" * } * 其中access_token可用于获取共享收货地址 * openid是微信支付jsapi支付接口统一下单时必须的参数 * 更详细的说明请参考网页授权获取用户基本信息:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html * @失败时抛异常WxPayException */ //public void GetOpenidAndAccessTokenFromCode(string code) //{ // try // { // //构造获取openid及access_token的url // WxPayData data = new WxPayData(); // data.SetValue("appid", WxPayConfig.APPID); // data.SetValue("secret", WxPayConfig.APPSECRET); // data.SetValue("code", code); // data.SetValue("grant_type", "authorization_code"); // string url = "https://api.weixin.qq.com/sns/oauth2/access_token?" + data.ToUrl(); // //请求url以获取数据 // string result = WxHelper.HttpGet(url); // //保存access_token,用于收货地址获取 // WxAuthorize jd = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<WxAuthorize>(result); // access_token = jd.access_token; // //获取用户openid // openid = jd.openid; // } // catch (Exception ex) // { // log4net.LogHelper.WriteError(this.GetType(), ex); // throw ex; // } //} ///// <summary> ///// 文章打赏 ///// </summary> ///// <param name="article">文章实体</param> ///// <returns></returns> //public WxPayData GetUnifiedOrderResult(PayCenterSetting setting,Article article, int luserid, out int orderid, int artcommentid = 0) //{ // OAuthUserBll bll = new OAuthUserBll(article.MinisnsId.ToString()); // OAuthUser looker = bll.GetUserByCache(luserid); // OAuthUser maker = bll.GetUserByCache(article.UserId); // //统一下单 // string out_trade_no = WxPayApi.GenerateOutTradeNo();//商户订单号 // string body = "赞赏" + (maker == null ? "匿名用户" : Utility.ReplaceSpecialChar(maker.Nickname, '?'));//商品描述 // if (article.IsGuerdon == (int)ArticleTypeEnum.Donation) // { // body = "支持" + (maker == null ? "匿名用户" : Utility.ReplaceSpecialChar(maker.Nickname, '?'));//商品描述 // } // string attach = "paytype=1&minisnsid=" + article.MinisnsId + "&articleid=" + article.Id + "&userid=" + article.UserId + "&luserId=" + looker.Id;//自带的信息 // if (article.IsGuerdon == (int)ArticleTypeEnum.Donation && artcommentid != 0) // { // attach += "&articlecommentid=" + artcommentid; // } // //统一下单 // WxPayData data = new WxPayData(); // data.SetValue("body", body); // data.SetValue("attach", attach); // data.SetValue("out_trade_no", out_trade_no); // data.SetValue("total_fee", total_fee); // data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); // data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); // data.SetValue("goods_tag", "test"); // data.SetValue("trade_type", "JSAPI"); // data.SetValue("openid", openid); // WxPayData result = WxPayApi.UnifiedOrder(data, setting); // if (!result.IsSet("appid") || !result.IsSet("prepay_id") || result.GetValue("prepay_id").ToString() == "") // { // log4net.LogHelper.WriteError(this.GetType(), new WxPayException("data:" + data.ToJson())); // log4net.LogHelper.WriteError(this.GetType(), new WxPayException("result:" + result.ToJson())); // log4net.LogHelper.WriteError(this.GetType(), new WxPayException("统一下单请求失败!prepay_id:" + result.GetValue("prepay_id").ToString())); // throw new WxPayException("UnifiedOrder response error!"); // } // //插入打赏记录 // if (maker == null) // { // //作者为空,不能打赏 // log4net.LogHelper.WriteError(this.GetType(), new WxPayException("文章作者为空!")); // throw new WxPayException("文章作者为空!"); // } // if (looker == null) // { // //打赏者为空,新增用户信息(在前面获取用户信息已经跳转注册过) // log4net.LogHelper.WriteError(this.GetType(), new WxPayException("获取用户信息失败!")); // throw new WxPayException("获取用户信息失败!"); // } // RewardOrder order = new RewardOrder(); // order.userip = Utility.Web.WebHelper.GetIP(); // order.addTime = DateTime.Now; // order.articleId = article.Id; // order.minisnsId = article.MinisnsId; // order.rewardFromUserId = looker.Id; // order.rewardMoney = total_fee; // order.rewardToUserId = maker.Id; // order.out_trade_no = out_trade_no; // order.status = 0; // order.percent = ((100 - WebConfigBLL.VzanRewardPercent) - new MinisnsBll().GetModel(article.MinisnsId).RewardPercent); // //众筹 // if (article.IsGuerdon == (int)ArticleTypeEnum.Donation) // { // order.percent = 100 - WebConfigBLL.DonationPercent; // order.rewardtype = 3; // } // //新增区分文章和回复类型 // order.rewardtype = 0; // RewardOrderBLL bllorder = new RewardOrderBLL(); // try // { // orderid = Convert.ToInt32(bllorder.Add(order)); // if (orderid <= 0) // { // throw new WxPayException("打赏新增订单失败!"); // } // } // catch (Exception ex) // { // log4net.LogHelper.WriteError(this.GetType(), new WxPayException("插入RewardOrder失败!" + ex.Message)); // throw; // } // unifiedOrderResult = result; // return result; //} ///// <summary> ///// 文章悬赏 ///// </summary> ///// <param name="article">文章实体</param> ///// <returns></returns> //public WxPayData GetUnifiedOrderResult(PayCenterSetting setting,Article article) //{ // OAuthUserBll bll = new OAuthUserBll(article.MinisnsId.ToString()); // OAuthUser maker = bll.GetUserByCache(article.UserId); // //ArticleType articleType = new ArticleTypeBll().GetModel(article.ArticleTypeId); // //统一下单 // string out_trade_no = WxPayApi.GenerateOutTradeNo();//商户订单号 // string body = string.Empty; // int paytype = 0; // if (article.GuerdonMoney > 0) // { // body += string.Format("悬赏贴:{0}元", article.GuerdonMoney * 0.01);//商品描述 // paytype = 2; // } // if (article.payment_free > 0) // { // if (article.IsGuerdon == (int)ArticleTypeEnum.Pay) // { // body += string.Format("付费贴:{0}元", article.payment_free * 0.01);//商品描述 // paytype = 3; // } // if (article.IsGuerdon == (int)ArticleTypeEnum.Stick) // { // body += string.Format("置顶贴:{0}元", article.payment_free * 0.01);//商品描述 // paytype = 4; // } // } // string attach = string.Empty; // attach = "paytype=" + paytype + "&minisnsid=" + article.MinisnsId + "&articleid=" + article.Id + "&userid=" + article.UserId;//自带的信息 // //统一下单 // WxPayData data = new WxPayData(); // data.SetValue("body", body); // data.SetValue("attach", attach); // data.SetValue("out_trade_no", out_trade_no); // data.SetValue("total_fee", total_fee); // data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); // data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); // data.SetValue("goods_tag", "test"); // data.SetValue("trade_type", "JSAPI"); // data.SetValue("openid", openid); // WxPayData result = WxPayApi.UnifiedOrder(data, setting); // if (!result.IsSet("appid") || !result.IsSet("prepay_id") || result.GetValue("prepay_id").ToString() == "") // { // log4net.LogHelper.WriteError(this.GetType(), new WxPayException("文章付款ID:" + article.Id + ",data:" + data.ToJson())); // log4net.LogHelper.WriteError(this.GetType(), new WxPayException("result:" + result.ToJson())); // log4net.LogHelper.WriteError(this.GetType(), new WxPayException("统一下单请求失败!prepay_id:" + result.GetValue("prepay_id").ToString())); // throw new WxPayException("UnifiedOrder response error!"); // } // //插入打赏记录 // if (maker == null) // { // //作者为空,不能打赏 // log4net.LogHelper.WriteError(this.GetType(), new WxPayException("文章作者为空!")); // throw new WxPayException("文章作者为空!"); // } // if (article.IsGuerdon == 1) // { // GuerdonOrder order = new GuerdonOrder(); // order.Addtime = DateTime.Now; // order.Articleid = article.Id; // order.MinisnsId = article.MinisnsId; // order.GuerdonFromUserId = maker.Id; // order.GuerdonMoney = article.GuerdonMoney; // order.OutTradeNo = out_trade_no; // order.Status = 0; // order.Percent = ((100 - WebConfigBLL.VzanRewardPercent) - new MinisnsBll().GetModel(article.MinisnsId).RewardPercent); // //新增区分文章和回复类型 // order.OperStatus = 0; // GuerdonOrderBLL bllorder = new GuerdonOrderBLL(); // bllorder.Add(order); // } // unifiedOrderResult = result; // return result; //} ///// <summary> ///// 回复打赏 ///// </summary> ///// <param name="article">回复实体</param> ///// <returns></returns> //public WxPayData GetUnifiedOrderResult(PayCenterSetting setting, ArticleComment comment, OAuthUser looker, out int orderid) //{ // OAuthUserBll bll = new OAuthUserBll(comment.MinisnsId.ToString()); // OAuthUser maker = bll.GetUserByCache(comment.UserId); // //统一下单 // string out_trade_no = WxPayApi.GenerateOutTradeNo();//商户订单号 // string body = "打赏" + (maker == null ? "匿名用户" : Utility.ReplaceSpecialChar(maker.Nickname, '?'));//商品描述 // string attach = "paytype=1&minisnsid=" + comment.MinisnsId + "&commentid=" + comment.Id + "&userid=" + comment.UserId + "&luserId=" + looker.Id;//自带的信息 // //统一下单 // WxPayData data = new WxPayData(); // data.SetValue("body", body); // data.SetValue("attach", attach); // data.SetValue("out_trade_no", out_trade_no); // data.SetValue("total_fee", total_fee); // data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); // data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); // data.SetValue("goods_tag", "test"); // data.SetValue("trade_type", "JSAPI"); // data.SetValue("openid", openid); // WxPayData result = WxPayApi.UnifiedOrder(data, setting); // if (!result.IsSet("appid") || !result.IsSet("prepay_id") || result.GetValue("prepay_id").ToString() == "") // { // log4net.LogHelper.WriteError(this.GetType(), new WxPayException("文章回复实体ID" + comment.Id + ",data:" + data.ToJson())); // log4net.LogHelper.WriteError(this.GetType(), new WxPayException("result:" + result.ToJson())); // log4net.LogHelper.WriteError(this.GetType(), new WxPayException("统一下单请求失败!prepay_id:" + result.GetValue("prepay_id").ToString())); // throw new WxPayException("UnifiedOrder response error!"); // } // //插入打赏记录 // if (maker == null) // { // //作者为空,不能打赏 // log4net.LogHelper.WriteError(this.GetType(), new WxPayException("文章作者为空!")); // throw new WxPayException("文章作者为空!"); // } // if (looker == null) // { // //打赏者为空,新增用户信息(在前面获取用户信息已经跳转注册过) // log4net.LogHelper.WriteError(this.GetType(), new WxPayException("获取用户信息失败!")); // throw new WxPayException("获取用户信息失败!"); // } // RewardOrder order = new RewardOrder(); // order.userip = Utility.Web.WebHelper.GetIP(); // order.addTime = DateTime.Now; // order.articleId = comment.ArticleId; // order.minisnsId = comment.MinisnsId; // order.rewardFromUserId = looker.Id; // order.rewardMoney = total_fee; // order.rewardToUserId = maker.Id; // order.out_trade_no = out_trade_no; // order.status = 0; // order.percent = ((100 - WebConfigBLL.VzanRewardPercent) - new MinisnsBll().GetModel(comment.MinisnsId).RewardPercent); // //新增区分文章和回复类型 // order.rewardtype = 1; // order.commentId = comment.Id;//如果是回复打赏,commentId为空 // RewardOrderBLL bllorder = new RewardOrderBLL(); // try // { // orderid = Convert.ToInt32(bllorder.Add(order)); // } // catch (Exception ex) // { // log4net.LogHelper.WriteError(this.GetType(), new WxPayException("插入RewardOrder失败!" + ex.Message)); // throw; // } // //orderid = bllorder.GetModel(string.Format("out_trade_no='{0}'", order.out_trade_no)).Id; // unifiedOrderResult = result; // return result; //} ///// <summary> ///// 支付中心 ///// </summary> ///// <param name="article">Morders订单实体</param> ///// <returns></returns> //public WxPayData GetUnifiedOrderResult(PayCenterSetting setting, Morders morder, bool livePay = false) //{ // //统一下单 // string out_trade_no = morder.orderno;//商户订单号 // if (string.IsNullOrEmpty(morder.orderno)) // { // log4net.LogHelper.WriteError(this.GetType(), new WxPayException("统一下单失败,订单的内部订单号为空!:OrderID:" + morder.Id)); // throw new WxPayException("UnifiedOrder response error!"); // } // string body = string.Empty; // if (!string.IsNullOrEmpty(morder.ShowNote)) // { // body = morder.ShowNote; // } // else // { // string paytype = string.Empty; // switch (morder.OrderType) // { // case (int)ArticleTypeEnum.Offer: // paytype = "悬赏贴"; // break; // case (int)ArticleTypeEnum.Pay: // paytype = "付费贴"; // break; // case (int)ArticleTypeEnum.Stick: // paytype = "置顶帖"; // break; // case (int)ArticleTypeEnum.VoiceRedPacket: // paytype = "语音红包"; // break; // case (int)ArticleTypeEnum.Advert: // paytype = "广告"; // break; // case (int)ArticleTypeEnum.VoiceRedPacketRecharge: // paytype = "红包充值"; // break; // case (int)ArticleTypeEnum.LiveReward: // paytype = "直播间打赏"; // break; // case (int)ArticleTypeEnum.CashWishes: // paytype = "送彩礼"; // break; // case (int)ArticleTypeEnum.CityArticleTop: // case (int)ArticleTypeEnum.CityBannerShow: // case (int)ArticleTypeEnum.CityStoreTop: // paytype = "同城推广"; // break; // } // body = string.Format("支付中心,{0}支付{1}元", paytype, (morder.payment_free * 0.01));//商品描述; // } // string attach = string.Format("paytype={0}&orderid={1}&orderno={2}&from=center", morder.OrderType, morder.Id, morder.orderno);//自带的信息 // //统一下单 // WxPayData data = new WxPayData(); // data.SetValue("body", body); // data.SetValue("attach", attach); // data.SetValue("out_trade_no", out_trade_no); // data.SetValue("total_fee", total_fee); // data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); // data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); // data.SetValue("goods_tag", "test"); // data.SetValue("trade_type", "JSAPI"); // data.SetValue("openid", openid); // WxPayData result = WxPayApi.UnifiedOrder(data, setting,60,livePay); // if (!result.IsSet("appid") || !result.IsSet("prepay_id") || result.GetValue("prepay_id").ToString() == "") // { // log4net.LogHelper.WriteError(this.GetType(), new WxPayException("data:" + data.ToJson())); // log4net.LogHelper.WriteError(this.GetType(), new WxPayException("result:" + result.ToJson())); // log4net.LogHelper.WriteError(this.GetType(), new WxPayException("统一下单请求失败!prepay_id:" + result.GetValue("prepay_id").ToString())); // throw new WxPayException("UnifiedOrder response error!"); // } // unifiedOrderResult = result; // return result; //} public WxPayData GetUnifiedOrderResultByCity(PayCenterSetting setting, CityMorders morder, string notify_url) { //统一下单 string out_trade_no = morder.orderno;//商户订单号 if (string.IsNullOrEmpty(morder.orderno)) { //log4net.LogHelper.WriteError(this.GetType(), new WxPayException("统一下单失败,订单的内部订单号为空!:OrderID:" + morder.Id)); throw new WxPayException("UnifiedOrder response error!"); } string body = string.Empty; if (!string.IsNullOrEmpty(morder.ShowNote)) { body = morder.ShowNote; } else { string paytype = string.Empty; switch (morder.OrderType) { case (int)ArticleTypeEnum.MiniappGoods: paytype = "小程序电商模板订单"; break; case (int)ArticleTypeEnum.MiniappFoodGoods: paytype = "小程序餐饮模板订单"; break; case (int)ArticleTypeEnum.MiniappSaveMoneySet: paytype = "小程序餐饮储值"; break; case (int)ArticleTypeEnum.MiniappBargain: paytype = "小程序砍价"; break; case (int)ArticleTypeEnum.MiniappEnt: paytype = "小程序专业版"; break; } body = string.Format("支付中心,{0}支付{1}元", paytype, (morder.payment_free * 0.01)); //商品描述; } string attach = string.Format("paytype={0}&orderid={1}&orderno={2}&from=city", morder.OrderType, morder.Id, morder.orderno); //自带的信息 //统一下单 WxPayData data = new WxPayData(); data.SetValue("body", body); data.SetValue("attach", attach); data.SetValue("out_trade_no", out_trade_no); data.SetValue("total_fee", total_fee); data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss")); data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss")); data.SetValue("goods_tag", "test"); data.SetValue("trade_type", "JSAPI"); data.SetValue("openid", openid); //同城回调到同城站点 //data.SetValue("notify_url", WebConfigBLL.citynotify_url); //data.SetValue("notify_url", WebConfigBLL.citynotify_url); data.SetValue("notify_url", notify_url); //log4net.LogHelper.WriteInfo(GetType(),"支付回调链接:"+ WebConfigBLL.citynotify_url); WxPayData result = WxPayApi.UnifiedOrder(data, setting); if (result != null && (!result.IsSet("appid") || !result.IsSet("prepay_id") || !result.IsSet("prepay_id"))) { //log4net.LogHelper.WriteError(this.GetType(), new WxPayException("data:" + data.ToJson())); //log4net.LogHelper.WriteError(this.GetType(), new WxPayException("result:" + result.ToJson())); //log4net.LogHelper.WriteError(this.GetType(), new WxPayException("统一下单请求失败!prepay_id:" + result.GetValue("prepay_id").ToString())); throw new WxPayException("UnifiedOrder response error!" + "result:" + result.ToJson()); } unifiedOrderResult = result; return(result); }
/// <summary> /// 获取提现结果 /// </summary> /// <param name="item"></param> /// <param name="code"></param> /// <param name="msg"></param> public void GetDrawCashResult(DrawCashApply item, ref int code, ref string msg, out C_UserInfo userinfo) { item.drawState = (int)DrawCashState.提现失败; userinfo = C_UserInfoBLL.SingleModel.GetModel(item.userId); if (userinfo != null) { PayCenterSetting setting = PayCenterSettingBLL.SingleModel.GetPayCenterSetting(userinfo.appId); if (setting == null) { msg = "提现失败更新提现申请记录失败PayCenterSetting为NULL"; } else { WxPayData data = new WxPayData(); data.SetValue("openid", userinfo.OpenId); //openid data.SetValue("amount", item.cashMoney); //取款金额 data.SetValue("re_user_name", ReplaceSpecialChar(userinfo.NickName, '?')); //收款用户姓名 data.SetValue("desc", string.Format("{0},小程序{1}提现{2}元", ReplaceSpecialChar(userinfo.NickName, '?'), Enum.GetName(typeof(DrawCashApplyType), item.applyType), item.cashMoneyStr)); data.SetValue("partner_trade_no", item.partner_trade_no); //订单号 data.SetValue("spbill_create_ip", ConfigurationManager.AppSettings["IP"]); //订单号 WxPayData result = WxPayApi.CompanyPay(data, setting); if (result != null) { try { string resultStr = result.ToJson(); //企业付款(客户提现),接收返回数据 //---------------------- //判断执行提现结果 //---------------------- int i = DrawResult(result, item.cashMoney, setting); if (i == 1) { msg = "提现成功"; code = 1; item.drawState = (int)DrawCashState.提现成功; } else if (i == -2) { code = -1; //表示微信那边返回错误码为“SYSTEMERROR”时,一定要使用原单号重试,否则可能造成重复支付等资金风险。 //该提现记录不能算失败也不能算成功,维持原状等待下次提现队列 msg = "返回错误码为“SYSTEMERROR”等待下次提现队列提现返回结果" + resultStr; } else { code = 0; msg = result.GetValue("err_code_des").ToString(); } } catch (Exception ex) { msg = "提现失败发生异常" + ex.Message; } } else { msg = "提现失败(证书路径不存在)"; } } } else { msg = "提现用户不存在"; } item.DrawTime = DateTime.Now; DrawCashApplyBLL.SingleModel.Update(item, "drawState,DrawTime"); writeLog(msg); }
/// <summary> /// 统一下单 /// </summary> /// <param name="inputObj">提交给统一下单API的参数</param> /// <param name="timeOut">超时时间</param> /// <returns></returns> public static WxPayData UnifiedOrder(WxPayData inputObj, PayCenterSetting setting, int timeOut = 60, bool livePay = false) { 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") || string.IsNullOrEmpty(inputObj.GetValue("notify_url").ToString())) { inputObj.SetValue("notify_url", WxPayConfig.NOTIFY_URL);//异步通知url } if (livePay) { inputObj.SetValue("notify_url", inputObj.GetValue("notify_url").ToString().Replace("/pay/", "/live/"));//异步通知url,直播要跳到直播回调 } string appid = WxPayConfig.APPID; string mch_id = WxPayConfig.MCHID; string key = string.Empty; if (setting != null && setting.Id > 0) { appid = setting.Appid; mch_id = setting.Mch_id; key = setting.Key; } inputObj.SetValue("appid", appid); //公众账号ID inputObj.SetValue("mch_id", mch_id); //商户号 inputObj.SetValue("spbill_create_ip", WxPayConfig.IP); //终端ip inputObj.SetValue("nonce_str", GenerateNonceStr()); //随机字符串 //log4net.LogHelper.WriteInfo(typeof(WxPayApi), inputObj.ToJson()); //签名 inputObj.SetValue("sign", inputObj.MakeSign(key)); string xml = inputObj.ToXml(); string response = WxHelper.Post(xml, url, false, setting, timeOut); //log4net.LogHelper.WriteInfo(typeof(WxPayApi), "UnifiedOrder().response=" + response); WxPayData result = new WxPayData(); result.FromXml(response); return(result); }
/// <summary> /// 企业付款 /// </summary> /// <param name="inputObj">企业付款接口的参数</param> /// <param name="timeOut">企业付款接口超时时间</param> /// <returns></returns> public static WxPayData CompanyPay(WxPayData inputObj, PayCenterSetting setting, int timeOut = 20) { string url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"; string appid = WxPayConfig.APPID; string mch_id = WxPayConfig.MCHID; string key = string.Empty; if (setting != null && setting.Id > 0) { appid = setting.Appid; mch_id = setting.Mch_id; key = setting.Key; } inputObj.SetValue("mch_appid", appid); //公众账号ID inputObj.SetValue("mchid", mch_id); //商户号 inputObj.SetValue("spbill_create_ip", WxPayConfig.IP); //IP inputObj.SetValue("nonce_str", GenerateNonceStr()); //随机字符串 inputObj.SetValue("check_name", "NO_CHECK"); //校验用户姓名,不需要校验,必选项,可选类型有: inputObj.SetValue("sign", inputObj.MakeSign(key)); //签名 //NO_CHECK:不校验真实姓名 //FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账) //OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功) // log4net.LogHelper.WriteInfo(typeof(CompanyPay), "用户提现请求参数:" + inputObj.ToJson()); DrawcashResult drawresult = new DrawcashResult(); if (setting != null) { drawresult.mch_id = setting.Mch_id; drawresult.appid = setting.Appid; } //检测必填参数 if (!inputObj.IsSet("mch_appid")) { throw new WxPayException("企业付款中,公众账号appID必填!"); } if (!inputObj.IsSet("mchid")) { throw new WxPayException("企业付款中,微信支付分配的商户号mchid必填!"); } if (!inputObj.IsSet("nonce_str")) { throw new WxPayException("企业付款中,随机字符串nonce_str必填!"); } else { drawresult.nonce_str = inputObj.GetValue("nonce_str").ToString(); } if (!inputObj.IsSet("sign")) { throw new WxPayException("企业付款中,签名sign必填!"); } else { drawresult.sign = inputObj.GetValue("sign").ToString(); } if (!inputObj.IsSet("partner_trade_no")) { throw new WxPayException("企业付款中,商户订单号partner_trade_no必填!"); } else { drawresult.partner_trade_no = inputObj.GetValue("partner_trade_no").ToString(); } if (!inputObj.IsSet("openid")) { throw new WxPayException("企业付款中,用户openid必填!"); } else { drawresult.openid = inputObj.GetValue("openid").ToString(); } string error = string.Empty; //if (new DrawBackUserBLL().CheckEnable(0, 0, drawresult.openid)) //{ // throw new WxPayException("黑名单!"); //} if (!inputObj.IsSet("check_name")) { throw new WxPayException("企业付款中,校验用户姓名check_name必填!"); } else { drawresult.check_name = inputObj.GetValue("check_name").ToString(); } if (!inputObj.IsSet("amount")) { throw new WxPayException("企业付款中,金额amount必填!"); } else { drawresult.amount = Convert.ToInt32(inputObj.GetValue("amount").ToString()); } if (!inputObj.IsSet("desc")) { throw new WxPayException("企业付款中,企业付款描述信息desc必填!"); } else { drawresult.desc = inputObj.GetValue("desc").ToString(); if (inputObj.GetValue("desc").ToString().Length >= 50) { inputObj.SetValue("desc", inputObj.GetValue("desc").ToString().Substring(0, 46) + "..."); } } if (!inputObj.IsSet("spbill_create_ip")) { throw new WxPayException("企业付款中,Ip地址spbill_create_ip必填!"); } else { drawresult.spbill_create_ip = inputObj.GetValue("spbill_create_ip").ToString(); } if (inputObj.IsSet("re_user_name")) { drawresult.re_user_name = inputObj.GetValue("re_user_name").ToString(); } string xml = inputObj.ToXml(); drawresult.CreateTime = DateTime.Now; //post之前,增加记录 int id = Convert.ToInt32(DrawcashResultBLL.SingleModel.Add(drawresult)); drawresult.id = id; // try { string response = WxHelper.Post(xml, url, true, setting, 30); if (string.IsNullOrEmpty(response)) { return(null); } WxPayData result = new WxPayData(); result.FromXml(response, false); if (result != null) { drawresult.return_code = result.GetValue("return_code") == null ? "" : result.GetValue("return_code").ToString(); drawresult.return_msg = result.GetValue("return_msg") == null ? "" : result.GetValue("return_msg").ToString(); drawresult.nonce_str = result.GetValue("nonce_str") == null ? "" : result.GetValue("nonce_str").ToString(); drawresult.result_code = result.GetValue("result_code") == null ? "" : result.GetValue("result_code").ToString(); drawresult.err_code = result.GetValue("err_code") == null ? "" : result.GetValue("err_code").ToString(); drawresult.err_code_des = result.GetValue("err_code_des") == null ? "" : result.GetValue("err_code_des").ToString(); drawresult.payment_time = DateTime.Now; drawresult.payment_no = result.GetValue("payment_no") == null ? "" : result.GetValue("payment_no").ToString(); DrawcashResultBLL.SingleModel.Update(drawresult); } return(result); } catch (Exception ex) { log4net.LogHelper.WriteError(typeof(WxPayApi), new Exception("提现出现错误,错误信息:" + ex.Message)); return(null); } }
public override void ProcessNotify() { try { WxPayData notifyData = GetNotifyData(); //检查支付结果中transaction_id是否存在 if (!notifyData.IsSet("transaction_id") || !notifyData.IsSet("appid")) { //若transaction_id不存在,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "支付结果中微信订单号不存在"); log4net.LogHelper.WriteError(GetType(), new Exception("transaction_id不存在 : " + res.ToXml())); context.Response.Write(res.ToXml()); context.Response.End(); return; } string transactionId = notifyData.GetValue("transaction_id").ToString(); //别删该日志 log4net.LogHelper.WriteInfo(this.GetType(), $"微信支付回调返回:{transactionId}"); string appid = notifyData.GetValue("appid").ToString(); PayCenterSetting setting = PayCenterSettingBLL.SingleModel.GetPayCenterSetting(appid); //增加重复回调判断 int re = RedisUtil.Get <int>(string.Format(MemCacheKey.ProcessNotify, transactionId)); if (re != 0) { return; } RedisUtil.Set(string.Format(MemCacheKey.ProcessNotify, transactionId), 1, TimeSpan.FromMinutes(30)); //查询订单,判断订单真实性 if (!QueryOrder(transactionId, setting)) { //若订单查询失败,则立即返回结果给微信支付后台 WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "订单查询失败"); log4net.LogHelper.WriteError(GetType(), new Exception("订单查询失败: " + notifyData.ToJson())); context.Response.Write(res.ToXml()); context.Response.End(); } //查询订单成功 else { //说付款成功:插入记录 //这里要注意,微信通知过来之后,15秒之内没有给微信回复处理状态,微信还会第二次,第三次通知。 //带过来的信息一模一样,所以这要做标志判断,万一处理过程出现问题没有给微信回复。 //在以后多次请求的时候避免多次进行业务处理,插入多条记录 PayResult result = notifyData.ToPayResult(); if (result == null) { return; } int id = Convert.ToInt32(PayResultBLL.SingleModel.Add(result));//插入记录,论坛,直播、有约 result.Id = id; NotifyOper(result); } } catch (Exception ex) { log4net.LogHelper.WriteError(typeof(ResultNotify), ex); } finally { //最后要给微信放回接收成功数据,不然微信会连续多次发送同样请求 WxPayData res = new WxPayData(); res.SetValue("return_code", "SUCCESS"); res.SetValue("return_msg", "OK"); context.Response.Write(res.ToXml()); context.Response.End(); } }
/// <summary> /// 测速上报 /// </summary> /// <param name="interface_url">接口URL</param> /// <param name="timeCost">接口耗时</param> /// <param name="inputObj">inputObj参数数组</param> private static void ReportCostTime(string interface_url, int timeCost, WxPayData inputObj, PayCenterSetting setting) { //如果不需要进行上报 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, setting); } catch (WxPayException) { //不做任何处理 } }