直奔主题,写一个公众号。包含基本微信前端效果,常用的增删改查功能、支付回调功能、推送消息功能。

暂时想到这么多。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

首先感谢官方提供的好东西(请忽略版本号(╯‵□′)╯︵┻━┻)

<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) ");
        }

        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; } }

 

微信支付回调页面

Stream s = Request.InputStream;
            int count = 0;
            byte[] buffer = new byte[1024];
            StringBuilder sb = new StringBuilder();
            while ((count = s.Read(buffer, 0, 1024)) > 0)
            {
                sb.Append(Encoding.UTF8.GetString(buffer, 0, count));
            }
            s.Flush();
            s.Close();
            s.Dispose();
            sxml = sb.ToString();

            DataTable dt = DataXml.CXmlToDataSet(sxml).Tables[0];
            DataRow dr = dt.Rows[0];
            if (dr["return_code"].ToString() != "SUCCESS") return;//return_code不正确

            SortedDictionary<string, string> sParams = new SortedDictionary<string, string>();
            foreach (DataColumn dc in dt.Columns)
            {
                sParams.Add(dc.ColumnName, dr[dc.ColumnName].ToString());
            }
            string sign = AssClass.MakeWxPaySign(sParams);
            if (sign != dr["sign"].ToString()) return;//签名验证失败,该数据可能并非来自微信官方

            string ddbh = dr["out_trade_no"].ToString();
            string tname, tid;

            if (dr["result_code"].ToString() == "SUCCESS")//支付成功
            {
            }
            else//支付失败
            {
               
            }
            db.EditDatabase(sql);
            Response.Write("<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>");//通知微信已成功接受到通知

 

补充一个公众号引导页面

    string Appid = System.Configuration.ConfigurationManager.AppSettings["Appid"];
    string appsecret = System.Configuration.ConfigurationManager.AppSettings["appsecret"];
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if (!string.IsNullOrEmpty(Request.QueryString["code"]))
            {
                if (ck.GetCookies("openid") == null || ck.GetCookies("openid") == "")
                {
                    string Code = Request.QueryString["code"].ToString();
                    OAuth_Token Model = Get_token(Code);//获得Token
                    OAuthUser OAuthUser_Model = Get_UserInfo(Model.access_token, Model.openid);
                    ck.SetCookies("openid", OAuthUser_Model.openid, 5);
                    ck.SetCookies("nickname", OAuthUser_Model.nickname, 5);
                    ck.SetCookies("headimgurl", OAuthUser_Model.headimgurl, 5);
                }
                string openid = ck.GetCookies("openid");
                string nickname = ck.GetCookies("nickname");
                string headimgurl = ck.GetCookies("headimgurl");

                DataTable dt = db.ReturnDataTable("select * from bulabulabula where openid='" + openid + "'");
                if (dt.Rows.Count == 0)//尚无该会员信息
                {
                    string newid = db.GetNewID("hy");
                    db.EditDatabase("insert into bulabulabula(*) values(" + newid + ",'" + openid + "','" + nickname + "','" + headimgurl + "',getdate())");
                    ck.SetCookies("userid", newid, 30);
                    ck.SetCookies("username", nickname, 30);
                }
                else//已有该用户
                {
                    ck.SetCookies("userid", dt.Rows[0]["id"].ToString(), 30);
                    ck.SetCookies("username", dt.Rows[0]["name"].ToString(), 30);
                }

                string url;
                if (Request.QueryString["pageid"] == null)
                {
                    Response.Write("<script>alert('无跳转参数'); WeixinJSBridge.call('closeWindow');</script>");
                    return;
                }
                string pageid = Request.QueryString["pageid"].ToString();
                switch (pageid)
                {
                    case "1"://用户信息
                        url = "/wechat/User.aspx";
                        break;
                    case "2"://其他内容
                        url = "/wechat/Something.aspx";
                        break;default:
                        
                     Response.Write("<script>alert('参数异常'); WeixinJSBridge.call('closeWindow');</script>");
                        return;
                       
                        break;
                }
                Response.Redirect(url);
            }
            else
            {
                if (Request.QueryString["pageid"] == null)
                {
                    Response.Write("<script>alert('无跳转参数'); WeixinJSBridge.call('closeWindow');</script>");
                    return;
                }

                string url = "Url";
                Response.Redirect(url);
            }
        }
    }

    //获得Token
    protected OAuth_Token Get_token(string Code)
    {
        string Str = AssClass.GetPage("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + Appid + "&secret=" + appsecret + "&code=" + Code + "&grant_type=authorization_code", "");
        OAuth_Token Oauth_Token_Model = AssClass.ParseFromJson<OAuth_Token>(Str);
        return Oauth_Token_Model;
    }
    //刷新Token
    protected OAuth_Token refresh_token(string REFRESH_TOKEN)
    {
        string Str = AssClass.GetPage("https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + Appid + "&grant_type=refresh_token&refresh_token=" + REFRESH_TOKEN, "");
        OAuth_Token Oauth_Token_Model = AssClass.ParseFromJson<OAuth_Token>(Str);
        return Oauth_Token_Model;
    }
    //获得用户信息
    protected OAuthUser Get_UserInfo(string REFRESH_TOKEN, string OPENID)
    {
        // Response.Write("获得用户信息REFRESH_TOKEN:" + REFRESH_TOKEN + "||OPENID:" + OPENID);
        string Str = AssClass.GetPage("https://api.weixin.qq.com/sns/userinfo?access_token=" + REFRESH_TOKEN + "&openid=" + OPENID, "");
        OAuthUser OAuthUser_Model = AssClass.ParseFromJson<OAuthUser>(Str);
        return OAuthUser_Model;
    }

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄