WeChat jssdk署名エラーinvalid signature


ほぼすべてのマイクロクレジットのためのページを開発したエンジニアは、WeChat jssdk報の様々なエラーに遭遇しました.
普通彼らはあなたにpermission deniedオプションを開くように勧めます.
    wechat.config({
      debug: true,
      appId: appId,
      timestamp: timestamp,
      nonceStr: nonceStr,
      signature: signature,
      jsApiList: ['scanQRCode'],
    });
結果はまたdebugに出会いました.このように:
サインが違います.これはどういう意味ですか?しかし、このサインは後端から来たものです.どうしてそれが間違っているのか分かりますか?バックエンドは標準的なアルゴリズムを使っています.間違いはあり得ません.
ネット上の各種の教程を調べて、あるいはWeChat公式サイト、彼らはいつも面倒を嫌がらずにあなたに教えて、あなたに署名の計算方法を検査させて、しかしまったく役に立ちません!invalid signatureのこの場合、署名を計算するための90%のアドレスが間違っています.アルゴリズムとは関係がありません.時間を無駄にして署名アルゴリズムを見る必要はありません.
また新しい状況に遭遇しましたので、WeChat公式アカウント管理の楽屋に入る必要があります.以下の順序で検査します.
まず、インタフェースの設定ページで、あなたのサーバーのドメイン名を信頼ドメイン名に加入しましたか?第二に、基本設定ページであなたのサーバーのIPアドレスをホワイトリストに追加しましたか?
WeChat要求:もし私たちがページでWeChatを呼び出すための何らかの方法が必要であれば、このページのURLアドレスで署名を取得しなければならない.よく分かりますが、実際にはURLの住所に含まれている部分が多く、疑問符があります.URL号があります.あなたがするのは#の前の部分を取り出すことです.例えば、あなたの#アドレスはこうです.URLであれば、署名を計算するためのhttps://www.abc.com/abc.html?abc=def#xyzアドレスはURLであってもよくないし、https://www.abc.com/abc.htmlでもないし、https://www.abc.com/abc.html?abc=def#xyzでなければなりません.
現在のページのhttps://www.abc.com/abc.html?abc=defアドレスはどうやって取得しますか?これは簡単です
let wechaturl = window.location.href.split('#')[0];
しかし、仕事はこのまま終わったと思いますか?無邪気すぎる.あなたのページはまだWeChat関数を正常に使えません.
なぜなら、ウィーチャット内蔵ブラウザはURLとAndroidでの表現が違っています.
Androidでは、上の方法で呼び出すことができます.しかし、iOSの下で、署名は依然として失敗しています.iOSでは、WeChatは、現在のページのiOSではなく、入り口URLを伝達する必要があるからです.
例えば、WeChat公衆番号のメニューリンクでURLページにアクセスし、AページのリンクからAページにジャンプし、Bページで署名を取得し、Androidの下であればBページのBアドレスで取得するべきですが、URL下で署名を取得します.またiOSページのAアドレスで取得しなければなりません.そうでなければ署名に失敗します.
原因が分かったら、いろいろな解決方法があります.
まず、私達は入り口のURLページにこのような判断を追加することができます.
if (navigator.userAgent.indexOf('iPhone') !== -1) {
    window.wechaturl = window.location + '';
}
その後、Aページで署名を呼び出す必要があるところに、このような判断を追加する.
let wechaturl = window.location.href.split('#')[0];
if (window.wechaturl !== undefined) {
  wechaturl = window.wechaturl;
}
こうして私たちは有効地域にBとAndroidを分けました.しかし、問題はiOSの下で、もし私のもう一つのメニューの入り口がiOSページだったら、BページからBページにジャンプします.この時、私のエントランスリンクはAページに強制的に変更されました.依然として署名失敗のエラーが発生します.
したがって、私たちはまた、WeChat公衆番号の各入り口メニューにリガの特別なパラメータをリンクする必要があります.例えば、A、このようになります.
そしてもう一つの判断を追加します.
if (navigator.userAgent.indexOf('iPhone') !== -1) {
  if (this.$route.query.wechat !== undefined && this.$route.query.wechat === '1') {
    window.wechaturl = window.location + '';
  }
}
ここではwechat=1という書き方をしましたが、原理は同じです.このパラメータを検出したのはhttps://www.abc.com/abc.html?abc=def&wechat=1だけです.現在のページは入り口ページだと思っています.検出されていないなら、あえて入り口ページに設定する必要はありません.
これでWeChat署名の失敗が解決されたようです.
しかし、私たちはまた別の状況に遭遇しました.WeChatウィジェットにvueの埋め込まれたウェブページを使って、Androidの下でwechatweb-viewのエラーを報告しました.でも、上記の経験があります.エラーの元はまだpermission denied入口の住所です.案の定、Androidの下で入り口の住所で署名を取得しましたが、現在の住所で署名を取得できませんでした.そのため、入り口のページでもう一つの判断を加えました.
if (navigator.userAgent.indexOf('miniProgram') !== -1) {
  window.wechaturl = window.location + '';
}
これで、各種の署名ミスの問題は全部解決されます.