nginx - WeChat JSSDK, ralat dilaporkan apabila konfigurasi dilaksanakan: tandatangan tidak sah
给我你的怀抱
给我你的怀抱 2017-05-16 17:23:32
0
8
1051

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

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

membalas semua(8)
左手右手慢动作

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

Ty80

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?

过去多啦不再A梦

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

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.

给我你的怀抱

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

淡淡烟草味

Lihat balasan saya daripada orang lain:

/q/1010000002502269/a-1020000002549180X2X

Ty80

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.

阿神

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);
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan