nginx - WeChat JSSDK、構成の実行時にエラーが報告されます: 無効な署名
给我你的怀抱
给我你的怀抱 2017-05-16 17:23:32
0
8
917

1、計算された署名は WeChat が提供するサンドボックスと一致しています: http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign
2. 問題を解決するために 2 つの方法を使用しようとしましたが、同じエラーが発生しました。 1) URL をローカルからサーバーに渡し、ajax を通じてサーバーの json データを取得し、wx のコンテンツを入力します。 .config; 2)、サーバーから取得します この訪問へのリンク
3. nginx をリバース ドメイン名プロキシとして使用しますが、アップストリーム用に処理されています
結論: WeChat の JSSDK にはバグがある疑いがあります

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

全員に返信(8)
过去多啦不再A梦

也许是url传入的问题,建议wx.config是通过后台生成,然后写到前台的。

比如我的

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

然后

@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>
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!