Rumah  >  Soal Jawab  >  teks badan

nginx - WeChat JSSDK, ralat dilaporkan apabila konfigurasi dilaksanakan: tandatangan tidak sah

1. Tandatangan yang dikira adalah konsisten dengan kotak pasir yang disediakan oleh WeChat: http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign
2. Mencuba dua kaedah untuk menyelesaikan masalah, tetapi masih mendapat ralat yang sama: 1) Lulus URL dari tempatan ke pelayan, dapatkan data json pelayan melalui ajax, dan kemudian isi kandungan wx.config; 2) Dapatkannya dari pelayan Pautan ke lawatan ini
3. Gunakan nginx sebagai proksi nama domain terbalik, tetapi ia telah diproses untuk huluan
Kesimpulan: Adalah disyaki bahawa JSSDK WeChat mempunyai pepijat

给我你的怀抱给我你的怀抱2713 hari yang lalu1013

membalas semua(8)saya akan balas

  • ringa_lee

    ringa_lee2017-05-16 17:25:32

    Mungkin perlu disemak
    1) Adakah anda menyimpan jsticket WeChat secara global pada pelayan Selepas jsticket baharu diperoleh, jsticket asal (termasuk access_token) akan dimuat semula
    2) Sama ada url itu konsisten, termasuk rentetan pertanyaan, dsb.
    3) Sama ada nonceStr dan cap waktu konsisten dengan tandatangan

    balas
    0
  • PHP中文网

    PHP中文网2017-05-16 17:25:32

    Saya juga mengesyaki terdapat pepijat. Tandatangan yang tidak sah adalah tidak sah di bawah android, tetapi ia betul di bawah ios. Dan ia diluluskan pada halaman penyahpepijatan rasmi Saya tertanya-tanya sama ada poster asal telah menyelesaikannya sekarang?

    balas
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-16 17:25:32

    Mungkin url传入的问题,建议wx.config dijana melalui latar belakang dan kemudian ditulis ke latar depan.

    Seperti saya

    import time
    import random
    import string
    import hashlib
    import urllib2
    import json
    
    from sae.kvdb import Client
    
    
    kvdb = Client()
    
    
    class WXSDK(object):
        httpHandler = urllib2.HTTPHandler()
        httpsHandler = urllib2.HTTPSHandler()
        opener = urllib2.build_opener(httpHandler, httpsHandler)
        urllib2.install_opener(opener)
    
        JSAPI_TICKET_URL = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi'
        ACCESS_TOKEN_URL = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}'
    
        def __init__(self, app_id, app_secret, url=None):
            self.app_id = app_id
            self.app_secret = app_secret
            self.url = url
    
    
        def __sendRequest(self, url):
            return json.loads(urllib2.urlopen(url).read())
    
        def __get_access_token(self):
            data = kvdb.get('access_token_key') or {'expire_time': 0}
            now = self.__get_time()
            if data['expire_time'] < now:
                data['expire_time'] = now + 7000
                res = self.__sendRequest(
                    self.ACCESS_TOKEN_URL.format(self.app_id, self.app_secret))
                data['access_token'] = res['access_token']
                kvdb.set('access_token_key', data)
                return res['access_token']
            else:
                return data['access_token']
    
        def __get_jsapi_ticket(self):
            data = kvdb.get('jsapi_token_key') or {'expire_time': 0}
            now = self.__get_time()
            if data['expire_time'] < now:
                data['expire_time'] = now + 7000
                access_token = self.__get_access_token()
                res = self.__sendRequest(
                    self.JSAPI_TICKET_URL.format(access_token))
                data['jsapi_ticket'] = res['ticket']
                kvdb.set('jsapi_token_key', data)
                return res['ticket']
            else:
                return data['jsapi_ticket']
    
        def __get_time(self):
            return int(time.time())
    
        def __create_nonce_str(self):
            return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(15))
    
        def get_sign_package(self):
            options = {
                'nonceStr': self.__create_nonce_str(),
                'jsapi_ticket': self.__get_jsapi_ticket(),
                'timestamp': self.__get_time(),
                'url': self.url
            }
            options['signature'] = Sign(options.copy()).sign()
            options['app_id'] = self.app_id
            return options
    
    
    class Sign(object):
        def __init__(self, options):
            self.ret = options
    
        def sign(self):
            signature = '&'.join(['%s=%s' % (key.lower(), self.ret[key])
                                  for key in sorted(self.ret)])
            return hashlib.sha1(signature).hexdigest()
    
    

    Kemudian

    @card.route("/")
    def index():
        url = request.base_url
        if len(request.args) > 0:
            url = url + "?" + urllib.urlencode(request.args)
        wx.url = url
        signature_data = wx.get_sign_package()
        return render_template("card/index.html", wx=signature_data)
    

    <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> <script> wx.config({ appId: '{{wx.app_id}}', timestamp: {{wx.timestamp}}, nonceStr: '{{wx.nonceStr}}', signature: '{{wx.signature}}', jsApiList: [ 'onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo' ] }); </script>

    balas
    0
  • 仅有的幸福

    仅有的幸福2017-05-16 17:25:32

    Adakah masalah poster telah diselesaikan? Bagaimanapun, saya juga telah menguji antara muka untuk perbandingan dengan alat ujian WeChat, tetapi ia terus menunjukkan tandatangan yang tidak sah.

    balas
    0
  • 给我你的怀抱

    给我你的怀抱2017-05-16 17:25:32

    Tandatangan adalah sama seperti yang rasmi, dan URL juga diperoleh melalui location.href.split('#')[0]. . Ia juga terus menggesa config:tandatangan tidak sah Nama domain keselamatan antara muka JS akaun rasmi juga dikonfigurasikan OK, tetapi tidak berfungsi. . Minta pertolongan kepada Allah,
    Alamat ujian: http://weixin.zhjckx.com/ApiWeiXin/JsSdk

    balas
    0
  • 淡淡烟草味

    淡淡烟草味2017-05-16 17:25:32

    Lihat balasan saya daripada orang lain:

    /q/1010000002502269/a-1020000002549180X2X

    balas
    0
  • PHP中文网

    PHP中文网2017-05-16 17:25:32

    Situasi yang saya hadapi ialah apabila mendapatkan URL semasa semasa menjana tandatangan, kaedah URL:full() rangka kerja laravel telah digunakan. Akibatnya, kaedah ini akan menyusun semula susunan rentetan pertanyaan dalam URL. Contohnya, url semasa anda melawat ialah

    http://test.com?x=1&a=2
    

    , hasil yang diperoleh dengan menggunakan URL:full() ialah

    http://test.com?a=2&x=1
    

    Ditukar kepada contoh rasmi WeChat yang jujur ​​dan praktikal:

    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
    $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
    

    Tidak mengapa.

    balas
    0
  • 阿神

    阿神2017-05-16 17:25:32

    Saya mengubah suainya sendiri dan mengujinya ok. Sebabnya adalah kerana fungsi httpGet rasmi tidak boleh digunakan.

    Beritahu saya dua ayat ini dalam jssdk.php

    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
    
    改为 
    
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);// 这里改为false, 可以请求https的网页
    //curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);

    balas
    0
  • Batalbalas