微信小程序登录服务使用文档
大约 3 分钟
微信小程序登录服务使用文档
概述
WechatMiniProgramFacade 是微信小程序登录服务的静态门面类,提供了通过code获取用户openid和session_key的功能。使用静态代理模式调用,简单便捷。
配置参数
1. $params - 登录参数
$params = [
'code' => '小程序登录code', // 必填: 小程序登录code
'appid' => 'YOUR_WECHAT_MINI_PROGRAM_APPID', // 必填: 小程序AppId
// 'anonymousCode' => '匿名code', // 可选: 匿名code(与code二选一)
];2. $config - 配置参数
$config = [
'appsecret' => 'your_appsecret', // 必填: 小程序AppSecret
];使用示例
基本用法 - 获取用户信息
use YouHuJun\Tool\App\Facade\V1\Wechat\MiniProgram\WechatMiniProgramFacade;
// 登录参数
$params = [
'code' => '0e3q2k0004L9O90g0000000000',
'appid' => 'YOUR_WECHAT_MINI_PROGRAM_APPID',
];
// 配置
$config = [
'appsecret' => 'YOUR_WECHAT_MINI_PROGRAM_SECRET',
];
// 获取用户信息(返回数组)
$result = WechatMiniProgramFacade::getOpenIdByCode($params, $config);
// 响应数据结构:
// [
// 'response' => [
// 'openid' => 'ok-X068nPIY-emwpdlYAmoaef2h8',
// 'session_key' => 'CJsCJOkD3mFX8weh1ijyBQ==',
// 'unionid' => 'o7hrD6aYhmgFFy_qb238EOfKCS8I', // 如果用户绑定过开放平台
// ],
// 'appid' => 'wx1234567890abcdef'
// ]
$openid = $result['response']['openid'];
$sessionKey = $result['response']['session_key'];
echo "用户OpenID: " . $openid . "\n";
echo "Session Key: " . $sessionKey . "\n";使用集合对象格式返回
use YouHuJun\Tool\App\Facade\V1\Wechat\MiniProgram\WechatMiniProgramFacade;
$params = [
'code' => '0e3q2k0004L9O90g0000000000',
'appid' => 'YOUR_WECHAT_MINI_PROGRAM_APPID',
];
$config = [
'appsecret' => 'YOUR_WECHAT_MINI_PROGRAM_SECRET',
];
// 获取用户信息(返回对象)
$result = WechatMiniProgramFacade::getOpenIdByCodeWithCollection($params, $config);
echo "OpenID: " . $result->response->openid . "\n";
echo "AppID: " . $result->appid . "\n";完整的登录流程
use YouHuJun\Tool\App\Facade\V1\Wechat\MiniProgram\WechatMiniProgramFacade;
use YouHuJun\Tool\App\Exceptions\CommonException;
// 从小程序前端获取的code
$code = $_POST['code'] ?? '';
try {
// 调用微信接口获取用户信息
$result = WechatMiniProgramFacade::getOpenIdByCode([
'code' => $code,
'appid' => 'YOUR_WECHAT_MINI_PROGRAM_APPID',
], [
'appsecret' => 'YOUR_WECHAT_MINI_PROGRAM_SECRET',
]);
$openid = $result['response']['openid'];
$sessionKey = $result['response']['session_key'];
$unionid = $result['response']['unionid'] ?? null;
// 在这里处理登录逻辑:
// 1. 检查openid是否已存在
// 2. 如果不存在,创建新用户
// 3. 如果存在,更新用户信息
// 4. 生成登录token返回给前端
echo json_encode([
'code' => 0,
'message' => '登录成功',
'data' => [
'openid' => $openid,
'token' => 'generated_token_here',
],
]);
} catch (CommonException $e) {
echo json_encode([
'code' => $e->getCode(),
'message' => $e->getMessage(),
]);
}使用匿名code
$config = [
'appsecret' => 'your_appsecret_here',
];
// 对于某些场景,可能使用匿名code
$params = [
'anonymousCode' => 'anonymous_code_here',
'appid' => 'YOUR_WECHAT_MINI_PROGRAM_APPID',
];
$result = WechatMiniProgramFacade::getOpenIdByCode($params, $config);返回值
getOpenIdByCode() 返回数组格式:
[
'response' => [
'openid' => 'ok-X068nPIY-emwpdlYAmoaef2h8', // 用户唯一标识
'session_key' => 'CJsCJOkD3mFX8weh1ijyBQ==', // 会话密钥(用于解密敏感数据)
'unionid' => 'o7hrD6aYhmgFFy_qb238EOfKCS8I', // 开放平台唯一标识(可选)
],
'appid' => 'YOUR_WECHAT_MINI_PROGRAM_APPID', // 小程序AppId
]getOpenIdByCodeWithCollection() 返回对象格式:
(object)[
'response' => (object)[
'openid' => 'ok-X068nPIY-emwpdlYAmoaef2h8',
'session_key' => 'CJsCJOkD3mFX8weh1ijyBQ==',
'unionid' => 'o7hrD6aYhmgFFy_qb238EOfKCS8I',
],
'appid' => 'YOUR_WECHAT_MINI_PROGRAM_APPID',
]错误处理
服务会抛出 CommonException,包含以下错误码:
| 错误码 | Code | 说明 |
|---|---|---|
| ParamsIsNullError | 10020 | 参数为空(缺少code或anonymousCode) |
| AppidIsNullError | 10020 | AppId为空 |
| WechatMiniProgramSecretRequired | 52000 | 微信小程序AppSecret未设置 |
| WechatMiniProgramLoginError | 52010 | 微信小程序登录失败(微信接口返回错误) |
错误处理示例
use YouHuJun\Tool\App\Exceptions\CommonException;
use YouHuJun\Tool\App\Facade\V1\Wechat\MiniProgram\WechatMiniProgramFacade;
try {
$result = WechatMiniProgramFacade::getOpenIdByCode($params, $config);
echo "登录成功,OpenID: " . $result['response']['openid'];
} catch (CommonException $e) {
echo '错误码: ' . $e->getCode() . PHP_EOL;
echo '错误信息: ' . $e->getMessage() . PHP_EOL;
}注意事项
- code有效期: 微信小程序的code有效期只有5分钟,且只能使用一次
- session_key安全: session_key是敏感信息,不应存储或传递给前端,仅用于服务端解密数据
- unionid获取: 只有用户在小程序和公众号/开放平台都绑定过才能获取到unionid
- AppSecret安全: AppSecret不应暴露在前端,只应在服务端使用
- 静态调用: 使用
WechatMiniProgramFacade::getOpenIdByCode()静态方法调用,无需实例化 - 接口限制: 微信接口有调用频率限制,请合理使用
- 匿名code: code和anonymousCode必须提供其中一个
微信接口说明
请求URL
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code请求参数
| 参数 | 必填 | 说明 |
|---|---|---|
| appid | 是 | 小程序AppId |
| secret | 是 | 小程序AppSecret |
| js_code | 是 | 登录时获取的code |
| grant_type | 是 | 填写authorization_code |
返回参数
| 参数 | 说明 |
|---|---|
| openid | 用户唯一标识 |
| session_key | 会话密钥 |
| unionid | 用户在开放平台的唯一标识符(满足一定条件才返回) |
| errcode | 错误码 |
| errmsg | 错误信息 |
