2025-03-11 17:57:17 +08:00

230 lines
5.7 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// let Qrcode = require('@/pages/component/reqrcode.js')
import {qrcode} from './reqrcode.js'
export function toScanCode(options) {
let resultData = ''
// #ifdef APP-PLUS
let platform = uni.getSystemInfoSync().platform
if (platform == 'ios') {
resultData = scanCodeIos(options)
} else {
return new Promise((resolve, reject) => {
uni.scanCode({
onlyFromCamera: options.onlyFromCamera, // 只允许通过相机扫码
scanType: ['barCode','qrCode'], //扫码类型 barCode一维码 qrCode二维码
autoZoom:true,//是否启用自动放大,默认启用
success: function(res) {
resolve(res.result);
}
});
})
}
// #endif
// #ifdef H5
var ua = navigator.userAgent;
var isWeixin = !!/MicroMessenger/i.test(ua);
if (isWeixin) {
getJsApiConfig();
resultData = scanCodeWxH5(options)
} else {
resultData = scanCodeH5(options)
}
// #endif
return Promise.resolve(resultData);
}
//处理扫码内容
export function scanContent(result) {
var obj = null;
try {
obj = JSON.parse(result)
} catch (err) {
this.$tip.error("无法识别二维码");
return
}
return obj;
}
//微信扫码 参考地址https://mp.weixin.qq.com/s/ulq_cs-gGwkpmdt5zsU4aA
export function scanCodeWxH5(options) {
let fromCamera = options.onlyFromCamera
return new Promise((resolve, reject) => {
wx.scanQRCode({
needResult: 1, // 默认为0扫描结果由微信处理1则直接返回扫描结果
scanType: ['barCode','qrCode'], // 可以指定扫二维码还是一维码,默认二者都有 barCode一维码 qrCode二维码
success: function(res) {
resolve(res.resultStr)
}
});
})
}
//ios 扫码 uniapp nvue自带的Barcode
export function scanCodeIos(options) {
let fromCamera = options.onlyFromCamera
return new Promise((resolve, reject) => {
//开始扫码
toHsScanCode({
evalName: "hs-scancode", //扫码回调监听事件
msg: '扫码', //提示文本
fil: '0,1,2', //条码类型 0-qr二维码 1-EAN条形码标准版 2-EAN条形码简版
onlyFromCamera: fromCamera // 只允许通过相机扫码
}, res => {
//扫码成功后 这里自己判断,如果要自己处理结果就返回 true
resolve(res.result)
return true
})
})
}
//这里可以写成一个通用方法
export function toHsScanCode(options, results) {
const q = Object.entries(options).map(([key, value]) => `${key}=${value}`).join('&')
uni.$on(options.evalName || "hs-scancode", ([error, res]) => {
if (res) {
//扫码结果
uni.navigateBack({
delta: 1,
animationType: "fade-out", //用 fade-out 关闭页面,减少扫码成功后跳转页面的闪动
animationDuration: 300,
})
if (results && results(res) === true) return;
}
})
uni.navigateTo({
url: `/pages/component/hs-scancode?${q}`
})
}
// 调用接口获取config信息
export function getJsApiConfig() {
//获取到的url是当前页面的域名而不是完整url
const apiUrl = location.href.split('#')[0];
let param = {
url: apiUrl
}
this.$http.get('/sys/wx/getJsApiConfig', {
params: param
}).then(res => {
if (res.data.success) {
getConfig(res.data.result);
} else {
this.$tip.error(res.data.message);
}
}).catch((err) => {
console.log("请求返回err", err)
})
}
export function getConfig(res) {
// 配置config信息
wx.config({
debug: false,
appId: res.appId, // 必填,公众号的唯一标识
timestamp: res.timestamp, // 必填,生成签名的时间戳
nonceStr: res.nonceStr, // 必填,生成签名的随机串
signature: res.signature, // 必填,签名
jsApiList: ['scanQRCode'] // 必填需要使用的JS接口列表
});
// 通过ready接口处理成功验证
wx.ready(function() {
wx.checkJsApi({
jsApiList: ['scanQRCode'],
success: function(res) {
console.log('检验成功');
}
});
});
// 通过error接口处理失败验证
wx.error(function(res) {
console.log('校验失败');
});
}
// H5通过拉起相机拍照来识别二维码
export function scanCodeH5(options) {
let fromCamera = options.onlyFromCamera
let sourceType = ['camera','album']
if(fromCamera){
sourceType = ['camera']
}
return new Promise((resolve, reject) => {
uni.chooseImage({
count: 1,
sourceType: sourceType, //来源类型
success: imgRes => {
qrcode.decode(getObjectURL(imgRes.tempFiles[0]))
qrcode.callback = (codeRes) => {
if (codeRes.indexOf('error') >= 0) {
// 识别失败
reject("二维码识别失败");
} else {
// 识别成功
let content = decodeStr(codeRes)
let formatContent = scanContent(content)
resolve(formatContent);
}
}
}
})
})
}
// 获取文件地址函数
export function getObjectURL(file) {
var url = null
if (window.createObjectURL !== undefined) { // basic
url = window.createObjectURL(file)
} else if (window.URL !== undefined) { // mozilla(firefox)
url = window.URL.createObjectURL(file)
} else if (window.webkitURL !== undefined) { // webkit or chrome
url = window.webkitURL.createObjectURL(file)
}
return url
}
// 解码,输出:中文
export function decodeStr(str) {
var out, i, len, c;
var char2, char3;
out = "";
len = str.length;
i = 0;
while (i < len) {
c = str.charCodeAt(i++);
switch (c >> 4) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
// 0xxxxxxx
out += str.charAt(i - 1);
break;
case 12:
case 13:
// 110x xxxx 10xx xxxx
char2 = str.charCodeAt(i++);
out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
break;
case 14:
// 1110 xxxx 10xx xxxx 10xx xxxx
char2 = str.charCodeAt(i++);
char3 = str.charCodeAt(i++);
out += String.fromCharCode(((c & 0x0F) << 12) |
((char2 & 0x3F) << 6) |
((char3 & 0x3F) << 0));
break;
}
}
return out;
}