Maison  >  Questions et réponses  >  le corps du texte

nginx - WeChat JSSDK, une erreur est signalée lors de l'exécution de la configuration : signature invalide

1. La signature calculée est cohérente avec le bac à sable fourni par WeChat : http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign
2. J'ai essayé d'utiliser deux méthodes pour résoudre le problème, mais j'ai toujours la même erreur : 1), transmettre l'URL du local au serveur, obtenir les données json du serveur via ajax, puis remplir le contenu de wx .config; 2), récupérez-le depuis le serveur Lien vers cette visite
3. Utilisez nginx comme proxy de nom de domaine inverse, mais il a été traité en amont
Conclusion : on soupçonne que le JSSDK de WeChat présente un bug

给我你的怀抱给我你的怀抱2713 Il y a quelques jours1012

répondre à tous(8)je répondrai

  • ringa_lee

    ringa_lee2017-05-16 17:25:32

    Il faudra peut-être vérifier
    1) Mettez-vous en cache le jsticket de WeChat globalement sur le serveur ? Une fois un nouveau jsticket obtenu, le jsticket d'origine (y compris access_token) sera actualisé
    2) Si l'URL est cohérente, y compris la chaîne de requête, etc.
    3) Si nonceStr et timestamp sont cohérents avec la signature

    répondre
    0
  • PHP中文网

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

    Je soupçonne également qu'il y a un bug. La signature invalide n'est pas valide sous Android, mais elle est correcte sous iOS. Et il est transmis sur la page de débogage officielle. Je me demande si l'affiche originale l'a résolu maintenant ?

    répondre
    0
  • 过去多啦不再A梦

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

    Peut-être url传入的问题,建议wx.config est généré en arrière-plan puis écrit au premier plan.

    Comme le mien

    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()
    
    

    Alors

    @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>

    répondre
    0
  • 仅有的幸福

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

    Le problème de l'affiche a-t-il été résolu ? J'ai le même problème. Quoi qu'il en soit, j'ai également testé l'interface pour la comparer avec l'outil de test de WeChat, mais elle continue d'afficher une signature invalide

    .

    répondre
    0
  • 给我你的怀抱

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

    La signature est la même que la signature officielle et l'URL est également obtenue via location.href.split('#')[0]. . Il continue également à demander config:invalid signature. Le nom de domaine de sécurité de l'interface JS du compte officiel est également configuré correctement, mais ne fonctionne pas. . Demandez à Dieu de l'aide,
    Adresse de test : http://weixin.zhjckx.com/ApiWeiXin/JsSdk

    répondre
    0
  • 淡淡烟草味

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

    Découvrez ma réponse d'une autre personne :

    /q/1010000002502269/a-1020000002549180X2X

    répondre
    0
  • PHP中文网

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

    La situation que j'ai rencontrée était que lors de l'obtention de l'URL actuelle lors de la génération d'une signature, la méthode URL:full() du framework laravel était utilisée. En conséquence, cette méthode réorganisera l’ordre de la chaîne de requête dans l’URL. Par exemple, l'url lors de votre visite est

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

    , le résultat obtenu en utilisant URL:full() est

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

    Changé pour l'exemple officiel honnête et pratique de WeChat :

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

    C'est bon.

    répondre
    0
  • 阿神

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

    Je l'ai modifié moi-même et je l'ai testé ok. La raison est que la fonction officielle httpGet ne peut pas être utilisée.

    Dites-moi ces deux phrases dans 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);

    répondre
    0
  • Annulerrépondre