场景:自行开发的企微应用例如扫码入库、二维码资产盘点等等
扫一扫接口说明:企业微信扫一扫 - 接口文档 - 企业微信开发者中心
使用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)
{
//AuthDataModel
WXJsapiticket 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);
}