加了如图所示的js后,就可以正常签名了,iOS和安卓都可以,以后遇到这样的问题自己要记住。
其实也就是简单的在浏览器中实现一个打开pdf文件,并有类似预览功能的边框。其实在中国上经常见到类似的页面,在浏览器中打开pdf文档,可大部分都是由于版权的原因使用了一些很特殊的技术,自然很难模仿了。
即使有直接在浏览器打开的例子,也必须手动点击一下链接然后才能打开pdf文件。如何直接打开,而不用点击链接呢?
本以为自己对js很熟,也就使用js模拟点击,可就是不管用,没办法,只能在中国上继续寻找资料。最终想不到代码却很简单。
最主要的是使用到了一个jquery的插件jquery.media.js,使用这个插件就很容易实现了。
核心代码:
成因分析
使用jquery.media.js就可以直接把一个连接到pdf文件的链接打
确认签名算法正确,可用t=jsapisign页面工具进行校验。也就是你自己后台生成签名要和微信校验算法生成的签名一致才可以(可能大小写不同)。注意:签名生成规则如下:参与签名的字段包括有效的jsapi_ticket(获取方式详见微信JSSDK文档),noncestr(随机字符串,由开发者随机生成),timestamp(由开发者生成的当前时间戳),url(当前网页的URL,不包含#及其后面部分。注意:对于没有只有域名没有path的URL,浏览器会自动加上/作为path,如打开/)。特别注意:你在利用参数生成签名的时候,要对所有待签名参数按照字段名的ASCII码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。我的最开始的错误就是没有注意到生成签名的那几个参数要按照key=value的样式连接成一个字符串,然后在sha1加密生成。/****Java写的参数拼接算法***/String[]paramArr=newString[]{"jsapi_ticket="+jsapi_ticket,"timestamp="+timestamp,"noncestr="+nonce,"url="+jsurl}Arrays.sort(paramArr)//将排序后的结果拼接成一个字符串Stringcontent=paramArr[0].concat("&"+paramArr[1]).concat("&"+paramArr[2]).concat("&"+paramArr[3])System.out.println("拼接之后的content为:"+content)确认config中nonceStr(js中驼峰标准大写S),timestamp与用以签名中的对应noncestr,timestamp一致。确认url是页面完整的url(请在当前页面alert(location.href.split('#')[0])确认),包括'http(s)://'部分,以及'?'后面的GET参数部分,但不包括'#'hash后面的部分。确认config中的appid与用来获取jsapi_ticket的appid一致。确保一定缓存access_token和jsapi_ticket。确保你获取用来签名的url是动态生成的,动态页面可参见实例代码中php的实现方式。如果是html的静态页面在前端通过ajax将url传到后台签名,前端需要用js获取当前页面除去'#'hash部分的链接(可用location.href.split('#')[0]获取),因为页面一旦分享,微信客户端会在你的链接末尾加入其它参数,如果不是动态获取当前链接,将导致分享后的页面签名失败。