C# 关于调用微信接口的代码
调用微信接口前需要准备的内容。
1.微信公众平台的appid
2.微信公众平台的secret
3..获取tokenid
4.获取ticket
5.生成签名的随机串
6.生成签名的时间戳
7.生成签名
==============================================
1.微信公众平台的appid
2.微信公众平台的secret
这两者需要登录到申请的微信公众平台中去获取,建议写在配置文件中
==============================================
3.获取tokenid
public static string GetWxTokenId()
{
string token = "";
string url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appid, secret);
//向上面的地址发起httpget请求
//这里是封装的一个http请求的类
string content = HttpHelper.HttpGet(url);
if (!string.IsNullOrEmpty(content))
{
var obj = JsonConvert.DeserializeObject<TokenResult>(content);
if (!obj.errcode.HasValue)
{
token = obj.access_token;
}
}
return token;
}
这里是获取微信tokenid的返回对象
private class TokenResult
{
public string access_token { get; set; }
public string expires_in { get; set; }
public int? errcode { get; set; }
public string errmsg { get; set; }
}
注意:在每个微信公众号中获取tokenid的次数是有限的,所以应该将获取到的tokenid储存起来,以便后续使用。我使用的方法是将tokenid存储在数据库中,所以在每次使用之前都要做判断处理
/*tokenid保存方式说明:
*可在数据库中创建表:SysConfig(用户存储项目中的配置数据)
* 字段:
* ConfigKey:用于查询该条数据的key,做为主键
* ConfigValue:存储数据的值
* TypeName:该条配置数据的名称
* Description:说明
* CreateTime:创建时间
* LastModifyTime:上次修改的时间
* AllowEdit:是否可编辑
* LastValue:上一次的值
* tokenid的有效时间是两个小时=7200秒,每重新获取一次就更新一次LastModifyTime的值,将LastModifyTime和当前时间进行比对,如果小于7200秒则可以不用再次获取,反之则需要再次从微信获取。
*/
===========================================
4.获取ticket。需要上一步中获取到的tokenid。
/// <summary>
/// 获取ticket
/// </summary>
/// <param name="token">获取到的tokenid</param>
/// <returns>strticket</returns>
public static string GetTicket(string token)
{
string getticketurl = string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi", token);
string content = HttpHelper.HttpGet(getticketurl);
JsApiTicket obj = JsonConvert.DeserializeObject<JsApiTicket>(content);
return obj.ticket;
}
=========================================
5.生成签名的随机串
string noncestr = Guid.NewGuid().ToString().Replace("-", "");
========================================
6.生成签名的时间戳
TimeSpan ts = DateTime.UtcNow - new DateTime(, , , , , , );
string timestamp = Convert.ToInt64(ts.TotalSeconds).ToString();
========================================
7.生成签名
string signature = MakeSha1Sign(string.Format("jsapi_ticket={0}&noncestr={1}×tamp={2}&url={3}", jsapi_ticket, noncestr, timestamp, url));
/// <summary>
/// SDK生成签名
/// 注意:需要引用System.Security.dll
/// </summary>
/// <param name="str"></param>
/// <returns>str签名</returns>
public static string MakeSha1Sign(string str)
{
byte[] StrRes = Encoding.Default.GetBytes(str);
HashAlgorithm iSHA = new SHA1CryptoServiceProvider();
StrRes = iSHA.ComputeHash(StrRes);
StringBuilder EnText = new StringBuilder();
foreach (byte iByte in StrRes)
{
EnText.AppendFormat("{0:x2}", iByte);
}
return EnText.ToString();
}
======================================
最后可以将这些步骤封装在一个方法中
/// <summary>
/// 获取调用微信接口用的SDKConfig
/// </summary>
/// <param name="url"></param>
/// <returns>SDKConfig整个对象</returns>
public static JsApiConfig GetJsSdkConfig(string url)
{
//获取tokenid
string access_token = GetWxTokenId();
//获取ticket
string jsapi_ticket = GetTicket(access_token);
//生成签名的随机串
string noncestr = Guid.NewGuid().ToString().Replace("-", "");
//生成签名的时间戳
TimeSpan ts = DateTime.UtcNow - new DateTime(, , , , , , );
string timestamp = Convert.ToInt64(ts.TotalSeconds).ToString();
//签名
string signature = MakeSha1Sign(string.Format("jsapi_ticket={0}&noncestr={1}×tamp={2}&url={3}", jsapi_ticket, noncestr, timestamp, url)); JsApiConfig config = new JsApiConfig()
{
appId = appid,
debug = false,
nonceStr = noncestr,
timestamp = timestamp,
signature = signature,
ticket = jsapi_ticket,
//需要使用的JS接口列表
jsApiList = new string[] { "chooseImage", "previewImage", "uploadImage", "downloadImage" } };
return config;
}
=======================================
页面上面调用我们上面配置好的内容
$.post('/WapCardInfo/GetSDKConfig', { url: location.href.split('#')[] }, function (data) {
var configObj = data;
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: configObj.appId, // 必填,公众号的唯一标识
timestamp: configObj.timestamp, // 必填,生成签名的时间戳
nonceStr: configObj.nonceStr, // 必填,生成签名的随机串
signature: configObj.signature, // 必填,签名,见附录1
jsApiList: [
'checkJsApi',
'onMenuShareTimeline',
'onMenuShareAppMessage',
'onMenuShareQQ',
'onMenuShareWeibo',
'onMenuShareQZone'
] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
});
复制代码
=======================================
请求的后台代码
[HttpPost]
public JsonResult GetSDKConfig(string url)
{
try
{
//这里就是调用上面封装的方法
JsSdkApi.jsapiConfig model = JsSdkApi.GetJsSdkConfig(url);
return Json(model);
}
catch (Exception ex)
{
LogHelper.Error("获取wxconfig出现异常:" + ex.Message.Replace("'", "\""));
return Json(new JsSdkApi.jsapiConfig());
}
}
至于需要的接口就去微信公众平台开发者文档中去查看啦。
C# 关于调用微信接口的代码的更多相关文章
- C# 调用微信接口的代码
调用微信接口前需要准备的内容. 1.微信公众平台的appid 2.微信公众平台的secret 3..获取tokenid 4.获取ticket 5.生成签名的随机串 6.生成签名的时间戳 7.生成签名 ...
- C# 调用微信接口上传素材和发送图文消息
using Common;using Newtonsoft.Json.Linq;using System;using System.IO;using System.Net;using System.T ...
- 调用微信接口token的问题
前言 微信的影响力众所周知,越来越多的人也都离不开它,工作,生活,社交的好帮手.相信大家对微信公众号,小程序也都不陌生,那么在开发公众号,小程序的时候需要调用到微信的接口,固然就会遇到token的问题 ...
- JAVA调用微信接口实现页面分享功能(分享到朋友圈显示图片,分享给朋友)
钉钉提供的内网穿透之HTTP穿透:https://www.cnblogs.com/pxblog/p/13862376.html 网页分享到微信中如何显示标题图,如果自定义标题图,描述,显示效果如下 官 ...
- vue项目中分享到朋友圈,调用微信接口
虽然微信提供了jssdk,不代表可以点击按钮进行分享到朋友圈,是需要微信自带的浏览器右上角进行分享.手机浏览器需要浏览器支持分享到朋友圈的分享机制. 微信jssdk地址: https://mp.wei ...
- HTML5 页面调用微信接口
参考微信微信官方文档JS_SDK:https://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#JSSDK.E4.BD.B ...
- [实例]JAVA调用微信接口发送图文消息,不用跳到详情页
package com.test; import java.io.IOException; import java.io.InputStream; import java.io.OutputStrea ...
- 前台调用微信接口成功还报Network Error
前台 vue+springboot项目 this.api({ url:"https://.....",//微信路径 method:"post", param ...
- 调用 微信接口报错 {"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
如下截图,仅为备份,本文转载地址: http://www.cnblogs.com/liaolongjun/p/6080240.html 以下正文↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ...
随机推荐
- 【Linux】- mv命令
Linux mv命令用来为文件或目录改名.或将文件或目录移入其它位置. 语法 mv [options] source dest mv [options] source... directory 参数说 ...
- 【Docker 命令】- rm命令
docker rm :删除一个或多少容器 语法 docker rm [OPTIONS] CONTAINER [CONTAINER...] OPTIONS说明: -f :通过SIGKILL信号强制删除一 ...
- C#中的unsafe
为了保持类型安全性,默认情况下,C# 不支持指针算法. 但是,通过使用 unsafe 关键字,可以定义可在其中使用指针的不安全上下文. 有关指针的详细信息,请参阅主题指针类型. 备注 在公共语言运行时 ...
- tcp中的发送窗口是啥意思?
初始的三次握手: 02:52:36.585412 IP 127.0.0.1.59764 > 127.0.0.1.8000: Flags [S], seq 3800457532, win 4369 ...
- perf打印调用栈的过程
perf_prepare_sample-->perf_callchain-->get_perf_callchain 上面的调用栈会使用 perf_event_output--> 0x ...
- lucene 学习之基础篇
一.什么是全文索引 全文检索首先将要查询的目标文档中的词提取出来,组册索引(类似书的目录),通过查询索引达到搜索目标文档的目的,这种先建立索引,再对索引进行搜索的过程就叫全文索引. 从图可以看出做全文 ...
- Winform程序部署方式总结二——Windows Installer发布
针对Winform程序,介绍两种常用打包方式:ClickOnce和Windows Installer 应用程序如下: 二.Windows Installer发布 1.新建项目 创建后视图 第一步: 应 ...
- 【转载】用C#编写一个简单的记事本
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- Python 文件对象和方法
Python文件对象和方法 1.打开和关闭文件 Python提供了必要的函数和方法进行默认情况下的文件基本操作,我们可以用file对象做大部分文件操作. open()方法 我们必须先用Python内置 ...
- 2017 ICPC beijing E - Cats and Fish
#1631 : Cats and Fish 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 There are many homeless cats in PKU camp ...