序文最近、小さなプログラムを開発しているときに、このような問題に遭遇しました。ユーザーが認証をクリックして携帯電話番号を復号化しようとすると、1 回目は失敗しますが、2 回目は成功します。しばらく勉強した後、ようやくもっと合理的な解決策を見つけました。皆さんのお役に立てればと思い、ここに記録してまとめておきます。 要件の説明ユーザーが「電話を取得」ボタンをクリックすると、WeChatでユーザーが設定した電話番号が復号化され、連絡先の電話番号入力ボックスに表示されます。 特定のコード<view class="cu-form-group"> <view class="title text-black">連絡先電話番号</view> <input class="radius" name="mobile" placeholder="連絡先の電話番号を入力してください" value="{{detail.mobile}}" bindinput="onInputMobile"></input> <button bindgetphonenumber="getPhoneNumber" class="cu-btn line-blue sm" openType="getPhoneNumber">電話番号を取得</button> </ビュー> まず、アプレットボタンコンポーネントが必要で、openType="getPhoneNumber" を設定します。 onLoad: 非同期関数() { this.getSessionKey() }, 非同期getSessionKey() { const { コード } = wx.login() を待つ const res = Index.getSessionKey({ コード }) (res.code == 1)の場合{ this.setData({ セッションキー: res.data }) } }, getPhoneNumber: 非同期関数(e) { if (e.detail.errMsg === "getPhoneNumber:ok") { const res = Index.getPhone({ iv: e.詳細.iv、 暗号化データ: e.detail.encryptedData、 セッションキー: this.data.session_key }) (res.err == 0)の場合{ wx.showToast({ タイトル: 「ネットワークが少し不安定です。もう一度クリックしてお試しください」 アイコン: 'なし' }) 戻る } const 詳細 = this.data.detail detail.mobile = res.err.phoneNumber this.setData({ 詳細 }) } そうでない場合 (e.detail.errMsg === "getPhoneNumber:fail user deny") { wx.showModal({ タイトル: 「ヒント」 内容: 「認証を拒否しました。もう一度クリックして認証してください」 表示キャンセル: false、 confirmText: 「了解しました」 }) } }, onLoadライフサイクル中にログインコードを取得し、そのコードをサーバーに送信してsession_keyを取得します。 サーバー側で session_key を取得するには、ミニプログラムの公式ドキュメントを参照してください。 ユーザーが「Get Phone」ボタンをクリックすると、session_key と取得された iv、encryptedData が復号化のためにサーバーに送信されます。 この方法でユーザーの携帯電話番号を取得できます。 ピット以前の解決策では、ユーザーが [電話番号を取得] ボタンをクリックした後、getPhoneNumber 関数で wx.logon() を直接呼び出し、コード、iv、encryptedData をサーバーに送信していました。サーバーは最初にコードを使用して session_key を取得し、次にそれを iv および encryptedData と組み合わせて復号化しました。この方法では、最初の復号化は失敗し、次にボタンをもう一度クリックして復号化インターフェイスを呼び出すと成功します。 そして、この状況は 5 ~ 6 分ごとに再発します。 ログイン状態が期限切れになっているかどうかを確認するために wx.checkSession(Object object) を呼び出すと、常に成功します。 推測後で考えてみたのですが、getPhoneNumber 関数で wx.login を呼び出して、サーバーがコードを使用して session_key を交換し、それを iv と組み合わせて、encryptedData を復号化できないのはなぜでしょうか? session_key を取得するために、wx.login を onLoad に入れるのはどうでしょうか? wx.login が呼び出されると、WeChat サーバーの session_key が更新されると思います。getPhoneNumber で wx.login が直接呼び出されると、WeChat サーバーはそれを更新する時間がない可能性があり、サーバーはそれを復号化に使用します。前回期限が切れた session_key は引き続き復号化に使用されるため、2 回目以降にのみ成功します。 onload に wx.login を配置すると、session_key を時間内に取得できます。 要約するWeChatミニプログラムを通じて携帯電話番号を取得する際の落とし穴に関するこの記事はこれで終わりです。WeChatミニプログラムを通じて携帯電話番号を取得することに関するより関連性の高いコンテンツについては、123WORDPRESS.COMで以前の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後も123WORDPRESS.COMを応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: MySQL の char、varchar、text フィールド タイプの違い
>>: MySQL の null 可能フィールドは NULL に設定する必要がありますか、それとも NOT NULL に設定する必要がありますか?
この記事では、モグラ叩きゲームを実装するためのJavaScriptの具体的なコードを参考までに紹介し...
序文MySQL インデックスの使用に関しては、これまでインデックスの最左接頭辞ルール、インデックス ...
1. 温かくて優しい関連アドレス: http://www.web-designers.cn/post...
1. クエリプロセスプロセスリストを表示2. 対応するプロセスを照会し、IDを強制終了します。検証(...
関連記事: MySQL8.0.20 インストール チュートリアルとインストールの問題に関する詳細なチ...
通常の開発では、凸型の丸い角、つまり border-radius 属性を使用するのが一般的です。凹角...
1. はじめにPresto は、ギガバイトからペタバイトに及ぶデータ ソースに対してインタラクティブ...
フローティング要素は、親要素の高さを縮小します。要素を float float:left/right...
Tomcat8 イメージをダウンロード [root@localhost ~]# docker sea...
成果を達成する実装コードhtml <div class="コンテナ">...
この記事は、Element公式サイトとQiniu Cloud公式サイトを使用しています。 eleme...
目次1. 実行コンテキストとは何か2. 実行コンテキスト スタックとは何ですか? 3. 実行コンテキ...
遅延読み込み(レイジー読み込み)とプリロードは、Web 最適化によく使用される手段です。 。 1. ...
border-radius:10px; /* すべての角は半径 10px で丸められます*/ bor...
環境: (docker、k8s クラスター)、前回 docker で起動した Java プログラムの...