- 小程序请求后端接口报403,postman能正常调用接口?
postman能下调用接口 [图片] 小程序报403 [图片]
2023-03-10 - wx.previewFile能调用,但无法显示预览文件?
我出现的问题是wx.previewFile能调用到,但文件预览没出来。环境是微信小程序开发工具企业微信模式(基础库有试过:2.12.13、2.10.1、2.8.3、2.4.0),安卓手机(华为mate10pro),企业微信版本是3.1.19。 web-view 代码如下: <view > <web-view src="{{requestUrl}}/lookDoc.html?{{webViewURLParam.fileURL}}&{{webViewURLParam.fileName}}&{{webViewURLParam.fileSize}}&{{corpId}}&{{enCodeReqURL}}&{{c_t}}&{{fromType}}"></web-view> </view> lookDoc.html如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>地球人</title> </head> <body> <div id="app"></div> <script src="//res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> <script> var fileURL; (function(){ var params = location.search.substring(1).split("&"); //alert("params:"+params); if(null==params||undefined==params||params.length<=0||null==params[0]||undefined==params[0]||""==params[0]||"undefined"==params[0]){ alert("获取不到文件地址。请返回重试!"); return; } //alert("wx.previewFile:"+wx.previewFile); var url=decodeURIComponent(params[0]),fileName=decodeURIComponent(params[1]),reqURL=decodeURIComponent(params[4]); fileURL=reqURL+"/067fd6610b564949af84eb418b4a6755.pptx"; var reqParams={"agentId":window.location.href}; var xhr = new XMLHttpRequest(); xhr.open("POST", reqURL+"/my/loadSingnature", true); xhr.setRequestHeader("Content-type", "application/json"); xhr.setRequestHeader("kbn-version", "5.3.0"); xhr.setRequestHeader("c_t", params[5]); xhr.setRequestHeader("fromType", params[6]); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if (xhr.status == 200) { var str=xhr.responseText,singnature=xhr.getResponseHeader("singnature"),longTime=Number(xhr.getResponseHeader("longTime")),randomStr=xhr.getResponseHeader("randomStr"); if(str.indexOf("Success")>-1){ //alert(singnature+"\n"+longTime+"\n"+randomStr+"\n"+window.location.href); window.wx.config({ beta: true,// 必须这么写,否则wx.invoke调用形式的jsapi会有问题 debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: params[3], // 必填,企业微信的corpID timestamp:longTime, // 必填,生成签名的时间戳 nonceStr: randomStr, // 必填,生成签名的随机串 signature: singnature,// 必填,签名,见 附录-JS-SDK使用权限签名算法 jsApiList: ["previewFile"] // 必填,需要使用的JS接口列表,凡是要调用的接口都需要传进来 }); wx.ready(function(rea){//alert("wx.ready:"+rea); // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口, //则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。 /*alert("wx.previewFile read:"+wx.previewFile); wx.checkJsApi({ jsApiList: ['previewFile'], // 需要检测的JS接口列表 success: function(res) { // 以键值对的形式返回,可用的api值true,不可用为false // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"} alert("checkJsApi_res:"+res); } });*/ //pdf 126552 c60f4567b4f749389f8b224ff926400f.pdf var pdfURL=reqURL+"/c60f4567b4f749389f8b224ff926400f.pdf"; window.wx.invoke("previewFile",{ url: pdfURL, // 需要预览文件的地址(必填,可以使用相对路径) //name: "c60f4567b4f749389f8b224ff926400f.pdf", // 需要预览文件的文件名,必须有带文件格式的后缀,例如.doc(不填的话取url的最后部分,最后部分是个包含格式后缀的文件名) size: 126552//params[2], // 需要预览文件的字节大小(必填,而且大小必须正确,否则会打开失败) }); /*//doc 31742 c522e139a67246bab028a0b7898d5d05.docx var docURL=reqURL+"/c522e139a67246bab028a0b7898d5d05.docx"; window.wx.invoke("previewFile",{ url: pdfURL, // 需要预览文件的地址(必填,可以使用相对路径) name: "c522e139a67246bab028a0b7898d5d05.docx", // 需要预览文件的文件名,必须有带文件格式的后缀,例如.doc(不填的话取url的最后部分,最后部分是个包含格式后缀的文件名) size: 31742//params[2], // 需要预览文件的字节大小(必填,而且大小必须正确,否则会打开失败) }); //excel 31685 b26c51b4808e443d9979c09d5e7b4c4b.xlsx var excelURL=reqURL+"/b26c51b4808e443d9979c09d5e7b4c4b.xlsx"; window.wx.invoke("previewFile",{ url: excelURL, // 需要预览文件的地址(必填,可以使用相对路径) name: "b26c51b4808e443d9979c09d5e7b4c4b.xlsx", // 需要预览文件的文件名,必须有带文件格式的后缀,例如.doc(不填的话取url的最后部分,最后部分是个包含格式后缀的文件名) size: 31685//params[2], // 需要预览文件的字节大小(必填,而且大小必须正确,否则会打开失败) }); window.wx.invoke("previewFile",{ url: fileURL, // 需要预览文件的地址(必填,可以使用相对路径) name: "067fd6610b564949af84eb418b4a6755.pptx", // 需要预览文件的文件名,必须有带文件格式的后缀,例如.doc(不填的话取url的最后部分,最后部分是个包含格式后缀的文件名) size: 1983995//params[2], // 需要预览文件的字节大小(必填,而且大小必须正确,否则会打开失败) });*/ }); wx.error(function(res){alert("wx.config error:"+res); // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 }); }else{ alert("获取企业微信JS SDK调用签名失败,无法预览!"); } } } }; xhr.send(stringify(reqParams)); })(); function stringify(jsonObj) { var result = '', curVal; if (jsonObj === null) { return String(jsonObj); } switch (typeof jsonObj) { case 'number': case 'boolean': return String(jsonObj); case 'string': return '"' + jsonObj + '"'; case 'undefined': case 'function': return undefined; } switch (Object.prototype.toString.call(jsonObj)) { case '[object Array]': result += '['; for (var i = 0, len = jsonObj.length; i < len; i++) { curVal = JSON.stringify(jsonObj[i]); result += (curVal === undefined ? null : curVal) + ","; } if (result !== '[') { result = result.slice(0, -1); } result += ']'; return result; case '[object Date]': return '"' + (jsonObj.toJSON ? jsonObj.toJSON() : jsonObj.toString()) + '"'; case '[object RegExp]': return "{}"; case '[object Object]': result += '{'; for (i in jsonObj) { if (jsonObj.hasOwnProperty(i)) { curVal = JSON.stringify(jsonObj[i]); if (curVal !== undefined) { result += '"' + i + '":' + curVal + ','; } } } if (result !== '{') { result = result.slice(0, -1); } result += '}'; return result; case '[object String]': return '"' + jsonObj.toString() + '"'; case '[object Number]': case '[object Boolean]': return jsonObj.toString(); } } //document.ready(function(){ //}); </script> <!--<div> <button onclick="myButton()" style="width:260px;height:80px;font-size:28px;">点击</button> </div>--> </body> </html> 开发工具: [图片] 手机端: [图片]
2021-11-05 - 小程序自带video组件无法播放录屏的mp4视频?
wxml: <view style=""> <video id="video" style="width: 100%;" src="{{fileURL}}" controls autoplay show-mute-btn="true" object-fit="fill" enable-auto-rotation="true" title="{{titleName}}"></video> </view> MP4视频文件信息(ffprobe): { "streams": [ { "index": 0, "codec_name": "aac", "codec_long_name": "AAC (Advanced Audio Coding)", "profile": "LC", "codec_type": "audio", "codec_time_base": "1/48000", "codec_tag_string": "mp4a", "codec_tag": "0x6134706d", "sample_fmt": "fltp", "sample_rate": "48000", "channels": 2, "channel_layout": "stereo", "bits_per_sample": 0, "r_frame_rate": "0/0", "avg_frame_rate": "0/0", "time_base": "1/48000", "start_pts": 0, "start_time": "0.000000", "duration_ts": 223232, "duration": "4.650667", "bit_rate": "3390", "max_bit_rate": "128000", "nb_frames": "218", "disposition": { "default": 1, "dub": 0, "original": 0, "comment": 0, "lyrics": 0, "karaoke": 0, "forced": 0, "hearing_impaired": 0, "visual_impaired": 0, "clean_effects": 0, "attached_pic": 0, "timed_thumbnails": 0 }, "tags": { "creation_time": "2021-03-04T08:39:01.000000Z", "language": "eng", "handler_name": "Sound Media Handler" } }, { "index": 1, "codec_name": "h264", "codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10", "profile": "High", "codec_type": "video", "codec_time_base": "1/80", "codec_tag_string": "avc1", "codec_tag": "0x31637661", "width": 1920, "height": 1080, "coded_width": 1920, "coded_height": 1088, "closed_captions": 0, "has_b_frames": 0, "sample_aspect_ratio": "1:1", "display_aspect_ratio": "16:9", "pix_fmt": "yuv420p", "level": 42, "color_range": "tv", "color_space": "smpte170m", "color_transfer": "bt470m", "color_primaries": "smpte170m", "chroma_location": "left", "refs": 1, "is_avc": "true", "nal_length_size": "4", "r_frame_rate": "40/1", "avg_frame_rate": "40/1", "time_base": "1/1000", "start_pts": 0, "start_time": "0.000000", "duration_ts": 5275, "duration": "5.275000", "bit_rate": "13588094", "bits_per_raw_sample": "8", "nb_frames": "211", "disposition": { "default": 1, "dub": 0, "original": 0, "comment": 0, "lyrics": 0, "karaoke": 0, "forced": 0, "hearing_impaired": 0, "visual_impaired": 0, "clean_effects": 0, "attached_pic": 0, "timed_thumbnails": 0 }, "tags": { "creation_time": "2021-03-04T08:39:01.000000Z", "language": "und", "handler_name": "Video Media Handler", "encoder": "AVC Coding" } } ], "format": { "filename": "069535620aa94361a75846db00826ee0.mp4", "nb_streams": 2, "nb_programs": 0, "format_name": "mov,mp4,m4a,3gp,3g2,mj2", "format_long_name": "QuickTime / MOV", "start_time": "0.000000", "duration": "5.300000", "size": "8967077", "bit_rate": "13535210", "probe_score": 100, "tags": { "major_brand": "isom", "minor_version": "512", "compatible_brands": "isomiso2avc1mp41", "creation_time": "2021-03-04T08:39:01.000000Z", "encoder": "Lenovo Game Recorder " } } }
2021-07-29