微信小程序高级开发(1):微信授权登录获取openid(wx.login、php后端)

微信小程序使用微信授权登录获取openid的流程主要包括以下步骤:

1.微信公众平台注册小程序

开发者需要前往微信公众平台(https://mp.weixin.qq.com/)进行小程序的注册,填写相关信息,如邮箱、密码、主体类型等,完成注册流程后,即可获得一个小程序账号,用于后续的开发和管理。

2.搭建前端页面

在微信小程序开发工具中创建项目,在项目的前端页面中,通常使用button组件,并设置open-type="getUserInfo"属性来触发微信授权登录按钮。当用户点击该按钮时,会弹出微信授权窗口。

<view class="container">
  <button open-type="getUserInfo" bindgetuserinfo="onGetUserInfo">
    微信登录
  </button>
</view>
Page({
  onGetUserInfo(e) {
    // 在这里处理用户授权结果
    if (e.detail.userInfo) {
      // 用户授权成功
      console.log('用户授权成功', e.detail.userInfo);
    } else {
      // 用户拒绝授权
      console.log('用户拒绝授权');
    }
  }
})

3.获取code

当用户点击授权登录按钮并同意授权后,微信小程序会回调bindgetuserinfo指定的函数。在这个函数中,可以通过wx.login()方法获取登录凭证codecode是一个临时的凭证,只能使用一次,有效期较短,用于后续获取openid等信息。

wx.login({
  success: res => {
    // res.code就是获取到的code
    const code = res.code;
    console.log('获取到的code:', code);
    // 可以将code发送到后端服务器进行下一步处理
  },
  fail: err => {
    console.error('获取code失败', err);
  }
});

4.后端服务器获取openid

(1)封装 HTTP 请求函数

为了方便后续发起 HTTP 请求,可以封装一个通用的函数来处理不同类型的请求。

function httpRequest($url, $method = 'GET', $data = []) {
    $ch = curl_init();
    if ($method === 'POST') {
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
    }
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 忽略 SSL 验证,生产环境建议配置证书
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    $response = curl_exec($ch);
    if (curl_errno($ch)) {
        echo 'Curl error: '. curl_error($ch);
    }
    curl_close($ch);
    return $response;
}

(2)实现获取 openid 的接口

在 PHP 脚本中,接收前端传递的 code,并调用微信接口获取 openid

<?php
// 引入上述封装的 httpRequest 函数

// 获取前端传递的 code
$code = $_GET['code']?? '';
if (empty($code)) {
    http_response_code(400);
    echo json_encode(['error' => '缺少 code 参数']);
    exit;
}

// 配置小程序的 appid 和 secret
$appid = '你的小程序 appid';
$secret = '你的小程序 secret';

// 构建请求 URL
$url = "https://api.weixin.qq.com/sns/jscode2session?appid={$appid}&secret={$secret}&js_code={$code}&grant_type=authorization_code";

// 发起 HTTP 请求
$response = httpRequest($url);
$data = json_decode($response, true);

// 检查是否成功获取 openid
if (isset($data['openid'])) {
    http_response_code(200);
    echo json_encode(['openid' => $data['openid']]);
} else {
    http_response_code(500);
    echo json_encode(['error' => '获取 openid 失败', 'detail' => $data]);
}
?>

(3)代码升级建议

3.1 错误处理与日志记录

在实际应用中,为了更好地排查问题,需要对可能出现的错误进行详细的日志记录。可以使用 PHP 的 error_log 函数将错误信息记录到日志文件中。

// 在 httpRequest 函数中添加错误日志记录
function httpRequest($url, $method = 'GET', $data = []) {
    $ch = curl_init();
    if ($method === 'POST') {
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
    }
    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);
    $response = curl_exec($ch);
    if (curl_errno($ch)) {
        $error = 'Curl error: '. curl_error($ch);
        error_log($error, 3, 'curl_errors.log'); // 将错误信息记录到 curl_errors.log 文件中
        echo $error;
    }
    curl_close($ch);
    return $response;
}
3.2 配置管理

将小程序的 appidsecret 等敏感信息存储在配置文件中,避免硬编码在代码里,提高代码的安全性和可维护性。

// config.php 文件
<?php
return [
    'appid' => '你的小程序 appid',
    'secret' => '你的小程序 secret'
];
// 在获取 openid 的脚本中引入配置文件
<?php
require_once 'config.php';
$config = require 'config.php';
$appid = $config['appid'];
$secret = $config['secret'];
// 后续代码保持不变
?>
3.3 安全性增强

为了防止跨站请求伪造(CSRF)攻击,可以在前端和后端之间添加额外的验证机制,例如使用 state 参数。在前端调用 wx.login 时生成一个随机的 state 值,并将其传递给后端,后端在接收 code 时验证 state 的一致性。

3.4 缓存机制

为了减少对微信接口的频繁调用,可以考虑添加缓存机制。例如,使用 Redis 缓存 openid,在一定时间内,如果再次收到相同的 code,可以直接从缓存中获取 openid,而不必再次调用微信接口。

通过以上步骤,你可以将原有的 PHP 代码进行升级,使其更加健壮、安全和高效。

存储和使用openid
- 后端服务器获取到openid后,可以将其存储在数据库中,与用户的其他信息进行关联。后续用户再次登录或者进行其他操作时,就可以通过openid来识别用户身份,实现个性化的功能和服务。

在整个流程中,需要注意保护用户的隐私和数据安全,确保appidsecret等敏感信息不被泄露。同时,要根据微信的相关规定和政策,合理使用用户的授权信息,为用户提供良好的使用体验。


@漏刻有时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漏刻有时

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值