国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ WeChat アプレット WeChatの開発 WeChat 開発 - Jssdk 通話共有の例

WeChat 開発 - Jssdk 通話共有の例

Feb 13, 2017 am 11:36 AM

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

    //得到數(shù)據(jù)包,返回使用頁面  
    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();


        // 這里參數(shù)的順序要按照 key 值 ASCII 碼升序排序  
        string rawstring = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + nonceStr + "&timestamp=" + 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;
    }


    //創(chuàng)建隨機字符串  
    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使用規(guī)則(有過期時間)類似access_token, oauth的access_token與基礎(chǔ)access_token不同
    private string getJsApiTicket()
    {
        //這里我從數(shù)據(jù)庫讀取
        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();//獲取系統(tǒng)的全局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;
                //存入數(shù)據(jù)庫操作
            }
        }
        return ticket;
    }


    ////得到accesstoken 如果文件里時間 超時則重新獲取  
    //private string getAccessToken()
    //{
    //    // access_token 應(yīng)該全局存儲與更新,以下代碼以寫入到文件中做示例
    //    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;
    //}


    //發(fā)起一個http請球,返回值  
    private string httpGet(string url)
    {
        try
        {
            WebClient MyWebClient = new WebClient();
            MyWebClient.Credentials = CredentialCache.DefaultCredentials;//獲取或設(shè)置用于向Internet資源的請求進(jìn)行身份驗證的網(wǎng)絡(luò)憑據(jù)  
            Byte[] pageData = MyWebClient.DownloadData(url); //從指定網(wǎng)站下載數(shù)據(jù)  
            string pageHtml = System.Text.Encoding.Default.GetString(pageData);  //如果獲取網(wǎng)站頁面采用的是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時間格式轉(zhuǎn)換為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;
    }
}
//創(chuàng)建Json序列化 及反序列化類目  
#region
//創(chuàng)建JSon類 保存文件 jsapi_ticket.json  
public class JSTicket
{

    public string jsapi_ticket { get; set; }

    public double expire_time { get; set; }
}
//創(chuàng)建 JSon類 保存文件 access_token.json  

public class AccToken
{

    public string access_token { get; set; }

    public double expires_in { get; set; }
}


//創(chuàng)建從微信返回結(jié)果的一個類 用于獲取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();

Then js call:

<script type="text/javascript">
            var dataForWeixin = {
                appId: "<%=appid%>",
                MsgImg: "<%=WeChatImg%>",
                TLImg: "<%=WeChatImg%>",
                url: "<%=url%>",
                title: "<%=Title%>",
                desc: "<%=desc%>",
                timestamp: &#39;<%=timestamp%>&#39;,
                nonceStr: &#39;<%=nonce%>&#39;,
                signature: &#39;<%=signature%>&#39;,
                jsApiList: [&#39;onMenuShareTimeline&#39;, &#39;onMenuShareAppMessage&#39;, &#39;onMenuShareQQ&#39;, &#39;onMenuShareWeibo&#39;],
                fakeid: "",
                callback: function () { }
            };
            wx.config({
                debug: false, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會通過log打出,僅在pc端時才會打印。
                appId: dataForWeixin.appId, // 必填,公眾號的唯一標(biāo)識
                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, // 分享標(biāo)題
                    link: dataForWeixin.url, // 分享鏈接
                    imgUrl: dataForWeixin.MsgImg, // 分享圖標(biāo)
                    success: function () {
                        // 用戶確認(rèn)分享后執(zhí)行的回調(diào)函數(shù)
                    },
                    cancel: function () {
                        // 用戶取消分享后執(zhí)行的回調(diào)函數(shù)
                    }
                });
                //分享給朋友
                wx.onMenuShareAppMessage({
                    title: dataForWeixin.title, // 分享標(biāo)題
                    desc: dataForWeixin.desc, // 分享描述
                    link: dataForWeixin.url, // 分享鏈接
                    imgUrl: dataForWeixin.TLImg, // 分享圖標(biāo)
                    type: &#39;&#39;, // 分享類型,music、video或link,不填默認(rèn)為link
                    dataUrl: &#39;&#39;, // 如果type是music或video,則要提供數(shù)據(jù)鏈接,默認(rèn)為空
                    success: function () {
                        // 用戶確認(rèn)分享后執(zhí)行的回調(diào)函數(shù)
                    },
                    cancel: function () {
                        // 用戶取消分享后執(zhí)行的回調(diào)函數(shù)
                    }
                });
                //QQ
                wx.onMenuShareQQ({
                    title: dataForWeixin.title, // 分享標(biāo)題
                    desc: dataForWeixin.desc, // 分享描述
                    link: dataForWeixin.url, // 分享鏈接
                    imgUrl: dataForWeixin.MsgImg,// 分享圖標(biāo)
                    success: function () {
                        // 用戶確認(rèn)分享后執(zhí)行的回調(diào)函數(shù)
                    },
                    cancel: function () {
                        // 用戶取消分享后執(zhí)行的回調(diào)函數(shù)
                    }
                });
                //QQ微博
                wx.onMenuShareWeibo({
                    title: dataForWeixin.title, // 分享標(biāo)題
                    desc: dataForWeixin.desc, // 分享描述
                    link: dataForWeixin.url, // 分享鏈接
                    imgUrl: dataForWeixin.TLImg, // 分享圖標(biāo)
                    success: function () {
                        // 用戶確認(rèn)分享后執(zhí)行的回調(diào)函數(shù)
                    },
                    cancel: function () {
                        // 用戶取消分享后執(zhí)行的回調(diào)函數(shù)
                    }
                });
                // config信息驗證后會執(zhí)行ready方法,所有接口調(diào)用都必須在config接口獲得結(jié)果之后,config是一個客戶端的異步操作,
                //所以如果需要在頁面加載時就調(diào)用相關(guān)接口,則須把相關(guān)接口放在ready函數(shù)中調(diào)用來確保正確執(zhí)行。對于用戶觸發(fā)時才調(diào)用的接口,則可以直接調(diào)用,不需要放在ready函數(shù)中。
            });
            wx.error(function (res) {
                //alert(res);
                // config信息驗證失敗會執(zhí)行error函數(shù),如簽名過期導(dǎo)致驗證失敗,具體錯誤信息可以打開config的debug模式查看,也可以在返回的res參數(shù)中查看,對于SPA可以在這里更新簽名。
            });
</script>

微信開發(fā)-Jssdk調(diào)用分享實例

その他の WeChat 開発 - Jssdk 通話共有の例については、PHP 中國語 Web サイトに注意してください。関連記事!

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國語版

SublimeText3 中國語版

中國語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)