企业微信自建应用开发
需求:公司项目这块主要是对接蓝牙,连接低功耗蓝牙设备方案:H5调用企业微信sdk问题总结:1.企业微信应用管理后台2.需要设置地方工作台应用主页网页授权及JS-SDK(1)应用OAuth2.0网页授权功能的回调域名(2)js-sdk 可信域名其他:本地开发时并且前后端分离,需要服务端一个地址,前端自己也需要地址,并且俩端都需要把下载文件放到根目录。前端这块因为我这个项目和本地vue项目端口冲突了,
·
需求:公司项目这块主要是对接蓝牙,连接低功耗蓝牙设备
方案:H5调用企业微信sdk
问题总结:
1.企业微信应用管理后台
2.需要设置地方
-
工作台应用主页
-
网页授权及JS-SDK
(1)应用OAuth2.0网页授权功能的回调域名
(2)js-sdk 可信域名
其他:本地开发时并且前后端分离,需要服务端一个地址,前端自己也需要地址,并且俩端都需要把下载文件放到根目录。前端这块因为我这个项目和本地vue项目端口冲突了,我自己下了个nginx 本地服务器搞了下端口,后台给配置的,完后需要公司外网IP 映射到一个测试域名,最后填到企业微信的是这个测试域名,看图
3.开发需要用到的参数(前后端都需要)
- 我的企业 -> 企业ID
- 应用管理 -> Secret 密钥
4.开发获取身份问题 (文档 服务端API 身份验证)
由可信域名支配,domain 就是可信域名地址,按钮(A页面)点击跳转后自动会在新页面(B页面)后面返回一个code,再进行一系列身份获取
B页面
var code = getParamer("code")
/*
* @fun getParamer 获取url参数
* @fun paramer 参数名
* */
function getParamer(paramer) {
if((window.location.href).indexOf("=") > 0) {
var url = window.location.href.split("?")[1];
if(url && url.indexOf("&") > 0) {
urlParamArry = url.split("&");
for(var i = 0; i < urlParamArry.length; i++) {
var paramerName = urlParamArry[i].split("=");
if(paramer == paramerName[0]) {
return paramerName[1];
}
}
} else {
var paramerValue = url.split("=")[1];
return paramerValue;
}
}
}
4.开发配置sdk问题
签名服务端生成 wx.config 会用到,只要页面需要调用sdk,每个页面都必须配置 wx.config,可以封装一个公共的方法通过传参方式配置对应的sdk
5.关于蓝牙
- iOS基本调用没问题,api 都好使
- Android 难啊,可能是因为我们的指令多,一个页面可能会发多条指令,总之 api 需要一一对应使用 打开蓝牙/关闭蓝牙 连接设备/断开设备 重复连接会发生api 回调成功了,设备蓝牙却没有断开的现象
- Android 写入数据后立马开启notify 会发生10008错误,系统错误,建议写入数据延迟1秒或者2秒,然后写入失败重新写入,上限10次,10次以后还是写入失败就重新操作,目前就是这样解决的,这样解决之后几乎没有出现写入失败了
6.关于蓝牙操作用到的一些方法
/*arrayBuffer转字符串*/
function arrayBuffer2Str(arrayBuffer) {
let unit8Arr = new Uint8Array(arrayBuffer);
let encodedString = String.fromCharCode.apply(null, unit8Arr),
decodedString = decodeURIComponent(escape((encodedString))); //没有这一步中文会乱码
return decodedString
}
/*字符串转字节序列*/
function stringToByte(str) {
var bytes = new Array();
var len, c;
len = str.length;
for(var i = 0; i < len; i++) {
c = str.charCodeAt(i);
if(c >= 0x010000 && c <= 0x10FFFF) {
bytes.push(((c >> 18) & 0x07) | 0xF0);
bytes.push(((c >> 12) & 0x3F) | 0x80);
bytes.push(((c >> 6) & 0x3F) | 0x80);
bytes.push((c & 0x3F) | 0x80);
} else if(c >= 0x000800 && c <= 0x00FFFF) {
bytes.push(((c >> 12) & 0x0F) | 0xE0);
bytes.push(((c >> 6) & 0x3F) | 0x80);
bytes.push((c & 0x3F) | 0x80);
} else if(c >= 0x000080 && c <= 0x0007FF) {
bytes.push(((c >> 6) & 0x1F) | 0xC0);
bytes.push((c & 0x3F) | 0x80);
} else {
bytes.push(c & 0xFF);
}
}
return bytes;
}
/*十六进制字符串 转 十进制整数 例如:11 ——17*/
function hex2int(hex) {
var len = hex.length,
a = new Array(len),
code;
for(var i = 0; i < len; i++) {
code = hex.charCodeAt(i);
if(48 <= code && code < 58) {
code -= 48;
} else {
code = (code & 0xdf) - 65 + 10;
}
a[i] = code;
}
return a.reduce(function(acc, c) {
acc = 16 * acc + c;
return acc;
}, 0);
}
/*hex 转字符串*/
function hexCharCodeToStr(hexCharCodeStr) {
var trimedStr = hexCharCodeStr.trim();
var rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr;
var len = rawStr.length;
if(len % 2 !== 0) {
console.log("Illegal Format ASCII Code!");
return "";
}
var curCharCode;
var resultStr = [];
for(var i = 0; i < len; i = i + 2) {
curCharCode = parseInt(rawStr.substr(i, 2), 16); // ASCII Code Value
resultStr.push(String.fromCharCode(curCharCode));
}
return resultStr.join("");
}
/*ArrayBuffer转16进制字符串示例*/
function ab2hex(buffer) {
var hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function(bit) {
return('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('');
}
/*浏览器判断机型*/
function getPhoneType() {
var phoneType = "";
var u = navigator.userAgent
var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1;
var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
if(isAndroid) {
phoneType = "Android"
}
if(isIOS) {
phoneType = "IOS"
}
return phoneType
}
更多推荐
已为社区贡献2条内容
所有评论(0)