/** * 下载对账单 * @param WxPayData inputObj 提交给下载对账单API的参数 * @param int timeOut 接口超时时间 * @throws WxPayException * @return 成功时返回,其他抛异常 */ public static WxPayData DownloadBill(WxPayData inputObj, WxPayConfigDomain WxPayConfig, 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(WxPayConfig.PAYKEY)); //签名 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, WxPayConfig.PAYKEY); } //接口调用成功则返回非xml格式的数据 else { result.SetValue("result", response); } return(result); }
public void ProcessNotify() { SceneryDomain sceneryDomain = new SceneryDomain(); try { WxPayData notifyData = null; WxPayData res = null; try { notifyData = GetNotifyData(sceneryDomain); } catch (WxPayException ex) { //若签名错误,则立即返回结果给微信支付后台 res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", ex.Message); LogHelper.WeChatLog("Sign check error : " + res.ToXml()); ResponseMessage.Content = new StringContent(res.ToXml()); return; } //检查支付结果中transaction_id是否存在 if (!notifyData.IsSet("transaction_id")) { //若transaction_id不存在,则立即返回结果给微信支付后台 res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "支付结果中微信订单号不存在"); LogHelper.WeChatLog("The Pay result is error : " + res.ToXml()); ResponseMessage.Content = new StringContent(res.ToXml()); return; } string transaction_id = notifyData.GetValue("transaction_id").ToString(); //查询订单,判断订单真实性 var queryResult = QueryOrder(transaction_id, sceneryDomain.WeChat); if (queryResult == null) { //若订单查询失败,则立即返回结果给微信支付后台 res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "订单查询失败"); LogHelper.WeChatLog("Order query failure : " + res.ToXml()); ResponseMessage.Content = new StringContent(res.ToXml()); return; } //查询订单成功 else { //业务处理 var detailDao = new WeChatDetailDao(); var qrCodeDao = new WeChatQRCodeDao(); //支付成功 查询交易信息 WeChatDetailDomain detail = new WeChatDetailDomain(); detail.Out_trade_no = queryResult.GetValue("out_trade_no").ToString(); detail.Total_fee = Convert.ToInt32(queryResult.GetValue("total_fee")); //需要检查数据库中是否有改数据 有的话 直接返回 var QRCodeDetail = qrCodeDao.IsExistOut_trade_no(detail.Out_trade_no, detail.Total_fee, sceneryDomain.WeChat.APPID); if (QRCodeDetail == null || QRCodeDetail.SceneryName == "-1") { LogHelper.WeChatLog("论寻:无通知参数"); res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "无通知参数"); LogHelper.WeChatLog("Order query failure : " + res.ToXml()); ResponseMessage.Content = new StringContent(res.ToXml()); return; } if (QRCodeDetail.SceneryName != "-2") { //保存微信信息 detail.SceneryName = QRCodeDetail.SceneryName; detail.Creater = sceneryDomain.WeChat.APPID; detail.Updater = ""; detail.AppId = sceneryDomain.WeChat.APPID; detail.BatchNumber = QRCodeDetail.BatchNumber; detail.SceneryRate = QRCodeDetail.SceneryRate; detail.Time_end = DateTime.ParseExact(queryResult.GetValue("time_end").ToString(), "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture); detail.WeChatPlayDate = Convert.ToDateTime(detail.Time_end.ToString("yyyy-MM-dd")); detail.Err_code = "Success"; detail.Err_code_des = "异步"; detail.Openid = queryResult.GetValue("openid").ToString(); detail.Trade_type = queryResult.GetValue("trade_type").ToString(); detail.Bank_type = queryResult.GetValue("bank_type").ToString(); detail.Settlement_total_fee = Convert.ToInt32(queryResult.GetValue("settlement_total_fee")); detail.Transaction_id = queryResult.GetValue("transaction_id").ToString(); detailDao.Add(detail); } else { //论寻:数据已经存在,不需要插入 LogHelper.WeChatLog("论寻:数据已经存在,不需要插入"); } res = new WxPayData(); res.SetValue("return_code", "SUCCESS"); res.SetValue("return_msg", "OK"); LogHelper.WeChatLog("order query success : " + res.ToXml()); ResponseMessage.Content = new StringContent(res.ToXml()); } } catch (Exception ex) { LogHelper.WeChatLog("Notify 异常:" + ex.Message); WxPayData res = new WxPayData(); res.SetValue("return_code", "FAIL"); res.SetValue("return_msg", "系统异常"); LogHelper.WeChatLog("Sign check error : " + res.ToXml()); ResponseMessage.Content = new StringContent(res.ToXml()); } }
/** * * 测速上报 * @param string interface_url 接口URL * @param int timeCost 接口耗时 * @param WxPayData inputObj参数数组 */ private static void ReportCostTime(string interface_url, int timeCost, WxPayData inputObj, WxPayConfigDomain WxPayConfig) { //如果不需要进行上报 if (WxPayConfigDomain.REPORT_LEVENL == 0) { return; } //如果仅失败上报 if (WxPayConfigDomain.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, WxPayConfig); } catch (WxPayException ex) { //不做任何处理 } }
/** * * 统一下单 * @param WxPaydata inputObj 提交给统一下单API的参数 * @param int timeOut 超时时间 * @throws WxPayException * @return 成功时返回,其他抛异常 */ public static WxPayData UnifiedOrder(WxPayData inputObj, WxPayConfigDomain WxPayConfig, int timeOut = 6) { string url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; //检测必填参数 if (!inputObj.IsSet("out_trade_no")) { throw new WxPayException("缺少统一支付接口必填参数out_trade_no!"); } else if (!inputObj.IsSet("body")) { throw new WxPayException("缺少统一支付接口必填参数body!"); } else if (!inputObj.IsSet("total_fee")) { throw new WxPayException("缺少统一支付接口必填参数total_fee!"); } else if (!inputObj.IsSet("trade_type")) { throw new WxPayException("缺少统一支付接口必填参数trade_type!"); } //关联参数 if (inputObj.GetValue("trade_type").ToString() == "JSAPI" && !inputObj.IsSet("openid")) { throw new WxPayException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!"); } if (inputObj.GetValue("trade_type").ToString() == "NATIVE" && !inputObj.IsSet("product_id")) { throw new WxPayException("统一支付接口中,缺少必填参数product_id!trade_type为JSAPI时,product_id为必填参数!"); } //异步通知url未设置,则使用配置文件中的url if (!inputObj.IsSet("notify_url")) { inputObj.SetValue("notify_url", "http://alipayapi.zhilvtx.com/API/WeChat/Notify");//异步通知url } inputObj.SetValue("appid", WxPayConfig.APPID); //公众账号ID inputObj.SetValue("mch_id", WxPayConfig.MCHID); //商户号 //inputObj.SetValue("spbill_create_ip", WxPayConfig.IP);//终端ip inputObj.SetValue("nonce_str", GenerateNonceStr()); //随机字符串 //签名 inputObj.SetValue("sign", inputObj.MakeSign(WxPayConfig.PAYKEY)); string xml = inputObj.ToXml(); var start = DateTime.Now; LogHelper.WeChatLog(string.Format("商户订单号:{0} 请求:{1}", inputObj.GetValue("out_trade_no"), xml)); string response = HttpService.Post(xml, url, false, timeOut); LogHelper.WeChatLog(string.Format("WxPayApi:UnfiedOrder response :", response)); var end = DateTime.Now; int timeCost = (int)((end - start).TotalMilliseconds); WxPayData result = new WxPayData(); result.FromXml(response, WxPayConfig.PAYKEY); ReportCostTime(url, timeCost, result, WxPayConfig);//测速上报 return(result); }