123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566 |
- using System;
- using System.Collections.Generic;
- using Library;
- using LitJson;
- using System.Linq;
- using System.Security.Cryptography.X509Certificates;
- using System.Security.Cryptography;
- using System.Text;
- using System.IO;
- using System.Net;
- using MySystem.PxcModels;
- namespace MySystem
- {
- public class WeChatFunction
- {
- public WeChatFunction()
- {
- }
- #region 服务商平台商户进件提交申请单API
- public string MerchantCreate(PxcModels.MerchantAddInfo info, PxcModels.MerchantInfo merchant)
- {
-
- Dictionary<string, object> result = new Dictionary<string, object>();
- result.Add("business_code", info.BusinessCode);
- PxcModels.WebCMSEntities dbpxc = new PxcModels.WebCMSEntities();
-
- Dictionary<string, object> contact_info = new Dictionary<string, object>();
- contact_info.Add("contact_type", "LEGAL");
- contact_info.Add("contact_name", RSAEncrypt(info.ContactName));
- contact_info.Add("contact_id_number", RSAEncrypt(info.ContactIdNumber));
-
- contact_info.Add("mobile_phone", RSAEncrypt(info.MobilePhone));
- contact_info.Add("contact_email", RSAEncrypt(info.ContactEmail));
- result.Add("contact_info", contact_info);
-
- Dictionary<string, object> subject_info = new Dictionary<string, object>();
- subject_info.Add("subject_type", info.SubjectType);
- Dictionary<string, object> business_license_info = new Dictionary<string, object>();
- business_license_info.Add("license_copy", GetMediaId("/" + info.LicenseCopy));
- business_license_info.Add("license_number", info.LicenseNumber);
- business_license_info.Add("merchant_name", merchant.Name);
- business_license_info.Add("legal_person", info.LegalPerson);
- subject_info.Add("business_license_info", business_license_info);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Dictionary<string, object> identity_info = new Dictionary<string, object>();
- info.IdDocType = "IDENTIFICATION_TYPE_IDCARD";
- identity_info.Add("id_holder_type", "LEGAL");
- identity_info.Add("id_doc_type", info.IdDocType);
- Dictionary<string, object> id_card_info = new Dictionary<string, object>();
- id_card_info.Add("id_card_copy", GetMediaId("/" + info.IdCardCopy));
- id_card_info.Add("id_card_national", GetMediaId("/" + info.IdCardNational));
- id_card_info.Add("id_card_name", RSAEncrypt(info.IdCardName));
- id_card_info.Add("id_card_number", RSAEncrypt(info.IdCardNumber));
- id_card_info.Add("id_card_address", RSAEncrypt(info.IdCardAddress));
- id_card_info.Add("card_period_begin", CheckForever(info.CardPeriodBegin));
- id_card_info.Add("card_period_end", CheckForever(info.CardPeriodEnd));
- identity_info.Add("id_card_info", id_card_info);
-
- identity_info.Add("owner", true);
- subject_info.Add("identity_info", identity_info);
-
-
-
-
-
-
-
-
-
-
-
-
-
- result.Add("subject_info", subject_info);
-
- Dictionary<string, object> business_info = new Dictionary<string, object>();
- business_info.Add("merchant_shortname", info.MerchantShortname);
- business_info.Add("service_phone", info.ServicePhone);
- Dictionary<string, object> sales_info = new Dictionary<string, object>();
- info.SalesScenesType = "SALES_SCENES_STORE";
- sales_info.Add("sales_scenes_type", info.SalesScenesType.Split(',').ToList());
- Dictionary<string, object> biz_store_info = new Dictionary<string, object>();
- biz_store_info.Add("biz_store_name", info.BizStoreName);
- PxcModels.OpenBankCityTable BizAddress = dbpxc.OpenBankCityTable.FirstOrDefault(m => m.CityName.EndsWith(info.BizAddressCode)) ?? new PxcModels.OpenBankCityTable();
- biz_store_info.Add("biz_address_code", BizAddress.Code);
- biz_store_info.Add("biz_store_address", info.BizStoreAddress);
- List<string> store_entrance_pic = new List<string>();
- store_entrance_pic.Add(GetMediaId("/" + info.StoreEntrancePic));
- biz_store_info.Add("store_entrance_pic", store_entrance_pic);
- List<string> indoor_pic = new List<string>();
- indoor_pic.Add(GetMediaId("/" + info.IndoorPic));
- biz_store_info.Add("indoor_pic", indoor_pic);
- biz_store_info.Add("biz_sub_appid", info.BizSubAppid);
- sales_info.Add("biz_store_info", biz_store_info);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- business_info.Add("sales_info", sales_info);
- result.Add("business_info", business_info);
-
- Dictionary<string, object> settlement_info = new Dictionary<string, object>();
- settlement_info.Add("settlement_id", info.SettlementId);
- string QualificationType = function.CheckNull(info.QualificationType);
- if (QualificationType.Contains(","))
- {
- QualificationType = QualificationType.Split(',')[0];
- }
- settlement_info.Add("qualification_type", QualificationType);
- if (!string.IsNullOrEmpty(info.Qualifications))
- {
- List<string> Qualifications = new List<string>();
- Qualifications.Add(GetMediaId("/" + info.Qualifications));
- settlement_info.Add("qualifications", Qualifications);
- }
- settlement_info.Add("activities_id", info.ActivitiesId);
- settlement_info.Add("activities_rate", info.ActivitiesRate);
- result.Add("settlement_info", settlement_info);
-
- Dictionary<string, object> bank_account_info = new Dictionary<string, object>();
- bank_account_info.Add("bank_account_type", info.BankAccountType);
- bank_account_info.Add("account_name", RSAEncrypt(info.AccountName));
- bank_account_info.Add("account_bank", info.AccountBank);
- PxcModels.OpenBankCityTable BankAddress = dbpxc.OpenBankCityTable.FirstOrDefault(m => m.CityName.EndsWith(info.BankAddressCode)) ?? new PxcModels.OpenBankCityTable();
- bank_account_info.Add("bank_address_code", BankAddress.Code);
- PxcModels.OpenBankTable BankBranch = dbpxc.OpenBankTable.FirstOrDefault(m => m.BankName == info.BankName) ?? new PxcModels.OpenBankTable();
- bank_account_info.Add("bank_branch_id", BankBranch.BankCode);
- bank_account_info.Add("bank_name", info.BankName);
- bank_account_info.Add("account_number", RSAEncrypt(info.AccountNumber));
- result.Add("bank_account_info", bank_account_info);
- dbpxc.Dispose();
- string req = Newtonsoft.Json.JsonConvert.SerializeObject(result);
- Dictionary<string, string> header = new Dictionary<string, string>();
-
-
-
-
-
- string merchantId = "1611167423";
- string serialNo = "534165421BE2814DEC08F8D00BDAB9944B13646C";
- string resp = postJson("https://api.mch.weixin.qq.com/v3/applyment4sub/applyment/", req, prikey, merchantId, serialNo);
- function.WriteLog(resp, "商户进件日志");
- return resp;
- }
- #endregion
- #region 服务商平台查询申请单状态API
- public Dictionary<string, object> QueryMerchant(string BusinessCode)
- {
- Dictionary<string, object> return_result = new Dictionary<string, object>();
- try
- {
- string merchantId = "1611167423";
- string serialNo = "534165421BE2814DEC08F8D00BDAB9944B13646C";
- string result = postJson("https://api.mch.weixin.qq.com/v3/applyment4sub/applyment/business_code/" + BusinessCode, "", prikey, merchantId, serialNo, "GET");
- function.WriteLog(result, "服务商平台查询申请单状态API");
-
- JsonData jsonObj = JsonMapper.ToObject(result);
- return_result.Add("applyment_id", jsonObj["applyment_id"].ToString());
- return_result.Add("applyment_state", jsonObj["applyment_state"].ToString());
- return_result.Add("applyment_state_msg", jsonObj["applyment_state_msg"].ToString());
- if (jsonObj["applyment_state"].ToString() == "APPLYMENT_STATE_REJECTED")
- {
- List<Dictionary<string, string>> audit_detail = new List<Dictionary<string, string>>();
- JsonData auditObj = jsonObj["audit_detail"];
-
-
-
-
-
-
-
-
- return_result.Add("reject_reason", auditObj[0]["reject_reason"].ToString());
- return_result.Add("audit_detail", audit_detail);
- }
- if (result.Contains("\"sign_url\":"))
- {
- return_result.Add("sign_url", jsonObj["sign_url"].ToString());
- }
- }
- catch (Exception ex)
- {
- function.WriteLog(DateTime.Now.ToString() + "\r\n" + ex.ToString(), "服务商平台查询申请单状态API异常");
- }
- return return_result;
- }
- #endregion
-
- #region 服务商平台申请退款API
- public Dictionary<string, string> Refund(string AppId, string MchId, string SubMchId, decimal RefundMoney, decimal TotalMoney, string OrderNo, string RefundNo)
- {
- Dictionary<string, string> return_result = new Dictionary<string, string>();
- int refund = (int)(RefundMoney * 100);
- int amount = (int)(TotalMoney * 100);
-
- SortedList<string, object> par = new SortedList<string, object>();
- par.Add("sub_mchid", SubMchId);
- par.Add("out_trade_no", OrderNo);
- par.Add("out_refund_no", RefundNo);
- Dictionary<string, object> amountDic = new Dictionary<string, object>();
- amountDic.Add("refund", refund);
- amountDic.Add("total", amount);
- amountDic.Add("currency", "CNY");
- par.Add("amount", amountDic);
- string req = Newtonsoft.Json.JsonConvert.SerializeObject(par);
- function.WriteLog(req, "服务商平台申请退款API");
- try
- {
- string merchantId = MchId;
- string serialNo = "534165421BE2814DEC08F8D00BDAB9944B13646C";
- string result = postJson("https://api.mch.weixin.qq.com/v3/refund/domestic/refunds", req, prikey, merchantId, serialNo);
- function.WriteLog(result, "服务商平台申请退款API");
- JsonData jsonObj = JsonMapper.ToObject(result);
- return_result.Add("refund_id", jsonObj["refund_id"].ToString());
- return_result.Add("channel", jsonObj["channel"].ToString());
- return_result.Add("user_received_account", jsonObj["user_received_account"].ToString());
- return_result.Add("status", jsonObj["status"].ToString());
- return_result.Add("payer_total", jsonObj["amount"]["payer_total"].ToString());
- return_result.Add("payer_refund", jsonObj["amount"]["payer_refund"].ToString());
- return_result.Add("settlement_refund", jsonObj["amount"]["settlement_refund"].ToString());
- return_result.Add("settlement_total", jsonObj["amount"]["settlement_total"].ToString());
- return_result.Add("discount_refund", jsonObj["amount"]["discount_refund"].ToString());
- }
- catch (Exception ex)
- {
- function.WriteLog(DateTime.Now.ToString() + "\r\n" + ex.ToString(), "服务商平台申请退款API异常");
- }
- return return_result;
- }
- #endregion
- #region 敏感信息加密
-
- string pubkey = "MIID3DCCAsSgAwIBAgIUU0FlQhvigU3sCPjQC9q5lEsTZGwwDQYJKoZIhvcNAQELBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsTFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3QgQ0EwHhcNMjEwNjMwMDMwOTA5WhcNMjYwNjI5MDMwOTA5WjBuMRgwFgYDVQQDDA9UZW5wYXkuY29tIHNpZ24xEzARBgNVBAoMClRlbnBheS5jb20xHTAbBgNVBAsMFFRlbnBheS5jb20gQ0EgQ2VudGVyMQswCQYDVQQGDAJDTjERMA8GA1UEBwwIU2hlblpoZW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC64SIwN1afgge2pjFeNZAlKz5ZdJw8W/hisaIJnkzbE/1oG5n+SgtbMLfBLBFp0zMyT5SP5ve5aJAvUjwnRwQoDG+4z3jE8vLyjFLxoy5sWGex8+FBC5hs81oAUHuazigi5NcSH9Ji/8Lq3zFh8Az4+ZchQ14SFhSGTifSZfdTX5wYDEv3DKDYgQvvAgDgjBF1Uj91NpVD7ruQjAJ7MwZvUX7rnYFnQggFQwIBWazNXaGa7OpO6Xbf+uNtbl436My7WQX+ffjmtYmcgND60mgn/rFQMg5r+Q+J8mDgIaAzCmr3xW31OIvAD1iYV0ksTyQntD5pOzCYdHZPDOZCqYlHAgMBAAGjgYEwfzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE8DBlBgNVHR8EXjBcMFqgWKBWhlRodHRwOi8vZXZjYS5pdHJ1cy5jb20uY24vcHVibGljL2l0cnVzY3JsP0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFEMzk3NTQ5ODQ2QzAxQzNFOEVCRDIwDQYJKoZIhvcNAQELBQADggEBAEgXlFe4MpFUUnj6gJt5KoPpzLTNOXDHsglUrAobq/HlmDBOF8yCUFvtbRaJxUSQVFfo/2zag8J57YNMo2If1HkD1LMEGAcPGNS+aho9SgCFbLG+c82nNICl8g8oe1HNS7IpRjacSfrKIYt5VL5lHHC5ZJaKq0Ez9c7bfPGC6CaA8WDnApFZut5qhYNMBUYZZjAMVIZ2G/kIsxbo1oUpVEnQq5YQxPUDWdYKxdTvo7uXXpWv6qo761Hid24R7mdrGEuHZNBfxYCt1wJQNlcGVgCjk8PPo73mO0zYRwV0x7pNkFFbiP7aetf6RB82YUbuNkvql83Ox+e22ByMi8lOUZo=";
- string prikey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQD7f7VmtjtLJaY+oJkMgDN9dDE082ZOgquHorPrtJNEdf7VjRFLMoKOoiQsT4OgVq3lNN2KKndd5ahsegSq7Ng7aYJq7IDH584RWEGbekEn0M10aXThdk9dPSCMXBPFR6y4gMvV4R6pVbPBxoSFMI6ty+EqfZLP9Cxvxx7msIKEB46r2R6gYL7j061ytoURavUxGAZxMXnCAEckbrssiFwhLTmX6TtC8MVPyUfLPUh07ArRZxK2F0hpX35Te0Jda7xkulbWtz4EB8KPXr0bJGO/oUo+Prqpdjy0+zKMfMvBP6NG1Hnh3z7yBhlYIe4vymFQU1Wy0OtrEbrU1OdJiq5XAgMBAAECggEAJ7biAWczc8ltOCSKJpQ0DVKE1rS86hbuWUvTF5x7SOtNI5HUMki2nylxhuHDilVFvpUbis7r7JLwhri59ffSqYcexh20tFyhiNGkApZKpavuVby1bUkOfU3CzwdXQ+bumnAUQCD9g4X6DdZ4ZMPnNACm/Nu5jEcloT0TXyBua8SpmlFMYgo/x8XOTT4dEeubwNsfEpmSeWcQRJLJI5ujGgmmZLiAs7F3VlCJFNtQa1KT3a1EDhD5jajeQAzsPpQ48i/joOqE71RlVr77z4Ethr8o1Cc16K9Md2AtVesMZ6eZNqKkQ/qC3vnxk5Sy25tuVmOCXa81ErIf9Tf/JwhymQKBgQD/TXnYxEzYJCqa7/Ck6QqBHQf4ak1OVz7/NY7bmxYT5ez4eJKzrh+xQYWBq/UmKeEiH5QI6T3MVo7L20tbeuYLQwYpgb+BpOKHFne2ODOgDYreNREB06Ww2qAQYCqwyBnTqt7UthDmcXhcPojwxNLSJAOCQhld9TOOmK1db33PIwKBgQD8L5KiN9XRFCvUH6rhUcs/8lmGR2N8zSTts+BNCwIPGQWE0UvbjroyNxVbq6cXXlZZ6H07vEAgaIrLIkwLgen2IwsuOiyaEMvRP9oGwC+LnpP+9sxbW5w5do1hfyeGiSPPgSYIWZMOOwX+qfqXDMM3whJP1hk4El87kC+kl2URPQKBgQC4kTc8ebWgMI1Ik5wibIN2khlYAum+cB6P/BU6OCU+32NwwiI0mfY5fEfbVgiVvYMP20p3Ir/VgOIdCH2zNecnTx4eVbmwLRbDWH/VEU5pMEEroauY6XyInZVIIW3bfd4GAyqzFqijIHdGIMN5ZKGQ4A5VVhnmrkTGmyQCP37xhwKBgQCaLW+Fc4NqTt240x+Cn6IWV1E6UfzV+QmBtb4E/BznJBIGsHqjIbBeMOUC5X/DPq6mSwf9dEr0RVXNeQtq4aMrEyOrwG8yReCF7naaN/cZcfrjHvmzRN/PFda766Q7kS5ul3OsGS9ZvOYeWsdUf73+Ic1WN/u1Fy5X2P/3rYNhtQKBgAIioAq8psFdy/itpJryaWdmDM6fM6ctp5P6VBWOVp2JGkOzHboiXFToJJBtmi7Rdp8AN1aYBbtVX1o0+RmfEiHqXn84GpSNT6tGirHvARi5ab3jvn+bkUWjZYOGd96hus8GirA+wQb/V92Ms3jS5VUS1HBfHaTGT5G2Slrr8YZu";
- public string RSAEncrypt(string text)
- {
- byte[] publicKey = Convert.FromBase64String(pubkey);
-
-
-
-
- using (var x509 = new X509Certificate2(publicKey))
- {
- using (var rsa = x509.GetRSAPublicKey())
- {
- var buff = rsa.Encrypt(Encoding.UTF8.GetBytes(text), RSAEncryptionPadding.OaepSHA1);
- return Convert.ToBase64String(buff);
- }
- }
- }
- public string postJson(string url, string postData, string privateKey, string merchantId, string serialNo, string method = "POST")
- {
- HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
- request.Method = method;
- request.ContentType = "application/json;charset=UTF-8";
- request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36";
- request.Accept = "application/json";
- string Authorization = GetAuthorization(url, method, postData, privateKey, merchantId, "62B64854B768D344249FDB9E6EF4A1232C000E84");
- request.Headers.Add("Authorization", Authorization);
- request.Headers.Add("Wechatpay-Serial", serialNo);
- if (!string.IsNullOrEmpty(postData))
- {
- byte[] paramJsonBytes;
- paramJsonBytes = System.Text.Encoding.UTF8.GetBytes(postData);
- request.ContentLength = paramJsonBytes.Length;
- Stream writer;
- try
- {
- writer = request.GetRequestStream();
- }
- catch (Exception)
- {
- writer = null;
- Console.Write("连接服务器失败!");
- }
- writer.Write(paramJsonBytes, 0, paramJsonBytes.Length);
- writer.Close();
- }
- HttpWebResponse response;
- try
- {
- response = (HttpWebResponse)request.GetResponse();
- }
- catch (WebException ex)
- {
- response = ex.Response as HttpWebResponse;
- }
- Stream resStream = response.GetResponseStream();
- StreamReader reader = new StreamReader(resStream);
- string text = reader.ReadToEnd();
- return text;
-
-
- }
- #endregion
- #region 图片上传
- public string GetMediaId(string imgPath)
- {
- if (string.IsNullOrEmpty(imgPath))
- {
- return "";
- }
- if (imgPath.Contains(","))
- {
- imgPath = imgPath.Split(',')[0];
- }
- string key = "wechatpic:" + function.MD5_16(imgPath);
- string media_id = RedisDbconn.Instance.Get<string>(key);
- if (!string.IsNullOrEmpty(media_id))
- {
- return media_id;
- }
- string filePath = function.getPath(imgPath);
- var filename = Path.GetFileName(filePath);
- FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
- Byte[] imgBytesIn = new Byte[fs.Length];
- fs.Read(imgBytesIn, 0, imgBytesIn.Length);
- fs.Close();
- byte[] hash = SHA256Managed.Create().ComputeHash(imgBytesIn);
- StringBuilder builder = new StringBuilder();
- for (int i = 0; i < hash.Length; i++)
- {
- builder.Append(hash[i].ToString("x2"));
- }
- var sha256 = builder.ToString();
- string metaStr = "{\"filename\":\""+ filename + "\",\"sha256\":\"" + sha256 + "\"}";
- media_id = UploadImgApi(metaStr, imgBytesIn, filename);
- RedisDbconn.Instance.Set(key, media_id);
- return media_id;
- }
- public string UploadImgApi(string metaStr, Byte[] imgBytesIn,string filename)
- {
- string url = "https://api.mch.weixin.qq.com/v3/merchant/media/upload";
-
- string merchantId = "1611167423";
- string serialNo = "62B64854B768D344249FDB9E6EF4A1232C000E84";
- string privateKey = prikey;
- #region 定义请求体中的内容 并转成二进制
- string boundary = "lc199aecd61b4653ef";
- string Enter = "\r\n";
- string campaignIDStr1
- = "--" + boundary
- + Enter
- + "Content-Disposition: form-data; name=\"meta\";"
- + Enter
- + "Content-Type:application/json;"
- + Enter
- + Enter
- + metaStr
- + Enter
- + "--" + boundary
- + Enter
- + "Content-Disposition:form-data;name=\"file\";filename=\""+ filename + "\";"
- + Enter
- + "Content-Type:image/jpeg"
- + Enter
- + Enter;
- byte[] byteData2
- = imgBytesIn;
- string campaignIDStr3
- = Enter
- + "--" + boundary
- + Enter;
- var byteData1 = System.Text.Encoding.UTF8.GetBytes(campaignIDStr1);
- var byteData3 = System.Text.Encoding.UTF8.GetBytes(campaignIDStr3);
- #endregion
- string transactionsResponse = UploadImg_postJson(url, byteData1, byteData2, byteData3, metaStr, privateKey, merchantId, serialNo, boundary, "POST");
- var result=JsonMapper.ToObject(transactionsResponse);
- return result["media_id"].ToString();
- }
- public string UploadImg_postJson(string url, byte[] b1, byte[] b2, byte[] b3, string metaStr, string privateKey, string merchantId, string serialNo, string boundary, string method = "POST")
- {
- HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
- request.Method = method;
-
- request.ContentType = "multipart/form-data;boundary=" + boundary;
- request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36";
- request.Accept = "application/json";
- string Authorization = GetAuthorization(url, method, metaStr, privateKey, merchantId, serialNo);
- request.Headers.Add("Authorization", Authorization);
- Stream writer;
- try
- {
- writer = request.GetRequestStream();
- }
- catch (Exception)
- {
- writer = null;
- }
- writer.Write(b1, 0, b1.Length);
- writer.Write(b2, 0, b2.Length);
- writer.Write(b3, 0, b3.Length);
- writer.Close();
- HttpWebResponse response;
- try
- {
- response = (HttpWebResponse)request.GetResponse();
- }
- catch (WebException ex)
- {
- response = ex.Response as HttpWebResponse;
- }
- Stream resStream = response.GetResponseStream();
- StreamReader reader = new StreamReader(resStream);
- string text = reader.ReadToEnd();
- return text;
- }
- protected string GetAuthorization(string url, string method, string jsonParame, string privateKey, string merchantId, string serialNo)
- {
- var uri = new Uri(url);
- string urlPath = uri.PathAndQuery;
- string nonce = Guid.NewGuid().ToString();
- var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
-
- method = string.IsNullOrEmpty(method) ? "" : method;
- string message = string.Format("{0}\n{1}\n{2}\n{3}\n{4}\n", method, urlPath, timestamp, nonce, jsonParame);
- string signTxt = Sign(message, privateKey);
-
- string authorzationTxt = string.Format("WECHATPAY2-SHA256-RSA2048 mchid=\"{0}\",nonce_str=\"{1}\",timestamp=\"{2}\",serial_no=\"{3}\",signature=\"{4}\"",
- merchantId,
- nonce,
- timestamp,
- serialNo,
- signTxt
- );
- return authorzationTxt;
- }
- protected string Sign(string message, string privateKey)
- {
- byte[] keyData = Convert.FromBase64String(privateKey);
- byte[] data = System.Text.Encoding.UTF8.GetBytes(message);
- var rsa = RSA.Create();
- rsa.ImportPkcs8PrivateKey(keyData, out _);
- return Convert.ToBase64String(rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1));
-
-
-
-
-
- }
- #endregion
- #region 获取文件sha256
- public string GetSha256(FileStream stream)
- {
- using (SHA256 mySHA256 = SHA256.Create())
- {
- byte[] hashValue = mySHA256.ComputeHash(stream);
- return Encoding.UTF8.GetString(hashValue);
- }
- }
- #endregion
- #region 判断长期
- public string CheckForever(DateTime? time)
- {
- if (time == null)
- {
- return "";
- }
- if (time.Value.Year >= 2050)
- {
- return "长期";
- }
- return time.Value.ToString("yyyy-MM-dd");
- }
- #endregion
- }
- }
|