微信开发实例:Jssdk调用
白羽 2018-06-06 来源 :网络 阅读 1076 评论 0

摘要:本文将带你了解微信开发实例Jssdk调用,希望本文对大家学微信有所帮助。


 

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.IO;using Newtonsoft.Json;using System.Net;using System.Runtime.Serialization.Formatters.Binary;using System.Text;using System.Security.Cryptography;
/// <summary>/// WXJSSDK 的摘要说明/// </summary>public class WXJSSDK
{
    private string appId;
    private string appSecret;
    private DataTable DT;
 
    public WXJSSDK(string appId, string appSecret)
    {
        this.appId = appId;
        this.appSecret = appSecret;
    }
 
    //得到数据包,返回使用页面  
    public System.Collections.Hashtable getSignPackage()
    {
        string jsapiTicket = getJsApiTicket();
        string url = HttpContext.Current.Request.Url.ToString();
        string timestamp = Convert.ToString(ConvertDateTimeInt(DateTime.Now));
        string nonceStr = createNonceStr();
 
 
        // 这里参数的顺序要按照 key 值 ASCII 码升序排序  
        string rawstring = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + nonceStr + "×tamp=" + timestamp + "&url=" + url + "";
 
 
        string signature = SHA1_Hash(rawstring);
 
 
        System.Collections.Hashtable signPackage = new System.Collections.Hashtable();
        signPackage.Add("appId", appId);
        signPackage.Add("nonceStr", nonceStr);
        signPackage.Add("timestamp", timestamp);
        signPackage.Add("url", url);
        signPackage.Add("signature", signature);
        signPackage.Add("rawString", rawstring);
 
 
        return signPackage;
    }
 
 
    //创建随机字符串  
    private string createNonceStr()
    {
        int length = 16;
        string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        string str = "";
        Random rad = new Random();
        for (int i = 0; i < length; i++)
        {
            str += chars.Substring(rad.Next(0, chars.Length - 1), 1);
        }
        return str;
    }
 
 
    //得到ticket 如果文件里时间 超时则重新获取    //注:jsapi_ticket使用规则(有过期时间)类似access_token, oauth的access_token与基础access_token不同
    private string getJsApiTicket()
    {
        //这里我从数据库读取
        DT = DbSession.Default.FromSql("select jsapi_ticket,ticket_expires from table where ID=1").ToDataTable();
        int expire_time = (int)DT.Rows[0]["ticket_expires"];
        string ticket = DT.Rows[0]["jsapi_ticket"].ToString();
        string accessToken =getAccessToken();//获取系统的全局token
        if (expire_time < ConvertDateTimeInt(DateTime.Now))
        {
            string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=" + accessToken + "";
            Jsapi api =JsonConvert.DeserializeObject<Jsapi>(httpGet(url));
            ticket = api.ticket;
            if (ticket != "")
            {
                expire_time = ConvertDateTimeInt(DateTime.Now) + 7000;
                //存入数据库操作            }
        }
        return ticket;
    }
 
 
    ////得到accesstoken 如果文件里时间 超时则重新获取  
    //private string getAccessToken()
    //{
    //    // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
    //    string access_token = "";
    //    string path = HttpContext.Current.Server.MapPath(@"/weixin/access_token.json");
    //    FileStream file = new FileStream(path, FileMode.Open);
    //    var serializer = new DataContractJsonSerializer(typeof(AccToken));
    //    AccToken readJSTicket = (AccToken)serializer.ReadObject(file);
    //    file.Close();
    //    if (readJSTicket.expires_in < ConvertDateTimeInt(DateTime.Now))
    //    {
    //        string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret + "";
 
    //        AccToken iden = Desrialize<AccToken>(new AccToken(), httpGet(url));
 
    //        access_token = iden.access_token;
    //        if (access_token != "")
    //        {
    //            iden.expires_in = ConvertDateTimeInt(DateTime.Now) + 7000;
    //            iden.access_token = access_token;
 
    //            string json = Serialize<AccToken>(iden);
    //            StreamWriterMetod(json, path);
    //        }
    //    }
    //    else
    //    {
    //        access_token = readJSTicket.access_token;
    //    }
    //    return access_token;
    //}
 
 
    //发起一个http请球,返回值  
    private string httpGet(string url)
    {
        try
        {
            WebClient MyWebClient = new WebClient();
            MyWebClient.Credentials = CredentialCache.DefaultCredentials;//获取或设置用于向Internet资源的请求进行身份验证的网络凭据  
            Byte[] pageData = MyWebClient.DownloadData(url); //从指定网站下载数据  
            string pageHtml = System.Text.Encoding.Default.GetString(pageData);  //如果获取网站页面采用的是GB2312,则使用这句              
 
            return pageHtml;
        }
 
 
        catch (WebException webEx)
        {
            Console.WriteLine(webEx.Message.ToString());
            return null;
        }
    }
 
 
    //SHA1哈希加密算法  
    public string SHA1_Hash(string str_sha1_in)
    {
        SHA1 sha1 = new SHA1CryptoServiceProvider();
        byte[] bytes_sha1_in = System.Text.UTF8Encoding.Default.GetBytes(str_sha1_in);
        byte[] bytes_sha1_out = sha1.ComputeHash(bytes_sha1_in);
        string str_sha1_out = BitConverter.ToString(bytes_sha1_out);
        str_sha1_out = str_sha1_out.Replace("-", "").ToLower();
        return str_sha1_out;
    }
 
 
    /// <summary>  
    /// StreamWriter写入文件方法  
    /// </summary>  
    private void StreamWriterMetod(string str, string patch)
    {
        try
        {
            FileStream fsFile = new FileStream(patch, FileMode.OpenOrCreate);
            StreamWriter swWriter = new StreamWriter(fsFile);
            swWriter.WriteLine(str);
            swWriter.Close();
        }
        catch (Exception e)
        {
            throw e;
        }
    }
 
    /// <summary>  
    /// 将c# DateTime时间格式转换为Unix时间戳格式  
    /// </summary>  
    /// <param name="time">时间</param>  
    /// <returns>double</returns>  
    public int ConvertDateTimeInt(System.DateTime time)
    {
        int intResult = 0;
        System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
        intResult = Convert.ToInt32((time - startTime).TotalSeconds);
        return intResult;
    }
}//创建Json序列化 及反序列化类目  #region//创建JSon类 保存文件 jsapi_ticket.json  public class JSTicket
{
 
    public string jsapi_ticket { get; set; }
 
    public double expire_time { get; set; }
}//创建 JSon类 保存文件 access_token.json  
public class AccToken
{
 
    public string access_token { get; set; }
 
    public double expires_in { get; set; }
}
 
//创建从微信返回结果的一个类 用于获取ticket  
public class Jsapi
{
 
    public int errcode { get; set; }
 
    public string errmsg { get; set; }
 
    public string ticket { get; set; }
 
    public string expires_in { get; set; }
}#endregion

 

上面是写好的类,接下来直接调用后对应输出给js

WXJSSDK jssdk = new WXJSSDK(AppId,AppSecret);

Hashtable hs = jssdk.getSignPackage();string signature = hs["signature"].ToString();string signature = hs["signature"].ToString();string timestamp = hs["timestamp"].ToString();string nonce = hs["nonceStr"].ToString();

 

接着js调用:

 

<script type="text/javascript">
            var dataForWeixin = {
                appId: "<%=appid%>",
                MsgImg: "<%=WeChatImg%>",
                TLImg: "<%=WeChatImg%>",
                url: "<%=url%>",
                title: "<%=Title%>",
                desc: "<%=desc%>",
                timestamp: '<%=timestamp%>',
                nonceStr: '<%=nonce%>',
                signature: '<%=signature%>',
                jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo'],
                fakeid: "",
                callback: function () { }
            };
            wx.config({
                debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
                appId: dataForWeixin.appId, // 必填,公众号的唯一标识
                timestamp: dataForWeixin.timestamp, // 必填,生成签名的时间戳
                nonceStr: dataForWeixin.nonceStr, // 必填,生成签名的随机串
                signature: dataForWeixin.signature,// 必填,签名,见附录1
                jsApiList: dataForWeixin.jsApiList  // 必填,需要使用的JS接口列表,所有JS接口列表见附录2            });
            wx.ready(function () {
                //在此输入各种API
                //分享到朋友圈                wx.onMenuShareTimeline({
                    title: dataForWeixin.title, // 分享标题
                    link: dataForWeixin.url, // 分享链接
                    imgUrl: dataForWeixin.MsgImg, // 分享图标
                    success: function () {
                        // 用户确认分享后执行的回调函数                    },
                    cancel: function () {
                        // 用户取消分享后执行的回调函数                    }
                });
                //分享给朋友                wx.onMenuShareAppMessage({
                    title: dataForWeixin.title, // 分享标题
                    desc: dataForWeixin.desc, // 分享描述
                    link: dataForWeixin.url, // 分享链接
                    imgUrl: dataForWeixin.TLImg, // 分享图标
                    type: '', // 分享类型,music、video或link,不填默认为link
                    dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
                    success: function () {
                        // 用户确认分享后执行的回调函数                    },
                    cancel: function () {
                        // 用户取消分享后执行的回调函数                    }
                });
                //QQ                wx.onMenuShareQQ({
                    title: dataForWeixin.title, // 分享标题
                    desc: dataForWeixin.desc, // 分享描述
                    link: dataForWeixin.url, // 分享链接
                    imgUrl: dataForWeixin.MsgImg,// 分享图标
                    success: function () {
                        // 用户确认分享后执行的回调函数                    },
                    cancel: function () {
                        // 用户取消分享后执行的回调函数                    }
                });
                //QQ微博                wx.onMenuShareWeibo({
                    title: dataForWeixin.title, // 分享标题
                    desc: dataForWeixin.desc, // 分享描述
                    link: dataForWeixin.url, // 分享链接
                    imgUrl: dataForWeixin.TLImg, // 分享图标
                    success: function () {
                        // 用户确认分享后执行的回调函数                    },
                    cancel: function () {
                        // 用户取消分享后执行的回调函数                    }
                });
                // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,
                //所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。            });
            wx.error(function (res) {
                //alert(res);
                // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。            });</script>

 

 


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之微信频道!

 


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程