下面给出详细的攻略,分为以下几个步骤:
在小程序端,可以通过wx.login
函数获取用户授权凭证code,示例代码如下:
wx.login({
success: function(res) {
if (res.code) {
/* 在这里向后台服务器发送授权凭证code */
} else {
console.log('获取用户登录态失败!' + res.errMsg)
}
}
})
除此之外,如果需要获取用户手机号等敏感数据,还需要调用wx.getPhoneNumber
函数获取用户授权,示例代码如下:
wx.getPhoneNumber({
success: function(res) {
/* 在这里向后台服务器发送encryptedData和iv等信息 */
},
fail: function(res) {
console.log('获取用户手机号失败!' + res.errMsg)
}
})
在后端服务器上,可以使用ThinkPHP5
框架自带的Http
库发送请求获取session_key和openid,示例代码如下:
use think\facade\Http;
function getSessionKeyAndOpenid($code) {
$url = "https://api.weixin.qq.com/sns/jscode2session?" .
"appid=APPID&secret=SECRET&js_code=CODE&grant_type=authorization_code";
$url = str_replace('APPID', '你的小程序appid', $url);
$url = str_replace('SECRET', '你的小程序appsecret', $url);
$url = str_replace('CODE', $code, $url);
$response = Http::get($url);
return json_decode($response, true);
}
在后端服务器上,可以使用PHP
的openssl_decrypt
函数解密用户敏感数据,示例代码如下:
function getPhoneNumber($sessionKey, $encryptedData, $iv) {
$data = openssl_decrypt(base64_decode($encryptedData), 'AES-128-CBC', base64_decode($sessionKey), OPENSSL_RAW_DATA, base64_decode($iv));
$res = json_decode($data, true);
return $res['phoneNumber'];
}
至此,就可以完成微信小程序的授权登陆并获取用户手机号的操作了。
示例代码:例如通过ThinkPHP5
框架实现了一个小程序登陆接口,接收小程序端发送的授权凭证code和加密数据,从而返回用户的手机号,代码如下:
<?php
namespace app\api\controller;
use think\Controller;
class Wechat extends Controller
{
public function getUserPhoneNumber()
{
$code = input('code');
$encryptedData = input('encryptedData');
$iv = input('iv');
$result = $this->getSessionKeyAndOpenid($code);
$sessionKey = $result['session_key'];
$phoneNumber = $this->getPhoneNumber($sessionKey, $encryptedData, $iv);
return json([
'phone_number' => $phoneNumber,
]);
}
private function getSessionKeyAndOpenid($code) {
$url = "https://api.weixin.qq.com/sns/jscode2session?" .
"appid=APPID&secret=SECRET&js_code=CODE&grant_type=authorization_code";
$url = str_replace('APPID', '你的小程序appid', $url);
$url = str_replace('SECRET', '你的小程序appsecret', $url);
$url = str_replace('CODE', $code, $url);
$response = Http::get($url);
return json_decode($response, true);
}
private function getPhoneNumber($sessionKey, $encryptedData, $iv) {
$data = openssl_decrypt(base64_decode($encryptedData), 'AES-128-CBC', base64_decode($sessionKey), OPENSSL_RAW_DATA, base64_decode($iv));
$res = json_decode($data, true);
return $res['phoneNumber'];
}
}
其中的getUserPhoneNumber
方法就是接收小程序端发送的授权凭证code和加密数据,并返回用户手机号的方法。