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>
        </view>
まず、アプレットブロックが必要で、オープンタイプ=「get Phone eNumber」を設定します。

    onLoad: async function () {
        this.getSessionKey()
    },
    async getSessionKey() {
        const { code } = await wx.login()
        const res = await Index.getSessionKey({
            code
        })
        if (res.code == 1) {
            this.setData({
                session_key: res.data
            })
        }
    },
    getPhoneNumber: async function (e) {
        if (e.detail.errMsg === "getPhoneNumber:ok") {
            const res = await Index.getPhone({
                iv: e.detail.iv,
                encryptedData: e.detail.encryptedData,
                session_key: this.data.session_key
            })
            if (res.err == 0) {
                wx.showToast({
                    title: '        ,     ',
                    icon: 'none'
                })
                return
            }
            const detail = this.data.detail
            detail.mobile = res.err.phoneNumber
            this.setData({
                detail
            })
        } else if (e.detail.errMsg === "getPhoneNumber:fail user deny") {
            wx.showModal({
                title: '  ',
                content: '      ,        ',
                showCancel: false,
                confirmText: "   "
            })
        }
    },
オンラインライフサイクルで登録コードを取得し、サービスにコードを送信してsessionを取得する。key
サービスでsessionを獲得する。keyはアプレット公式文書を参照してください。
ユーザーが電話ボタンをクリックすると、セッション_keyおよび取得したiv,encrypedDataはサービス側に送信して復号します。
これでユーザーの携帯番号が取得できます。

以前のプログラムは、ユーザーが電話ボタンをクリックして、直接getPhone eNumber関数内でwx.logon()を呼び出して、code、iv、encrypedDataをサービスに送信し、サービス先にcodeを持ってsessionを取得することです。keyは、その後iv、encrypedDataと結合して解読します。これを行うと最初の復号に失敗し、再度ボタンを押して復号インターフェースを呼び出すことに成功します。しかも5~6分ごとにまたこの状況が現れます。
wx.checkSessionを呼び出して登録状態が期限切れかどうかをチェックするのもずっと成功しています。

推察する
それから考えてみましたが、なぜget Phone eNumber関数内でwx.loginを呼び出して、サービス先でcodeをsession_に変えましたか?key、そしてivを結合して、encrypedDataは解読してはいけませんか?wx.loginをonLoadに入れてsession_を取得します。keyでいいですか?
wx.loginの呼び出し時にWeChatサーバーのsessionを更新すると思います。keyは、直接get Phone eNumberでwx.lognを調整します。もしかしたら、WeChatサーバはまだ更新できていないかもしれません。サービス側は持って解読します。解読する時に使うのはやはり前回の期限が切れたsessionです。key、だから2回目以降しか成功できません。wx.loginはonload内に置いて、来ることができる及びsession_keyです。
締め括りをつける
ここでは、WeChatアプリについて、携帯電話の番号を取得して、ピットを踏んだ文章を紹介します。携帯電話の番号を取得するためには、以前の文章を検索したり、次の関連記事を見たりしてください。これからもよろしくお願いします。