using CsharpHttpHelper; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Api.Framework.Tools { /// /// 商户支付类 /// public class WechatPay { public WechatPay() { } private string wechat_pay_url = "http://wxpay.api.52cmg.cn"; private const int wechat_appid = 85599; private const string wechat_appkey = "vssNGL91TxssqPHsOek+febRdhhPDf5BwIAO2S/jr0kGsFJIrG1IbG7Y73kM14h+71q1KepvUSG6ngSvZzHxQsBNSUFWd0/kOqjTJp5az5CssPEZOE+5Y9JyOQQ6P6QijdhSxtGSrJt3RLKAeQGbEnc5lU5WB8g1zgIODrLzRQ0=AQAB"; /// /// 请求服务器 /// /// /// /// private WebResult SendServer(string method, object param = null) { AuthEndpoint end = new AuthEndpoint() { Appid = wechat_appid, Enckey = wechat_appkey, Host = wechat_pay_url + "/api/pay.asmx/send_data", Method = method }; if (param != null) { var _param = param.GetType().GetProperties(); foreach (var item in _param) { end.Param[item.Name] = item.GetValue(param); } } HttpHelper http = new HttpHelper(); return http.SendData(end); } /// /// 商户数据上传 /// /// /// /// /// /// /// /// /// public string Upload(string url, string gzh_appid, string gzh_appsecret, string sh_appid, string sh_appsecret, byte[] sh_cerdata, string footer) { if (string.IsNullOrEmpty(url) || string.IsNullOrEmpty(gzh_appid) || string.IsNullOrEmpty(sh_appid)) throw new Exception("商户填写的数据信息不完整!"); var hex_data = HttpExtend.ByteToHex(sh_cerdata); var result = SendServer("upload_shop", new { url = url, gzh_appid = gzh_appid, gzh_appsecret = gzh_appsecret, sh_appid = sh_appid, sh_appsecret = sh_appsecret, sh_cerdata = hex_data, footer = footer }); return result.message.ToString(); } const string rsa_key = @"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCgPPwyc5JAbPRjkulZcat/JAYm /eiPRhtyod1CmqLteE1v90HCPoLwejkrmUToRsaJKKOgObKdh/t3Od/41RBc3rJw S4uX8VXqsq/VcLWh/GiieCNYqpb/7Chp7tfW7Sp+eyA/reT9LHRg27hLYfkhmu9f eFGAS17iICAyv3jpUwIDAQAB"; /// /// 商户创建 /// /// 商户地址 /// 备注 /// 描述 /// 金额 /// [Obsolete("改方法已过时")] public string Create(string url, object remark, string describe, double money) { var post = string.Empty;// "amount=[金额]&describe=[描述]&remark=[备注]".Replace("[金额]", money.ToString()).Replace("[描述]", HttpHelper.URLEncode(describe)).Replace("[备注]", HttpHelper.URLEncode(HttpHelper.ObjectToJson(remark))); var http = new HttpHelper(); url = url.Replace("[金额]", money.ToString()).Replace("[描述]", HttpHelper.URLEncode(describe, Encoding.UTF8)).Replace("[备注]", HttpHelper.URLEncode(HttpHelper.ObjectToJson(remark), Encoding.UTF8)); //if (url.StartsWith("https://pay.api.52cmg.cn")) //{ // RSACryption rsa = new RSACryption(); // var request_data = rsa.RsaEncrypt(HttpHelper.ObjectToJson(new // { // money = money, // describe = describe, // remark = remark // }),rsa_key); //} var item = http.GetItem(url); item.Encoding = Encoding.UTF8; var data = http.GetHtml(item); var result = data.Html; var json = HttpExtend.JsonToDictionary(result); if (json != null && json.ContainsKey("code")) { var code = int.Parse(json["code"].ToString()); if (code == 1) { var ispaid = false; var msg = string.Empty; if (json.ContainsKey("message")) msg = json["message"].ToString(); else if (json.ContainsKey("msg")) msg = json["msg"].ToString(); if (json.ContainsKey("ispaid")) ispaid = json["ispaid"].ToString().ToUpper() == "TRUE"; return msg; } //else if (code == 2) //{ // return "已转账"; //} else EventClient.OnEvent(this, $"生成兑换链接失败:{json["msg"].ToString()}"); } else EventClient.OnEvent(this, $"生成兑换链接失败:{result}"); return string.Empty; } /// /// 商户创建 /// /// 商户地址 /// 备注 /// 描述 /// 金额 /// 是否直接到账 /// public string Create(string url, object remark, string describe, double money, out bool ispaid) { var html = string.Empty; try { var post = string.Empty;// "amount=[金额]&describe=[描述]&remark=[备注]".Replace("[金额]", money.ToString()).Replace("[描述]", HttpHelper.URLEncode(describe)).Replace("[备注]", HttpHelper.URLEncode(HttpHelper.ObjectToJson(remark))); var http = new HttpHelper(); url = url.Replace("[金额]", money.ToString("0.00")).Replace("[描述]", HttpHelper.URLEncode(describe, Encoding.UTF8)).Replace("[备注]", HttpHelper.URLEncode(HttpHelper.ObjectToJson(remark), Encoding.UTF8)); //if (url.StartsWith("https://pay.api.52cmg.cn")) //{ // RSACryption rsa = new RSACryption(); // var request_data = rsa.RsaEncrypt(HttpHelper.ObjectToJson(new // { // money = money, // describe = describe, // remark = remark // }),rsa_key); //} ispaid = false; var item = http.GetItem(url); item.Timeout = 1000 * 60 * 10; item.ReadWriteTimeout = 20000; item.Encoding = Encoding.UTF8; var data = http.GetHtml(item); html = data.Html; var json = HttpExtend.JsonToDictionary(html); if (json != null && json.ContainsKey("code")) { var code = int.Parse(json["code"].ToString()); if (code == 1) { var msg = string.Empty; if (json.ContainsKey("message")) msg = json["message"]?.ToString(); else if (json.ContainsKey("msg")) msg = json["msg"]?.ToString(); if (json.ContainsKey("ispaid")) ispaid = json["ispaid"]?.ToString().ToUpper() == "TRUE"; return msg; } else { var msg = string.Empty; if (json.ContainsKey("msg")) msg = json["msg"]?.ToString(); else if (json.ContainsKey("message")) msg = json["message"]?.ToString(); EventClient.OnEvent(this, $"生成商户兑换链接失败:{msg}"); } } else EventClient.OnEvent(this, $"生成商户兑换链接失败:{html}"); } catch (Exception ex) { EventClient.OnEvent(this, $"生成兑换链接失败:{html} - {ex.Message}"); } ispaid = false; return string.Empty; } /// /// 商户创建 /// /// 商户地址 /// 备注 /// 描述 /// 金额 /// 是否直接到账 /// 小程序信息,微信可以用来发送小程序;不支持小程序返回null /// public string Create(string url, object remark, string describe, double money, out bool ispaid, out object appinfo) { var html = string.Empty; appinfo = null; try { var post = string.Empty;// "amount=[金额]&describe=[描述]&remark=[备注]".Replace("[金额]", money.ToString()).Replace("[描述]", HttpHelper.URLEncode(describe)).Replace("[备注]", HttpHelper.URLEncode(HttpHelper.ObjectToJson(remark))); var http = new HttpHelper(); url = url.Replace("[金额]", money.ToString("0.00")).Replace("[描述]", HttpHelper.URLEncode(describe, Encoding.UTF8)).Replace("[备注]", HttpHelper.URLEncode(HttpHelper.ObjectToJson(remark), Encoding.UTF8)); //if (url.StartsWith("https://pay.api.52cmg.cn")) //{ // RSACryption rsa = new RSACryption(); // var request_data = rsa.RsaEncrypt(HttpHelper.ObjectToJson(new // { // money = money, // describe = describe, // remark = remark // }),rsa_key); //} ispaid = false; var item = http.GetItem(url); item.Timeout = 30000; item.ReadWriteTimeout = 20000; item.Encoding = Encoding.UTF8; var data = http.GetHtml(item); html = data.Html; //{"code":1,"msg":"https://ygh8i.kuaizhan.com/52/52/p825791697c346b?orderid=e8255ae1e8d928555d61de464d73af75\u0026appid=wx6e0df44505ec10f5","appinfo":null,"aliUrl":"https://ulink.alipay.com/?scheme=alipays%3A%2F%2Fplatformapi%2Fstartapp%3FsaId%3D10000007%26clientVersion%3D3.7.0.0718%26qrcode%3Dhttps%3A%2F%2Fpay.api.52cmg.cn%2Falipay%3Forderid%3De8255ae1e8d928555d61de464d73af75"} var json = HttpExtend.JsonToDictionary(html); if (json != null && json.ContainsKey("code")) { var code = int.Parse(json["code"].ToString()); if (code == 1) { var msg = string.Empty; if (json.ContainsKey("message")) msg = json["message"]?.ToString(); else if (json.ContainsKey("msg")) msg = json["msg"]?.ToString(); if (json.ContainsKey("ispaid")) ispaid = json["ispaid"]?.ToString().ToUpper() == "TRUE"; if (json.ContainsKey("appinfo")) appinfo = json["appinfo"]; return msg; } else { var msg = string.Empty; if (json.ContainsKey("msg")) msg = json["msg"]?.ToString(); else if (json.ContainsKey("message")) msg = json["message"]?.ToString(); EventClient.OnEvent(this, $"生成商户兑换链接失败:{msg}"); } } else EventClient.OnEvent(this, $"生成商户兑换链接失败:{html}"); } catch (Exception ex) { EventClient.OnEvent(this, $"生成兑换链接失败:{html} - {ex.Message}"); } ispaid = false; return string.Empty; } /// /// /// /// /// /// /// /// public string Create2(string url, object remark, string describe, double money) { var html = string.Empty; try { var http = new HttpHelper(); url = url.Replace("[金额]", ((int)(money * 100)).ToString()).Replace("[描述]", HttpHelper.URLEncode(describe, Encoding.UTF8)).Replace("[备注]", HttpHelper.URLEncode(HttpHelper.ObjectToJson(remark), Encoding.UTF8)); var item = http.GetItem(url); item.Timeout = 30000; item.ReadWriteTimeout = 20000; item.Encoding = Encoding.UTF8; var data = http.GetHtml(item); html = data.Html; var jObj = JObject.Parse(html); if (jObj != null && jObj["code"] != null) { if ((int)jObj["code"] == 1) { var msg = jObj["data"]["withdraw_url"]?.ToString(); return msg; } else EventClient.OnEvent(this, $"生成商户兑换链接失败1:{html}"); } else EventClient.OnEvent(this, $"生成商户兑换链接失败2:{html}"); } catch (Exception ex) { EventClient.OnEvent(this, $"生成兑换链接失败3:{html} - {ex.Message}"); } return string.Empty; } /// /// 商户创建 /// /// 公众号appid /// 商户appid /// 公众号appkey /// 商户appkey /// 金额 /// 备注 /// 描述 /// public string Create(string gzh_appid, string sh_appid, string gzh_appkey, string sh_appkey, double amount, string remark, string describe) { if (string.IsNullOrEmpty(gzh_appid) || string.IsNullOrEmpty(sh_appid)) throw new Exception("商户填写的数据信息不完整!"); var password = HttpExtend.GetMD5String(gzh_appkey + sh_appkey); var result = SendServer("create_order", new { gzh_appid = gzh_appid, sh_appid = sh_appid, amount = amount.ToString("0.00"), remark = remark, describe = describe, password = password }); return result.message.ToString(); } } }