场景:自行开发的企微应用例如扫码入库、二维码资产盘点等等
官网地址:使用说明 - 接口文档 - 企业微信开发者中心
扫一扫接口说明:企业微信扫一扫 - 接口文档 - 企业微信开发者中心
使用Js版本: http://res.wx.qq.com/open/js/jweixin-1.2.0.js
前端JS代码:
wx.config({beta: true,// 必须这么写,否则wx.invoke调用形式的jsapi会有问题debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。appId: '@Model.appId', // 必填,企业微信的corpID,必须是本企业的corpID,不允许跨企业使用timestamp: '@Model.timestamp', // 必填,生成签名的时间戳nonceStr: '@Model.nonceStr', // 必填,生成签名的随机串signature: '@Model.signature',// 必填,签名,见 附录-JS-SDK使用权限签名算法jsApiList: ['scanQRCode'] // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来});wx.ready(function () {// 下面是扫描后返回结果 结果在res里$('#scanQRCode1').click(function () {wx.scanQRCode({desc: 'scanQRCode desc',needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是条形码(一维码),默认二者都有success: function (res) {//IOS里面不加延时alert不执行不知道为嘛//setTimeout(() => {//$('#scrV').val(res.resultStr)//res.resultStr 二维码返回值//}, 500)$('#scrV').val(res.resultStr)},error: function (res) {if (res.errMsg.indexOf('function_not_exist') > 0) {alert('版本过低请升级')}}});});});
后端获取wx.config配置参数方法
定义返回类:
public class WxJsApiConfig{public string appId { get; set; }public string timestamp { get; set; }public string nonceStr { get; set; }public string signature { get; set; }}public class WXJsapiticket{public int errcode { get; set; }public string errmsg { get; set; } public string ticket { get; set; }public int expires_in { get; set; }}
配置参数获取方法:
private readonly string _JsApiTicket = "WeChatJsApiTicket";private readonly string _CorpID;public WXFunction(){_CorpID="自己的corpID"}internal string GetJsapiticketInfo()
{lock (this){return _cache.GetOrCreate(_JsApiTicket, token =>{string url = $@"https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token={AuthToken()}";//请求获取var client = new RestClient(url);client.Timeout = -1;var request = new RestRequest(Method.GET);IRestResponse response = client.Execute(request);if (response.IsSuccessful){//AuthDataModelWXJsapiticket jsapiticket = JsonConvert.DeserializeObject<WXJsapiticket>(response.Content);if (jsapiticket.errmsg == "ok"){//凭证有效期为7200秒//这里设置提前20分钟过期_cache.Set(_JsApiTicket, jsapiticket.ticket, DateTimeOffset.Now.AddSeconds(jsapiticket.expires_in - 600));return jsapiticket.ticket;}else{return @$"Ticket获取异常{response.Content}";}}else{return "Ticket请求失败";}});}
}public void ClearTicketCache()
{_cache.Remove(_JsApiTicket);
}internal string JsApiTicket()
{if (_cache.Get(_JsApiTicket) == null){ClearTicketCache();GetJsapiticketInfo();}return _cache.Get(_JsApiTicket)?.ToString();
}/// <summary>/// 获取JS-SDK配置信息/// </summary>/// <param name="url"></param>/// <returns></returns>public WxJsApiConfig GetJsApiInfo(string url){WxJsApiConfig jsinfo = new WxJsApiConfig();int timestamp = 1644481645;// 获取时间戳 这里网页转的当前时间 也可以直接用我的string noncestr = "Wx45f84q984as4fq89";//随机字符串 我是通过时间转的 自定义 可以直接用我的string string1 = "jsapi_ticket=" + JsApiTicket() + "&noncestr=" + noncestr + "×tamp=" + timestamp + "&url=" + url;//拼接连接字符串string signature = SHA1(string1, Encoding.UTF8);//SHA-1加密过程 可以使用动态库 没有的直接用我的 方法在后面signature = signature.ToLower(); // 生成后转换小写jsinfo.appId = _CorpID;jsinfo.timestamp= timestamp.ToString();jsinfo.nonceStr = noncestr;jsinfo.signature = signature;return jsinfo;}/// <summary>/// sha-1加密算法/// </summary>/// <param name="content"></param>/// <param name="encode"></param>/// <returns></returns>public string SHA1(string content, Encoding encode){try{SHA1 sha1 = new SHA1CryptoServiceProvider();byte[] bytes_in = encode.GetBytes(content);byte[] bytes_out = sha1.ComputeHash(bytes_in);sha1.Dispose();string result = BitConverter.ToString(bytes_out);result = result.Replace("-", "");return result;}catch (Exception ex){throw new Exception("SHA1加密出错:" + ex.Message);}}
控制器:
public IActionResult SCRCode(){string url = "http://你的域名:5441/Home/SCRCode";WxJsApiConfig js = _wxf.GetJsApiInfo(url);return View(js);}