**小程序获取手机号代码?获取**用户绑定的手机号,需先调用wx.login接口。
小程序获取code。
后台得到session_key,openid。
组件触发getPhoneNumber
因为需要用户主动触发才能发起获取手机号接口,所以该功能不由API来调用,需用<button>组件的点击来触发。
需要将<button>组件open-type的值设置为getPhoneNumber,当用户点击并同意之后,可以通过bindgetphonenumber事件回调获取到**服务器返回的加密数据,然后在第三方服务端结合session_key以及app_id进行解密获取手机号。
tips:
在回调中调用wx.login登录,可能会刷新登录态。此时服务器使用code换取的sessionKey不是加密时使用的sessionKey,导致解密失败。建议开发者提前进行login;或者在回调中先使用checkSession进行登录态检查,避免login刷新登录态。
<buttonopen-type="getPhoneNumber"bindgetphonenumber="getPhoneNumber"></button>Page({getPhoneNumber(e){console.log(e.detail.errMsg)console.log(e.detail.iv)console.log(e.detail.encryptedData)}})encryptedData解密encryptedData解密后为以下JSON结构{"phoneNumber":"13580006666","purePhoneNumber":"13580006666","countryCode":"86","watermark":{"appid":"APPID","timestamp":TIMESTAMP}}
成都小程序开发可以通过各种前端接口获取**提供的开放数据。考虑到开发者服务器也需要获取这些开放数据,**会对这些数据做签名和加密处理。开发者后台拿到开放数据后可以对数据进行校验签名和解密,来保证数据不被篡改。
签名校验以及数据加解密涉及用户的会话密钥session_key。开发者应该事先通过wx.login登录流程获取会话密钥session_key并保存在服务器。为了数据不被篡改,开发者不应该把session_key传到小程序客户端等服务器外的环境。
接口返回的加密数据(encryptedData)进行对称解密。解密算法如下:
对称解密使用的算法为AES-128-CBC,数据采用PKCS#7填充。
对称解密的目标密文为Base64_Decode(encryptedData)。
对称解密秘钥aeskey=Base64_Decode(session_key),aeskey是16字节。
对称解密算法初始向量为Base64_Decode(iv),其中iv由数据接口返回。
会话密钥session_key有效***
开发者如果遇到因为session_key不正确而校验签名失败或解密失败,请关注下面几个与session_key有关的注意事项。
wx.login调用时,用户的session_key可能会被更新而致使旧session_key失效(刷新机制存在***短周期,如果同一个用户短时间内多次调用wx.login,并非每次调用都导致session_key刷新)。开发者应该在明确需要重新登录时才调用wx.login,及时通过code2Session接口更新服务器存储的session_key。
**不会把session_key的有效期告知开发者。我们会根据用户使用小程序的行为对session_key进行续期。用户越频繁使用小程序,session_key有效期越长。
开发者在session_key失效时,可以通过重新执行登录流程获取有效的session_key。使用接口wx.checkSession可以校验session_key是否有效,从而避免小程序反复执行登录流程。
当开发者在实现自定义登录态时,可以考虑以session_key有效期作为自身登录态有效期,也可以实现自定义的时效***策略。
<?php/***对**小程序用户加密数据的解密示例代码.*[email protected](c)1998-2014TencentInc.*/namespacewechat;classwxBizDataCrypt{private$appid;private$sessionKey;/***构造函数[email protected][email protected][email protected]$appidstring小程序的appid*/publicfunction__construct($appid,$sessionKey){$this->sessionKey=$sessionKey;$this->appid=$appid;}/***检验数据的真实***,并且获取解密后的明文.[email protected]$encryptedDatastring加密的用户数据[email protected]$ivstring与用户数据一同返回的初始向量[email protected]$datastring解密后的原文*[email protected],失败返回对应的错误码*/publicfunctiondecryptData($encryptedData,$iv,&$data){if(strlen($this->sessionKey)!=24){returnerrorCode::$IllegalAesKey;}$aesKey=base64_decode($this->sessionKey);if(strlen($iv)!=24){returnerrorCode::$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){returnerrorCode::$IllegalBuffer;}if($dataObj->watermark->appid!=$this->appid){returnerrorCode::$IllegalBuffer;}$data=$result;returnerrorCode::$OK;}}/***errorcode说明.*<ul>*<li>-41001:encodingAesKey非法</li>*<li>-41003:aes解密失败</li>*<li>-41004:解密后得到的buffer非法</li>*<li>-41005:base64加密失败</li>*<li>-41016:base64解密失败</li>*</ul>*/classerrorCode{publicstatic$OK=0;publicstatic$IllegalAesKey=-41001;publicstatic$IllegalIv=-41002;publicstatic$IllegalBuffer=-41003;publicstatic$DecodeBase64Error=-41004;}改造<?php/***对**小程序用户加密数据的解密示例代码.*[email protected](c)1998-2014TencentInc.*/namespacewechat;classwxBizDataCrypt{private$appid;private$sessionKey;/***errorcode说明.*<ul>*<li>-41001:encodingAesKey非法</li>*<li>-41003:aes解密失败</li>*<li>-41004:解密后得到的buffer非法</li>*<li>-41005:base64加密失败</li>*<li>-41016:base64解密失败</li>*</ul>*/publicstatic$OK=0;publicstatic$IllegalAesKey=-41001;publicstatic$IllegalIv=-41002;publicstatic$IllegalBuffer=-41003;publicstatic$DecodeBase64Error=-41004;/***构造函数[email protected][email protected][email protected]$appidstring小程序的appid*/publicfunction__construct($appid,$sessionKey){$this->sessionKey=$sessionKey;$this->appid=$appid;}/***检验数据的真实***,并且获取解密后的明文.[email protected]$encryptedDatastring加密的用户数据[email protected]$ivstring与用户数据一同返回的初始向量[email protected]$datastring解密后的原文*[email protected],失败返回对应的错误码*/publicfunctiondecryptData($encryptedData,$iv,&$data){if(strlen($this->sessionKey)!=24){returnself::$IllegalAesKey;}$aesKey=base64_decode($this->sessionKey);if(strlen($iv)!=24){returnself::$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){returnself::$IllegalBuffer;}if($dataObj->watermark->appid!=$this->appid){returnself::$IllegalBuffer;}$data=$result;returnself::$OK;}}