直奔主题,写一个公众号。包含基本微信前端效果,常用的增删改查功能、支付回调功能、推送消息功能。
暂时想到这么多。
首先感谢官方提供的好东西(请忽略版本号(╯‵□′)╯︵┻━┻)
<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
有点用的签名算法
/// <summary> /// 签名算法 /// </summary> /// <param name="jsapi_ticket">jsapi_ticket</param> /// <param name="noncestr">随机字符串(必须与wx.config中的nonceStr相同)</param> /// <param name="timestamp">时间戳(必须与wx.config中的timestamp相同)</param> /// <param name="url">当前网页的URL,不包含#及其后面部分(必须是调用JS接口页面的完整URL)</param> /// <returns></returns> public static string GetSignature(string jsapi_ticket, string noncestr, long timestamp, string url, out string string1)// 生成微信接口的签名 { StringBuilder string1Builder = new StringBuilder(); string1Builder.Append("jsapi_ticket=").Append(jsapi_ticket).Append("&") .Append("noncestr=").Append(noncestr).Append("&") .Append("timestamp=").Append(timestamp).Append("&") .Append("url=").Append(url.IndexOf("#") >= 0 ? url.Substring(0, url.IndexOf("#")) : url); string1 = string1Builder.ToString(); return FormsAuthentication.HashPasswordForStoringInConfigFile(string1, "SHA1"); }
有点用的Token
/// <summary> /// 获取access_token /// </summary> /// <returns></returns> public static string GetAccessToken()// 获取access_token { string Appid = System.Configuration.ConfigurationManager.AppSettings["Appid"]; string appsecret = System.Configuration.ConfigurationManager.AppSettings["appsecret"]; ConnDB db = new ConnDB(); DataRow dr = db.ReturnDataTable("select token,time from balabulabula ").Rows[0]; string access_token = dr["token"].ToString(); string yxq = dr["time"].ToString(); if (yxq == "") yxq = "2016-01-01"; if (DateTime.Now >= DateTime.Parse(yxq)) { access_token = ParseFromJson<Access_Token>(GetPage("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + Appid + "&secret=" + appsecret, "")).access_token; db.EditDatabase("update bulabulabula set token='" + access_token + "',time=convert(varchar(20),dateadd(ss,6000,getdate()),120) where mc='access_token'"); } return access_token; }
有点用的微信js
/// <summary> /// 生成微信配置js /// </summary> /// <returns></returns> public static string WxConfig()// 生成微信配置js { ConnDB db = new ConnDB(); string url = HttpContext.Current.Request.Url.AbsoluteUri; if (url.IndexOf('#') > 0) url = url.Substring(0, url.IndexOf('#')); string Appid = System.Configuration.ConfigurationManager.AppSettings["Appid"]; DataRow dr = db.ReturnDataTable("select token,time from bulabulabula'").Rows[0]; string jsapi_ticket = dr["token"].ToString(); string yxq = dr["time"].ToString(); if (yxq == "") yxq = "2016-01-01"; if (DateTime.Now >= DateTime.Parse(yxq)) { string access_token = GetAccessToken(); jsapi_ticket = ParseFromJson<Jsapi_Ticket>(GetPage("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + access_token + "&type=jsapi", "")).ticket; db.EditDatabase("update bualbulabula set token='" + jsapi_ticket + "',time=convert(varchar(20),dateadd(ss,6000,getdate()),120) where mc='jsapi_ticket'"); } string noncestr = CreatenNonce_str(); long timestamp = CreatenTimestamp(); string str1; string signature = GetSignature(jsapi_ticket, noncestr, timestamp, url, out str1); return @" <script type='text/javascript'> wx.error(function (res) { alert(res.errMsg); }); wx.config({ debug: false, appId: '" + Appid + @"', timestamp: " + timestamp.ToString() + @", nonceStr: '" + noncestr + @"', signature: '" + signature + @"', jsApiList: ['scanQRCode', 'chooseImage', 'uploadImage', 'getLocation', 'openLocation'] }); function wxalert(txt) { $('#dlg_alert').show(); $('#wxdlg_alert_text').text(txt); } </script> <link href='css/weui.min.css' rel='stylesheet'/> <div class='weui_dialog_alert' id='dlg_alert' style='display: none;'> <div class='weui_mask'></div> <div class='weui_dialog'> <div class='weui_dialog_hd'><strong class='weui_dialog_title'>提示</strong></div> <div class='weui_dialog_bd' id='wxdlg_alert_text'>弹窗内容,告知当前页面信息等</div> <div class='weui_dialog_ft'> <a href=""javascript:$('#dlg_alert').hide();"" class='weui_btn_dialog primary'>确定</a> </div> </div> </div>"; }
生成微信Alert
/// <summary> /// 生成微信Alert /// </summary> /// <returns></returns> public static string WxAlert()// 生成微信Alert { return @" <script type='text/javascript'> function wxalert(txt) { $('#dlg_alert').show(); $('#wxdlg_alert_text').text(txt); } </script> <link href='css/weui.min.css' rel='stylesheet'/> <div class='weui_dialog_alert' id='dlg_alert' style='display: none;'> <div class='weui_mask'></div> <div class='weui_dialog'> <div class='weui_dialog_hd'><strong class='weui_dialog_title'>提示</strong></div> <div class='weui_dialog_bd' id='wxdlg_alert_text'>弹窗内容,告知当前页面信息等</div> <div class='weui_dialog_ft'> <a href=""javascript:$('#dlg_alert').hide();"" class='weui_btn_dialog primary'>确定</a> </div> </div> </div>"; }
生成微信支付的签名
/// <summary> /// 生成微信支付的签名 /// </summary> /// <param name="sParams"></param> /// <returns></returns> public static string MakeWxPaySign(SortedDictionary<string, string> sParams)// 生成微信支付的签名 { string key = System.Configuration.ConfigurationManager.AppSettings["WechatPayKey"]; StringBuilder sb = new StringBuilder(); foreach (KeyValuePair<string, string> temp in sParams) { if (temp.Value == "" || temp.Value == null || temp.Key.ToLower() == "sign") { continue; } sb.Append(temp.Key.Trim() + "=" + temp.Value.Trim() + "&"); } sb.Append("key=" + key.Trim() + ""); string signkey = sb.ToString(); System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create(); byte[] data = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(signkey)); sb = new StringBuilder(); for (int n = 0; n < data.Length; n++) { sb.Append(data[n].ToString("x2")); } return sb.ToString().ToUpper(); }
生成微信支付用的js
/// <summary> /// 生成微信支付用的JS /// </summary> /// <param name="openid">微信用户openid</param> /// <param name="ddbh">订单编号</param> /// <param name="je">订单总金额</param> /// <returns></returns> public static string MakeWxPayJs(string openid, string ddbh, string je)// 生成微信支付用的JS { string rv = ""; try { ConnDB db = new ConnDB(); //获取订单编号相关string Appid = System.Configuration.ConfigurationManager.AppSettings["Appid"]; string mch_id = System.Configuration.ConfigurationManager.AppSettings["WechatPayNum"]; string nonce_str = CreatenNonce_str(); string ip = "127.0.0.1"; //ddbh = "2018062500014"; SortedDictionary<string, string> sParams = new SortedDictionary<string, string>(); sParams.Add("appid", Appid); sParams.Add("body", ""); sParams.Add("device_info", "WEB"); sParams.Add("mch_id", mch_id);//微信商户号 sParams.Add("nonce_str", nonce_str); sParams.Add("notify_url", "http://" + System.Configuration.ConfigurationManager.AppSettings["ThisUrl"] + "/wechat/pay/dealnotify_wx.aspx");//接收回调通知的网址 sParams.Add("openid", openid);//微信用户openid sParams.Add("out_trade_no", ddbh);//订单号 sParams.Add("spbill_create_ip", ip);//发起者ip sParams.Add("total_fee", je);//总金额 sParams.Add("trade_type", "JSAPI"); sParams.Add("sign", MakeWxPaySign(sParams)); StringBuilder sb = new StringBuilder(); sb.Append("<xml>"); foreach (KeyValuePair<string, string> temp in sParams) { if (temp.Value == "" || temp.Value == null) continue; sb.Append("<" + temp.Key.Trim() + ">"); sb.Append(temp.Value.Trim()); sb.Append("</" + temp.Key.Trim() + ">"); } sb.Append("</xml>"); rv = GetPage("https://api.mch.weixin.qq.com/pay/unifiedorder", sb.ToString()); DataTable dt = DataXml.CXmlToDataSet(rv).Tables[0]; string prepay_id = dt.Rows[0]["prepay_id"].ToString(); string timeStamp = CreatenTimestamp().ToString(); sParams = new SortedDictionary<string, string>(); sParams.Add("appId", Appid); sParams.Add("timeStamp", timeStamp); sParams.Add("nonceStr", nonce_str); sParams.Add("package", "prepay_id=" + prepay_id); sParams.Add("signType", "MD5"); string getBrandWCPayRequest = "'appId' : '" + Appid + "','timeStamp': '" + timeStamp + "','nonceStr' : '" + nonce_str + "','package' : 'prepay_id=" + prepay_id + "','signType' : 'MD5','paySign' : '" + MakeWxPaySign(sParams) + "'"; //修改支付记录状态 return @" <script> function onBridgeReady(){ WeixinJSBridge.invoke( 'getBrandWCPayRequest', {" + getBrandWCPayRequest + @"}, function(res){ if(res.err_msg == 'get_brand_wcpay_request:ok' ) { location='/wechat/sc_fkcg.aspx'; } //alert('res.err_msg:'+res.err_msg+' err_code:'+res.err_code+' err_desc:'+res.err_desc); } ); } function callpay() { if (typeof WeixinJSBridge == 'undefined'){ if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', onBridgeReady); document.attachEvent('onWeixinJSBridgeReady', onBridgeReady); } }else{ onBridgeReady(); } } </script>"; } catch (Exception ex) { return "错误:" + ex.Message + " " + rv; } }