PHP微信小程序后端需实现登录鉴权、token校验、敏感数据解密及安全响应头配置:一、启用cURL/JSON/OpenSSL扩展并规范项目结构;二、用jscode2session换openid/session_key,生成自定义token存库;三、通过check_auth.php中间件校验token有效性并绑定openid;四、用AES-128-CBC解密encryptedData并校验watermark.appid;五、设置CORS头、HTTPS强制校验与JSON响应格式。

如果您使用PHP为微信小程序搭建后端服务,则需实现稳定的数据接口输出与安全的用户身份验证机制。以下是完成该任务的具体步骤:
一、配置基础环境与项目结构
确保服务器运行PHP 7.4及以上版本,并启用cURL、JSON、OpenSSL扩展,这是处理微信登录凭证解密和HTTPS请求的必要条件。项目应分离接口路由、业务逻辑与数据库操作,便于维护与调试。
1、在Web根目录下创建api/子目录,用于存放所有接口脚本。
2、新建config.php文件,定义数据库连接参数与微信AppID、AppSecret常量。
立即学习“PHP免费学习笔记(深入)”;
3、创建autoload.php文件,注册自动加载函数,支持按命名空间加载类文件。
二、实现微信用户登录鉴权接口
小程序调用wx.login获取临时登录凭证code,后端需将其提交至微信接口换取openid与session_key,再生成自定义登录态token并返回客户端。
1、编写login.php接口,接收POST参数code。
2、拼接微信接口URL:https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=CODE&grant_type=authorization_code。
3、使用file_get_contents或cURL发起GET请求,获取返回的JSON数据。
4、校验返回数据中是否包含openid字段,若缺失则返回错误码40013(appid错误)或40001(secret无效)。
5、生成32位随机字符串作为session_id,存入MySQL表weapp_session,字段包括session_id、openid、session_key、expire_time(当前时间+7200秒)。
6、将session_id作为token返回给小程序,响应格式为{"token":"xxx","expires_in":7200}。
三、构建受保护的数据接口中间件
所有需校验用户身份的接口(如获取用户信息、提交订单)必须先验证token有效性,防止未授权访问。
1、创建check_auth.php文件,读取HTTP请求头中的Authorization字段值。
2、从数据库查询weapp_session表中session_id匹配且expire_time大于当前时间戳的记录。
3、若查无结果,立即终止脚本并输出HTTP状态码401及响应体{"errcode":40001,"errmsg":"invalid credential"}。
4、若验证通过,将查询到的openid赋值给全局变量$auth_openid,供后续接口逻辑使用。
5、在user_info.php等接口顶部引入require_once 'check_auth.php';,确保执行前已完成鉴权。
四、封装微信敏感数据解密工具
小程序调用wx.getUserInfo或获取手机号时,加密数据需由后端使用session_key解密,保障用户隐私不被泄露。
1、安装composer包firebase/php-jwt或直接引入wechat_decrypt.php解密函数(基于AES-128-CBC算法)。
2、从数据库根据token查出对应session_key与iv(前端传入的加密算法初始向量)。
3、调用decryptData($encryptedData, $iv, $sessionKey)函数,传入Base64解码后的加密数据、iv和session_key。
4、验证解密后JSON中的watermark.appid是否与当前小程序AppID一致,不一致则拒绝处理并返回错误提示解密失败:appid mismatch。
5、成功解密后提取nickName、avatarUrl或purePhoneNumber字段,按业务需求返回结构化数据。
五、设置跨域与安全响应头
小程序网络请求默认启用HTTPS且强制校验域名,后端需明确声明允许来源并禁用危险头信息,避免因CORS或内容类型错误导致接口调用失败。
1、在所有接口PHP文件开头添加header("Access-Control-Allow-Origin: https://servicewechat.com");。
2、设置header("Access-Control-Allow-Methods: GET, POST, OPTIONS");,显式声明支持的方法。
3、添加header("Access-Control-Allow-Headers: Authorization, Content-Type");,允许携带认证头与JSON类型标识。
4、对OPTIONS预检请求直接输出空响应并exit,避免进入后续业务逻辑。
5、统一设置header("Content-Type: application/json; charset=utf-8");,防止中文乱码与解析异常。



















