携帯電話番号の歩数記録を取得するWeChatアプレット

携帯電話番号の歩数記録を取得するWeChatアプレット

序文

最近、小さなプログラムを開発しているときに、このような問題に遭遇しました。ユーザーが認証をクリックして携帯電話番号を復号化しようとすると、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を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • WeChatミニプログラムでユーザー認証を通じて携帯電話番号を取得する方法(getPhoneNumber)
  • WeChatアプレットは、ユーザーのログイン機能を承認するために携帯電話番号を取得します
  • WeChatミニプログラムのユーザー認証、位置情報認証、WeChatにバインドされた携帯電話番号の取得
  • WeChatアプレット機能の概要(携帯電話番号認証*、パスワード認証*、認証コードの取得*)
  • WeChatミニプログラムでユーザーの携帯電話番号を取得する方法
  • WeChatアプレットgetPhoneNumberはユーザーの携帯電話番号を取得します
  • WeChatアプレットはユーザー情報と携帯電話番号を取得します(バックエンドTP5.0)
  • WeChat アプレット開発: ユーザーの携帯電話番号の取得 (PHP インターフェースの復号化)
  • WeChatアプレットは携帯電話番号をバインドして認証コード機能を取得します
  • 携帯電話番号を取得するためのWeChatアプレットJavaScript復号化サンプルコードの詳細な説明

<<:  MySQL の char、varchar、text フィールド タイプの違い

>>:  MySQL の null 可能フィールドは NULL に設定する必要がありますか、それとも NOT NULL に設定する必要がありますか?

推薦する

Linux でネットワーク パケット損失と遅延をシミュレートする方法

netem と tc: netem は、Linux カーネル バージョン 2.6 以降で提供されるネ...

高度な JavaScript フロントエンド開発でよく使用されるいくつかの API の例の詳細な説明

目次ミューテーションオブザーバーAPI特徴インターセクションオブザーバーAPI例えば画像の遅延読み込...

HTML 基本ノート (推奨)

1. ウェブページの基本構造: XML/HTML コードコンテンツをクリップボードにコピー<...

HTML で複数のフォームのテキスト ボックスを揃える方法

フォームのコードは図の通りです。スタイルシートがまだ追加されていないため、フォームが整列されておらず...

Tomcat でのコネクタ構成

JBoss は Tomcat を Web コンテナとして使用するため、JBoss の Web コンテ...

Windows Server 2008R2、2012、2016、2019 の違い

目次共通バージョンの紹介共通バージョンのダウンロードアドレスとインストール以下に簡単な違いを示します...

CenterOS7 インストールおよび構成環境 jdk1.8 チュートリアル

1. まずcenterosに付属のJDKをアンインストールします rpm-qa|grepopenjd...

HTML テーブルタグチュートリアル (27): セルの背景画像属性 BACKGROUND

セルの背景画像を設定でき、任意の GIF または JPEG 画像ファイルを使用できます。基本的な構文...

Mysql5.7.14 Linux版のパスワードを忘れた場合の完璧な解決策

/etc/my.confファイルで、[mysqld]の下に次の行を追加します: skip-grant...

Ubuntuがインターネットに接続できない場合の解決策

問題の説明:デスクトップ コンピューターとキャンパス ネットワークを使用して、有線モードでインターネ...

一目でわかる$nextTickの説明

目次1. 機能説明2. 親コンポーネント3. サブコンポーネント NextTick.vue 4なぜ未...

MySql インデックス使用戦略の分析

MySql インデックスインデックスの利点1. 一意のインデックスまたは主キー インデックスを作成す...

Linux でジャンクファイルをエレガントに削除する方法

あなたも私と同じように、コンピューターのファイルを整然と整理し、不要なファイルを適宜削除するプログラ...

Linux で最も頻繁に使用されるターミナル コマンドのトップ 10 のリストを取得します。

私が最も頻繁に使用するコマンドは次の通りです:選択肢CDギットls ssh須藤数週間前、私はこの R...

DOCTYPE要素詳細説明完全版

1. 概要この記事では、DOCTYPE要素を体系的に説明します。同時に、多くの情報を調べました。イン...