1、首先为了方便理解,附上一张小程序获取用户手机号码的流程图。
2、按照上图所示,需要先畛粳棠奈获取用户的登陆凭证,下面的这个代码是使用小程序登录接口以后在获取的,其中wx.request()是微信官方的API,它的作用是发送网络请求到后端,然后在后端用code换区session_key和openid;相关代码如下:wx.login({ success: function (res) { if (res.code) { //使用小程序登录的接口完成后端用户登录 wx.request({ url: app.d.hostUrl + 'getOpenid',//你自己相关api接口的路径 data: { code: res.code, appid: "小程序AppID", secret: "小程序secret", }, success: function (res) { //将openid保存到缓存里 wx.setStorageSync("openid", res.openid); wx.setStorageSync("session_key", res.session_key); } }) } else { console.log('获取用户登录态失败!' + res.errMsg) } } })。
3、现在前端已经将获取的openid和session_key所需的参数传递给后端了,在后端写入相关代码://用code换session_key和openidpublic function getOpenid(){ global $_GPC;//这是微擎框架 $_GPC想当于$_GET和$_POST $code = $_GPC['code']; $appid = $_GPC['appid']; $secret = $_GPC['secret']; $api = "https://api.weixin.qq.com/sns/jscode2session?appid={$appid}&secret={$secret}&js_code={$code}&grant_type=authorization_code"; $str = $this->httpGet($api); return $str;}private function httpGet($url){ $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 500); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true); curl_setopt($curl, CURLOPT_URL, $url); $res = curl_exec($curl); curl_close($curl); return $res;}。
4、这时前端success就可以取到openid和session_key了,那么就需要在后端用session_key和openid来获取解密手机号码了;相关代码:public function getPhoneNumber(){//这是解密手机号码的接口,等会前端还要写个请求访问这个接口拿到手机号码 global $_GPC; require_once dirname(__FILE__) . '/mail/WXBizDataCrypt.php'; $appid = $_GPC['appid']; $sessionKey = $_GPC['session_key']; $encryptedData = $_GPC['encryptedData']; $iv = $_GPC['iv']; $pc = new WXBizDataCrypt($appid, $sessionKey); $errCode = $pc->decryptData($encryptedData, $iv, $data ); if ($errCode == 0) { print($data . "\n"); } else { print($errCode . "\n"); } }。
5、在小程序的wxml文件中写一个button按钮来获取用户手机号码;相关代码:<button bindgetphonenumber='getPhoneNumber'> 使用微信登录 </button>。
6、然后在js代码中写好获取代码就可以了;相关代码:getPhoneNumber:function (e) { var detail = e.detail; wx.request({ url: app.d.hostUrl + 'getPhoneNumber', //解密手机号码接口 data: { "appid": app.d.appId, "session_key": wx.getStorageSync('session_key'), "encryptedData": detail.encryptedData, "iv": detail.iv }, success: function (res) { console.log(res.data.phoneNumber); wx.setStorageSync("phonenumber", res.data.phoneNumber); } }) }。