首页 > 技术分享 > 微信小程序
收藏

通过微信获取手机号,微信提示小程序session_key明文传输的解决方法

11/14 14:14
大潇博客 原创文章,转载请标明出处

通过微信获取手机号时,若以明文方式传输session_key,微信检测到后,会通过公众平台安全助手,发推送给绑定小程序账号的微信,提醒及时修改,以消除风险

提示虽然来自微信,但解决此问题需要后端做处理

注意:明文传输session_key指双向明文传输,包括小程序请求接口时传的参数、接口返回给微信小程序的参数,POST和GET等任何请求方式均不可以携带session_key


获取手机号

首先在小程序的getPhoneNumber方法,获取动态令牌code

微信手机号快速验证组件文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html

Page({
      getPhoneNumber (e) {
            console.log(e.detail.code)     // 动态令牌
            console.log(e.detail.errMsg) // 回调信息(成功失败都会返回)
            console.log(e.detail.errno)    // 错误码(失败时返回)
      }
})

携带此参数访问后端给的接口,后端拿到code再请求微信接口,获取openid和session_key,接口为:

$api='https://api.weixin.qq.com/sns/jscode2session?appid=appid&secret=appsecret&js_code='.$_GET['code'].'&grant_type=authorization_code

微信返回如下数据


此时可将session_key转储到缓存或数据库中,有效期建议设置在72小时内,比如使用redis临时保存

$result=file_get_contents($api);

$wxdata=json_decode($result,true);

$redis->setex($wxdata['openid'],pow(60,2)*72,,$wxdata['session_key']);

然后将session_key销毁,单独传输openid返回前端


再次请求后端接口,携带openid、encryptedData、iv等其它程序必要参数,通过微信提供的解密方法,获得手机号

public function decryptData( $appid, $sessionKey, $encryptedData, $iv, &$data ){

      if (strlen($sessionKey) != 24) {

            return -41001;
      }

      $aesKey=base64_decode($sessionKey);

      if (strlen($iv) != 24) {

            return -41002;

      }

      $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 -41003;

      }

      if( $dataObj->watermark->appid != $appid ){

            return -41003;

      }

      $data = $result;

      return 0;

}

解密后的格式

手机号获取成功

打赏

阅读排行

大家都在搜

博客维护不易,感谢你的肯定
扫码打赏,建议金额1-10元
  • 15601023311