参考:https://www.cnblogs.com/liangzia/p/9957626.html(主要)
https://www.cnblogs.com/zxf100/p/11849878.html


前言

提示:微信小程序登录大概逻辑及实现
例如:前后端分离项目


一、大概逻辑

小程序端准备若干参数传至后端,后端生成token返回(后端是https接口)

二、实现步骤

1.小程序前端实现

直接上代码

  <button 
      open-type="getUserInfo" 
      bindgetuserinfo="onGetUserInfo"
      class="userinfo-avatar"
      style="background-image: url({{avatarUrl}})"
      size="default"
    ></button>
onGetUserInfo: function(e) {
    if (!this.data.logged && e.detail.userInfo) {
      console.log(e)
      
  <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">setData</span><span class="token punctuation">(</span><span class="token punctuation">{<!-- --></span>
    logged<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>
    avatarUrl<span class="token punctuation">:</span> e<span class="token punctuation">.</span>detail<span class="token punctuation">.</span>userInfo<span class="token punctuation">.</span>avatarUrl<span class="token punctuation">,</span>
    userInfo<span class="token punctuation">:</span> e<span class="token punctuation">.</span>detail<span class="token punctuation">.</span>userInfo
  <span class="token punctuation">}</span><span class="token punctuation">)</span>


  wx<span class="token punctuation">.</span><span class="token function">login</span><span class="token punctuation">(</span><span class="token punctuation">{<!-- --></span>
    success<span class="token punctuation">:</span><span class="token keyword">function</span><span class="token punctuation">(</span>res<span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
    
    console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>res<span class="token punctuation">)</span><span class="token punctuation">;</span>
    wx<span class="token punctuation">.</span><span class="token function">request</span><span class="token punctuation">(</span><span class="token punctuation">{<!-- --></span>
      <span class="token comment">// url: 'http://127.0.0.1:12001/api/frontend/user/checkIdentity',</span>
      url<span class="token punctuation">:</span> <span class="token string">'https://www.baidu.net/api/frontend/user/checkIdentity'</span><span class="token punctuation">,</span>
      method<span class="token punctuation">:</span> <span class="token string">'POST'</span><span class="token punctuation">,</span>
      header<span class="token punctuation">:</span> <span class="token punctuation">{<!-- --></span> <span class="token string">'content-type'</span><span class="token punctuation">:</span> <span class="token string">'application/x-www-form-urlencoded'</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>
      data<span class="token punctuation">:</span> <span class="token punctuation">{<!-- --></span>
        encryptedData<span class="token punctuation">:</span> e<span class="token punctuation">.</span>detail<span class="token punctuation">.</span>encryptedData<span class="token punctuation">,</span>
        signature<span class="token punctuation">:</span> e<span class="token punctuation">.</span>detail<span class="token punctuation">.</span>signature<span class="token punctuation">,</span>
        rawData<span class="token punctuation">:</span> e<span class="token punctuation">.</span>detail<span class="token punctuation">.</span>rawData<span class="token punctuation">,</span>
        iv<span class="token punctuation">:</span> e<span class="token punctuation">.</span>detail<span class="token punctuation">.</span>iv<span class="token punctuation">,</span>
        code<span class="token punctuation">:</span>res<span class="token punctuation">.</span>code
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      success<span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span>res_user<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
        console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token number">11111</span><span class="token punctuation">)</span>
        console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>res_user<span class="token punctuation">)</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>res_user<span class="token punctuation">.</span>data<span class="token punctuation">.</span>status <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
          <span class="token keyword">var</span> data <span class="token operator">=</span> <span class="token constant">JSON</span><span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span>res_user<span class="token punctuation">.</span>data<span class="token punctuation">.</span>msg<span class="token punctuation">)</span>    <span class="token comment">//json转对象</span>
          <span class="token comment">//授权成功返回的数据,根据自己需求操作</span>
          console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span>

        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span> fail<span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
          console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'ajax失败了'</span><span class="token punctuation">)</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span>
 
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span>

},

2.引入微信验证库(坑多)

首先到官方链接:搜索“点击下载”,然后剪切这几个文件到项目文件夹,引入,且得使用include_once app_path() . "/Library/Wechat/wxBizDataCrypt.php";这种方式,不知道为啥要用这么古老得方法,而且里面得代码写的真是~

3.接口实现

具体逻辑思路看代码

 public function checkIdentity($request)
    {

    <span class="token variable">$encryptedData</span> <span class="token operator">=</span> <span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token property">encryptedData</span> <span class="token operator">?</span><span class="token operator">?</span> <span class="token single-quoted-string string">''</span><span class="token punctuation">;</span>
    <span class="token variable">$iv</span> <span class="token operator">=</span> <span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token property">iv</span> <span class="token operator">?</span><span class="token operator">?</span> <span class="token single-quoted-string string">''</span><span class="token punctuation">;</span>
    <span class="token variable">$signature</span> <span class="token operator">=</span> <span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token property">signature</span> <span class="token operator">?</span><span class="token operator">?</span> <span class="token single-quoted-string string">''</span><span class="token punctuation">;</span>
    <span class="token variable">$rawData</span> <span class="token operator">=</span> <span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token property">rawData</span> <span class="token operator">?</span><span class="token operator">?</span> <span class="token single-quoted-string string">''</span><span class="token punctuation">;</span>
    <span class="token variable">$code</span> <span class="token operator">=</span> <span class="token variable">$request</span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token property">code</span> <span class="token operator">?</span><span class="token operator">?</span> <span class="token single-quoted-string string">''</span><span class="token punctuation">;</span>
	<span class="token comment">// 获取sessionKey和openId后面要用</span>
    <span class="token function">list</span><span class="token punctuation">(</span><span class="token variable">$sessionKey</span><span class="token punctuation">,</span> <span class="token variable">$openId</span><span class="token punctuation">)</span> <span class="token operator">=</span> WeChatUtil<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">getSessionKeyOpenId</span><span class="token punctuation">(</span><span class="token variable">$code</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">// 验证</span>
    <span class="token variable">$signature2</span> <span class="token operator">=</span> <span class="token function">sha1</span><span class="token punctuation">(</span><span class="token variable">$rawData</span> <span class="token punctuation">.</span> <span class="token variable">$sessionKey</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$signature</span> <span class="token operator">!=</span> <span class="token variable">$signature2</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
        <span class="token keyword">throw</span> FrontendException<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token number">200011</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token comment">/**
     * 根据open_id找
     * 如果没有就继续执行下去,解密得到info
     * 新增进去
     */</span>
    <span class="token variable">$user</span> <span class="token operator">=</span> self<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">getSingleByOpenId</span><span class="token punctuation">(</span><span class="token variable">$openId</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token variable">$user</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
        <span class="token variable">$wxBizDataCrypt</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name"><span class="token punctuation">\</span>WXBizDataCrypt</span><span class="token punctuation">(</span><span class="token function">env</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'XCX_APP_ID'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$sessionKey</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token variable">$errorCode</span> <span class="token operator">=</span> <span class="token variable">$wxBizDataCrypt</span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">decryptData</span><span class="token punctuation">(</span><span class="token variable">$encryptedData</span><span class="token punctuation">,</span> <span class="token variable">$iv</span><span class="token punctuation">,</span> <span class="token variable">$data</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token variable">$errorCode</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
            <span class="token variable">$data</span> <span class="token operator">=</span> <span class="token function">json_decode</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">,</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token variable">$user</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Users</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token variable">$user</span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token property">username</span> <span class="token operator">=</span> <span class="token variable">$data</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'nickName'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
            <span class="token variable">$user</span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token property">open_id</span> <span class="token operator">=</span> <span class="token variable">$data</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'openId'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
            <span class="token variable">$user</span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token property">country</span> <span class="token operator">=</span> <span class="token variable">$data</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'country'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>

            <span class="token variable">$user</span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">save</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
    <span class="token variable">$params</span> <span class="token operator">=</span> <span class="token punctuation">[</span>
        <span class="token single-quoted-string string">'username'</span> <span class="token operator">=</span><span class="token operator">&gt;</span> <span class="token variable">$user</span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token property">username</span><span class="token punctuation">,</span>
        <span class="token single-quoted-string string">'password'</span> <span class="token operator">=</span><span class="token operator">&gt;</span> <span class="token single-quoted-string string">'123456'</span>
    <span class="token punctuation">]</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token variable">$token</span> <span class="token operator">=</span> Auth<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">guard</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'api'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">attempt</span><span class="token punctuation">(</span><span class="token variable">$params</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token operator">?</span> <span class="token punctuation">[</span><span class="token single-quoted-string string">'token'</span> <span class="token operator">=</span><span class="token operator">&gt;</span> <span class="token single-quoted-string string">'bearer '</span> <span class="token punctuation">.</span> <span class="token variable">$token</span><span class="token punctuation">]</span>
        <span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token single-quoted-string string">'error'</span> <span class="token operator">=</span><span class="token operator">&gt;</span> <span class="token single-quoted-string string">'获取token失败'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>

// throw FrontendException::error(200012); }

总结

提示:自己写了简单的前端页面对接的,感觉比H5的微信登录简单些🧐