using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Security.Cryptography; using System.Text; using System.Xml; using Org.BouncyCastle.Security; using Org.BouncyCastle.Crypto.Parameters; namespace Mtxfw.Utility { public class Interface_WxPay { public static string APPID = "wx8874b820fc84430c"; public static string TENPAY = "qbccandgengliu"; public static string PARTNER = "1239351402";//商户号 public static string APPSECRET = "fb2ceb817c30b371f172336b7e1da929"; public static string PARTNER_KEY = "qbpxltgocom8848vipxltgocom885888"; public const string OAUTH2 = "https://open.weixin.qq.com/connect/oauth2/authorize"; public const string OAUTH2_ACCESS_TOKEN = "https://api.weixin.qq.com/sns/oauth2/access_token"; //支付密钥Key(原来的Paysignkey ) public static string PAY_SIGNKEY = "qbpxltgocom8848vipxltgocom885888";//paysignkey(非appkey) //服务器异步通知页面路径(流量卡) public static string NOTIFY_URL_Card_Store = "/pay/weixinnotify_url.aspx";// ConfigurationManager.AppSettings["WXPayNotify_URL_CardStore"].ToString(); public static string NOTIFY_URL_Card_User = "/pay/weixinnotify_url.aspx"; //ConfigurationManager.AppSettings["WXPayNotify_URL_CardUser"].ToString(); public static string NOTIFY_URL_HB_Store = "/pay/weixinnotify_url.aspx";// ConfigurationManager.AppSettings["WXPayNotify_URL_CardStore"].ToString(); public static string Get_RequestHtml(Mtxfw.Utility.Config config, HttpContext Context, string openid, string Bill_No, decimal Charge_Amt, string Body = "测试充值", string PayType = "card_store") { if (openid.Length == 0) { return ""; } APPID = config.webappKey; APPSECRET = config.webappSecret; TENPAY = config.webToken; PARTNER = config.webPARTNER; PARTNER_KEY = config.webPARTNER_KEY; PAY_SIGNKEY = config.webPARTNER_KEY; //支付完成后的回调处理页面,*替换成notify_url.asp所在路径 string TENPAY_NOTIFY = config.webUrl + NOTIFY_URL_Card_Store; if (PayType == "card_user") { //用户购买支付 TENPAY_NOTIFY = config.webUrl + NOTIFY_URL_Card_User; } else if (PayType == "hb_store") { //店铺红包充值 TENPAY_NOTIFY = config.webUrl + NOTIFY_URL_HB_Store; } //设置package订单参数 SortedDictionary dic = new SortedDictionary(); string total_fee = (Charge_Amt*100).ToString("f0"); string wx_timeStamp = ""; string wx_nonceStr = Interface_WxPay.getNoncestr(); dic.Add("appid", APPID); dic.Add("mch_id", PARTNER);//财付通帐号商家 dic.Add("device_info", "WEB");//可为空 dic.Add("nonce_str", wx_nonceStr); dic.Add("trade_type", "JSAPI"); dic.Add("attach", "att1"); dic.Add("openid", openid); dic.Add("out_trade_no", Bill_No); //商家订单号 dic.Add("total_fee", total_fee); //商品金额,以分为单位(money * 100).ToString() dic.Add("notify_url", TENPAY_NOTIFY.ToLower());//接收财付通通知的URL dic.Add("body", Body);//商品描述 dic.Add("spbill_create_ip", Context.Request.UserHostAddress); //用户的公网ip,不是商户服务器IP string get_sign = BuildRequest(dic, PARTNER_KEY); string url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; string _req_data = ""; _req_data += "" + APPID + ""; _req_data += ""; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += ""; //通知支付接口,拿到prepay_id ReturnValue retValue = StreamReaderUtils.StreamReader(url, Encoding.UTF8.GetBytes(_req_data), System.Text.Encoding.UTF8, true, false, false, config.webPARTNER); //设置支付参数 XmlDocument xmldoc = new XmlDocument(); xmldoc.LoadXml(retValue.Message); XmlNode Event = xmldoc.SelectSingleNode("/xml/prepay_id"); XmlNode Event2 = xmldoc.SelectSingleNode("/xml/return_msg"); string return_json = ""; Mtxfw.Utility.Common.WriteHtml("/weixin/weixin1.txt", retValue.Message + get_sign); if (Event != null) { string _prepay_id = Event.InnerText; Mtxfw.Utility.Common.WriteHtml("/weixin/weixin2.txt", _prepay_id); SortedDictionary pay_dic = new SortedDictionary(); wx_timeStamp = Interface_WxPay.getTimestamp(); wx_nonceStr = Interface_WxPay.getNoncestr(); string _package = "prepay_id=" + _prepay_id; pay_dic.Add("appId", APPID); pay_dic.Add("timeStamp", wx_timeStamp); pay_dic.Add("nonceStr", wx_nonceStr); pay_dic.Add("package", _package); pay_dic.Add("signType", "MD5"); string get_PaySign = BuildRequest(pay_dic, PARTNER_KEY); return_json = JsonUtils.SerializeToJson(new { appId = APPID, timeStamp = wx_timeStamp, nonceStr = wx_nonceStr, package = _package, paySign = get_PaySign, signType = "MD5" }); } return return_json; } public static string Get_RequestHtml5(Mtxfw.Utility.Config config, HttpContext Context, string Bill_No, decimal Charge_Amt, string Body = "测试充值", string PayType = "card_store") { APPID = config.webappKey; APPSECRET = config.webappSecret; TENPAY = config.webToken; PARTNER = config.webPARTNER; PARTNER_KEY = config.webPARTNER_KEY; PAY_SIGNKEY = config.webPARTNER_KEY; //支付完成后的回调处理页面,*替换成notify_url.asp所在路径 string TENPAY_NOTIFY = config.webUrl + NOTIFY_URL_Card_Store; if (PayType == "card_user") { //用户购买支付 TENPAY_NOTIFY = config.webUrl + NOTIFY_URL_Card_User; } else if (PayType == "hb_store") { //店铺红包充值 TENPAY_NOTIFY = config.webUrl + NOTIFY_URL_HB_Store; } //设置package订单参数 SortedDictionary dic = new SortedDictionary(); string attach = "购买商品"; string total_fee = (Charge_Amt * 100).ToString("f0"); string wx_nonceStr = Interface_WxPay.getNoncestr(); string scene_info = "{\"h5_info\":{\"type\":\"Wap\",\"wap_url\": \"" + config.webUrl + "\",\"wap_name\": \"礼名公司\"}}"; string uIP = Context.Request.UserHostAddress; dic.Add("appid", APPID); dic.Add("mch_id", PARTNER);//财付通帐号商家 dic.Add("nonce_str", wx_nonceStr); dic.Add("trade_type", "MWEB"); dic.Add("attach", attach); dic.Add("out_trade_no", Bill_No); //商家订单号 dic.Add("total_fee", total_fee); //商品金额,以分为单位(money * 100).ToString() dic.Add("notify_url", TENPAY_NOTIFY.ToLower());//接收财付通通知的URL dic.Add("body", Body);//商品描述 dic.Add("scene_info", scene_info); dic.Add("spbill_create_ip", uIP); //用户的公网ip,不是商户服务器IP string get_sign = BuildRequest(dic, PARTNER_KEY); string url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; string _req_data = ""; _req_data += ""; _req_data += ""; _req_data += ""; _req_data += ""; _req_data += ""; _req_data += " "; _req_data += ""; _req_data += ""; _req_data += " "; _req_data += ""; _req_data += ""; _req_data += " "; _req_data += ""; //通知支付接口,拿到prepay_id ReturnValue retValue = StreamReaderUtils.StreamReader(url, Encoding.UTF8.GetBytes(_req_data), System.Text.Encoding.UTF8, true, false, false, config.webPARTNER); //设置支付参数 XmlDocument xmldoc = new XmlDocument(); xmldoc.LoadXml(retValue.Message); XmlNode Event = xmldoc.SelectSingleNode("/xml/prepay_id"); XmlNode Event0 = xmldoc.SelectSingleNode("/xml/mweb_url"); XmlNode Event2 = xmldoc.SelectSingleNode("/xml/return_msg"); string return_json = ""; Mtxfw.Utility.Common.WriteHtml("/weixin/weixin1.txt", retValue.Message + get_sign); if (Event != null && Event0 != null) { string _prepay_id = Event.InnerText; string mweb_url = Event0.InnerText; return_json = mweb_url + "&redirect_url=" + HttpUtility.UrlEncode(config.webUrl + "/mobile/my.aspx"); } return return_json; } //小程序支付 public static void Get_RequestHtml0(Mtxfw.Utility.Config config, HttpContext Context, string openid, string Bill_No, decimal Charge_Amt, ref string timeStamp, ref string nonceStr, ref string package, ref string paySign, string Body = "测试充值", string PayType = "card_store") { APPID = config.webXAppID; APPSECRET = config.webXAppSecret; TENPAY = config.webToken; PARTNER = config.webPARTNER; PARTNER_KEY = config.webPARTNER_KEY; PAY_SIGNKEY = config.webPARTNER_KEY; //支付完成后的回调处理页面,*替换成notify_url.asp所在路径 string TENPAY_NOTIFY = config.webUrl + NOTIFY_URL_Card_User; //设置package订单参数 SortedDictionary dic = new SortedDictionary(); string total_fee = (Charge_Amt * 100).ToString("f0"); string wx_timeStamp = Interface_WxPay.getTimestamp(); string wx_nonceStr = Interface_WxPay.getNoncestr(); dic.Add("appid", APPID); dic.Add("mch_id", PARTNER);//财付通帐号商家 dic.Add("device_info", "WEB");//可为空 dic.Add("nonce_str", wx_nonceStr); dic.Add("trade_type", "JSAPI"); dic.Add("attach", "att1"); dic.Add("openid", openid); dic.Add("out_trade_no", Bill_No); //商家订单号 dic.Add("total_fee", total_fee); //商品金额,以分为单位(money * 100).ToString() dic.Add("notify_url", TENPAY_NOTIFY.ToLower());//接收财付通通知的URL dic.Add("body", Body);//商品描述 dic.Add("spbill_create_ip", Context.Request.UserHostAddress); //用户的公网ip,不是商户服务器IP string get_sign = BuildRequest(dic, PARTNER_KEY); string url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; string _req_data = ""; _req_data += "" + APPID + ""; _req_data += ""; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += ""; //通知支付接口,拿到prepay_id ReturnValue retValue = StreamReaderUtils.StreamReader(url, Encoding.UTF8.GetBytes(_req_data), System.Text.Encoding.UTF8, true, false, false, config.webPARTNER); //设置支付参数 XmlDocument xmldoc = new XmlDocument(); xmldoc.LoadXml(retValue.Message); XmlNode Event = xmldoc.SelectSingleNode("/xml/prepay_id"); XmlNode Event2 = xmldoc.SelectSingleNode("/xml/return_msg"); Mtxfw.Utility.Common.WriteHtml("/weixin/weixin1.txt", _req_data + "|" + retValue.Message + "|" + get_sign); if (Event != null) { string _prepay_id = Event.InnerText; Mtxfw.Utility.Common.WriteHtml("/weixin/weixin2.txt", _prepay_id); SortedDictionary pay_dic = new SortedDictionary(); string _package = "prepay_id=" + _prepay_id; pay_dic.Add("appId", APPID); pay_dic.Add("timeStamp", wx_timeStamp); pay_dic.Add("nonceStr", wx_nonceStr); pay_dic.Add("package", _package); pay_dic.Add("signType", "MD5"); string get_PaySign = BuildRequest(pay_dic, PARTNER_KEY); timeStamp = wx_timeStamp; nonceStr = wx_nonceStr; package = _package; paySign = get_PaySign; } } //付款到微信零钱 public static void Get_Requestchange(int ifweb, Mtxfw.Utility.Config config, HttpContext Context, string openid, string Bill_No, decimal Charge_Amt, string re_user_name,ref bool IFSUCCESS, ref string payment_no, ref string ErrMsg, string Body = "付款到零钱") { APPID = config.weixinAPP_ID; APPSECRET = config.weixinAPP_Secret; if (ifweb == 1) { APPID = config.webappKey; APPSECRET = config.webappSecret; } TENPAY = config.webToken; PARTNER = config.webPARTNER; PARTNER_KEY = config.webPARTNER_KEY; PAY_SIGNKEY = config.webPARTNER_KEY; //支付完成后的回调处理页面,*替换成notify_url.asp所在路径 string TENPAY_NOTIFY = config.webUrl + NOTIFY_URL_Card_User; //设置package订单参数 SortedDictionary dic = new SortedDictionary(); string total_fee = (Charge_Amt * 100).ToString("f0"); string wx_timeStamp = Interface_WxPay.getTimestamp(); string wx_nonceStr = Interface_WxPay.getNoncestr(); string uIP = Context.Request.UserHostAddress; dic.Add("mch_appid", APPID); dic.Add("mchid", PARTNER);//财付通帐号商家 dic.Add("device_info", "");//可为空 dic.Add("nonce_str", wx_nonceStr); dic.Add("partner_trade_no", Bill_No); //商家订单号 dic.Add("openid", openid); dic.Add("check_name", "FORCE_CHECK"); dic.Add("re_user_name", re_user_name); dic.Add("amount", total_fee); //商品金额,以分为单位(money * 100).ToString() dic.Add("desc", Body);//商品描述 dic.Add("spbill_create_ip", uIP); //用户的公网ip,不是商户服务器IP//Context.Request.UserHostAddress string get_sign = BuildRequest(dic, PARTNER_KEY); string url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"; string _req_data = ""; _req_data += "" + APPID + ""; _req_data += "" + PARTNER + ""; _req_data += ""; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += " "; _req_data += ""; _req_data += " "; _req_data += " "; _req_data += ""; //通知支付接口,拿到prepay_id ReturnValue retValue = StreamReaderUtils.StreamReader(url, Encoding.UTF8.GetBytes(_req_data), System.Text.Encoding.UTF8, true, true, false, config.webPARTNER); Mtxfw.Utility.Common.WriteHtml("/weixin/changeweixin0.txt", retValue.Message); //设置支付参数 XmlDocument xmldoc = new XmlDocument(); xmldoc.LoadXml(retValue.Message); XmlNode Event = xmldoc.SelectSingleNode("/xml/return_code"); XmlNode Event0 = xmldoc.SelectSingleNode("/xml/return_msg"); Mtxfw.Utility.Common.WriteHtml("/weixin/changeweixin1.txt", _req_data + "|" + retValue.Message + "|" + get_sign); if (Event != null) { string return_code = Event.InnerText; if(return_code== "SUCCESS") { XmlNode Event1 = xmldoc.SelectSingleNode("/xml/result_code"); string result_code = Event1.InnerText; if (result_code== "SUCCESS") { XmlNode Event2 = xmldoc.SelectSingleNode("/xml/partner_trade_no"); string partner_trade_no = Event2.InnerText; XmlNode Event3 = xmldoc.SelectSingleNode("/xml/payment_no"); payment_no = Event3.InnerText; IFSUCCESS = true; } else { XmlNode Event4 = xmldoc.SelectSingleNode("/xml/err_code"); XmlNode Event5 = xmldoc.SelectSingleNode("/xml/err_code_des"); if (Event4.InnerText == "SYSTEMERROR") { ErrMsg = "系统繁忙,请稍后再试。"; } else if (Event4.InnerText == "NAME_MISMATCH") { ErrMsg = "您的姓名与微信收款人姓名不一致"; } else { ErrMsg = Event5.InnerText; } } } else { ErrMsg= Event0.InnerText; } } } //查询付款到零钱记录 public static void Get_Requestchange0(int ifweb, Mtxfw.Utility.Config config, string partner_trade_no, ref bool IFSUCCESS, ref string ErrMsg) { APPID = config.weixinAPP_ID; APPSECRET = config.weixinAPP_Secret; if (ifweb == 1) { APPID = config.webappKey; APPSECRET = config.webappSecret; } TENPAY = config.webToken; PARTNER = config.webPARTNER; PARTNER_KEY = config.webPARTNER_KEY; PAY_SIGNKEY = config.webPARTNER_KEY; //支付完成后的回调处理页面,*替换成notify_url.asp所在路径 string TENPAY_NOTIFY = config.webUrl + NOTIFY_URL_Card_User; //设置package订单参数 SortedDictionary dic = new SortedDictionary(); string wx_timeStamp = Interface_WxPay.getTimestamp(); string wx_nonceStr = Interface_WxPay.getNoncestr(); dic.Add("nonce_str", wx_nonceStr); dic.Add("partner_trade_no", partner_trade_no);//商家订单号 dic.Add("mch_id", PARTNER); dic.Add("appid ", APPID);//财付通帐号商家 string get_sign = BuildRequest(dic, PARTNER_KEY); string url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo"; string _req_data = ""; _req_data += " "; _req_data += " "; _req_data += "" + PARTNER + ""; _req_data += "" + APPID + ""; _req_data += " "; _req_data += ""; //通知支付接口,拿到prepay_id ReturnValue retValue = StreamReaderUtils.StreamReader(url, Encoding.UTF8.GetBytes(_req_data), System.Text.Encoding.UTF8, true, true, false, config.webPARTNER); //设置支付参数 XmlDocument xmldoc = new XmlDocument(); xmldoc.LoadXml(retValue.Message); XmlNode Event = xmldoc.SelectSingleNode("/xml/return_code"); XmlNode Event0 = xmldoc.SelectSingleNode("/xml/return_msg"); Mtxfw.Utility.Common.WriteHtml("/weixin/change0weixin1.txt", _req_data + "|" + retValue.Message + "|" + get_sign); if (Event != null) { string return_code = Event.InnerText; if (return_code == "SUCCESS") { XmlNode Event1 = xmldoc.SelectSingleNode("/xml/result_code"); string result_code = Event1.InnerText; if (result_code == "SUCCESS") { XmlNode Event3 = xmldoc.SelectSingleNode("/xml/status"); string status = Event3.InnerText; if (status == "SUCCESS") { IFSUCCESS = true; } } else { XmlNode Event4 = xmldoc.SelectSingleNode("/xml/err_code"); XmlNode Event5 = xmldoc.SelectSingleNode("/xml/err_code_des"); ErrMsg = Event5.InnerText; } } else { ErrMsg = Event0.InnerText; } } } //退款 public static void Get_Requestrefund(Mtxfw.Utility.Config config, string transaction_id, string out_trade_no, string out_refund_no, decimal refund, decimal total, ref int refundstatus, ref string ErrMsg, ref string refund_id, ref string refund_channel, ref string user_received_account,ref string success_time, string reason = "退款") { //支付完成后的回调处理页面,*替换成notify_url.asp所在路径 string TENPAY_NOTIFY = config.webUrl + NOTIFY_URL_Card_User; //设置package订单参数 SortedDictionary dic = new SortedDictionary(); dic.Add("transaction_id", transaction_id); dic.Add("out_trade_no", out_trade_no); dic.Add("out_refund_no", out_refund_no); dic.Add("reason", reason); dic.Add("notify_url", TENPAY_NOTIFY); dic.Add("amount", "{\"refund\":"+ refund + ",\"total\":"+ total + ",\"currency\": \"CNY\"}"); string get_sign = BuildRequest(dic, PARTNER_KEY); string url = "https://api.mch.weixin.qq.com/v3/refund/domestic/refunds"; string _req_data = ""; _req_data += "" + transaction_id + ""; _req_data += "" + PARTNER + ""; _req_data += ""+ out_refund_no + ""; _req_data += " "; _req_data += " "; _req_data += ""; //通知支付接口,拿到prepay_id ReturnValue retValue = StreamReaderUtils.StreamReader(url, Encoding.UTF8.GetBytes(_req_data), System.Text.Encoding.UTF8, true, false, false, config.webPARTNER); //设置支付参数 XmlDocument xmldoc = new XmlDocument(); xmldoc.LoadXml(retValue.Message); XmlNode Event = xmldoc.SelectSingleNode("/xml/status"); Mtxfw.Utility.Common.WriteHtml("/weixin/Requestrefund.txt", _req_data + "|" + retValue.Message); if (Event != null) { string return_code = Event.InnerText; if (return_code == "SUCCESS") { XmlNode Event1 = xmldoc.SelectSingleNode("/xml/refund_id"); XmlNode Event2 = xmldoc.SelectSingleNode("/xml/channel"); XmlNode Event3 = xmldoc.SelectSingleNode("/xml/user_received_account"); XmlNode Event4 = xmldoc.SelectSingleNode("/xml/success_time"); refund_id = Event1.InnerText; string channel = Event2.InnerText; if (channel == "ORIGINAL") { refund_channel = "原路退款"; } else if (channel == "BALANCE") { refund_channel = "退回到余额"; } else if (channel == "OTHER_BALANCE") { refund_channel = "原账户异常退到其他余额账户"; } else if (channel == "OTHER_BANKCARD") { refund_channel = "原银行卡异常退到其他银行卡 "; } user_received_account = Event3.InnerText; success_time = Event4.InnerText; refundstatus = 1; } else if (return_code == "CLOSED") { ErrMsg = "退款关闭"; refundstatus = 2; } else if (return_code == "PROCESSING") { ErrMsg = "退款处理中"; refundstatus = 3; } else if (return_code == "ABNORMAL") { ErrMsg = "退款异常"; refundstatus = 4; } } } //查询退款记录 public static void Get_Requestrefund0(Mtxfw.Utility.Config config, string out_refund_no, ref bool IFSUCCESS, ref string ErrMsg, ref string refund_id, ref string refund_channel, ref string user_received_account, ref string success_time) { //设置package订单参数 SortedDictionary dic = new SortedDictionary(); string url = "https://api.mch.weixin.qq.com/v3/refund/domestic/refunds/" + out_refund_no; //通知支付接口,拿到prepay_id ReturnValue retValue = StreamReaderUtils.StreamReader(url, null, System.Text.Encoding.UTF8, false, false, false, config.webPARTNER); //设置支付参数 XmlDocument xmldoc = new XmlDocument(); xmldoc.LoadXml(retValue.Message); XmlNode Event = xmldoc.SelectSingleNode("/xml/status"); Mtxfw.Utility.Common.WriteHtml("/weixin/Requestrefund0.txt", retValue.Message); if (Event != null) { string return_code = Event.InnerText; if (return_code == "SUCCESS") { XmlNode Event1 = xmldoc.SelectSingleNode("/xml/refund_id"); XmlNode Event2 = xmldoc.SelectSingleNode("/xml/channel"); XmlNode Event3 = xmldoc.SelectSingleNode("/xml/user_received_account"); XmlNode Event4 = xmldoc.SelectSingleNode("/xml/success_time"); refund_id = Event1.InnerText; string channel = Event2.InnerText; if (channel == "ORIGINAL") { refund_channel = "原路退款"; } else if (channel == "BALANCE") { refund_channel = "退回到余额"; } else if (channel == "OTHER_BALANCE") { refund_channel = "原账户异常退到其他余额账户"; } else if (channel == "OTHER_BANKCARD") { refund_channel = "原银行卡异常退到其他银行卡 "; } user_received_account = Event3.InnerText; success_time = Event4.InnerText; } else if (return_code == "CLOSED") { ErrMsg = "退款关闭"; } else if (return_code == "PROCESSING") { ErrMsg = "退款处理中"; } else if (return_code == "ABNORMAL") { ErrMsg = "退款异常"; } else { ErrMsg = "其它原因"; } } } #region 取得OAuth2 URL地址 public static string OAuth2_GetUrl_Pay(string URL, int Scope, string state = "STATE") { StringBuilder sbCode = new StringBuilder(OAUTH2); sbCode.Append("?appid=" + APPID); sbCode.Append("&scope=" + (Scope == 1 ? "snsapi_userinfo" : "snsapi_base")); sbCode.Append("&state=" + state); sbCode.Append("&redirect_uri=" + Uri.EscapeDataString(URL)); sbCode.Append("&response_type=code#wechat_redirect"); return sbCode.ToString(); } #endregion #region 取得OAuth2 Access_Token public static ReturnValue OAuth2_Access_Token(string Code) { StringBuilder sbCode = new StringBuilder(OAUTH2_ACCESS_TOKEN); sbCode.Append("?appid=" + APPID); sbCode.Append("&secret=" + APPSECRET); sbCode.Append("&code=" + Code); sbCode.Append("&grant_type=authorization_code"); ReturnValue retValue = StreamReaderUtils.StreamReader(sbCode.ToString(), Encoding.UTF8); if (retValue.HasError) { return retValue; } try { int intWeixin_ExpiresIn = Convert.ToInt32(StringUtils.GetJsonValue(retValue.Message, "expires_in").ToString()); retValue.PutValue("Weixin_OpenID", StringUtils.GetJsonValue(retValue.Message, "openid").ToString()); retValue.PutValue("Weixin_Token", StringUtils.GetJsonValue(retValue.Message, "access_token").ToString()); //retValue.PutValue("Weixin_ExpiresIn", intWeixin_ExpiresIn); //retValue.PutValue("Weixin_ExpiresDate", DateTime.Now.AddSeconds(intWeixin_ExpiresIn)); //retValue.PutValue("refresh_token", StringUtils.GetJsonValue(retValue.Message, "refresh_token").ToString()); //retValue.PutValue("scope", StringUtils.GetJsonValue(retValue.Message, "scope").ToString()); } catch { retValue.HasError = true; retValue.Message = retValue.Message; retValue.ErrorCode = ""; } return retValue; } #endregion public static string getNoncestr() { Random random = new Random(); return GetMD5(random.Next(1000).ToString(), "utf-8"); } public static string getTimestamp() { TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); return Convert.ToInt64(ts.TotalSeconds).ToString(); } public static string BuildRequest(SortedDictionary sParaTemp, string key) { //获取过滤后的数组 Dictionary dicPara = new Dictionary(); dicPara = FilterPara(sParaTemp); //组合参数数组 string prestr = CreateLinkString(dicPara); //拼接支付密钥 string stringSignTemp = prestr + "&key=" + key; //获得加密结果 string myMd5Str = GetMD5(stringSignTemp); //返回转换为大写的加密串 return myMd5Str.ToUpper(); } public static string BuildRequest0(SortedDictionary sParaTemp, string key) { //获取过滤后的数组 Dictionary dicPara = new Dictionary(); dicPara = FilterPara(sParaTemp); //组合参数数组 string prestr = CreateLinkString0(dicPara); //获得加密结果 return sign(key, prestr); } /// /// 除去数组中的空值和签名参数并以字母a到z的顺序排序 /// /// 过滤前的参数组 /// 过滤后的参数组 public static Dictionary FilterPara(SortedDictionary dicArrayPre) { Dictionary dicArray = new Dictionary(); foreach (KeyValuePair temp in dicArrayPre) { if (temp.Key != "sign" && !string.IsNullOrEmpty(temp.Value)) { dicArray.Add(temp.Key, temp.Value); } } return dicArray; } //组合参数数组 public static string CreateLinkString(Dictionary dicArray) { StringBuilder prestr = new StringBuilder(); foreach (KeyValuePair temp in dicArray) { prestr.Append(temp.Key + "=" + temp.Value + "&"); } int nLen = prestr.Length; prestr.Remove(nLen - 1, 1); return prestr.ToString(); } //组合参数数组 public static string CreateLinkString0(Dictionary dicArray) { StringBuilder prestr = new StringBuilder(); foreach (KeyValuePair temp in dicArray) { prestr.Append("\""+temp.Key + "\":\"" + temp.Value + "\","); } int nLen = prestr.Length; prestr.Remove(nLen - 1, 1); return "{" + prestr.ToString() + "}"; } public static string sign(string signaturePrivateKey, string signatureData, string hashAlgorithm = "SHA256", string encoding = "UTF-8") { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); FromPrivateKeyJavaString(rsa,signaturePrivateKey); byte[] signatureBytes = rsa.SignData(Encoding.GetEncoding(encoding).GetBytes(signatureData), hashAlgorithm); return Convert.ToBase64String(signatureBytes); } // /// RSA加载JAVA PrivateKey /// /// java提供的第三方私钥 /// public static void FromPrivateKeyJavaString(RSA rsa, string privateJavaKey) { string xmlPrivateKey = ConvertToXmlPrivateKey(rsa, privateJavaKey); rsa.FromXmlString(xmlPrivateKey); } /// /// 把java的私钥转换成.net的xml格式 /// /// /// /// public static string ConvertToXmlPrivateKey(RSA rsa, string privateJavaKey) { RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateJavaKey)); string xmlPrivateKey = string.Format("{0}{1}

{2}

{3}{4}{5}{6}{7}
", Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()), Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()), Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()), Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()), Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()), Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()), Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()), Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned())); return xmlPrivateKey; } public static bool verfySign(string publicKey, string signature, string content, string hashAlgorithm = "SHA256", string encoding = "UTF-8") { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); string xmlPublicKey = ConvertToXmlPublicJavaKey(rsa, publicKey); rsa.FromXmlString(xmlPublicKey); //返回数据验证结果 byte[] Data = Encoding.GetEncoding(encoding).GetBytes(content); byte[] rgbSignature = Convert.FromBase64String(signature); return rsa.VerifyData(Data, hashAlgorithm, rgbSignature); } /// /// 把java的公钥转换成.net的xml格式 /// /// java提供的第三方公钥 /// public static string ConvertToXmlPublicJavaKey(RSA rsa, string publicJavaKey) { RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicJavaKey)); string xmlpublicKey = string.Format("{0}{1}", Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()), Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned())); return xmlpublicKey; } //加密 public static string GetMD5(string pwd) { MD5 md5Hasher = MD5.Create(); byte[] data = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(pwd)); StringBuilder sBuilder = new StringBuilder(); for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("x2")); } return sBuilder.ToString(); } /** 获取大写的MD5签名结果 */ public static string GetMD5(string encypStr, string charset) { string retStr; MD5CryptoServiceProvider m5 = new MD5CryptoServiceProvider(); //创建md5对象 byte[] inputBye; byte[] outputBye; //使用GB2312编码方式把字符串转化为字节数组. try { inputBye = Encoding.GetEncoding(charset).GetBytes(encypStr); } catch (Exception ex) { inputBye = Encoding.GetEncoding("GB2312").GetBytes(encypStr); } outputBye = m5.ComputeHash(inputBye); retStr = System.BitConverter.ToString(outputBye); retStr = retStr.Replace("-", "").ToUpper(); return retStr; } } }