参考: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">></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">></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">></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">></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">></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">></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">></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">></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">></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">></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">></span> <span class="token variable">$user</span><span class="token operator">-</span><span class="token operator">></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">></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">></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">></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">></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的微信登录简单些🧐
