做小程序的流程总结(基本篇)

一、首先当我们借助小程序实现我们的网站搭建时,就需要使用小程序自带的一些功能;且需要根据该小程序获取到的一些参数存储到对应的数据库中。

       openID:每个微信用户使用该小程序时都会产生一个openID,且该openID是唯一标识,因此可将其存储在用户表中。

       token:这个token值是我们自己在内部生成的,主要是为了安全获取UID,UID在数据库中存储中的是数据记录的唯一ID,如果单纯的传入UID值来获取

                    该UID的信息值的话,会不安全,因此需要通过token来获取,如何获取我会提供一系列代码;

//随意生成的TOKEN值
public static function generateToken(){$randChar = getRandChar(32);$timestamp = $_SERVER['REQUEST_TIME_FLOAT'];$tokenSalt = config('secure.salt');return md5($randChar . $timestamp . $tokenSalt);} public static function verifyToken($token){$exist = Cache::get($token);if($exist){return true;}else{return false;}}//获取以token为键值的部分,获取对应的值public static function getCurrentTokenVar($key){$request=Request::instance();$token = input("token");if($token==""){$token=$request->header("token");}$vars = Cache::get($token);if (!$vars){throw new TokenException();}else {if(!is_array($vars)){$vars = json_decode($vars, true);}if (array_key_exists($key, $vars)) {return $vars[$key];}else{ // throw new Exception('尝试获取的Token变量并不存在');return false;}}}
function __construct($code){$this->code=$code;$this->wxAppId=config("wx.app_id");$this->wxAppSecret=config("wx.app_secret");$this->wxLoginUrl=sprintf(config("wx.login_url"),$this->wxAppId,$this->wxAppSecret,$this->code);}/** 登录*/public function get(){$result = curl_get($this->wxLoginUrl);// 注意json_decode的第一个参数true// 这将使字符串被转化为数组而非对象$wxResult = json_decode($result, true);if (empty($wxResult)) {// 为什么以empty判断是否错误,这是根据微信返回// 规则摸索出来的// 这种情况通常是由于传入不合法的codethrow new Exception('获取session_key及openID时异常,微信内部错误');}else {// 建议用明确的变量来表示是否成功// 微信服务器并不会将错误标记为400,无论成功还是失败都标记成200// 这样非常不好判断,只能使用errcode是否存在来判断$loginFail = array_key_exists('errcode', $wxResult);if ($loginFail) {$this->processLoginError($wxResult);}else {return $this->grantToken($wxResult);}}}//颁发令牌private function grantToken($wxResult){// 此处生成令牌使用的是TP5自带的令牌// 如果想要更加安全可以考虑自己生成更复杂的令牌// 比如使用JWT并加入盐,如果不加入盐有一定的几率伪造令牌//        $token = Request::instance()->token('token', 'md5');$openid = $wxResult['openid'];$user = User::getByOpenID($openid);if (!$user)// 借助微信的openid作为用户标识// 但在系统中的相关查询还是使用自己的uid
        {$uid = $this->newUser($openid);$type=0;}else {$uid = $user->id;$type=$user->type;}$cachedValue = $this->prepareCachedValue($wxResult, $uid,$type);$token = $this->saveToCache($cachedValue);return $token;}private function processLoginError($wxResult){throw new WeChatException(['msg' => $wxResult['errmsg'],'errorCode' => $wxResult['errcode']]);}/**创建一个新用户* @param $openid* @return mixed*/private function newUser($openid){// 有可能会有异常,如果没有特别处理// 这里不需要try——catch// 全局异常处理会记录日志// 并且这样的异常属于服务器异常// 也不应该定义BaseException返回到客户端$user = User::create(['openid' => $openid]);return $user->id;}/**准备存入缓存的数据* @param $wxResult* @param $uid* @return mixed*/private function prepareCachedValue($wxResult, $uid,$type){$cachedValue = $wxResult;$cachedValue['uid'] = $uid;$cachedValue['type']=$type;$cachedValue['scope'] =config("secure.user");;return $cachedValue ;}/*** 存入缓存*/private function saveToCache($wxResult){$key = self::generateToken();$value = json_encode($wxResult);$expire_in = config('secure.time');$result = cache($key, $value, $expire_in);if (!$result){throw new TokenException(['msg' => '服务器缓存异常','errorCode' => 10005]);}return $key;}

二、当获取到token时,需要在小程序的缓存中也存入该token值;

wx.setStorageSync('token', res.data.token);

使用小程序请求数据时,将token的值存入Header中,后台获取到Token的值,会进行相应的处理,获取到对应的UID

 

转载于:https://www.cnblogs.com/baiyangLI/p/9300147.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413743.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js对象数组 按对象的某一属性进行去重

var array [{ id: 1, name: "张三"},{ id: 2, name: "李四"},{ id: 3, name: "张龙"},{ id: 4, name: "赵虎"},{ id: 5, name: "王朝"},{ id: 1, name: "刘金刚"},{ id: 6, name: "马汉"}, ]var obj …

[vue-cli]vue-cli怎么解决跨域的问题?

[vue-cli]vue-cli怎么解决跨域的问题? 在根目录下新建:vue.config.js注意名不能错误,然后里面配置 module.exports { devServer: { proxy: { //配置跨域 /api: { target: 跨域url, ws: true, changOrigin: true // pathRewrite: { // ^/api…

java - springmvc整合cxf发布webservice

1.jar包已上传百度云盘&#xff0c;在jar包目录下 2.web.xml配置 <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:schemaLocation" http://java.sun.com/xml/ns/javaee http://jav…

CSS3 选择前几个元素 选择后几个元素等问题

//例如有如下代码块 <div><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p> </div>1.选择第n个p div:nth-child(n) p:nth-of-type(n)2.选择倒数第n…

[vue-cli] vue-cli中你经常的加载器有哪些?

[vue-cli] vue-cli中你经常的加载器有哪些&#xff1f; style,css,vue,postcss,url等个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

Python中将array类型不按科学计数法存在文件中的方法

直接上代码&#xff1a; from numpy import *import numpy as npDrug_array zeros((708,708),dtype int)f open(D:\mat_drug_drug.txt)lines f.readlines()Drug_row 0for line in lines: list line.strip(\n).split( ) Drug_array[Drug_row:] list[:] Drug_row…

[vue-cli] 你知道什么是脚手架吗?

[vue-cli] 你知道什么是脚手架吗&#xff1f; vue项目一般是使用webpack进行打包构建的&#xff0c;然而如果每一个项目都需要我们去配置loader和plugin的话&#xff0c;是很重复的劳动&#xff0c;并且vue项目需要使用到的最基本的webpack loader和webpack plugin是相同的。因…

Vue报错:Elements in iteration expect to have ‘v-bind:key‘ directives的解决办法

1.我们在使用v-for的时候&#xff0c;在v-for 后添加 v-bind:key"ite Vue 2.2.0的版本里&#xff0c;当在组件中使用v-for时&#xff0c;key是必须的。 1.我们在使用v-for的时候&#xff0c;在v-for 后添加 v-bind:key"item" <div v-for"todo in to…

vue报错:error Strings must use singlequote quotes 字符串必须使用单引号

例出现下面报错 这个问题说明必须使用单引号&#xff0c;在vue的项目开发中&#xff0c;如果我们在通过vue-cli脚手架构建项目的时候使用了Eslint严格模式&#xff0c;那么对于字符串类型的数据String必须要使用单引号&#xff0c;不能使用双引号&#xff0c;否则会报异常。所以…

Java数组概述和定义

1、数组概述和定义格式说明    为什么要有数组(容器)&#xff1a;       为了存储同种数据类型的多个值  数组概念&#xff1a;      数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。      数组既可以存储基本数据类型&#xff0c;也可…

工作327:uni-数据格式处理

allPrpos(obj) { // 用来保存所有的属性名称和值let list[]var props "";// 开始遍历for(var p in obj){ // 方法if(typeof(obj[p])"function"){ obj[p]();}else{ // p 为属性名称&#xff0c;obj[p]为对应属性的值if(p.indexOf("apic") ! -1){…

vue eslint报错Expected linebreaks to be ‘LF‘ but found ‘CRLF‘

原因&#xff1a;在使用不同的编辑器和操作系统时&#xff0c;我们使用的换行操作不一样&#xff0c;造成了这种报错 解决方法&#xff1a;在.eslintrc.js文件里面&#xff0c;在 rule&#xff1a;下面加上”linebreak-style“:[0&#xff0c;“error”&#xff0c;“window”…

mysql数据库的设计

数据库的设计有一个严谨的流程&#xff0c;根据流程制作一个完整的数据库&#xff0c;可以省去很多的时间&#xff0c;也可以最大程度上与客户的想法契合。 需求分析阶段&#xff1a;分析客户的业务和数据处理需求 概要设计阶段&#xff1a;设计数据库的E-R模型图&#xff0c;确…

[vue-cli] 说下你了解的vue-cli原理?你可以自己实现个类vue-cli吗?

[vue-cli] 说下你了解的vue-cli原理&#xff1f;你可以自己实现个类vue-cli吗&#xff1f; 原理就是通过node环境发起git请求&#xff0c;把预先设置好的模板下载下来。 给时间的话&#xff0c;应该可以实现&#xff0c;需要用到一些npm包个人简介 我是歌谣&#xff0c;欢迎和…

配置svn 报错E200002解决办法

新买个mac配置svn&#xff0c;在修改配置文件svnserve.conf保存的时候 报了一个E200002错误 就很懵逼 去网上找了一下资料才了解原因&#xff1a; svnserve.conf 文件配置需要顶格写 不能换行或者空格&#xff01; 改完就对了&#xff01;

NTP服务器时间同步

一、简要说明 二、安装步骤 三、配置文件 四、常用命令 五、注意事项 六、运行截图 七、参考资料一、简要说明 搭建Kubernetes环境&#xff0c;需要几台、几十台机器配合运作&#xff0c;许多集群服务比如Etcd等都依赖系统的时间&#xff0c;如果机器的系统时间不一致…

[Css] 使用css如何拉伸字体?

[Css] 使用css如何拉伸字体&#xff1f; letter-spacing&#xff0c;transform:scale个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

[bug] uni-app 支付宝小程序 上传文件uni.uploadFile 报错 errMsg: “uploadFile:fail 无效参数“

首先看报错 就挺奇怪的 uni.chooseImage返回的参数都没问题&#xff0c; H5上也能正常运行 看下我的uni.uploadFile函数 uni.uploadFile({url: baseUrl params_.url,name: file,filePath: params_.query.files,formData: param_,success: (res) > {uni.hideLoading() …

mysql安装innodb插件

1.可以用 show engines;或者show plugins;来查看 mysql> show plugins; --------------------------------------------------------------------------------------- | Name | Status | Type | Library | License | ----…

[css] 写出固定子容器在固定的父容器下水平垂直居中的布局

[css] 写出固定子容器在固定的父容器下水平垂直居中的布 1.父容器 position: relative,子元素 position: absolute;left: 50%;top: 50%;transform:translate3d(-50%,-50%,0). 2.父容器 display:flex; align-items:center;just-content:center.个人简介 我是歌谣&#xff0c;欢…