uniapp+Laravel实现微信小程序手机号一键登录全流程(附前后端代码及详细解释)

实现微信小程序手机号一键登录的流程主要分为以下几个步骤,这里将结合UniApp(一个使用Vue.js开发所有前端应用的框架)和Laravel(一个PHP Web开发框架)来详细介绍。这个过程涉及前端的微信小程序接口调用、后端的用户验证与处理,以及两者的交互。

1. 准备工作

  • 微信小程序开发环境:确保你已经注册了微信小程序并获取了AppID。
  • UniApp:安装并配置好UniApp开发环境。
  • Laravel后端:搭建并配置好Laravel项目,包括数据库连接等。
  • 微信开发者平台:在微信公众平台注册小程序,获取AppID和AppSecret,并在小程序管理后台开启“微信登录”功能,同时需要申请“短信服务”。

2. 前端(UniApp)实现

2.1 获取用户授权并发起登录请求

在微信小程序中,首先需要用户授权获取手机号码。通过wx.login获取code,然后通过wx.getUserProfilewx.getPhoneNumber获取用户信息或手机号(需用户授权)。

// pages/login/index.vue
onLoad() {
  // 调用微信登录接口获取code
  wx.login({
    success: (res) => {
      if (res.code) {
        this.code = res.code; // 保存code用于后续请求
        // 请求后端进行微信登录验证并获取手机号
        this.getPhoneNumber();
      } else {
        console.log('登录失败!' + res.errMsg);
      }
    }
  });
},
getPhoneNumber(e) {
  if (e && e.detail.errMsg === 'getPhoneNumber:ok') {
    // 用户同意授权获取手机号
    wx.request({
      url: `${this.$api.baseUrl}/login/phone`, // 后端接口地址
      method: 'POST',
      data: {
        code: this.code,
        encryptedData: e.detail.encryptedData,
        iv: e.detail.iv,
      },
      success: (res) => {
        if (res.data.status === 'success') {
          // 登录成功,根据返回的token等信息进行后续操作
          uni.setStorageSync('token', res.data.token);
          this.$router.replace('/home');
        } else {
          uni.showToast({ title: '登录失败', icon: 'none' });
        }
      },
      fail: (err) => {
        console.error('请求失败', err);
      }
    });
  }
}

3. 后端(Laravel)实现

3.1 微信登录验证并获取手机号

在Laravel中,你需要创建一个控制器方法来处理微信小程序发来的登录请求。这通常涉及到使用微信的API来验证code,解密获取到的手机号码,并进行用户注册或登录逻辑。

// Laravel 控制器示例,如 App\Http\Controllers\WechatController.php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use GuzzleHttp\Client;

class WechatController extends Controller
{
    public function loginWithPhone(Request $request)
    {
        $code = $request->input('code');
        $encryptedData = $request->input('encryptedData');
        $iv = $request->input('iv');

        // 使用code换取session_key和openid
        $result = Http::asForm()->post('https://api.weixin.qq.com/sns/jscode2session', [
            'appid' => env('WECHAT_APP_ID'),
            'secret' => env('WECHAT_APP_SECRET'),
            'js_code' => $code,
            'grant_type' => 'authorization_code',
        ]);

        if ($result->successful()) {
            $data = $result->json();
            $sessionKey = $data['session_key'];

            // 解密手机号
            $client = new Client();
            $response = $client->post('https://api.weixin.qq.com/wxa/business/getuserphonenumber', [
                'json' => [
                    'iv' => $iv,
                    'encrypted_data' => $encryptedData,
                    'session_key' => $sessionKey,
                ],
            ]);

            $phoneNumberRes = json_decode($response->getBody(), true);
            if ($phoneNumberRes['errcode'] == 0) {
                $phoneNumber = $phoneNumberRes['phoneNumber'];

                // 在这里处理用户登录或注册逻辑,例如查找或创建用户,生成Token等
                // ...

                return response()->json(['status' => 'success', 'token' => $generatedToken]);
            } else {
                return response()->json(['status' => 'fail', 'message' => '获取手机号失败']);
            }
        } else {
            return response()->json(['status' => 'fail', 'message' => '微信登录验证失败']);
        }
    }
}

4. 注意事项

  • 确保在微信开发者平台正确配置你的小程序,包括AppID、AppSecret,并启用相应接口权限。
  • 对于敏感操作(如获取手机号),确保遵循微信的用户隐私协议,且用户已明确授权。
  • 在后端处理手机号解密时,确保使用安全的方式存储和处理用户数据。
  • 实际部署时,记得替换示例代码中的环境变量(如env('WECHAT_APP_ID'))为实际值。

以上就是使用UniApp和Laravel实现微信小程序手机号一键登录的基本流程和关键代码。请根据具体需求调整和完善代码细节。

### 实现微信小程序一键授权登录的功能 #### 1. 使用微信小程序官方API实现一键登录微信小程序中,可以通过调用微信的 `wx.login` 和 `wx.getUserProfile` 接口来实现用户的授权登录功能。这些接口允许开发者获取用户的 openid 或者 unionid,并进一步请求用户的手机号码。 以下是一个简单的示例代码: ```javascript // app.js App({ onLaunch() { wx.login({ success(res) { if (res.code) { console.log('登录成功', res); // 将 code 发送到服务器换取 session_key 和 openid } else { console.error('登录失败:', res.errMsg); } }, }); }, }); ``` 当用户点击按钮触发授权时,可以使用如下方法获取用户信息[^1]: ```javascript Page({ getUserInfo(e) { const { errMsg, iv, encryptedData } = e.detail; if (errMsg === 'getPhoneNumber:ok') { // 调用后端接口解密数据 wx.request({ url: 'https://your-server-url/api/decrypt', method: 'POST', data: { encryptedData, iv, }, success(res) { console.log('手机号解析成功', res.data.phoneNumber); }, fail(err) { console.error('手机号解析失败', err); }, }); } else { console.warn('用户拒绝提供手机号'); } }, }); ``` --- #### 2. 在 UniApp实现一键登录 如果开发环境是基于 UniApp,则需要结合 Vue 的语法以及微信的小程序 API 来完成同样的功能。以下是具体的实现方式[^2]: ##### 页面配置 在页面中放置一个按钮用于触发授权操作: ```html <template> <view class="content"> <button open-type="getPhoneNumber" @getphonenumber="getUserPhone">一键登录</button> </view> </template> <script> export default { methods: { async getUserPhone(e) { try { const { errMsg, iv, encryptedData } = e.detail; if (errMsg !== 'getPhoneNumber:ok') throw new Error('用户未同意'); const response = await this.$http.post('/api/login', { encryptedData, iv, }); console.log('登录成功', response); } catch (error) { console.error('登录失败', error.message || error); } }, }, }; </script> ``` 上述代码实现了通过 `open-type="getPhoneNumber"` 获取用户手机号并发送到服务端进行解密的过程。 --- #### 3. 后端配合实现完整的登录流程 无论是使用 Go 还是 Laravel,在后端都需要对接收到的数据进行解密处理。以下是两种常见技术栈的具体实现方案[^3][^4]。 ##### (1)Go 实现解密逻辑 后端接收来自前端传递的加密数据和初始向量(IV),并通过微信提供的公钥对其进行解密: ```go package main import ( "encoding/json" "fmt" "log" "github.com/eure/wxDecrypt" ) func decrypt(encryptedData string, iv string, sessionKey string) map[string]interface{} { result := make(map[string]interface{}) err := wxDecrypt.New(sessionKey).Decode(iv, encryptedData, &result) if err != nil { log.Fatalf("解密失败:%v", err) } return result } func main() { sessionKey := "exampleSessionKeyFromWeChat" encryptedData := "encryptedUserDataFromFrontend" iv := "initializationVectorFromFrontend" data := decrypt(encryptedData, iv, sessionKey) fmt.Println(data["phoneNumber"]) } ``` ##### (2)Laravel 实现解密逻辑 在 PHP/Laravel 环境下也可以轻松实现类似的解密逻辑: ```php <?php namespace App\Http\Controllers; use Illuminate\Support\Facades\Crypt; class WechatController extends Controller { public function login(Request $request) { $sessionKey = 'exampleSessionKey'; $encryptedData = $request->input('encryptedData'); $iv = $request->input('iv'); $data = openssl_decrypt( base64_decode($encryptedData), 'AES-128-CBC', $sessionKey, OPENSSL_RAW_DATA, base64_decode($iv) ); return json_decode($data)->phoneNumber ?? null; } } ``` --- ### 总结 通过以上步骤,可以在微信小程序中快速实现一键授权登录功能。无论是在纯微信小程序还是跨平台框架(如 UniApp)上,核心思路都是利用微信开放的能力获取用户信息,并由后端负责敏感数据的安全存储与管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值