简单的企业微信开发 前后端

涉及公司内容已删除

token等票据落地设置请自行百度

using DAL;

using System;

using System.Collections;

using System.Collections.Generic;

using System.Data;

using System.IO;

using System.Linq;

using System.Net;

using System.Security.Cryptography;

using System.Security.Policy;

using System.Text;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using Newtonsoft.Json;

using Newtonsoft.Json.Linq;

namespace custServiceMange

{

public partial class approval : System.Web.UI.Page

{

//AgentId 1000010

//Secret Et58dZVUEK3AJ7w-Tb3RRYzV8VKScOHkIW3mWO1ymAU

//agentConfig与config的签名算法完全一样,但是jsapi_ticket的获取方法不一样

//定义对象

private string timestamp;//签名的时间戳

private string noncestr;//签名的随机串

private string ent_signature;//企业签名

private string app_signature;//应用签名

private string ent_ticket;//企业的jsapi_ticket

private string app_ticket;//应用的jsapi_ticket

private string uri;//url

public string Timestamp

{

get

{

return timestamp;

}

set

{

timestamp = value;

}

}

public string Noncestr

{

get

{

return noncestr;

}

set

{

noncestr = value;

}

}

public string entSignature

{

get

{

return ent_signature;

}

set

{

ent_signature = value;

}

}

public string appSignature

{

get

{

return app_signature;

}

set

{

app_signature = value;

}

}

public string entTicket

{

get

{

return ent_ticket;

}

set

{

ent_ticket = value;

}

}

public string appTicket

{

get

{

return app_ticket;

}

set

{

ent_ticket = value;

}

}

public string Uri

{

get

{

return uri;

}

set

{

uri = value;

}

}

protected void Page_Load(object sender, EventArgs e)

{

//企业AccessTicket

string entAccessTicket = GetEntAccessToken();

ent_ticket = GetEntJsapi_Ticket(entAccessTicket);

//企业签名

ent_signature = GetSignature(ent_ticket, noncestr, timestamp, uri);

//应用AccessTicket

string appAccessTicket = GetAppAccessToken();

app_ticket = GetAppJsapi_Ticket(appAccessTicket);

//应用签名

app_signature = GetSignature(app_ticket, noncestr, timestamp, uri);

//签名的时间戳

timestamp = DateTime.Now.Ticks.ToString().Substring(0, 10);

//签名的随机串

noncestr = new Random().Next(10000).ToString();

//本地地址

uri = Request.Url.ToString().Replace("#", "");

this.DataBind();

}

/// <summary>

/// 获取企业的AccessToken

/// </summary>

/// <returns></returns>

public static string GetEntAccessToken()

{

//取数据库存储过程的AccessToken

DataTable dt1 = DAL.DbHelper.Query("EXEC [192.168.0.11].[DB_WCWorkAccount].dbo.sp_GetWCWAAAccessToken 1").Tables[0];

string s1_AccessToken = dt1.Rows[0]["AccessToken"].ToString().Trim();//企业的AccessToken

return s1_AccessToken;

}

/// <summary>

/// 获取应用的AccessToken

/// </summary>

/// <returns></returns>

public static string GetAppAccessToken()

{

//取数据库存储过程的AccessToken

DataTable dt2 = DAL.DbHelper.Query("EXEC [192.168.0.11].[DB_WCWorkAccount].dbo.sp_GetWCWAAAccessToken 2").Tables[0];

string s2_AccessToken = dt2.Rows[0]["AccessToken"].ToString().Trim();//应用的AccessToken

return s2_AccessToken;

}

/// <summary>

/// 获取企业Jsapi_Ticket

/// </summary>

/// <returns></returns>

public static string GetEntJsapi_Ticket(string entAccessToken)

{

string type = "jsapi";

string tokenUrl = string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type={1}", entAccessToken, type);

var wc = new WebClient();

var strReturn = wc.DownloadString(tokenUrl); //取得微信返回的json数据

JObject obj = JObject.Parse(strReturn);

string ticket = obj["strReturn"]["ticket"].ToString();

return ticket;

}

/// <summary>

/// 获取应用Jsapi_Ticket

/// </summary>

/// <returns></returns>

public static string GetAppJsapi_Ticket(string appAccessToken)

{

string type = "jsapi";

string tokenUrl = string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type={1}", appAccessToken, type);

var wc = new WebClient();

var strReturn = wc.DownloadString(tokenUrl); //取得微信返回的json数据

JObject obj = JObject.Parse(strReturn);

string ticket = obj["strReturn"]["ticket"].ToString();

return ticket;

}

/// <summary>

/// 获取JS-SDK权限验证的签名Signature

/// </summary>

/// <param name="ticket"></param>

/// <param name="noncestr"></param>

/// <param name="timestamp"></param>

/// <param name="url"></param>

/// <returns>CreateSha1(parameters)</returns>

public static string GetSignature(string ticket, string noncestr, string timestamp, string url)

{

var parameters = new Hashtable();

parameters.Add("jsapi_ticket", ticket);

parameters.Add("noncestr", noncestr);

parameters.Add("timestamp", timestamp);

parameters.Add("url", url);

return CreateSha1(parameters);

}

/// <summary>

/// sha1加密

/// </summary>

/// <returns>GetSha1(sb.ToString()).ToLower()</returns>

private static string CreateSha1(Hashtable parameters)

{

var sb = new StringBuilder();

var akeys = new ArrayList(parameters.Keys);

akeys.Sort();

foreach (var k in akeys)

{

if (parameters[k] != null)

{

var v = (string)parameters[k];

if (sb.Length == 0)

{

sb.Append(k + "=" + v);

}

else

{

sb.Append("&" + k + "=" + v);

}

}

}

return GetSha1(sb.ToString()).ToLower();

}

/// <summary>

/// 签名算法

/// </summary>

/// <param name="str"></param>

/// <returns>hash</returns>

public static string GetSha1(string str)

{

//建立SHA1对象

SHA1 sha = new SHA1CryptoServiceProvider();

//将mystr转换成byte[]

ASCIIEncoding enc = new ASCIIEncoding();

byte[] dataToHash = enc.GetBytes(str);

//Hash运算

byte[] dataHashed = sha.ComputeHash(dataToHash);

//将运算结果转换成string

string hash = BitConverter.ToString(dataHashed).Replace("-", "");

return hash;

}

}

}

Aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="approval.aspx.cs" Inherits="custServiceMange.approval" %>

<!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>

</head>

<body>

<table width="100%" align="center" border="0">

<tr>

<td>

申请类型:

<select neme="approveType">

<option value ="请假">请假</option>

<option value ="出差">出差</option>

<option value="加班">加班</option>

<option value="出席面试">出席面试</option>

</select>

</td>

</tr>

<tr>

<td>

工号:<input name="workNo" type="text" id="workId" tabindex="1" size="15" value=""/>

</td>

</tr>

<tr>

<td>

部门:

<select neme="department">

<option value ="开发部">开发部</option>

<option value ="执行部">执行部</option>

<option value="市场部">市场部</option>

<option value="测试部">测试部</option>

</select>

</td>

</tr>

<tr>

<td>姓名:<input name="name" type="text" id="name" tabindex="1" size="15" value=""/></td>

</tr>

<tr>

<td>

开始时间:<input id="startTime" type="date" value=""/>

</td>

</tr>

<tr>

<td>

结束时间:<input id="endTime" type="date" value=""/>

</td>

</tr>

<tr>

<td>

时长

<input id="lengthTime"  type="date" value=""/>

</td>

</tr>

<tr>

<td>

<textarea rows="20" cols="100">申请事由</textarea>

</td>

</tr>

<tr>

<td>

<textarea rows="20" cols="100" >附件链接</textarea>

</td>

</tr>

</table>

</body>

<%-- 步骤一:引入JS文件--%>

<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

<%--步骤二:通过config接口注入权限验证配置--%>

<script>

//config注入的是企业的身份与权限

wx.config({

debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。

appId: ‘wwd9d5b7cf59f1e871‘, // 必填,公众号的唯一标识

timestamp: <%# Eval("timestamp") %>, // 必填,生成签名的时间戳

nonceStr: ‘<%# Eval("nonceStr") %>‘, // 必填,生成签名的随机串

signature: ‘<%# Eval("ent_signature") %>‘,// 必填,签名,config所以为企业签名

jsApiList: [‘oaType‘,‘templateId‘,‘thirdNo‘,‘extData‘] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2

});

//oaType      操作类型,目前支持:10001-发起审批;10002-查看审批详情。

//templateId  发起审批的模板ID,在自建应用-审批接口中创建模板可获取。

//thirdNo     审批单号,由开发者自行定义,不可重复。

//extData     详情数据,Json格式,用于审批详情页信息展示。

////步骤三:通过ready接口处理成功验证

//wx.ready(function(){

//    // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。

//});

////步骤四:通过error接口处理失败验证

//wx.error(function(res){

//    // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。

//});

//agentConfig注入的是应用的身份与权限

wx.agentConfig({

corpid: ‘wwd9d5b7cf59f1e871‘, // 必填,企业微信的corpid,必须与当前登录的企业一致

agentid: ‘‘, // 必填,企业微信的应用id

timestamp:  <%# Eval("timestamp") %>, // 必填,生成签名的时间戳

nonceStr: ‘<%# Eval("nonceStr") %>‘, // 必填,生成签名的随机串

signature: ‘<%# Eval("app_signature") %>‘,// 必填,签名,agentConfig所以为应用签名

jsApiList: [‘oaType‘,‘templateId‘,‘thirdNo‘,‘extData‘], //必填

success: function(res) {

// 回调

//1、发起申请申请时后,审批状态发生变化时

//2、发起申请申请时后,在“审批中”状态,有任意审批人进行审批操作时

//oaType       操作类型,目前支持:10001-发起审批;10002-查看审批详情。

//templateId   发起审批的模板ID,在自建应用-审批接口中创建模板可获取。

//thirdNo      审批单号,由开发者自行定义,不可重复。

//extData      详情数据,Json格式,用于审批详情页信息展示。

wx.invoke(‘thirdPartyOpenPage‘, {

"oaType": "10001",// String

"templateId": "",// String 自建应用中 审批功测试 模板编号

"thirdNo": "",// String

"extData": {

‘fieldList‘: [{

‘title‘: ‘申请类型‘,

‘type‘: ‘text‘,

‘value‘: ‘‘,

},

{

‘title‘: ‘工号‘,

‘type‘: ‘text‘,

‘value‘: ‘‘,

},

{

‘title‘: ‘部门‘,

‘type‘: ‘text‘,

‘value‘: ‘‘,

},

{

‘title‘:‘姓名‘,

‘type‘:‘text‘,

‘value‘:‘‘,

},

{

‘title‘:‘开始时间‘,

‘type‘:‘text‘,

‘value‘:‘‘,

},

{

‘title‘: ‘结束时间‘,

‘type‘: ‘text‘,

‘value‘: ‘‘,

},

{

‘title‘: ‘时长‘,

‘type‘: ‘‘,

‘value‘: ‘‘,

},

{

‘title‘:‘申请事由‘,

‘type‘:‘text‘,

‘value‘:‘‘,

},

{

‘title‘:‘附件链接‘,

‘type‘:‘link‘,

‘value‘:‘‘,

}]

},// JSON

})

},

fail: function(res) {

if(res.errMsg.indexOf(‘function not exist‘) > -1){

alert(‘版本过低请升级‘)

}

}

});

</script>

</html>

原文地址:https://www.cnblogs.com/zhangsonglin/p/10436533.html

时间: 2024-08-30 16:21:38

简单的企业微信开发 前后端的相关文章

Java企业微信开发_03_通讯录同步

一.本节要点 1.获取通讯录密钥 获取方式: 登录企业微信—>管理工具—>通讯录同步助手—>开启“API接口同步”  ; 开启后,即可看到通讯录密钥,也可设置通讯录API的权限:读取或者编辑通讯录. 获取通讯录密钥的目的: 通过企业ID(CorpId)和 通讯录密钥可以获取通讯录相关接口的使用凭证(AccessToken).有了AccessToken,就可以使用通讯录相关接口了. 凭证的获取方式有两种(此处暂时存疑,以待勘误): 通讯录AccessToken:CorpId+通讯录密钥 其

Java企业微信开发_07_素材管理之上传本地临时素材文件

一.本节要点 1.临时素材有效期 media_id是可复用的,同一个media_id可用于消息的多次发送(3天内有效) 2.上传文件时的http请求里都有啥 具体原理可参看: 为什么上传文件的表单需要设置enctype="multipart/form-data" (http://blog.csdn.net/mazhibinit/article/details/49667511) 3.上传本地临时素材到微信服务器的流程 (1)建立与微信服务器的网络连接 (2)从连接中获取输出流(写入微信

如何用php开启企业微信开发的回调模式

猜想: 懵逼 实践: 微信公众号开发的手册中甚至给出了只需要修改几个参数就能使用的范例.企业微信开发中在一个很不显眼的地方放了一个sample. https://work.weixin.qq.com/api/doc#10128 看似很好理解(并不,背后封装了不算简单的加密方法) 获取参数->解密->输出解密后的参数 然而却因为一个函数引用传参知识点的缺失而困扰了许久 public function VerifyURL($sMsgSignature, $sTimeStamp, $sNonce,

企业微信开发基础配置

企业微信,这玩意和钉钉基本没区别,主打企业移动办公,弱化了社交,强化了企业服务 起步比钉钉晚,格局分布基本一样,自建应用和第三方应用 开发第三方应用就不说了,下面说说开发配置自建应用吧: 1.注册登录企业微信,创建公司(这里面会有个企业id需要记下来,这个id后面掉微信接口要用): 2.创建自建应用,填写相关信息,(名称,图标,可见用户群体)如下: 3.创建好应用进来以后,有两个参数(后面和微信接口对接要用的)和两个设置非常重要:  至此等到了三个id分别如下: CorpID(企业id)----

Java企业微信开发_09_身份验证之移动端网页授权(有完整项目源码)

注: 源码已上传github: https://github.com/shirayner/WeiXin_QiYe_Demo 一.本节要点 1.1 授权回调域(可信域名) 在开始使用网页授权之前,需要先设置一下授权回调域.这里瞬间想到之前做JSSDK的时候,也设置过一个域名.二者本质上都是设置可信域名. 当用户授权完毕之后,请求将重定向到此域名(或者子域名)下的执行者(jsp页面或者servlet等).如何设置授权回调域,请见第二节. 1.2 获取Code https://open.weixin.

Java企业微信开发_04_自定义菜单

一.本节要点 1.菜单相关实体类的封装 参考官方文档中的请求包的内容,对菜单相关实体类进行封装. 这里需要格外注意的是,企业微信中请求包的数据是Json字符串格式的,而不是xml格式.关于json序列化的问题请参考上一节   Java企业微信开发_03_通讯录同步 2.创建菜单的接口 public static String create_menu_url = "https://qyapi.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS

对开发-前后端的理解

<写在前面的话:请忽略> 很久没有写博客了,因为现在换了方向,总感觉突然写别的话题会很唐突.从一个在校学生转变为职场的程序媛,感觉变化还是很大的(指的是从事的方向):从前我只要关注研究的点就好,把道理理清楚,然后去学习其中的思想,比如(在这之前)我最后写的一个是SDN相关的,有一些文章是讲的以前做的项目相关,关系到linux内核DCB模块,应用程序和内核交互的netlink方式和虚拟化等.项目中重要的是怎么去用,而研究中是怎么去在前人的基础上创新,那么,现在到底是怎么一回事..我想就要从这个文

全程真实数据对接 带你从0开发前后端分离的企业级上线项目

<ignore_js_op> 第1章 课程介绍(2018配套教程:电商前端+电商后端+电商权限管理系统课程)本章中会先让大家了解课程整体情况,然后手把手带大家做一些开发前的准备工作.后台管理系统测试账号和密码(切勿修改,导致其他同学体验不了)        账号:admin 密码:admin (Java一期课程ID:96,Java二期进阶课程ID:162,权限系统课程:ID:149,http://coding.imooc.com/class/XXX.html ,访问时将前面网站中的XXX换成.

web开发-前后端分离原理

前言 前后端分离已成为互联网项目开发的业界标准使用方式,通过Nginx+Tomcat的方式(也可以中间加一个Node.js)有效的进行解耦,并且前后端分离会为以后的大型分布式架构.弹性计算架构.微服务架构.多端化服务(多种客户端,例如:浏览器,车载终端,安卓,IOS等等)打下坚实的基础.这个步骤是系统架构从猿进化成人的必经之路.核心思想是前端HTML页面通过Ajax调用后端的restuful api接口并使用json数据进行交互. 在互联网架构中,名词解释: Web服务器:一般指像Nginx,A