public static NameValueCollection GetOpenidAndAccessToken(Page page, string appId, string appSecret, bool appendLog = false) { if (!string.IsNullOrEmpty(page.Request.QueryString["code"])) { string code = page.Request.QueryString["code"]; return(JsApiPay.GetOpenidAndAccessTokenFromCode(code, page, appId, appSecret, false)); } string host = page.Request.Url.Host; string path = page.Request.Path; string value = HttpUtility.UrlEncode(page.Request.Url.ToString()); WxPayData wxPayData = new WxPayData(); wxPayData.SetValue("appid", appId); wxPayData.SetValue("redirect_uri", value); wxPayData.SetValue("response_type", "code"); wxPayData.SetValue("scope", "snsapi_base"); wxPayData.SetValue("state", "STATE#wechat_redirect"); string text = "https://open.weixin.qq.com/connect/oauth2/authorize?" + wxPayData.ToUrl(); if (appendLog) { WxPayLog.AppendLog(JsApiPay.paramDict, text, page.Request.Url.ToString(), "未获取到code,跳转去获取code页面", LogType.GetTokenOrOpenID); } try { page.Response.Redirect(text); } catch (ThreadAbortException) { } return(null); }
public static WxPayData Micropay(WxPayData inputObj, PayConfig config, int timeOut = 10) { string text = "https://api.mch.weixin.qq.com/pay/micropay"; if (!inputObj.IsSet("body")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "缺少必填参数body", LogType.MicroPay); } else if (!inputObj.IsSet("out_trade_no")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "缺少必填参数out_trade_no", LogType.MicroPay); } else if (!inputObj.IsSet("total_fee")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "缺少必填参数total_fee", LogType.MicroPay); } else if (!inputObj.IsSet("auth_code")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "缺少必填参数auth_code", LogType.MicroPay); } inputObj.SetValue("spbill_create_ip", config.IPAddress); inputObj.SetValue("appid", config.AppId); inputObj.SetValue("mch_id", config.MchID); inputObj.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", "")); inputObj.SetValue("sign", inputObj.MakeSign(config.Key)); string xml = inputObj.ToXml(); DateTime now = DateTime.Now; string xml2 = HttpService.Post(xml, text, false, config, timeOut); DateTime now2 = DateTime.Now; int timeCost = (int)(now2 - now).TotalMilliseconds; WxPayData wxPayData = new WxPayData(); wxPayData.FromXml(xml2, config.Key); WxPayApi.ReportCostTime(text, timeCost, wxPayData, config); return wxPayData; }
public static WxPayData Report(WxPayData inputObj, PayConfig config, int timeOut = 1) { string url = "https://api.mch.weixin.qq.com/payitil/report"; if (!inputObj.IsSet("interface_url")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "接口URL,缺少必填参数interface_url!", LogType.Report); } if (!inputObj.IsSet("return_code")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "返回状态码,缺少必填参数return_code!", LogType.Report); } if (!inputObj.IsSet("result_code")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "业务结果,缺少必填参数result_code!", LogType.Report); } if (!inputObj.IsSet("user_ip")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "访问接口IP,缺少必填参数user_ip!", LogType.Report); } if (!inputObj.IsSet("execute_time_")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "接口耗时,缺少必填参数execute_time_!", LogType.Report); } inputObj.SetValue("appid", config.AppId); inputObj.SetValue("mch_id", config.MchID); inputObj.SetValue("user_ip", config.IPAddress); inputObj.SetValue("time", DateTime.Now.ToString("yyyyMMddHHmmss")); inputObj.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); inputObj.SetValue("sign", inputObj.MakeSign(config.Key)); string xml = inputObj.ToXml(); string xml2 = HttpService.Post(xml, url, false, config, timeOut); WxPayData wxPayData = new WxPayData(); wxPayData.FromXml(xml2, config.Key); return wxPayData; }
public PayNotify GetPayNotify(string xml) { DataTable dataTable = this.ErrorTable("Notify"); DataRow dataRow = dataTable.NewRow(); dataRow["OperTime"] = DateTime.Now; try { if (string.IsNullOrEmpty(xml)) { return(null); } PayNotify notifyObject = Utils.GetNotifyObject <PayNotify>(xml); string sign = ""; if (notifyObject == null || !this.ValidPaySign(notifyObject, out sign)) { dataTable.Rows.Add(dataRow); IDictionary <string, string> dictionary = new Dictionary <string, string>(); dictionary.Add("ErrorMsg", (notifyObject == null) ? "Notify Null" : "Valid pay Sign Error"); dictionary.Add("result", xml); WxPayLog.AppendLog(dictionary, sign, "", "签名验证失败", LogType.PayNotify); return(null); } notifyObject.PayInfo = new PayInfo { SignType = "MD5", Sign = notifyObject.sign, TradeMode = 0, BankType = notifyObject.bank_type, BankBillNo = "", TotalFee = (decimal)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 = "", Attach = notifyObject.attach }; return(notifyObject); } catch (Exception ex) { IDictionary <string, string> dictionary = new Dictionary <string, string>(); dictionary.Add("result", xml); WxPayLog.WriteExceptionLog(ex, dictionary, LogType.Error); return(null); } }
public static WxPayData UnifiedOrder(WxPayData inputObj, PayConfig config, int timeOut = 6) { string text = "https://api.mch.weixin.qq.com/pay/unifiedorder"; if (!inputObj.IsSet("out_trade_no")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "缺少统一支付接口必填参数out_trade_no!", LogType.UnifiedOrder); } else if (!inputObj.IsSet("body")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "缺少统一支付接口必填参数body!", LogType.UnifiedOrder); } else if (!inputObj.IsSet("total_fee")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "缺少统一支付接口必填参数total_fee!", LogType.UnifiedOrder); } else if (!inputObj.IsSet("trade_type")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "缺少统一支付接口必填参数trade_type!", LogType.UnifiedOrder); } if (inputObj.GetValue("trade_type").ToString() == "JSAPI" && !inputObj.IsSet("openid")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!", LogType.UnifiedOrder); } if (inputObj.GetValue("trade_type").ToString() == "NATIVE" && !inputObj.IsSet("product_id")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "统一支付接口中,缺少必填参数product_id!trade_type为JSAPI时,product_id为必填参数!", LogType.UnifiedOrder); } if (!inputObj.IsSet("NOTIFY_URL")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "统一支付接口中,缺少必填参数NOTIFY_URL!", LogType.UnifiedOrder); } if (!inputObj.IsSet("NOTIFY_URL")) { inputObj.SetValue("NOTIFY_URL", config.NOTIFY_URL); } inputObj.SetValue("appid", config.AppId); inputObj.SetValue("mch_id", config.MchID); inputObj.SetValue("spbill_create_ip", config.IPAddress); inputObj.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); inputObj.SetValue("sign", inputObj.MakeSign(config.Key)); string xml = inputObj.ToXml(); DateTime now = DateTime.Now; string xml2 = HttpService.Post(xml, text, false, config, timeOut); DateTime now2 = DateTime.Now; int timeCost = (int)(now2 - now).TotalMilliseconds; WxPayData wxPayData = new WxPayData(); wxPayData.FromXml(xml2, config.Key); WxPayApi.ReportCostTime(text, timeCost, wxPayData, config); return wxPayData; }
private static void ReportCostTime(string interface_url, int timeCost, WxPayData inputObj, PayConfig config) { if (config.REPORT_LEVENL != 0 && (config.REPORT_LEVENL != 1 || !inputObj.IsSet("return_code") || !(inputObj.GetValue("return_code").ToString() == "SUCCESS") || !inputObj.IsSet("result_code") || !(inputObj.GetValue("result_code").ToString() == "SUCCESS"))) { WxPayData wxPayData = new WxPayData(); wxPayData.SetValue("interface_url", interface_url); wxPayData.SetValue("execute_time_", timeCost); if (inputObj.IsSet("return_code")) { wxPayData.SetValue("return_code", inputObj.GetValue("return_code")); } if (inputObj.IsSet("return_msg")) { wxPayData.SetValue("return_msg", inputObj.GetValue("return_msg")); } if (inputObj.IsSet("result_code")) { wxPayData.SetValue("result_code", inputObj.GetValue("result_code")); } if (inputObj.IsSet("err_code")) { wxPayData.SetValue("err_code", inputObj.GetValue("err_code")); } if (inputObj.IsSet("err_code_des")) { wxPayData.SetValue("err_code_des", inputObj.GetValue("err_code_des")); } if (inputObj.IsSet("out_trade_no")) { wxPayData.SetValue("out_trade_no", inputObj.GetValue("out_trade_no")); } if (inputObj.IsSet("device_info")) { wxPayData.SetValue("device_info", inputObj.GetValue("device_info")); } try { WxPayApi.Report(wxPayData, config, 1); } catch (WxPayException) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "关闭订单接口中,out_trade_no必填!", LogType.CloseOrder); } } }
public static void GetCode(Page page, string appId, bool appendLog = false) { string text = HttpUtility.UrlEncode(page.Request.Url.ToString()); WxPayData wxPayData = new WxPayData(); wxPayData.SetValue("appid", appId); wxPayData.SetValue("redirect_uri", text); wxPayData.SetValue("response_type", "code"); wxPayData.SetValue("scope", "snsapi_base"); wxPayData.SetValue("state", "STATE#wechat_redirect"); string text2 = "https://open.weixin.qq.com/connect/oauth2/authorize?" + wxPayData.ToUrl(); if (appendLog) { WxPayLog.AppendLog(JsApiPay.paramDict, text2, text, "跳转去获取code页面", LogType.GetTokenOrOpenID); } page.Response.Redirect(text2); }
public static WxPayData Reverse(WxPayData inputObj, PayConfig config, int timeOut = 6) { string text = "https://api.mch.weixin.qq.com/secapi/pay/reverse"; if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "撤销订单API接口中缺少必填参数out_trade_no 或者 transaction_id", LogType.CloseOrder); } inputObj.SetValue("appid", config.AppId); inputObj.SetValue("mch_id", config.MchID); inputObj.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); inputObj.SetValue("sign", inputObj.MakeSign(config.Key)); string xml = inputObj.ToXml(); DateTime now = DateTime.Now; string xml2 = HttpService.Post(xml, text, true, config, timeOut); DateTime now2 = DateTime.Now; int timeCost = (int)(now2 - now).TotalMilliseconds; WxPayData wxPayData = new WxPayData(); wxPayData.FromXml(xml2, config.Key); WxPayApi.ReportCostTime(text, timeCost, wxPayData, config); return wxPayData; }
public static WxPayData ShortUrl(WxPayData inputObj, PayConfig config, int timeOut = 6) { string text = "https://api.mch.weixin.qq.com/tools/shorturl"; if (!inputObj.IsSet("long_url")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "需要转换的URL,签名用原串,传输需URL encode!", LogType.ShortUrl); } inputObj.SetValue("appid", config.AppId); inputObj.SetValue("mch_id", config.MchID); inputObj.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); inputObj.SetValue("sign", inputObj.MakeSign(config.Key)); string xml = inputObj.ToXml(); DateTime now = DateTime.Now; string xml2 = HttpService.Post(xml, text, false, config, timeOut); DateTime now2 = DateTime.Now; int timeCost = (int)(now2 - now).TotalMilliseconds; WxPayData wxPayData = new WxPayData(); wxPayData.FromXml(xml2, config.Key); WxPayApi.ReportCostTime(text, timeCost, wxPayData, config); return wxPayData; }
public static string GetEditAddressParameters(string appId, string access_token, bool appendLog = false) { string text = ""; try { string host = JsApiPay.page.Request.Url.Host; string path = JsApiPay.page.Request.Path; string query = JsApiPay.page.Request.Url.Query; string value = "http://" + host + path + query; WxPayData wxPayData = new WxPayData(); wxPayData.SetValue("appid", appId); wxPayData.SetValue("url", value); wxPayData.SetValue("timestamp", WxPayApi.GenerateTimeStamp()); wxPayData.SetValue("noncestr", WxPayApi.GenerateNonceStr()); wxPayData.SetValue("accesstoken", access_token); string password = wxPayData.ToUrl(); string text2 = FormsAuthentication.HashPasswordForStoringInConfigFile(password, "SHA1"); WxPayData wxPayData2 = new WxPayData(); wxPayData2.SetValue("appId", appId); wxPayData2.SetValue("scope", "jsapi_address"); wxPayData2.SetValue("signType", "sha1"); wxPayData2.SetValue("addrSign", text2); wxPayData2.SetValue("timeStamp", wxPayData.GetValue("timestamp")); wxPayData2.SetValue("nonceStr", wxPayData.GetValue("noncestr")); text = wxPayData2.ToJson(); JsApiPay.paramDict.Add("paramJson", text); if (appendLog) { WxPayLog.AppendLog(JsApiPay.paramDict, text2, JsApiPay.page.Request.Url.ToString(), "获取收货地址js函数入口参数", LogType.GetOrEditAddress); } } catch (Exception ex) { WxPayLog.AppendLog(JsApiPay.paramDict, "", JsApiPay.page.Request.Url.ToString(), "获取收货地址js函数入口参数:" + ex.Message, LogType.GetOrEditAddress); throw new WxPayException(ex.ToString()); } return(text); }
public static WxPayData Refund(WxPayData inputObj, PayConfig config, int timeOut = 60) { string text = "https://api.mch.weixin.qq.com/secapi/pay/refund"; if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "退款订单API接口中缺少必填参数out_trade_no 或者 transaction_id", LogType.Refund); } else if (!inputObj.IsSet("out_refund_no")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "退款订单API接口中缺少必填参数out_refund_no", LogType.Refund); } else if (!inputObj.IsSet("total_fee")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "退款订单API接口中缺少必填参数total_fee", LogType.Refund); } else if (!inputObj.IsSet("refund_fee")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "退款订单API接口中缺少必填参数refund_fee", LogType.Refund); } else if (!inputObj.IsSet("op_user_id")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "退款订单API接口中缺少必填参数op_user_id", LogType.Refund); } inputObj.SetValue("appid", config.AppId); inputObj.SetValue("mch_id", config.MchID); inputObj.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", "")); inputObj.SetValue("sign", inputObj.MakeSign(config.Key)); string xml = inputObj.ToXml(); DateTime now = DateTime.Now; string xml2 = HttpService.Post(xml, text, true, config, timeOut); DateTime now2 = DateTime.Now; int timeCost = (int)(now2 - now).TotalMilliseconds; WxPayData wxPayData = new WxPayData(); wxPayData.FromXml(xml2, config.Key); WxPayApi.ReportCostTime(text, timeCost, wxPayData, config); return wxPayData; }
public static WxPayData DownloadBill(WxPayData inputObj, PayConfig config, int timeOut = 6) { string url = "https://api.mch.weixin.qq.com/pay/downloadbill"; if (!inputObj.IsSet("bill_date")) { WxPayLog.AppendLog(inputObj.GetParam(), "", HttpContext.Current.Request.Url.ToString(), "对账单接口中,缺少必填参数bill_date", LogType.DownLoadBill); } inputObj.SetValue("appid", config.AppId); inputObj.SetValue("mch_id", config.MchID); inputObj.SetValue("nonce_str", WxPayApi.GenerateNonceStr()); inputObj.SetValue("sign", inputObj.MakeSign(config.Key)); string xml = inputObj.ToXml(); string text = HttpService.Post(xml, url, false, config, timeOut); WxPayData wxPayData = new WxPayData(); if (text.Substring(0, 5) == "<xml>") { wxPayData.FromXml(text, config.Key); } else { wxPayData.SetValue("result", text); } return wxPayData; }
public static string Post(string xml, string url, bool isUseCert, PayConfig config, int timeout) { GC.Collect(); string text = ""; HttpWebRequest httpWebRequest = null; HttpWebResponse httpWebResponse = null; Stream stream = null; IDictionary <string, string> dictionary = new Dictionary <string, string>(); dictionary.Add("xml", xml); dictionary.Add("url", url); dictionary.Add("isUseCert", isUseCert.ToString()); dictionary.Add("timeout", timeout.ToString()); dictionary.Add("SSLCERT_PATH", config.SSLCERT_PATH); dictionary.Add("SSLCERT_PASSWORD", config.SSLCERT_PASSWORD); dictionary.Add("PROXY_URL", config.PROXY_URL); long num = 0L; try { ServicePointManager.DefaultConnectionLimit = 200; if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = HttpService.CheckValidationResult; } httpWebRequest = (HttpWebRequest)WebRequest.Create(url); httpWebRequest.Method = "POST"; httpWebRequest.Timeout = -1; httpWebRequest.ContentType = "text/xml"; byte[] bytes = Encoding.UTF8.GetBytes(xml); httpWebRequest.ContentLength = bytes.Length; if (isUseCert) { string physicalApplicationPath = HttpContext.Current.Request.PhysicalApplicationPath; FileStream fileStream = new FileStream(physicalApplicationPath + config.SSLCERT_PATH, FileMode.Open, FileAccess.Read, FileShare.Read); byte[] array = new byte[fileStream.Length]; fileStream.Read(array, 0, array.Length); fileStream.Close(); X509Certificate2 value = new X509Certificate2(array, config.SSLCERT_PASSWORD, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet); httpWebRequest.ClientCertificates.Add(value); } stream = httpWebRequest.GetRequestStream(); stream.Write(bytes, 0, bytes.Length); stream.Close(); ServicePointManager.ServerCertificateValidationCallback = HttpService.CheckValidationResult; httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream(), Encoding.UTF8); text = streamReader.ReadToEnd().Trim(); WxPayLog.AppendLog(dictionary, "", url + "---0", text, LogType.Refund); streamReader.Close(); } catch (ThreadAbortException) { WxPayLog.AppendLog(dictionary, xml, url + "---1", text, LogType.Refund); Thread.ResetAbort(); return(""); } catch (WebException ex2) { if (ex2.Status == WebExceptionStatus.ProtocolError) { dictionary.Add("StatusCode", ((HttpWebResponse)ex2.Response).StatusCode.ToString()); dictionary.Add("StatusCode", ((HttpWebResponse)ex2.Response).StatusDescription); } WxPayLog.AppendLog(dictionary, xml, url + "---2---" + num + "---" + ex2.Message, text, LogType.Refund); return(""); } catch (Exception ex3) { dictionary.Add("HttpService", ex3.ToString()); WxPayLog.AppendLog(dictionary, xml, url + "---3", text, LogType.Refund); return(""); } finally { httpWebResponse?.Close(); httpWebRequest?.Abort(); } return(text); }
public static NameValueCollection GetOpenidAndAccessTokenFromCode(string code, Page page, string appId, string appSecret, bool appendLog = false) { NameValueCollection nameValueCollection = new NameValueCollection(); nameValueCollection.Add("OpenID", ""); nameValueCollection.Add("Access_Token", ""); string value = ""; string value2 = ""; try { WxPayData wxPayData = new WxPayData(); wxPayData.SetValue("appid", appId); wxPayData.SetValue("secret", appSecret); wxPayData.SetValue("code", code); wxPayData.SetValue("grant_type", "authorization_code"); string text = "https://api.weixin.qq.com/sns/oauth2/access_token?" + wxPayData.ToUrl(); string json = HttpService.Get(text, ""); JsonData jsonData = JsonMapper.ToObject(json); value2 = (string)jsonData["access_token"]; value = (string)jsonData["openid"]; nameValueCollection.Set("OpenID", value); nameValueCollection.Set("Access_Token", value2); if (!JsApiPay.paramDict.ContainsKey("appid")) { JsApiPay.paramDict.Add("appid", appId); } if (!JsApiPay.paramDict.ContainsKey("secret")) { JsApiPay.paramDict.Add("secret", appSecret); } if (!JsApiPay.paramDict.ContainsKey("code")) { JsApiPay.paramDict.Add("code", code); } if (!JsApiPay.paramDict.ContainsKey("grant_type")) { JsApiPay.paramDict.Add("grant_type", "authorization_code"); } if (!JsApiPay.paramDict.ContainsKey("RequestUrl")) { JsApiPay.paramDict.Add("RequestUrl", text); } if (!JsApiPay.paramDict.ContainsKey("OpenID")) { JsApiPay.paramDict.Add("OpenID", value); } if (!JsApiPay.paramDict.ContainsKey("Access_Token")) { JsApiPay.paramDict.Add("Access_Token", value2); } if (appendLog) { WxPayLog.AppendLog(JsApiPay.paramDict, "", page.Request.Url.ToString(), "根据code获取OpenId和AccessToken", LogType.GetTokenOrOpenID); } return(nameValueCollection); } catch (Exception ex) { if (!JsApiPay.paramDict.ContainsKey("appid")) { JsApiPay.paramDict.Add("appid", appId); } if (!JsApiPay.paramDict.ContainsKey("secret")) { JsApiPay.paramDict.Add("secret", appSecret); } if (!JsApiPay.paramDict.ContainsKey("code")) { JsApiPay.paramDict.Add("code", code); } if (!JsApiPay.paramDict.ContainsKey("grant_type")) { JsApiPay.paramDict.Add("grant_type", "authorization_code"); } if (!JsApiPay.paramDict.ContainsKey("OpenID")) { JsApiPay.paramDict.Add("OpenID", value); } if (!JsApiPay.paramDict.ContainsKey("Access_Token")) { JsApiPay.paramDict.Add("Access_Token", value2); } WxPayLog.AppendLog(JsApiPay.paramDict, "", page.Request.Url.ToString(), "根据code获取OpenId和AccessToken" + ex.Message, LogType.GetTokenOrOpenID); throw new WxPayException(ex.ToString()); } }