小程序通过wx.login组件会返回一个code,这个code用来获得用户的openid。
小程序写法为:
wx.login({success (res) {if (res.code) {//发起网络请求wx.request({url: 'https://example.com/onLogin',// 后台给的请求地址data: {code: res.code}})} else {console.log('登录失败!' + res.errMsg)}}
})
后端通过以下代码可以获得openid(参考文档:获取插件用户openpid | 微信开放文档)
<?php
public function getopenid(){$js_code = input('post.js_code');//小程序传来的code值$appid = '';//自己小程序的appid$appSecret = '';// 自己小程序的$appSecret$wxUrl = 'https://api.weixin.qq.com/sns/jscode2sessionappid=%s&secret=%s&js_code=%s&grant_type=authorization_code';$getUrl = sprintf($wxUrl, $appid, $appSecret, $js_code);//把appid,appsecret,code拼 接到url里$result = $this->curl_get($getUrl);//请求拼接好的url$wxResult = json_decode($result, true);return wxResult;
}
public function curl_get($url, &$httpCode = 0) {$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不做证书校验,部署在linux环境下请改为truecurl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);$file_contents = curl_exec($ch);$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);curl_close($ch);return $file_contents;}
使用手机号快速验证组件,获得的code用来请求地址获得手机号。
这个是手机号快速验证组件
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>Page({getPhoneNumber (e) {console.log(e.detail.code) // 动态令牌console.log(e.detail.errMsg) // 回调信息(成功失败都会返回)console.log(e.detail.errno) // 错误码(失败时返回)}
})
具体返回信息为:
后端拿到code后获取手机号的代码为(参考文档:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-info/phone-number/getPhoneNumber.html):
public function getphone(){$js_code = input('post.phone_code');//小程序传来的code值$appid = '';//小程序的appid$appSecret = '';// 小程序的$appSecret$access_token = $this->getAccessToken($appid, $appSecret);if($access_token !== false){$data = array('code' => $js_code);$result=$this->getUserPhoneNumber("https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=".$access_token,$data);var_dump($result);}}
public function getAccessToken($appid,$secret){$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$secret;$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);$data = curl_exec($ch);if(curl_errno($ch)){echo '<br>Curl error: ' . curl_error($ch)."<br>";return curl_error($ch);}curl_close($ch);$result = json_decode($data,true);if(isset($result["access_token"])){return $result["access_token"];}else{echo "<br>getAccessToken Failed: ".$result["errcode"].";".$result["errmsg"]."<br>";return false;}}
public function getUserPhoneNumber($remote_server, $data) {$json_data = json_encode($data);$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $remote_server);curl_setopt($ch, CURLOPT_POST, true);curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);$data = curl_exec($ch);if(curl_errno($ch)){echo '<br>Curl error: ' . curl_error($ch)."<br>";return curl_error($ch);}curl_close($ch);//$result = json_decode($data,true);//var_dump($result);return $data;}
如还有问题,可以留言联系,处理了一晚上的bug就记录到这里啦
参考官方文档:
小程序端需要写的:
手机号快速验证组件 | 微信开放文档
php后台需要写的:
手机号验证 | 微信开放文档
获取接口调用凭据:
获取接口调用凭据 | 微信开放文档