using System;
using System.Collections.Generic;
using System.Web;
using System.IO;
using System.Security.Cryptography; using System.Runtime.Serialization.Json;
using System.Runtime.Serialization;
using System.Net;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text; namespace WeixinJSSDJDemo
{
public class JSSDK
{
private string appId;
private string appSecret; public JSSDK(string appId, string appSecret)
{
this.appId = appId;
this.appSecret = appSecret;
} //创建Json序列化 及反序列化类目
#region
//创建JSon类 保存文件 jsapi_ticket.json
[DataContract(Namespace = "http://coderzh.cnblogs.com")]
class JSTicket
{
[DataMember(Order = 0)]
public string jsapi_ticket { get; set; }
[DataMember(Order = 1)]
public double expire_time { get; set; }
}
//创建 JSon类 保存文件 access_token.json
[DataContract(Namespace = "http://coderzh.cnblogs.com")]
class AccToken
{
[DataMember(Order = 0)]
public string access_token { get; set; }
[DataMember(Order = 1)]
public double expire_time { get; set; }
} //创建从微信返回结果的一个类 用于获取ticket
[DataContract(Namespace = "http://coderzh.cnblogs.com")]
class Jsapi
{
[DataMember(Order = 0)]
public int errcode { get; set; }
[DataMember(Order = 1)]
public string errmsg { get; set; }
[DataMember(Order = 2)]
public string ticket { get; set; }
[DataMember(Order = 3)]
public string expires_in { get; set; }
}
#endregion //得到数据包,返回使用页面
public System.Collections.Hashtable getSignPackage()
{ string jsapiTicket = getJsApiTicket();
string url = HttpContext.Current.Request.Url.ToString(); //"http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
string timestamp = Convert.ToString(ConvertDateTimeInt(DateTime.Now));
string nonceStr = createNonceStr(); // 这里参数的顺序要按照 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;
} //创建随机字符串
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 如果文件里时间 超时则重新获取
private string getJsApiTicket()
{
// jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
string path = HttpContext.Current.Server.MapPath(@"~/jssdk/jsapi_ticket.json");
JSTicket readJSTicket = null;
//读取文件
using (FileStream file = new FileStream(path, FileMode.Open))
{
var serializer = new DataContractJsonSerializer(typeof(JSTicket));
try
{
readJSTicket = (JSTicket)serializer.ReadObject(file);
}
catch
{
}
file.Close();
}
string ticket = "";
if (readJSTicket == null || readJSTicket.expire_time < ConvertDateTimeInt(DateTime.Now))
{
string accessToken = getAccessToken();
string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=" + accessToken + "";
Jsapi api = Desrialize<Jsapi>(new Jsapi(), httpGet(url)); ticket = api.ticket;
if (ticket != "")
{
if (readJSTicket == null)
{
readJSTicket = new JSTicket();
}
readJSTicket.expire_time = ConvertDateTimeInt(DateTime.Now) + 7000;
readJSTicket.jsapi_ticket = ticket; string json = Serialize<JSTicket>(readJSTicket);
StreamWriterMetod(json, path);
}
}
else
{
ticket = readJSTicket.jsapi_ticket;
} return ticket;
} //得到accesstoken 如果文件里时间 超时则重新获取
private string getAccessToken()
{
// access_token 应该全局存储与更新,以下代码以写入到文件中做示例 string access_token = "";
string path = HttpContext.Current.Server.MapPath(@"~/jssdk/access_token.json");
AccToken readJSTicket = null; using (FileStream file = new FileStream(path, FileMode.Open))
{
var serializer = new DataContractJsonSerializer(typeof(AccToken));
try
{
readJSTicket = (AccToken)serializer.ReadObject(file);
}
catch
{
}
file.Close();
}
if (readJSTicket == null || readJSTicket.expire_time < 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.expire_time = 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,则使用这句 //string pageHtml = Encoding.UTF8.GetString(pageData); //如果获取网站页面采用的是UTF-8,则使用这句 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>
/// 反序列化 字符串到对象
/// </summary>
/// <param name="obj">泛型对象</param>
/// <param name="str">要转换为对象的字符串</param>
/// <returns>反序列化出来的对象</returns>
public static T Desrialize<T>(T obj, string str)
{
try
{
var mStream = new MemoryStream(Encoding.Default.GetBytes(str));
var serializer = new DataContractJsonSerializer(typeof(T));
T readT = (T)serializer.ReadObject(mStream); return readT;
}
catch (Exception ex)
{
return default(T);
throw new Exception("反序列化失败,原因:" + ex.Message);
} } /// <summary>
/// 序列化 对象到字符串
/// </summary>
/// <param name="obj">泛型对象</param>
/// <returns>序列化后的字符串</returns>
public static string Serialize<T>(T obj)
{
try
{
var serializer = new DataContractJsonSerializer(typeof(T));
var stream = new MemoryStream();
serializer.WriteObject(stream, obj); byte[] dataBytes = new byte[stream.Length]; stream.Position = 0; stream.Read(dataBytes, 0, (int)stream.Length); string dataString = Encoding.UTF8.GetString(dataBytes);
return dataString;
}
catch (Exception ex)
{
return null;
throw new Exception("序列化失败,原因:" + ex.Message);
}
} /// <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;
}
}
}

  

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; namespace WeixinJSSDJDemo
{
public partial class Index : System.Web.UI.Page
{
protected static string AppId = "";
private JSSDK _helper = new JSSDK(AppId, "");
private Hashtable _result = null; protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
_result = _helper.getSignPackage();
}
} protected string Timestamp
{
get
{
//TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
//return Convert.ToInt64(ts.TotalSeconds);
return _result["timestamp"].ToString();
} } protected string NonceStr
{
get
{
//Random random = new Random();
//return GetMD5Hash(random.Next(1000).ToString());
return _result["nonceStr"].ToString();
}
} protected string Signature
{
get
{
//return GetMD5Hash(Timestamp.ToString()).ToUpper();
return _result["signature"].ToString();
}
} public static string GetMD5Hash(string value)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] hashByte = md5.ComputeHash(Encoding.Default.GetBytes(value));
StringBuilder sb = new StringBuilder();
foreach (byte b in hashByte)
{
sb.Append(b.ToString("x").PadLeft(, ''));
}
return sb.ToString();
} }
}
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="WeixinJSSDJDemo.Index" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script src="Scripts/jquery-1.8.2.min.js"></script>
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<style>
div {
margin-top: 50px;
}
</style>
</head>
<body>
<form id="form1" runat="server"> <div>
<a href="javascript:void(0)" onclick="ksly();">开始录音</a>
</div>
<div>
<a href="javascript:void(0)" onclick="tzly();">停止录音</a> </div>
<div>
<a href="javascript:void(0)" onclick="bfly();">播放录音</a>
</div>
<div>
<a href="javascript:void(0)" onclick="scly();">上传录音</a>
</div>
<div>
<a href="javascript:void(0)" onclick="pz();">拍照或从手机相册中选图接口</a>
</div>
<div>
<a href="javascript:void(0)" onclick="hqwlzt();">获取网络状态接口</a>
</div>
<div>
<select id="selZb">
<option value="wgs84">wgs84的gps坐标</option>
<option value="gcj02">火星坐标</option>
</select>
<a href="javascript:void(0)" onclick="hqdlwz();">获取地理位置接口</a>
</div>
<div>
<a href="javascript:void(0)" onclick="wxsys();">调起微信扫一扫接口</a>
</div>
<div>
<a href="javascript:void(0)" onclick="ycysjcd();">隐藏右上角菜单接口</a>
</div>
</form>
</body>
</html>
<script>
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '<%=AppId%>', // 必填,公众号的唯一标识
timestamp: '<%=Timestamp%>', // 必填,生成签名的时间戳
nonceStr: '<%=NonceStr%>', // 必填,生成签名的随机串
signature: '<%=Signature%>',// 必填,签名
jsApiList: [
"checkJsApi",
'onMenuShareTimeline',
'onMenuShareAppMessage',
'onMenuShareQQ',
'onMenuShareWeibo',
'hideMenuItems',
'showMenuItems',
'hideAllNonBaseMenuItem',
'showAllNonBaseMenuItem',
'translateVoice',
'startRecord',
'stopRecord',
'onRecordEnd',
'playVoice',
'pauseVoice',
'stopVoice',
'uploadVoice',
'downloadVoice',
'chooseImage',
'previewImage',
'uploadImage',
'downloadImage',
'getNetworkType',
'openLocation',
'getLocation',
'hideOptionMenu',
'showOptionMenu',
'closeWindow',
'scanQRCode',
'chooseWXPay',
'openProductSpecificView',
'addCard',
'chooseCard',
'openCard'
] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2。详见:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
}); wx.error(function (res) {
console.log(res);
alert('验证失败');
}); wx.ready(function () {
var url = 'http://szumxk.szum.gov.cn';
var link = url + '/<%=Request.Url.PathAndQuery%>';
var imgUrl = url + '/XZXK/img/upload.gif'; //转发到朋友圈
wx.onMenuShareTimeline({
title: 'JSSDK朋友圈转发测试',
link: link,
imgUrl: imgUrl,
success: function () {
alert('转发成功!');
},
cancel: function () {
alert('转发失败!');
}
}); //转发给朋友
wx.onMenuShareAppMessage({
title: 'JSSDK朋友圈转发测试',
desc: '转发给朋友',
link: link,
imgUrl: imgUrl,
type: 'link',
dataUrl: '',
success: function () {
alert('转发成功!');
},
cancel: function () {
alert('转发失败!');
}
});
}); function fxpyq() { }
var localId = "";
function ksly() {
wx.startRecord();
}
function tzly() {
wx.stopRecord({
success: function (res) {
localId = res.localId;
}
});
}
function bfly() {
if (localId != "") {
wx.playVoice({
localId: localId // 需要播放的音频的本地ID,由stopRecord接口获得
});
}
else {
alert("没有录音localId");
}
}
var localIds = "";
function pz() {
wx.chooseImage({
count:3, // 默认9
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: function (res) {
localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
alert(localIds);
}
});
} function hqwlzt() {
wx.getNetworkType({
success: function (res) {
var networkType = res.networkType; // 返回网络类型2g,3g,4g,wifi
alert(networkType);
}
});
} function hqdlwz() {
wx.getLocation({
type: $("#selZb").val(), // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
success: function (res) {
var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
var speed = res.speed; // 速度,以米/每秒计
var accuracy = res.accuracy; // 位置精度 wx.openLocation({
latitude: latitude, // 纬度,浮点数,范围为90 ~ -90
longitude: longitude, // 经度,浮点数,范围为180 ~ -180。
name: 'wilson 测试位置名', // 位置名
address: '当前办公地址', // 地址详情说明
scale: 28, // 地图缩放级别,整形值,范围从1~28。默认为最大
infoUrl: 'http://weiweictgu.cnblogs.com/' // 在查看位置界面底部显示的超链接,可点击跳转
});
}
});
} function wxsys() {
wx.scanQRCode({
needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是一维码,默认二者都有
success: function (res) {
var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
alert("扫描结果为:"+result);
}
});
}
function scly() {
if (localId != "") {
wx.uploadVoice({
localId: localId, // 需要上传的音频的本地ID,由stopRecord接口获得
isShowProgressTips: 1, // 默认为1,显示进度提示
success: function (res) {
var serverId = res.serverId; // 返回音频的服务器端ID
alert("上传成功,服务器id:" + serverId);
}
});
}
else {
alert("没有录音localId");
} } function ycysjcd() {
wx.hideOptionMenu();
}
</script>

微信JSSDK示例代码 笔记的更多相关文章

  1. 微信JS-SDK 示例

    微信JS-SDK 示例 1.html部分 <!DOCTYPE html> <!-- saved from url=(0028){sh:$selfUrl} --> <htm ...

  2. 微信JS-SDK坐标位置转换为百度地图坐标

    微信JS-SDK开发过程中,使用getLocation获取坐标位置,如何将微信获取的坐标直接应用到百度地图中,显示以下效果: 说明:红色图标是从微信转换过来的位置,蓝色图标是周边位置.首先从微信开发流 ...

  3. 微信JS-SDK说明文档及常见问题处理

    概述 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用微 ...

  4. 微信JS-SDK文档

    微信JS SDK 调用详解   微信JS SDK 调用详解... 1 概述... 2 使用说明... 2 接口调用说明... 4 基础接口... 4 判断当前客户端版本是否支持指定JS接口... 5 ...

  5. 企业号微信支付 公众号支付 H5调起支付API示例代码 JSSDK C# .NET

    先看效果 1.本文演示的是微信[企业号]的H5页面微信支付 2.本项目基于开源微信框架WeiXinMPSDK开发:https://github.com/JeffreySu/WeiXinMPSDK 感谢 ...

  6. 微信JS-SDK DEMO页面和示例代码

    <?php require_once "jssdk.php"; $jssdk = new JSSDK("yourAppID", "yourApp ...

  7. 微信微信JS-SDK 6.0.2 填坑笔记

    0.为什么以前不需要配置这么麻烦就可以修改分享description 等信息,但是现在不行了. 因为6.0.2版本之前没有做权限验证,所以config都是ok,但这并不意味着你config中的签名是O ...

  8. 微信JS-SDK分享接口示例中jsapi_ticket.php和access_token.php说明

    关于如何使用微信JS-SDK,可以查看官方介绍说明:查看链接 在使用分享接口的过程中,查看了示例代码,其中包含两个文件jsapi_ticket.php和access_token.php,记录一下这两个 ...

  9. 微信js-sdk开发获取签名和获取地理位置接口示例

    ###微信js-sdk开发获取签名和获取地理位置接口示例 前言:在做微信公众号开发时需要获取用户的地理位置信息,之前通过高德或者百度.腾讯等地图的api时发现经常获取不到,毕竟第三方的东西,后来改为采 ...

随机推荐

  1. spring mvc 利用匿名内部类构建返回json对象

    @RequestMapping(value = "/order/findOrderByIdVague/{noId}.json", method = {RequestMethod.G ...

  2. java中 == 与 equal区别 转

    java中的数据类型,可分为两类:1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==) ...

  3. C#颜色和名称样式对照表

    1   Color.AliceBlue 240,248,255 Color.LightSalmon 255,160,122 Color.AntiqueWhite 250,235,215 Color.L ...

  4. MySQL Binlog 【ROW】和【STATEMENT】选择(转)

    前言:       二进制日记录了数据库执行更改的操作,如Insert,Update,Delete等.不包括Select等不影响数据库记录的操作,因为没有对数据进行修改.二进制主要的功能有:复制(Re ...

  5. Redis 实现高效不遗漏的事件封装

    虽然Redis有订阅功能,但是订阅功能是实时的,过了这个点,就接收不到消息了. 同时,如果订阅的客户端因为某些特殊原因shutdown了,那也就找不回未处理完整的订阅事件了. 但好在,Redis还有一 ...

  6. 多线程编程之Linux环境下的多线程(三)

    前面两篇文章都讲述了Linux环境下的多线程编程基础知识,也附带了典型实例.本文主要比较一下Linux环境与Windows环境下的多线程编程区别. 看待技术问题要瞄准其本质,不管是WIN32.Linu ...

  7. [Hibernate] - mysql

    Hibernate使用mysql例子: 1) 新建一个bean: User.java package com.my.bean; import java.util.Date; public class ...

  8. 【shell】sort命令

    [root@andon ~]# sort 1 ##常用正序自动排序 101 paul 18 100 102 suan 11 99 103 peter 18 98 id name age score [ ...

  9. WPF性能提高--MSDN学习摘要

    关于性能 一.    关于硬件加速 1.对于大多数图形硬件而言,大型图面是指达到 2048x2048 或 4096x4096 像素大小的图面. 二.    合理的布局 1.简单地说,布局是一个递归系统 ...

  10. 剑指offer系列56---连续子数组的最大和

    [题目]输入一个整型数组,数组里有正数也有负数.数组中一个或连续多个整数组成一个子数组. * 求所有子数组和的最大值. * [思路]连续求和数组元素.一旦得到的和小于0,就抛弃前面的数组,从当前值重写 ...