NutzCN Logo
问答 代码生成的signature 跟我用官方微信 JS 接口签名校验工具测出的不一样
发布于 10天前 作者 qq_6b145f79 74 次浏览 复制 上一个帖子 下一个帖子
标签: nutzwk

代码里用到签名的地方

WxApi2 wxApi2 = wxConfigService.getWxApi2(wxUser.getWxid());
        if (Lang.isEmpty(Globals.memoryJsapiTicketStore.get(wxUser.getWxid()))) {
            Globals.memoryJsapiTicketStore.put(wxUser.getWxid(), new MemoryJsapiTicketStore());
        }        
        MemoryJsapiTicketStore memoryJsapiTicketStore = Globals.memoryJsapiTicketStore.get(wxUser.getWxid());
        wxApi2.setJsapiTicketStore(memoryJsapiTicketStore);
        String url = "http://" + Globals.AppDomain + Globals.AppBase + "/public/wx/selfRecord/toUpload/" + UUID.randomUUID();
        NutMap jsConfig = wxApi2.genJsSDKConfig(url, "chooseImage", "previewImage", "uploadImage", "downloadImage");

初始化的时候,设置了accesstoken

public synchronized WxApi2 getWxApi2(String wxid) {
        WxApi2Impl wxApi2 = Globals.WxMap.get(wxid);
        if (wxApi2 == null) {
            Wx_config appInfo = this.fetch(Cnd.where("id", "=", wxid));
            wxApi2 = new WxApi2Impl();
            wxApi2.setAppid(appInfo.getAppid());
            wxApi2.setAppsecret(appInfo.getAppsecret());
            wxApi2.setEncodingAesKey(appInfo.getEncodingAESKey());
            wxApi2.setToken(appInfo.getToken());
            wxApi2.setAccessTokenStore(new MemoryAccessTokenStore());
            Globals.WxMap.put(wxid, wxApi2);
        }
        return wxApi2;
    }

用wxApi2里的 jsapi_ticket值 加上 jsConfig里的timestamp,noncestr,url 生成的signature不一致呢。

源码里 是不是有问题啊。 有个 %d 不是 %s吗
@Override
public NutMap genJsSDKConfig(String url, String... jsApiList) {
String jt = this.getJsapiTicket();
long timestamp = System.currentTimeMillis();
String nonceStr = R.UU64();

    String str = String.format("jsapi_ticket=%s&noncestr=%s&timestamp=%d&url=%s", jt, nonceStr, timestamp, url);
14 回复

代码生成的signature 跟官网测试生成的不一致

 UUID.randomUUID()

url是随机的,6666

不是要保证唯一吗

timestamp是long,用%d没毛病的

签名不一致有问题吗。我拿代码生成的结果里的参数去官网测试的
我的页面上 wx.config配置都没问题,但是点击上传图片后,怎么都没反应了。也不报错,wx.ready wx.error都不弹出

wx.config({
    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    appId: '${appId}', // 必填,公众号的唯一标识
    timestamp: ${timestamp}, // 必填,生成签名的时间戳
    nonceStr: '${nonceStr}', // 必填,生成签名的随机串
    signature: '${signature}',// 必填,签名,见附录1
    jsApiList: [${jsApiList}] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});

wx.ready(function(){
    // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
	weui.alert("sdfsdf");
});
wx.error(function(res){
	weui.alert(res);
	if(res.errMsg){
	   alert(res.errMsg);
	}
});
<div class="weui-cells weui-cells_form" id="uploader">
     <div class="weui-cell">
         <div class="weui-cell__bd">
             <div class="weui-uploader">
                 <div class="weui-uploader__hd">
                     <p class="weui-uploader__title">图片上传</p>
                     <div class="weui-uploader__info"><span id="uploadCount">0</span>/5</div>
                 </div>
                 <div class="weui-uploader__bd">
                     <ul class="weui-uploader__files" id="uploaderFiles"></ul>
                     <div class="weui-uploader__input-box">
                         <input id="uploaderInput" class="weui-uploader__input" type="file" accept="image/*" capture="camera" multiple="" />
                     </div>
                 </div>
             </div>
         </div>
     </div>
 </div>

引入了 jweixin-1.2.0.js等

<script type="text/javascript">
wx.config({
    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    appId: 'wx5a637d115be7e891', // 必填,公众号的唯一标识
    timestamp: 1512696107838, // 必填,生成签名的时间戳
    nonceStr: 'BP8xVkKNGsap6wpQn8Htz-', // 必填,生成签名的随机串
    signature: '742a9a499b3fa0a6736add5d4b02f0f54da38728',// 必填,签名,见附录1
    jsApiList: ['chooseImage','previewImage','uploadImage','downloadImage'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});

wx.ready(function(){
    // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
	weui.alert("sdfsdf");
});
wx.error(function(res){
	weui.alert(res);
	if(res.errMsg){
	   alert(res.errMsg);
	}
});
</script>

话说,timestamp在服务器端和客户端上是同一个值吗?

这是代码生成的。

{appId=wx5a637d115be7e891, timestamp=1512697203882, nonceStr=1_iTHY8ZFFaj4cLkhjzLT-, signature=b25ca825c704357c550452882d0cc5a23604b042, jsApiList=[Ljava.lang.String;@1b97b729}

jsapi_ticket:
kgt8ON7yVITDhtdwci0qefxgHH58g8viXo7o-NXyMPInrwCO0CidpTIDnpUIZxZJc6TMsK7I7t56KhfGA_aiaQ

这是网页生成的。

jsapi_ticket
kgt8ON7yVITDhtdwci0qefxgHH58g8viXo7o-NXyMPInrwCO0CidpTIDnpUIZxZJc6TMsK7I7t56KhfGA_aiaQ
noncestr
1_iTHY8ZFFaj4cLkhjzLT-
timestamp
1512697203
url
http://pandaz.mynatapp.cc/wkweb/public/wx/selfRecord/toUpload/d3a32809-7f14-4df8-a58f-8d8373f231db
生成签名
string1
jsapi_ticket=kgt8ON7yVITDhtdwci0qefxgHH58g8viXo7o-NXyMPInrwCO0CidpTIDnpUIZxZJc6TMsK7I7t56KhfGA_aiaQ&noncestr=1_iTHY8ZFFaj4cLkhjzLT-&timestamp=1512697203&url=http://pandaz.mynatapp.cc/wkweb/public/wx/selfRecord/toUpload/d3a32809-7f14-4df8-a58f-8d8373f231db

signature
416872fa6a44ce4dcdeb5b2f896a997439c35bcc

我去,页面上时间戳 怎么 只能输入10位

秒 跟毫秒。代码里是毫秒。页面是秒。但是用转换工具转出来的时间都是一样的

得用同一个值吧

嗯。我在代码里用 秒。生成的就一样了。。源码要改吗。

啥源码? 你自己代码的问题吧?

我看的nutzwx里 用的是秒啊。AbstractWxApi2.genJsSDKConfig 获取签名的方法。
我用的是wkweb

添加回复
请先登陆
回到顶部