nginx - WeChat JSSDK, une erreur est signalée lors de l'exécution de la configuration : signature invalide
给我你的怀抱
给我你的怀抱 2017-05-16 17:23:32
0
8
1053

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

给我你的怀抱
给我你的怀抱

répondre à tous(8)
左手右手慢动作

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

Ty80

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 ?

过去多啦不再A梦

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>
仅有的幸福

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

.
给我你的怀抱

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

淡淡烟草味

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

/q/1010000002502269/a-1020000002549180X2X

Ty80

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.

阿神

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);
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal