WeChatFunction.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. using System;
  2. using System.Collections.Generic;
  3. using Library;
  4. using LitJson;
  5. using System.Linq;
  6. using System.Security.Cryptography.X509Certificates;
  7. using System.Security.Cryptography;
  8. using System.Text;
  9. using System.IO;
  10. using System.Net;
  11. using MySystem.Models;
  12. namespace MySystem
  13. {
  14. public class WeChatFunction
  15. {
  16. public WeChatFunction()
  17. {
  18. }
  19. #region 服务商平台商户进件提交申请单API
  20. public string MerchantCreate(PxcModels.MerchantAddInfo info, PxcModels.MerchantInfo merchant)
  21. {
  22. // pubkey = GetPublicKey();
  23. Dictionary<string, object> result = new Dictionary<string, object>();
  24. result.Add("business_code", info.BusinessCode); //业务申请编号
  25. PxcModels.WebCMSEntities dbpxc = new PxcModels.WebCMSEntities();
  26. //超级管理员信息
  27. Dictionary<string, object> contact_info = new Dictionary<string, object>();
  28. contact_info.Add("contact_name", RSAEncrypt(info.ContactName)); //超级管理员姓名
  29. contact_info.Add("contact_id_number", RSAEncrypt(info.ContactIdNumber)); //超级管理员身份证件号码
  30. // contact_info.Add("openid", info.OpenId); //超级管理员微信openid
  31. contact_info.Add("mobile_phone", RSAEncrypt(info.MobilePhone)); //联系手机
  32. contact_info.Add("contact_email", RSAEncrypt(info.ContactEmail)); //联系邮箱
  33. result.Add("contact_info", contact_info);
  34. //主体资料
  35. Dictionary<string, object> subject_info = new Dictionary<string, object>();
  36. subject_info.Add("subject_type", info.SubjectType); //主体类型
  37. Dictionary<string, object> business_license_info = new Dictionary<string, object>();
  38. business_license_info.Add("license_copy", GetMediaId("/bsserver_com" + info.LicenseCopy)); //营业执照照片
  39. business_license_info.Add("license_number", info.LicenseNumber); //注册号/统一社会信用代码
  40. business_license_info.Add("merchant_name", merchant.Name); //商户名称
  41. business_license_info.Add("legal_person", info.LegalPerson); //个体户经营者/法人姓名
  42. subject_info.Add("business_license_info", business_license_info); //营业执照
  43. // Dictionary<string, object> certificate_info = new Dictionary<string, object>();
  44. // certificate_info.Add("cert_copy", GetMediaId("/bsserver_com" + info.CertCopy)); //登记证书照片
  45. // certificate_info.Add("cert_type", info.CertType); //登记证书类型
  46. // certificate_info.Add("cert_number", info.CertNumber); //证书号
  47. // certificate_info.Add("merchant_name", info.CertMerchantName); //商户名称
  48. // certificate_info.Add("company_address", info.CompanyAddress); //注册地址
  49. // certificate_info.Add("legal_person", info.CertLegalPerson); //法人姓名
  50. // certificate_info.Add("period_begin", CheckForever(info.PeriodBegin)); //有效期限开始日期
  51. // certificate_info.Add("period_end", CheckForever(info.PeriodEnd)); //有效期限结束日期
  52. // subject_info.Add("certificate_info", certificate_info); //登记证书
  53. // Dictionary<string, object> organization_info = new Dictionary<string, object>();
  54. // organization_info.Add("organization_copy", GetMediaId("/bsserver_com" + info.OrganizationCopy)); //组织机构代码证照片
  55. // organization_info.Add("organization_code", info.OrganizationCode); //组织机构代码
  56. // organization_info.Add("org_period_begin", CheckForever(info.OrgPeriodBegin)); //组织机构代码证有效期开始日期
  57. // organization_info.Add("org_period_end", CheckForever(info.OrgPeriodEnd)); //组织机构代码证有效期结束日期
  58. // subject_info.Add("organization_info", organization_info); //组织机构代码证
  59. // subject_info.Add("certificate_letter_copy", GetMediaId("/bsserver_com" + info.CertificateLetterCopy)); //单位证明函照片
  60. Dictionary<string, object> identity_info = new Dictionary<string, object>();
  61. info.IdDocType = "IDENTIFICATION_TYPE_IDCARD";
  62. identity_info.Add("id_doc_type", info.IdDocType); //证件类型
  63. Dictionary<string, object> id_card_info = new Dictionary<string, object>();
  64. id_card_info.Add("id_card_copy", GetMediaId("/bsserver_com" + info.IdCardCopy)); //身份证人像面照片
  65. id_card_info.Add("id_card_national", GetMediaId("/bsserver_com" + info.IdCardNational)); //身份证人像面照片
  66. id_card_info.Add("id_card_name", RSAEncrypt(info.IdCardName)); //身份证姓名
  67. id_card_info.Add("id_card_number", RSAEncrypt(info.IdCardNumber)); //身份证号码
  68. id_card_info.Add("card_period_begin", CheckForever(info.CardPeriodBegin)); //身份证有效期开始时间
  69. id_card_info.Add("card_period_end", CheckForever(info.CardPeriodEnd)); //身份证有效期结束时间
  70. identity_info.Add("id_card_info", id_card_info); //身份证信息
  71. // identity_info.Add("owner", info.Owner == 1 ? true : false); //经营者/法人是否为受益人
  72. identity_info.Add("owner", true);
  73. subject_info.Add("identity_info", identity_info); //经营者/法人身份证件
  74. // if (info.Owner == 0)
  75. // {
  76. // Dictionary<string, object> ubo_info = new Dictionary<string, object>();
  77. // ubo_info.Add("id_type", info.UboInfoIdType); //证件类型
  78. // ubo_info.Add("id_card_copy", GetMediaId("/bsserver_com" + info.UboInfoIdCardCopy)); //身份证人像面照片
  79. // ubo_info.Add("id_card_national", GetMediaId("/bsserver_com" + info.UboInfoIdCardNational)); //身份证国徽面照片
  80. // ubo_info.Add("id_doc_copy", GetMediaId("/bsserver_com" + info.UboInfoIdDocCopy)); //证件照片
  81. // ubo_info.Add("name", RSAEncrypt(info.UboInfoName)); //受益人姓名
  82. // ubo_info.Add("id_number", RSAEncrypt(info.UboInfoIdNumber)); //证件号码
  83. // ubo_info.Add("id_period_begin", CheckForever(info.UboInfoIdPeriodBegin)); //证件有效期开始时间
  84. // ubo_info.Add("id_period_end", CheckForever(info.UboInfoIdPeriodEnd)); //证件有效期结束时间
  85. // subject_info.Add("ubo_info", ubo_info); //最终受益人信息(UBO)
  86. // }
  87. result.Add("subject_info", subject_info);
  88. //经营资料
  89. Dictionary<string, object> business_info = new Dictionary<string, object>();
  90. business_info.Add("merchant_shortname", info.MerchantShortname); //商户简称
  91. business_info.Add("service_phone", info.ServicePhone); //客服电话
  92. Dictionary<string, object> sales_info = new Dictionary<string, object>();
  93. info.SalesScenesType = "SALES_SCENES_STORE";
  94. sales_info.Add("sales_scenes_type", info.SalesScenesType.Split(',').ToList()); //经营场景类型
  95. Dictionary<string, object> biz_store_info = new Dictionary<string, object>();
  96. biz_store_info.Add("biz_store_name", info.BizStoreName); //门店名称
  97. PxcModels.OpenBankCityTable BizAddress = dbpxc.OpenBankCityTable.FirstOrDefault(m => m.CityName.EndsWith(info.BizAddressCode)) ?? new PxcModels.OpenBankCityTable();
  98. biz_store_info.Add("biz_address_code", BizAddress.Code); //门店省市编码
  99. biz_store_info.Add("biz_store_address", info.BizStoreAddress); //门店地址
  100. List<string> store_entrance_pic = new List<string>();
  101. store_entrance_pic.Add(GetMediaId("/bsserver_com" + info.StoreEntrancePic));
  102. biz_store_info.Add("store_entrance_pic", store_entrance_pic); //门店门头照片
  103. List<string> indoor_pic = new List<string>();
  104. indoor_pic.Add(GetMediaId("/bsserver_com" + info.IndoorPic));
  105. biz_store_info.Add("indoor_pic", indoor_pic); //店内环境照片
  106. biz_store_info.Add("biz_sub_appid", info.BizSubAppid); //线下场所对应的商家APPID
  107. sales_info.Add("biz_store_info", biz_store_info); //线下门店场景
  108. // Dictionary<string, object> mp_info = new Dictionary<string, object>();
  109. // mp_info.Add("mp_appid", info.MpAppid); //服务商公众号APPID
  110. // mp_info.Add("mp_sub_appid", info.MpSubAppid); //商家公众号APPID
  111. // mp_info.Add("mp_pics", GetMediaId("/bsserver_com" + info.MpPics)); //公众号页面截图
  112. // sales_info.Add("mp_info", mp_info); //公众号场景
  113. // Dictionary<string, object> mini_program_info = new Dictionary<string, object>();
  114. // mini_program_info.Add("mini_program_appid", info.MiniProgramAppid); //服务商小程序APPID
  115. // mini_program_info.Add("mini_program_sub_appid", info.MiniProgramSubAppid); //商家小程序APPID
  116. // mini_program_info.Add("mini_program_pics", GetMediaId("/bsserver_com" + info.MiniProgramPics)); //小程序截图
  117. // sales_info.Add("mini_program_info", mini_program_info); //小程序场景
  118. // Dictionary<string, object> app_info = new Dictionary<string, object>();
  119. // app_info.Add("app_appid", info.AppAppid); //服务商应用APPID
  120. // app_info.Add("app_sub_appid", info.AppSubAppid); //商家应用APPID
  121. // app_info.Add("app_pics", GetMediaId("/bsserver_com" + info.AppPics)); //商家应用APPID
  122. // sales_info.Add("app_info", app_info); //APP场景
  123. // Dictionary<string, object> web_info = new Dictionary<string, object>();
  124. // web_info.Add("domain", info.WebDomain); //互联网网站域名
  125. // web_info.Add("web_authorisation", GetMediaId("/bsserver_com" + info.WebAuthorisation)); //网站授权函
  126. // web_info.Add("web_appid", info.WebAppId); //互联网网站对应的商家APPID
  127. // sales_info.Add("web_info", web_info); //互联网网站场景
  128. // Dictionary<string, object> wework_info = new Dictionary<string, object>();
  129. // wework_info.Add("sub_corp_id", info.SubCorpId); //商家企业微信CorpID
  130. // wework_info.Add("wework_pics", GetMediaId("/bsserver_com" + info.WeworkPics)); //企业微信页面截图
  131. // sales_info.Add("wework_info", wework_info); //企业微信场景
  132. business_info.Add("sales_info", sales_info); //经营场景
  133. result.Add("business_info", business_info);
  134. //结算规则
  135. Dictionary<string, object> settlement_info = new Dictionary<string, object>();
  136. settlement_info.Add("settlement_id", info.SettlementId); //入驻结算规则ID
  137. settlement_info.Add("qualification_type", info.QualificationType); //所属行业
  138. if (!string.IsNullOrEmpty(info.Qualifications))
  139. {
  140. List<string> Qualifications = new List<string>();
  141. Qualifications.Add(GetMediaId("/bsserver_com" + info.Qualifications));
  142. settlement_info.Add("qualifications", Qualifications); //特殊资质图片
  143. }
  144. settlement_info.Add("activities_id", info.ActivitiesId); //优惠费率活动ID
  145. settlement_info.Add("activities_rate", info.ActivitiesRate); //优惠费率活动值
  146. result.Add("settlement_info", settlement_info);
  147. //结算银行账户
  148. Dictionary<string, object> bank_account_info = new Dictionary<string, object>();
  149. bank_account_info.Add("bank_account_type", info.BankAccountType); //账户类型
  150. bank_account_info.Add("account_name", RSAEncrypt(info.AccountName)); //开户名称
  151. bank_account_info.Add("account_bank", info.AccountBank); //开户银行
  152. PxcModels.OpenBankCityTable BankAddress = dbpxc.OpenBankCityTable.FirstOrDefault(m => m.CityName.EndsWith(info.BankAddressCode)) ?? new PxcModels.OpenBankCityTable();
  153. bank_account_info.Add("bank_address_code", BankAddress.Code); //开户银行省市编码
  154. PxcModels.OpenBankTable BankBranch = dbpxc.OpenBankTable.FirstOrDefault(m => m.BankName == info.BankName) ?? new PxcModels.OpenBankTable();
  155. bank_account_info.Add("bank_branch_id", BankBranch.BankCode); //开户银行联行号
  156. bank_account_info.Add("bank_name", info.BankName); //开户银行全称(含支行)
  157. bank_account_info.Add("account_number", RSAEncrypt(info.AccountNumber)); //银行账号
  158. result.Add("bank_account_info", bank_account_info);
  159. dbpxc.Dispose();
  160. string req = Newtonsoft.Json.JsonConvert.SerializeObject(result);
  161. Dictionary<string, string> header = new Dictionary<string, string>();
  162. // 如何查看证书序列号?
  163. // 登陆商户平台【API安全】->【API证书】->【查看证书】,可查看商户API证书序列号。
  164. // 商户API证书和微信支付平台证书均可以使用第三方的证书解析工具,查看证书内容。或者使用openssl命令行工具查看证书序列号。
  165. // $ openssl x509 -in 1900009191_20180326_cert.pem -noout -serial
  166. // serial=1DDE55AD98ED71D6EDD4A4A16996DE7B47773A8C
  167. string merchantId = "1613112281"; //商户号
  168. string serialNo = "61D99F7218B487788E35D6C4E3ED398E0979D3F6"; //证书编号
  169. string resp = postJson("https://api.mch.weixin.qq.com/v3/applyment4sub/applyment/", req, prikey, merchantId, serialNo);
  170. function.WriteLog(resp, "商户进件日志");
  171. return resp;
  172. }
  173. #endregion
  174. #region 服务商平台查询申请单状态API
  175. public Dictionary<string, object> QueryMerchant(string BusinessCode)
  176. {
  177. Dictionary<string, object> return_result = new Dictionary<string, object>();
  178. try
  179. {
  180. string merchantId = "1613112281"; //商户号
  181. string serialNo = "61D99F7218B487788E35D6C4E3ED398E0979D3F6"; //证书编号
  182. string result = postJson("https://api.mch.weixin.qq.com/v3/applyment4sub/applyment/business_code/" + BusinessCode, "", prikey, merchantId, serialNo, "GET");
  183. function.WriteLog(result, "服务商平台查询申请单状态API");
  184. //{\"applyment_id\":2000002247709762,\"applyment_state\":\"APPLYMENT_STATE_FINISHED\",\"applyment_state_msg\":\"商户入驻申请已完成\",\"audit_detail\":[],\"business_code\":\"0123456789\",\"sign_url\":\"https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQFv7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyUXE1czkzb3JlUjIxZHpXbTF5Y2YAAgRjbe9hAwQAjScA\",\"sub_mchid\":\"1619775262\"}
  185. JsonData jsonObj = JsonMapper.ToObject(result);
  186. return_result.Add("applyment_id", jsonObj["applyment_id"].ToString()); //微信支付申请单号
  187. return_result.Add("applyment_state", jsonObj["applyment_state"].ToString()); //申请单状态
  188. return_result.Add("applyment_state_msg", jsonObj["applyment_state_msg"].ToString()); //申请状态描述
  189. if (jsonObj["applyment_state"].ToString() == "APPLYMENT_STATE_REJECTED")
  190. {
  191. List<Dictionary<string, string>> audit_detail = new List<Dictionary<string, string>>();
  192. JsonData auditObj = jsonObj["audit_detail"]; //驳回原因详情
  193. // for (int i = 0; i < auditObj.Count; i++)
  194. // {
  195. // Dictionary<string, string> row = new Dictionary<string, string>();
  196. // // row.Add("field", auditObj[i]["field"].ToString()); //字段名
  197. // // row.Add("field_name", auditObj[i]["field_name"].ToString()); //字段名称
  198. // row.Add("reject_reason", auditObj[i]["reject_reason"].ToString()); //驳回原因
  199. // audit_detail.Add(row);
  200. // }
  201. return_result.Add("reject_reason", auditObj[0]["reject_reason"].ToString());
  202. return_result.Add("audit_detail", audit_detail); //申请状态描述
  203. }
  204. if (result.Contains("\"sign_url\":"))
  205. {
  206. return_result.Add("sign_url", jsonObj["sign_url"].ToString()); //进件通过申请,待商家签约的地址
  207. }
  208. }
  209. catch (Exception ex)
  210. {
  211. function.WriteLog(DateTime.Now.ToString() + "\r\n" + ex.ToString(), "服务商平台查询申请单状态API异常");
  212. }
  213. return return_result;
  214. }
  215. #endregion
  216. #region 敏感信息加密
  217. // string pubkey = "MIIBCgKCAQEAxK9K2ElQ0rUMwNFW4xMx7kmkpDlp7WGQ8VffXLpudJBIrRVFWJN7dlinCGu67ZATf+/GZvLSSzQPWejHEsI9vUp9ej0x5iZDHGc9/shNUjd03ORkKo/Ohj3Ju19RzX4mh+GoinKGiuKX8CdGPXPe7UObKWyETrDcxrit6VCJQjE604aNtVeAUE+41mOpCLGzTgAKt4psfHxsBRtqlveH4cH/51ip+cGkC/u36gfDMKaRluVfFO3ETxDkI94BwNtnthcA4WDKha+wjtB6HIJ5xxHV550+cfdkl4j8UKU6pB+C5JRNgvjAf6ljg/TF+cGF1d8C6IbYYodYKloqN2DzrwIDAQAB"; //公钥
  218. string pubkey = "MIID3DCCAsSgAwIBAgIUYdmfchi0h3iONdbE4+05jgl50/YwDQYJKoZIhvcNAQELBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsTFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3QgQ0EwHhcNMjIwMTIzMDYwMjA4WhcNMjcwMTIyMDYwMjA4WjBuMRgwFgYDVQQDDA9UZW5wYXkuY29tIHNpZ24xEzARBgNVBAoMClRlbnBheS5jb20xHTAbBgNVBAsMFFRlbnBheS5jb20gQ0EgQ2VudGVyMQswCQYDVQQGDAJDTjERMA8GA1UEBwwIU2hlblpoZW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDSFtwof74G5sJuQya6OJKhfjMcVZ3PZk+uG0RWULyDwOZezvYjLp9jkkfTCWuWDkshRmrDhVj89eOPwy60QDYKaKQ1Mq48BqoQrOikSK5bxAMGHg1a/0UcPM3yL3T84nlZkFlySeXN8cqWkZnPIXeO/blYCyBxNizmUwIIJUlI1Fbhy4lQRsoLoRbeh+YUQ2AI9D2plzVDY5jkG9/FQWhyZr5K3rgjblb/pMZngmzSYCNBWfJP9EZfRuQvZokMEddytC3JoSPgvqA25RMAPvj1cnAiOypgm7BHhx+a1mpmz79ifWlDF9rglo6WDGAxQ4JDuPJTVOiQ9EsfS8OHjxmfAgMBAAGjgYEwfzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE8DBlBgNVHR8EXjBcMFqgWKBWhlRodHRwOi8vZXZjYS5pdHJ1cy5jb20uY24vcHVibGljL2l0cnVzY3JsP0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFEMzk3NTQ5ODQ2QzAxQzNFOEVCRDIwDQYJKoZIhvcNAQELBQADggEBABrLvDmhYbFtIbKZE+up87zfYcx/HvaxIrHNRju7e6Kn62fmxhNRFuOBjMwshBt247lN4w02peBDmAOTRTs8jwamRwqTv6WtO2bbrKT3QkyEDieNnO2kfEIsSAXGp0FUcmkgzZv7tOekGUx8H6yp/3mtpFy1UqE86s5GdQGDVmhOTG2naqidi1X10XnTNWrw3siuc5pSm02lfpwEMl2zyWvQrC/42s/DO8/VfnmIVGy1QIzIpTfUYC6mfTiGuARLIgUwv/wRxrCwSOBKLLbaxXPB2HOaUJ1BpAOyVjxx46Y7yEpfpzkHbm5gNnhICUjQwDT1V2tpslclqjwP0Ju97Mw=";
  219. string prikey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDEr0rYSVDStQzA0VbjEzHuSaSkOWntYZDxV99cum50kEitFUVYk3t2WKcIa7rtkBN/78Zm8tJLNA9Z6McSwj29Sn16PTHmJkMcZz3+yE1SN3Tc5GQqj86GPcm7X1HNfiaH4aiKcoaK4pfwJ0Y9c97tQ5spbIROsNzGuK3pUIlCMTrTho21V4BQT7jWY6kIsbNOAAq3imx8fGwFG2qW94fhwf/nWKn5waQL+7fqB8MwppGW5V8U7cRPEOQj3gHA22e2FwDhYMqFr7CO0HocgnnHEdXnnT5x92SXiPxQpTqkH4LklE2C+MB/qWOD9MX5wYXV3wLohthih1gqWio3YPOvAgMBAAECggEAFSxFo1jpIXWqBMvETbeQRXWaCq+/jnVVVBXAjsvm/hdWK4PBrlJaFRhgCtEGE3LSFpCqTATRzJSzHlunqoZMfScasOELkRoHWXRnwRiw8ivUIb9YZRiMA/l80PXm6XcuEKyjJxxDDYptDsY7knv5wJLpjiEHcS0q5x2UYyxvSjewJMZE8RlGxqvyoSmV2galRssQdpYujG27FAzcK/3SWDY9MjPNnTk9+kMnXXh8VB3fy9Dxpo1plmSwCKf3gnBGuqKcgyzp/5rnjyrGy7Whh5RFcdB7ervFIgCuLVd+Ko2NG3klJx1HUXduQ5laSgSrHwD69LByTEOmkl27l1R5OQKBgQDoj46CbJsnyD7XaTlPaMHIbzkC5QLPBMYqdqk7CvuRVSgbUttDUu4hJGuu+H+8rflg4UE5a++y5ip67XzfGw3KOb98IoHYrRPvZLAfQtiXuedX4I/klBSXMyf6HaI7QPKiH7fW1olpb/NaSMlfKtQR6wgpdZSc2iuiLwvFXuQLQwKBgQDYghN8oRXChpaVsWA8Gg8TkUs2WqcSCI6KWtAWMCTPLWakTQrHdmzsMGu50Q99U4iCCdW7y3+a59scRd+o5HDvD4HAHiSuQxy/F/iWH9y2IymoJyHFAy3iMUIfVhzQpiJCKRxzLkBxRPPE1JDTb6QmPX7t2poFXh9x+wFAMbaxJQKBgG+JqofTHvcNi1Y1GU+EpqxC68z/mUFAwOpMzw2KTu19MicorhC0DZHHrf3VIS6VIi3c2zN3GRdsXKNok6NNjmeXGsempTAOkqkWWYIkxUy/1LzI7zpp6xY5assCu3Q/yh8Hp1xauLzg/I4oqqwCFoQhfWClDAnOeW7nsXWP9T+RAoGANFeeJm87N4AaP65WObGDG5Pwvv9DjNSMwV4bGIIjJAMx4V7O0FINGzzJjm7Ac+gSBH4kMfaMrwKGslsiK06vDtyM3clrzMVk2b4N1x102oO9um1beKnAGgMWnUTQSpEfjycpPZ9c7QVieZ96M+O1p5kOaqqCufF7YK7yKnbaWBECgYEAvTevavXvhR7JTfVbqpPpBK0YUS0c8ys1k699VQeJIbSo2qecCi/xdk9fSHPFd0jjL5+7+g37M8l9KcQex0rnMxYBmIZY9Ce7MfsYt2dOnmLMdpOeiL4REt0Zr9txXrF0jeWlGYUTHl6/vNqKYJug3dpZaak/cj6Pyjyp35v3Ruw="; //私钥
  220. public string RSAEncrypt(string text)
  221. {
  222. byte[] publicKey = Convert.FromBase64String(pubkey);
  223. // var rsa = RSA.Create();
  224. // rsa.ImportRSAPublicKey(publicKey, out _);
  225. // var buff = rsa.Encrypt(Encoding.UTF8.GetBytes(text), RSAEncryptionPadding.OaepSHA1);
  226. // return Convert.ToBase64String(buff);
  227. using (var x509 = new X509Certificate2(publicKey))
  228. {
  229. using (var rsa = x509.GetRSAPublicKey())
  230. {
  231. var buff = rsa.Encrypt(Encoding.UTF8.GetBytes(text), RSAEncryptionPadding.OaepSHA1);
  232. return Convert.ToBase64String(buff);
  233. }
  234. }
  235. }
  236. public string postJson(string url, string postData, string privateKey, string merchantId, string serialNo, string method = "POST")
  237. {
  238. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  239. request.Method = method;
  240. request.ContentType = "application/json;charset=UTF-8";
  241. 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";
  242. request.Accept = "application/json";
  243. string Authorization = GetAuthorization(url, method, postData, privateKey, merchantId, "4DD075520570E89C215AD816F67083C3DC7053C8");
  244. request.Headers.Add("Authorization", Authorization);
  245. request.Headers.Add("Wechatpay-Serial", serialNo);
  246. if (!string.IsNullOrEmpty(postData))
  247. {
  248. byte[] paramJsonBytes;
  249. paramJsonBytes = System.Text.Encoding.UTF8.GetBytes(postData);
  250. request.ContentLength = paramJsonBytes.Length;
  251. Stream writer;
  252. try
  253. {
  254. writer = request.GetRequestStream();
  255. }
  256. catch (Exception)
  257. {
  258. writer = null;
  259. Console.Write("连接服务器失败!");
  260. }
  261. writer.Write(paramJsonBytes, 0, paramJsonBytes.Length);
  262. writer.Close();
  263. }
  264. HttpWebResponse response;
  265. try
  266. {
  267. response = (HttpWebResponse)request.GetResponse();
  268. }
  269. catch (WebException ex)
  270. {
  271. response = ex.Response as HttpWebResponse;
  272. }
  273. Stream resStream = response.GetResponseStream();
  274. StreamReader reader = new StreamReader(resStream);
  275. string text = reader.ReadToEnd();
  276. return text;
  277. //{\"code\":\"PARAM_ERROR\",\"message\":\"请确认待处理的消息是否为加密后的密文\"}
  278. //{\"applyment_id\":2000002247709762}
  279. }
  280. #endregion
  281. #region 图片上传
  282. public string GetMediaId(string imgPath)
  283. {
  284. if (string.IsNullOrEmpty(imgPath))
  285. {
  286. return "";
  287. }
  288. string key = "wechatpic:" + function.MD5_16(imgPath);
  289. string media_id = BothdisDbconn.Instance.Get<string>(key);
  290. if (!string.IsNullOrEmpty(media_id))
  291. {
  292. return media_id;
  293. }
  294. string filePath = function.getPath(imgPath);
  295. var filename = Path.GetFileName(filePath);
  296. FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
  297. Byte[] imgBytesIn = new Byte[fs.Length];
  298. fs.Read(imgBytesIn, 0, imgBytesIn.Length);
  299. fs.Close();
  300. byte[] hash = SHA256Managed.Create().ComputeHash(imgBytesIn);
  301. StringBuilder builder = new StringBuilder();
  302. for (int i = 0; i < hash.Length; i++)
  303. {
  304. builder.Append(hash[i].ToString("x2"));
  305. }
  306. var sha256 = builder.ToString();
  307. string metaStr = "{\"filename\":\""+ filename + "\",\"sha256\":\"" + sha256 + "\"}";
  308. media_id = UploadImgApi(metaStr, imgBytesIn, filename);
  309. BothdisDbconn.Instance.Set(key, media_id);
  310. return media_id;
  311. }
  312. public string UploadImgApi(string metaStr, Byte[] imgBytesIn,string filename)
  313. {
  314. string url = "https://api.mch.weixin.qq.com/v3/merchant/media/upload";
  315. string merchantId = "1613112281"; //商户号
  316. string serialNo = "4DD075520570E89C215AD816F67083C3DC7053C8"; //证书编号
  317. string privateKey = prikey;
  318. #region 定义请求体中的内容 并转成二进制
  319. string boundary = "lc199aecd61b4653ef";
  320. string Enter = "\r\n";
  321. string campaignIDStr1
  322. = "--" + boundary
  323. + Enter
  324. + "Content-Disposition: form-data; name=\"meta\";"
  325. + Enter
  326. + "Content-Type:application/json;"
  327. + Enter
  328. + Enter
  329. + metaStr
  330. + Enter
  331. + "--" + boundary
  332. + Enter
  333. + "Content-Disposition:form-data;name=\"file\";filename=\""+ filename + "\";"
  334. + Enter
  335. + "Content-Type:image/jpeg"
  336. + Enter
  337. + Enter;
  338. byte[] byteData2
  339. = imgBytesIn;
  340. string campaignIDStr3
  341. = Enter
  342. + "--" + boundary
  343. + Enter;
  344. var byteData1 = System.Text.Encoding.UTF8.GetBytes(campaignIDStr1);
  345. var byteData3 = System.Text.Encoding.UTF8.GetBytes(campaignIDStr3);
  346. #endregion
  347. string transactionsResponse = UploadImg_postJson(url, byteData1, byteData2, byteData3, metaStr, privateKey, merchantId, serialNo, boundary, "POST");
  348. var result=JsonMapper.ToObject(transactionsResponse);
  349. return result["media_id"].ToString();
  350. }
  351. 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")
  352. {
  353. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  354. request.Method = method;
  355. //request.ContentType = "application/json;charset=UTF-8";
  356. request.ContentType = "multipart/form-data;boundary=" + boundary;
  357. 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";
  358. request.Accept = "application/json";
  359. string Authorization = GetAuthorization(url, method, metaStr, privateKey, merchantId, serialNo);
  360. request.Headers.Add("Authorization", Authorization);
  361. Stream writer;
  362. try
  363. {
  364. writer = request.GetRequestStream();
  365. }
  366. catch (Exception)
  367. {
  368. writer = null;
  369. }
  370. writer.Write(b1, 0, b1.Length);
  371. writer.Write(b2, 0, b2.Length);
  372. writer.Write(b3, 0, b3.Length);
  373. writer.Close();
  374. HttpWebResponse response;
  375. try
  376. {
  377. response = (HttpWebResponse)request.GetResponse();
  378. }
  379. catch (WebException ex)
  380. {
  381. response = ex.Response as HttpWebResponse;
  382. }
  383. Stream resStream = response.GetResponseStream();
  384. StreamReader reader = new StreamReader(resStream);
  385. string text = reader.ReadToEnd();
  386. return text;
  387. }
  388. protected string GetAuthorization(string url, string method, string jsonParame, string privateKey, string merchantId, string serialNo)
  389. {
  390. var uri = new Uri(url);
  391. string urlPath = uri.PathAndQuery;
  392. string nonce = Guid.NewGuid().ToString();
  393. var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
  394. //数据签名 HTTP请求方法\n接口地址的url\n请求时间戳\n请求随机串\n请求报文主体\n
  395. method = string.IsNullOrEmpty(method) ? "" : method;
  396. string message = string.Format("{0}\n{1}\n{2}\n{3}\n{4}\n", method, urlPath, timestamp, nonce, jsonParame);
  397. string signTxt = Sign(message, privateKey);
  398. //Authorization和格式
  399. string authorzationTxt = string.Format("WECHATPAY2-SHA256-RSA2048 mchid=\"{0}\",nonce_str=\"{1}\",timestamp=\"{2}\",serial_no=\"{3}\",signature=\"{4}\"",
  400. merchantId,
  401. nonce,
  402. timestamp,
  403. serialNo,
  404. signTxt
  405. );
  406. return authorzationTxt;
  407. }
  408. protected string Sign(string message, string privateKey)
  409. {
  410. byte[] keyData = Convert.FromBase64String(privateKey);
  411. byte[] data = System.Text.Encoding.UTF8.GetBytes(message);
  412. var rsa = RSA.Create();
  413. rsa.ImportPkcs8PrivateKey(keyData, out _);
  414. return Convert.ToBase64String(rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1));
  415. // using (CngKey cngKey = CngKey.Import(keyData, CngKeyBlobFormat.Pkcs8PrivateBlob))
  416. // using (RSACng rsa = new RSACng(cngKey))
  417. // {
  418. // return Convert.ToBase64String(rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1));
  419. // }
  420. }
  421. #endregion
  422. #region 获取文件sha256
  423. public string GetSha256(FileStream stream)
  424. {
  425. using (SHA256 mySHA256 = SHA256.Create())
  426. {
  427. byte[] hashValue = mySHA256.ComputeHash(stream);
  428. return Encoding.UTF8.GetString(hashValue);
  429. }
  430. }
  431. #endregion
  432. #region 判断长期
  433. public string CheckForever(DateTime? time)
  434. {
  435. if (time == null)
  436. {
  437. return "";
  438. }
  439. if (time.Value.Year >= 2050)
  440. {
  441. return "长期";
  442. }
  443. return time.Value.ToString("yyyy-MM-dd");
  444. }
  445. #endregion
  446. }
  447. }