通过微信获取手机号时,若以明文方式传输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;
}
解密后的格式
手机号获取成功
上一篇:微信小程序支付注意事项,微信小程序支付验证签名失败排查与解决方法
下一篇:最后一页