using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Web; using System.Web.Script.Serialization; using System.Web.UI; using System.Web.UI.WebControls; using System.Xml; using NetLibrary; using NetLibrary.Log; using Newtonsoft.Json; namespace TradeManage { public partial class oauth2 : System.Web.UI.Page { const string Token = "qianyun"; //你的token static string appId = "wx2f5849d8aa573da3";//公众号的appId static string appSecret = "34cc0ed309a8250eed74ea4df0b59fb5";//公众号的appSecret static string Code = ""; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { if ((Server.UrlDecode(Page.Request.QueryString["Code"]) != null) && (Server.UrlDecode(Page.Request.QueryString["Code"]) != "")) { Code = Request.QueryString["Code"].ToString(); PostUrl(); } } } public void PostUrl() { //string url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx2f5849d8aa573da3&redirect_uri=http://www.mnkj.com/oauth2.aspx&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect"; string url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId + "&secret=" + appSecret + "&code=" + Code + "&grant_type=authorization_code"; string ErrorMessage = ""; string XmlContent = CustomIO.HttpRequest(url, "Get", out ErrorMessage); if(ErrorMessage!="") ErrorFollow.TraceWrite("PostUrl", "PostUrl", ErrorMessage); if (XmlContent != "") { //ErrorFollow.TraceWrite("PostUrl", "PostUrl", XmlContent); JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); weixin_token Model = JsonConvert.Deserialize(XmlContent); //string url1 = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN"; if (Model != null) { string OpenId = Model.openid; if (OpenId == "") return; int UId = TradeData.BaseService.IsWeiXin(OpenId); if (UId == -1) { Response.Write(""); } else if (UId ==0) { Response.Write(""); } else if(UId>0) { PostPage(OpenId, UId); } // ErrorFollow.TraceWrite("OpenId1", "OpenId1", OpenId); } //ErrorFollow.TraceWrite("PostUrl", "PostUrl", "access_token:" + Model.access_token + ";refresh_token:" + Model.refresh_token + ";expires_in:" + Model.expires_in.ToString() + ";openid:" + Model.openid); } } protected void ImageButton1_Click(object sender, ImageClickEventArgs e) { // ErrorFollow.TraceWrite("OpenId2", "OpenId2", OpenId); //int UId = TradeData.BaseService.IsWeiXin(OpenId); // if (UId == -1) // { // Response.Write(""); // } // else // Response.Redirect("weixin/weixinauth.aspx?OpenId="+OpenId); } public void PostPage(string OpenId, int amount) { try { PayWeiXin model = new PayWeiXin(); PayForWeiXinHelp PayHelp = new PayForWeiXinHelp(); string result = string.Empty; //传入OpenId string openId = OpenId;// "obpqPs0mhCF1GHOiB6ExmyFc4Zzg"; //传入红包金额(单位分) // Random r = new Random(); // decimal hb = r.Next(100, 200); //string amount = hb.ToString(); //接叐收红包的用户 用户在wxappid下的openid model.re_openid = openId;//"oFIYdszuDXVqVCtwZ-yIcbIS262k"; //付款金额,单位分 model.total_amount = amount; //最小红包金额,单位分 model.min_value = amount; //最大红包金额,单位分 model.max_value = amount; //调用方法 string postData = PayHelp.DoDataForPayWeiXin(model); result = PayHelp.PayForWeiXin(postData); XmlDocument doc = new XmlDocument(); doc.LoadXml(result); string jsonResult = JsonConvert.SerializeXmlNode(doc); if (jsonResult.Contains("SUCCESS")==true) { TradeModel.WX_User md = new TradeModel.WX_User(); md.openId = openId; md.InDate = DateTime.Now; md.GetMoney = Convert.ToDecimal(amount); md.GetDate = DateTime.Now; TradeData.BaseService.SaveWXUser(md); Response.Write(""); } else { Response.Write(""); TradeData.BaseService.UseWeiXin(openId); ErrorFollow.TraceWrite("PostPage", "PostPage", jsonResult); } } catch (Exception ex) { ErrorFollow.TraceWrite("PostPage", "PostPage", ex.Message); //写日志 return; } } } public class weixin_token { public string access_token { get; set; } public Int32? expires_in { get; set; } public string refresh_token { get; set; } public string openid { get; set; } public string scope { get; set; } } public class PayForWeiXinHelp { /// /// 调用微信支付接口前处理数据,包括sign验证等 /// /// /// public string DoDataForPayWeiXin(PayWeiXin payForWeiXin) { #region 处理nonce_str随机字符串,不长于 32 位(本程序生成长度为16位的) string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; payForWeiXin.nonce_str = RandomStr(str, 16); #endregion #region 商户信息从config文件中读取 //商户支付密钥key string key = "0123456789ABCDefghijklmnopqrstuv"; //商户号 payForWeiXin.mch_id = "1245142102"; //商户 appid payForWeiXin.wxappid = "wx2f5849d8aa573da3"; //提供方名称 payForWeiXin.nick_name = "云界抑菌健康生活馆"; payForWeiXin.act_id = "act_id"; //红包収送者名称 payForWeiXin.send_name = "云界抑菌健康生活馆"; //红包収放总人数 payForWeiXin.total_num = 1; //红包祝福诧 payForWeiXin.wishing = "欢迎访问云界抑菌优享健康生活"; //活劢名称 payForWeiXin.act_name = "云界抑菌剂优享活动"; //备注信息 payForWeiXin.remark = "无"; //商户logo的url payForWeiXin.logo_imgurl = ""; //分享文案 payForWeiXin.share_content = ""; //分享链接 payForWeiXin.share_url = ""; //分享的图片url payForWeiXin.share_imgurl = ""; //调用接口的机器 Ip 地址 payForWeiXin.client_ip = "121.41.56.160"; #endregion #region 订单信息 //生成订单号组成: mch_id+yyyymmdd+10 位一天内不能重复的数字 //生成10位不重复的数字 string num = "0123456789"; string randomNum = RandomStr(num, 10); payForWeiXin.mch_billno = payForWeiXin.mch_billno + System.DateTime.Now.ToString("yyyyMMdd") + randomNum; #endregion string postData = @" {0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15}"; postData = string.Format(postData, payForWeiXin.mch_billno, payForWeiXin.mch_id, payForWeiXin.wxappid, payForWeiXin.nick_name, payForWeiXin.send_name, payForWeiXin.re_openid, payForWeiXin.total_amount, payForWeiXin.min_value, payForWeiXin.max_value, payForWeiXin.total_num, payForWeiXin.wishing, payForWeiXin.client_ip, payForWeiXin.act_name, payForWeiXin.act_id, payForWeiXin.remark, payForWeiXin.nonce_str ); //原始传入参数 string[] signTemp = { "mch_billno=" + payForWeiXin.mch_billno, "mch_id=" + payForWeiXin.mch_id, "wxappid=" + payForWeiXin.wxappid, "nick_name=" + payForWeiXin.nick_name, "send_name=" + payForWeiXin.send_name, "re_openid=" + payForWeiXin.re_openid, "total_amount=" + payForWeiXin.total_amount, "min_value=" + payForWeiXin.min_value, "max_value=" + payForWeiXin.max_value, "total_num=" + payForWeiXin.total_num, "wishing=" + payForWeiXin.wishing, "client_ip=" + payForWeiXin.client_ip, "act_name=" + payForWeiXin.act_name, "act_id=" + payForWeiXin.act_id, "remark=" + payForWeiXin.remark, "nonce_str=" + payForWeiXin.nonce_str }; List signList = signTemp.ToList(); //拼接原始字符串 if (!string.IsNullOrEmpty(payForWeiXin.logo_imgurl)) { postData += "{0} "; postData = string.Format(postData, payForWeiXin.logo_imgurl); signList.Add("logo_imgurl=" + payForWeiXin.logo_imgurl); } if (!string.IsNullOrEmpty(payForWeiXin.share_content)) { postData += "{0} "; postData = string.Format(postData, payForWeiXin.share_content); signList.Add("share_content=" + payForWeiXin.share_content); } if (!string.IsNullOrEmpty(payForWeiXin.share_url)) { postData += "{0} "; postData = string.Format(postData, payForWeiXin.share_url); signList.Add("share_url=" + payForWeiXin.share_url); } if (!string.IsNullOrEmpty(payForWeiXin.share_imgurl)) { postData += "{0} "; postData = string.Format(postData, payForWeiXin.share_imgurl); signList.Add("share_imgurl=" + payForWeiXin.share_imgurl); } #region 处理支付签名 //对signList按照ASCII码从小到大的顺序排序 signList.Sort(); string signOld = string.Empty; string payForWeiXinOld = string.Empty; int i = 0; foreach (string temp in signList) { signOld += temp + "&"; i++; } signOld = signOld.Substring(0, signOld.Length - 1); //拼接Key signOld += "&key=" + key; //处理支付签名 payForWeiXin.sign = Encrypt(signOld).ToUpper(); #endregion postData += "{0}"; postData = string.Format(postData, payForWeiXin.sign); return postData; } /// /// 调用微信支付接口 /// /// /// public string PayForWeiXin(string postData) { string result = string.Empty; try { result = PostPage("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack", postData); } catch (Exception ex) { } return result; } /// /// post微信请求 /// /// /// /// public string PostPage(string posturl, string postData) { Stream outstream = null; Stream instream = null; StreamReader sr = null; HttpWebResponse response = null; HttpWebRequest request = null; Encoding encoding = Encoding.UTF8; byte[] data = encoding.GetBytes(postData); // 准备请求... try { //CerPath证书路径 string certPath = "D:\\mtkjerp\\Scripts\\cert\\apiclient_cert.p12";//"E:\\tfstmsk\\erp\\TradeManage\\TradeManage\\Scripts\\cert\\apiclient_cert.p12"; //证书密码 string password = "1245142102"; X509Certificate2 cert = new System.Security.Cryptography.X509Certificates.X509Certificate2(certPath, password, X509KeyStorageFlags.MachineKeySet); // 设置参数 request = WebRequest.Create(posturl) as HttpWebRequest; CookieContainer cookieContainer = new CookieContainer(); request.CookieContainer = cookieContainer; request.AllowAutoRedirect = true; request.Method = "POST"; request.ContentType = "text/xml"; request.ContentLength = data.Length; request.ClientCertificates.Add(cert); outstream = request.GetRequestStream(); outstream.Write(data, 0, data.Length); outstream.Close(); //发送请求并获取相应回应数据 response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才开始向目标网页发送Post请求 instream = response.GetResponseStream(); sr = new StreamReader(instream, encoding); //返回结果网页(html)代码 string content = sr.ReadToEnd(); string err = string.Empty; return content; } catch (Exception ex) { string err = ex.Message; return string.Empty; } } public string RandomStr(string str, int Length) { string result = string.Empty; Random rd = new Random(); for (int i = 0; i < Length; i++) { result += str[rd.Next(str.Length)]; } return result; } /// /// Md5加密 /// /// /// public static String Encrypt(String s) { MD5 md5 = new MD5CryptoServiceProvider(); byte[] bytes = System.Text.Encoding.UTF8.GetBytes(s); bytes = md5.ComputeHash(bytes); md5.Clear(); string ret = ""; for (int i = 0; i < bytes.Length; i++) { ret += Convert.ToString(bytes[i], 16).PadLeft(2, '0'); } return ret.PadLeft(32, '0'); } } public class PayWeiXin { public string nonce_str { get; set; } public string sign { get; set; } public string mch_billno { get; set; } public string mch_id { get; set; } public string wxappid { get; set; } public string nick_name { get; set; } public string send_name { get; set; } public string re_openid { get; set; } public int total_amount { get; set; } public int min_value { get; set; } public int max_value { get; set; } public int total_num { get; set; } public string wishing { get; set; } public string client_ip { get; set; } public string act_id { get; set; } public string act_name { get; set; } public string remark { get; set; } public string logo_imgurl { get; set; } public string share_content { get; set; } public string share_url { get; set; } public string share_imgurl { get; set; } } }