收藏
回答

获取手机号第一次获取100%失败 后面获取正常 再次进入页面获取也正常

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小程序 Bug 获取手机号 微信安卓客户端 7.0.7 2.6.6
wx.login({
              success: res => {
                getApp().request({
                  url: getApp().globalData.url + '/api/member/getAxbphone',        
                  method: "post",
                  data: {
                    encryptedData: e.detail.encryptedData,
                    iv: e.detail.iv,
                    code: res.code
                  },
                  success: function (res) {
                    console.log('手机号返回',res);
                    if (res.msg.mobile) {
                      wx.showModal({
                        title: '拨打隐私号码',
                        content: '为了双方的真实号码不被泄露,在隐私保护通话平台为A和B用户绑定一个虚拟号码X',
                        confirmText: "拨打电话",
                        confirmColor: "#07c160",
                        showCancel: false,
                        success: function (t) {
                          if (t.confirm) {
                            console.log('用户点击主操作', res.msg.mobile)
                            self.axbclick(res.msg.mobile);
                          }
                        }
                      });
                    } else {
                      wx.showToast({
                        title: '授权失败,请重新授权',
                        icon: 'none'
                      })
                    }
                  },
                  fail: function () {
                    wx.showToast({
                      title: '授权失败,请重新授权',
                      icon: 'none'
                    })
                  }
                })
 
 
              }
            })
public function getAxbphone($value=''){
   
  $encryptedData = input('encryptedData');
  $iv = input('iv');
  $res = $this->getopenId(input('code'));
 
  if (strlen($res['session_key']) != 24) {
      return 1;
  }
  $pc = new WXBizDataCrypt($setting['appid'],$res['session_key']);
  $errCode = $pc->decryptData($encryptedData,$iv,$data);
  $data = json_decode($data,true);
  //是否获取到需要挪车的手机号
  if($data['phoneNumber']){
    $data = [
      'mobile' => $data['phoneNumber']
    ];
    return json(['msg'=>$data,'status'=>'1']); //把手机号返回
  }else{
    return  json(['msg'=>$data,'status'=>'-1']); //出错
  }
}
<?php
namespace WXBizDataCrypt;
/**
 * 对微信小程序用户加密数据的解密示例代码.
 *
 * @copyright Copyright (c) 1998-2014 Tencent Inc.
 */
class WXBizDataCrypt
{
    public static $OK = 0;
    public static $IllegalAesKey = -41001;
    public static $IllegalIv = -41002;
    public static $IllegalBuffer = -41003;
    public static $DecodeBase64Error = -41004;
 
    private $appid;
    private $sessionKey;
 
    /**
     * 构造函数
     * @param $sessionKey string 用户在小程序登录后获取的会话密钥
     * @param $appid string 小程序的appid
     */
    public function __construct($appid, $sessionKey)
    {
 
        $this->sessionKey = $sessionKey;
        $this->appid = $appid;
    }
 
 
    /**
     * 检验数据的真实性,并且获取解密后的明文.
     * @param $encryptedData string 加密的用户数据
     * @param $iv string 与用户数据一同返回的初始向量
     * @param $data string 解密后的原文
     *
     * @return int 成功0,失败返回对应的错误码
     */
    public function decryptData($encryptedData, $iv, &$data)
    {
        if (strlen($this->sessionKey) != 24) {
            return static::$IllegalAesKey;
        }
        $aesKey = base64_decode($this->sessionKey);
 
 
        if (strlen($iv) != 24) {
            return static::$IllegalIv;
        }
        $aesIV = base64_decode($iv);
 
        $aesCipher = base64_decode($encryptedData);
 
        $result = openssl_decrypt($aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
 
        $dataObj = json_decode($result);
        if ($dataObj == NULL) {
            return static::$IllegalBuffer;
        }
        if ($dataObj->watermark->appid != $this->appid) {
            return static::$IllegalBuffer;
        }
        $data = $result;
        return static::$OK;
    }
 
}


回答关注问题邀请回答
收藏

2 个回答

  • 啊喵
    啊喵
    2019-10-08

    是不是login刷新了sessionkey?

    2019-10-08
    有用
    回复 1
    • 筋斗云网络
      筋斗云网络
      2019-10-08
      主要是login获取到code后直接传回后台获取到session_key 然后接着获取手机号的  前端也来不及刷新login
      2019-10-08
      回复
  • 污昂ᰔᩚ王࿐
    污昂ᰔᩚ王࿐
    2019-10-08

    第一次失败应该有一个报错吧   看看是什么报错解决就好了啊   我猜是code的问题

    2019-10-08
    有用
    回复 2
    • 筋斗云网络
      筋斗云网络
      2019-10-08
      不是code的问题 我打印的时候都有的
      2019-10-08
      回复
    • 筋斗云网络
      筋斗云网络
      2019-10-08
      获取手机号返回空  啥报错没有
      2019-10-08
      回复
登录 后发表内容
问题标签