微信 JSSDK .NET版
/*因为官方 微信 JSSDK 只有PHP java版本的 我自己照着PHP的翻译过来的,可供参考。欢迎指正*/
[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
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 JSSDK.Models
{
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 + "×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 如果文件里时间 超时则重新获取
private string getJsApiTicket()
{
// jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
string path =HttpContext.Current.Server.MapPath(@"/jssdk/jsapi_ticket.json"); //读取文件
FileStream file = new FileStream(path, FileMode.Open);
var serializer = new DataContractJsonSerializer(typeof(JSTicket));
JSTicket readJSTicket = (JSTicket)serializer.ReadObject(file);
file.Close();
string ticket = "";
if (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 != "")
{
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");
FileStream file = new FileStream(path, FileMode.Open);
var serializer = new DataContractJsonSerializer(typeof(AccToken));
AccToken readJSTicket = (AccToken)serializer.ReadObject(file);
file.Close();
if (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;
}
}
}
微信 JSSDK .NET版的更多相关文章
- 【微信JSSDK】PHP版微信录音文件下载
微信的录音文件上传到微信服务器上,只能保存三天. 因此需要做一个转存到自己服务器,或者七牛云的操作. 转存到自己服务器 调用微信JSSDK API 录音, 录音结束,上传到微信服务器,获取录音文件的 ...
- 配置并学习微信JS-SDK(1)
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> 微信JS-SDK ...
- 微信jssdk已无力吐槽
微信强大的整合能力让企业公众号的开发迅速窜红.尤其是企业须要个性化定制的一些功能.公司在同一时候上线的app和触屏版的应用中,微信分享自然是不可或缺的重要一环. 纵观如今大多数的微信公众号.分享大都是 ...
- 微信js-sdk调用
之前在做微信的时候,在微信支付还有调起微信扫一扫的时候,用过js-sdk.最近,被几个做前端的同学问到了具体的流程,想想,还是写下来好点. 微信js-sdk,是微信提供给网页开发设计者使用的, ...
- Java微信公众平台开发(十一)--微信JSSDK中Config配置
JSSDK曾经引爆前端以及后端的工程师,其魔性的力量毋庸置疑,在我们的技术眼里它的实现原理和根本是不能够被改变的,这篇文章就不对其js的实现做任何评价和解说了(因为我也不是很懂,哈哈),这里要说的是它 ...
- 微信 jssdk 逻辑在 vue 中的运用
微信 jssdk 在 vue 中的简单使用 import wx from 'weixin-js-sdk'; wx.config({ debug: true, appId: '', timestamp: ...
- vue 单页面(SPA) history模式调用微信jssdk 跳转后偶尔 "invalid signature"错误解决方案
项目背景 vue-cli生成的单页面项目,router使用history模式.产品会在公众号内使用,需要添加微信JSSDK,做分享相关配置. 遇到的问题 相关配置与JS接口安全域名都已经ok,发布后, ...
- 微信JS-SDK分享功能的.Net实现代码
JS-SDK接口是什么? 为了方便开发者实现微信内的网页(基于微信浏览器访问的网页)功能,比如拍照.选图.语音.位置等手机系统的能力,并方便开发者直接使用微信分享.扫一扫等微信特有的能力,微信推出了J ...
- C#开发微信门户及应用(39)--使用微信JSSDK实现签到的功能
随着微信开逐步开放更多JSSDK的接口,我们可以利用自定义网页的方式来调用更多微信的接口,实现我们更加丰富的界面功能和效果,例如我们可以在页面中调用各种手机的硬件来获取信息,如摄像头拍照,GPS信息. ...
随机推荐
- Unity3D ShaderLab 漫反射卷积光照模型
Unity3D ShaderLab 漫反射卷积光照模型 漫反射卷积[Diffuse convolution]是一个模糊立方体的过程,它保留了立方图的整体光照强度,只模糊了细节. 这种效果在我们要活得一 ...
- magento -- 给后台分类管理页的分类商品加一栏商品类型
当使用特定分类来控制前台的商品显示时,后台分类管理页的分类商品只有编号.名称.SKU和价格这几栏,选择特定商品相当不便. 可以在这里多加一栏商品类型用来筛选商品,添加的方式很简单. 打开文件/app/ ...
- iOS-NSURLCache内存缓存
在IOS应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在IOS设备中加一个缓存的机制.使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行.有时候我们需 ...
- 第二个Sprint冲刺第九天
讨论地点:宿舍 讨论成员:邵家文.李新.朱浩龙.陈俊金 工作:接着昨天的任务
- Iptables 规则 一些简单实例和详细介绍
设定规则 iptables -p INPUT DROP iptables -p OUTPUT ACCEPT iptables -p FORWARD DROP 1.防止外网用内网IP欺骗 iptable ...
- 面向过程部分 Java 和 C++ 的区别
前言 Java 和 C++ 在面向过程部分区别并不大,但还是有的,本文罗列了这些区别. 在 Java 中: 1. 数据类型的范围和机器无关 2. 加上前缀 0b 可以表示二进制数,如 0b1001 就 ...
- 四 主要的几种 Web 服务器
一 Microsoft IIS 1. 仅支持 Windows 操作系统,用于 .Net 平台网站的部署和运行. 2. IIS 是一种 Web 服务组件,包括括 Web 服务器.FTP 服务器.NNTP ...
- hdu 4258 Covered Walkway
题目大意: 一个N个点的序列,要将他们全部覆盖,求总最少费用:费用计算: c+(x-y)2 分析: 斜率优化DP 我们假设k<j<i.如果在j的时候决策要比在k的时候决策好,那么也是就是d ...
- static讲解
static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被stati ...
- 一个textview实现文字在图片上面的效果
类似于这样的,其实很简单,可是以前用的是imageview+textview.布局实现多写了好多代码.又不能在图片加文字,显得没技术含量. xml代码如下: <TextView android: ...