Maison > Questions et réponses > le corps du texte
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
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
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 ?
过去多啦不再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>
仅有的幸福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
.给我你的怀抱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
淡淡烟草味2017-05-16 17:25:32
Découvrez ma réponse d'une autre personne :
/q/1010000002502269/a-1020000002549180X2X
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.
阿神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);