- 1.小程序的优势
- 2.小程序的页面构成(4个文件)
- 3.小程序的生命周期
- 4.小程序如何请求数据
- 5.如何提高小程序的首屏加载时间
- 6.请简述你经常使用的小程序的组件
- 7.Wxss与css的区别请简述
- 8.小程序如何实现响应式
- 9.怎么优化小程序
- 10.小程序如何显示用户头像与用户名
- 11.请谈谈小程序的双向绑定和vue的异同
- 12.小程序中传参是怎么传的
- 14.如何让事件在捕获阶段触发
- 15.小程序页面间有那些传递数据的方法
- 16.你是怎么封装微信小程序的数据请求的
- 17.说一下微信小程序的适配问题
- 18.小程序跳转页面的方式
- 21.在小程序中如何获取用户信息
- 22.小程序中如何实现分享功能,微信有什么限制
- 23.你的小程序是如何上线的,审核大概需要多久?
- 24.小程序中如何用像Vant一样的第三方组件
- 25.小程序如何实现父子组件传参
- 26.小程序中APP的生命周期有哪些
- 27.小程序中Page的生命周期有哪些
- 28.小程序如何定义事件
- 29.如何阻止小程序的事件冒泡
- 30.如何让事件在捕获阶段触发
- 31.如何实现下拉刷新
- 32.bindtap和catchtap的区别是什么
- 33.简述下 wx.navigateTo(), wx.redirectTo(), wx.switchTab(), wx.navigateBack(), wx.reLaunch()的区别
- 34.小程序调用后台接口遇到哪些问题?
- 35.stroageSync和stroage区别?
36.支付流程">
36.支付流程- openID和unionID区别
小程序的本地存储
1.小程序的优势
- 不用安装即开即用,用完就走
- 体验上虽然没办法媲美APP,但综合考虑还是更优
- 对小程序拥有者来说,开发成本更低
对于用户来说,相较于各种APP,微信小程序UI和操作流程会更统一
2.小程序的页面构成(4个文件)
app.js 注册小程序 App({})
- index.js 注册页面 Page({})
- app.json 配置小程序页面路径和窗口表现
- index.wxml 添加页面布局
3.小程序的生命周期
应用生命周期
- onLaunch;初始化小程序是触发,全局支出法一次
- onShow:小程序初始化完成或者用户从后台切换到前台显示时触发
- onHide:用户从前台切换到后台隐藏时触发
- onError:小程序发生脚本错误,或者api调用失败,会触发onError并带上错误信息
- onPageNotFound:当小程序第一次打开的时候,找不到入口页面,才会触发
- 后台:当用户单击左上角关闭,或者按了设备Home件准备离开微信,小程序并没有直接销毁,而是进入了后台
- 前台:当再次进入微信或再次打开小程序,又会从后台进入前台
页面生命周期
- onLoad:页面加载 1) 一个页面只会调用一次 2) 参数可以获取wx.navigateTo和wx.redireacTo及中的query
- onShow页面显示 1) 每次打开都会调用一次
- onReady:页面初次渲染完成 1) 一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互 2)对界面的设置如wx.setNavigtionBarTitle请在inReady之后设置,
- onHide:页面隐藏 1) 当navgateTo或底部tab切换时调用
- onUnload:页面卸载 1) 当rediectTo或navigateBack的时候调用
- onPullDownRefresh :监听用户下拉
- onReachBottom :监听页面触底 可以编写下拉加载
- onShareAppMessage:监听用户右上角转换
- onPageScroll:监听页面滚动
- onResize :页面尺寸发生改变的时候触发 为横竖屏切换 需要页面中开启横屏:在app.json window,或者指定页面的json文件中,添加 “pageOrientation”:”auto”
- onTabItemTap:当该页面指定的tab页面,再次点击这个tabbar对应的tab按钮,就会触发
应用及页面生命周期的触发顺序
4.小程序如何请求数据
微信小程序不存在ajax,那么它是如何实现数据请求功能的呢?
在微信官方文档中提供了API的调用wx.request()来请求数据
我们需要把微信小程序数据请求的坑过一遍
- 微信小程序的请求地址需要在开发者小程序请求的坑过一遍
- 微信的小程序必须是https接口,并且默认443端口,也就是说,不允许修改默认端口
- 域名必须经过ICP备案
- 关于https证书
- 然后把这个勾勾去掉叫OK了
在小程序的生命周期函数中使用 (具体哪个生命周期看需求)
wx.request({
url:'https://xxx.xxx' //接口地址
//向后传递数据
data:{
参数1:'',
参数2:' '
},
// 设置header头
header:{
'content-type':'application.json' //默认值
}
// 请求成功进行逻辑操作
success:function(res){
console.log(res)
}
})
5.如何提高小程序的首屏加载时间
- 请求前置:提前请求数据,缩短页面加载时间
- 首屏直出:请求前,利用已有数据,跳过”页面加载”的过程
- 数据缓存:请求后,缓存接口请求的数据
6.请简述你经常使用的小程序的组件
组件: 路由组建,类似于html中a标签的功能.其中open-type对应于路由相关的API,可以是navigate.reLaunch,redirectTo,navigateBack,除此之外,还可以是exit表示退出小程序.url的路径要使用绝对路径,最前端带有/ 组件:在小程序中实现富文本编辑器需要用到editor组件,在editor组件中要给它一个id属性,EditorContext是通知id和editor组件关联 组件:摄像头组件,摄像头的使用需要组件和API配合,当然在使用camera组件的时候 组件:块级组件,代替原来的div标签 组件,富文本标签,可用将字符串解析成对应的标签.其中rich-text组件内会屏蔽所有节点的事件 组件:单选框组件,可用color属性来修改选择时的颜色,但是radio需要搭配radio-group来使用 组件:多选框组件,可以通过 color属性来修改颜色,但是checkbox需要搭配checkbo-groupx来使用。 组件:图标组件,有三个属性,其中type为icon的类型,string形式的;size为icon的大小,长度单位默认为px;color为icon的颜色,和css样式中的color一样 - 组件:输入框组件,该组件是原生组件,使用时请注意相关限制。常用的属性有value:输入框的初始内容,string类型,为必填选项;type:input的类型,string类型,默认为text;placeholder:输入框为空时的占位符,string类型,为必填选项。
7.Wxss与css的区别请简述
- 新增了rex尺寸单位
- css中需要手动进行像素单位换算,如rem
- wxss在底层支持新的尺寸单位rpx在不同大小的屏幕上小程序会自动进行换算
- 提供了全局的样式和局部样式
- 项目根目录中的app.wxss会作用于所有小程序页面
- 局部页面的wxss样式仅对当前页面有效
- wxss仅支持部分css选择器
- .class和#id
- 并集选择器 后代选择器
-
8.小程序如何实现响应式
9.怎么优化小程序
使用CDN资源,减少服务器带宽压力
- 路由懒加载
- 将一些静态 js css 放到其他地方(如OSS),减少服务器压力
- 按需加载三方资源,如iview,建议按需引入iview的组件
- 使用niginx开启gzip减少网络传输的流量大小
- 如首屏为登录页,可以做成多入口,登录页单独分离为一个入口
- 使用uglifyjs-webpack-plugin插件代替webpack自带UglifyJsPlugin插件
- 异步组件,类似路由懒加载
- js外联文件放到body底部,css外联文件放到head内
- http静态资源尽量用多个子域名
- 尽量减少http requests的数量
- js/css/html/img资源压缩
- 使用css spirtes,可以使用img请求次数
- 大图使用lazyLoad懒加载
- 避免dom elements的数量
- 使用异步脚本,动态创建脚本
10.小程序如何显示用户头像与用户名
方法一 : wx.getUserInfo
wx.getUserInfo 需要授权后才能得到数据 在新版本中 wx.getUserInfo需要搭配button让用户主动授权
<button wx:if="{{canIUse}}" open-type="getUserInfo">授权登录</button>
<view wx:else>请升级微信版本</view>
方法二 button+bindgetuserinfo
<button wx:if="{{canIUse}}" open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo">授权登录</button>
<view wx:else>请升级微信版本</view>
Page({
data: {
canIUse: wx.canIUse('button.open-type.getUserInfo') // 这个是兼容
},
onLoad: function() {
},
bindGetUserInfo (e) {
console.log(e.detail.userInfo);
}
})
11.请谈谈小程序的双向绑定和vue的异同
小程序中的数据双向绑定
- 首先要通过bindinput绑定文本框的输入事件
- 在data中声明一个变量content,将其动态绑定文本框的value值
- 在bindinput事件中通过事件参数e.detail.value 可以获取到文本框中最新的value值
通过this.setDate将文本框最新的value值 赋值给动态绑定的value值,connect即可实现数据的双向绑定
vue中的双向绑定
首先为文本框绑定@input 监听文本框的输入事件
- 为文本框动态绑定value属性,其值是在data中定义的变量
- 在@input绑定事件中,通过事件参数event,target.value 可以获取到input框中最新的value值
将其重新获取的value赋值给value值动态绑定的那个变量
区别
大体上区别不大,绑定事件不同,以及获取value值的具体方式不同,以及在小程序中设置data中的数据,需要调用 this,setData方法进行设置
12.小程序中传参是怎么传的
- 通过在App.js中设置全局变量
- 通过拼接URL直接传递
- 通过数据缓存存储在获取
- App.js
通常把不会更改的数据放在app.js的Data中,在各个页面中都可以通过app实力获取Data数据
var app = getApp();
var data = app.data;
wx.navigateTo({})中URL携带参数
wx.navigateTo({
url:'test?id=1'
})
数据缓存 ```javascript //统一处理
var dealParam = function(data) { for(var i in data) { if (typeof data[i] == ‘string’){ console.log(“key=”+i+“; value=”+data[i]); } else if (typeof data[i] == ‘object’) { dealParam(data[i]); } } }
<a name="rRr2K"></a>
### 13.和vue类比介绍
- 生命周期
-- 相比之下,小程序的钩子函数要简单的多;vue的钩子函数在跳转新页面时,钩子函数都会触发,但是小程序的钩子函数,页面不同的跳转方式,触发的钩子并不一样
- 数据绑定
-- vue动态绑定一个变量的值为元素的某个属性的时候,会在变量前面加上冒号:<br />-- 小程序绑定某个变量的值为元素属性时,会用两个大括号括起来,为被认为是字符串
- 列表渲染
-- vue 使用的是v-for<br />-- 小程序使用的是wx:for
- 显示与隐藏元素
-- vue 使用v-if和v-show控制元素的显示和隐藏<br />-- 小程序 使用vx-if和hidden 控制元素的显示和隐藏
- 事件处理
-- vue 使用 v-on:click:event绑定事件, 或者使用@event 绑定事件
```html
<button v-on:click="counter+=1">Add</button>
<button v-on:click.stop="counter+=1"></button>
— 小程序 全用bindtap(bind+event),或者catchtap(catch+event)绑定事件
<button bindtap="noWork">不上班</button>
<button catchtap="noWork">不上班</button> //阻止事件冒泡
- 数据双向绑定
- 设置值
— vue 中,只需要在表单元素上加v-model,然后咋绑定data中对应的一个值,当表单元素内容发生变化时,data中对应的值也会相应改变
— 小程序中,当表单内容发生变化时,会触发表单元素上绑定的方法,然后在该方法中,通过this.setData({key:value})来将表单上的值赋值给data中的对应值
去别:
- 取值
— 在vue中,通过this,reason取值
— 小程序中,通过this.data.reason取值
14.如何让事件在捕获阶段触发
事件的触发分为两个阶段,首先是捕获阶段,其次是冒泡阶段。默认情况下事件都是在冒泡阶段触发。如果希望事件可以在捕获阶段触发,可以通过capture-bind进行事件绑定
15.小程序页面间有那些传递数据的方法
1. 使用全局变量实现数据传递
— app.js和app.wxss中的代码都是全局生效的,所以我们可以利用这一点儿,在不同页面之间进行传值。**2. 页面跳转或重定向时,使用url带参数传递数据
1、父组件的json文件中声明对引用子组件**3. 使用组件模板 template传递参数
4. 使用缓存传递参数
wx.setStorageSync('checkin', checkin)
16.你是怎么封装微信小程序的数据请求的
- wx.request
```javascript
// 官方例子
wx.request({
url: ‘test.php’, //仅为示例,并非真实的接口地址
data: {
x: ‘’ ,
y: ‘’
},
header: {
}, success: function(res) { console.log(res.data) } })'content-type': 'application/json' // 默认值
- promise
```javascript
Promise封装
const baseUrl = 'https://csdn.net';
export const http = ({ url = '', param = {}, method="get",...other } = {}) => {
wx.showLoading({
title: '请求中,请耐心等待..'
});
let timeStart = Date.now();
return new Promise((resolve, reject) => {
wx.request({
url: getUrl(url),
data: param,
methods,
header: {
'content-type': 'application/json' // 默认值 ,另一种是 "content-type": "application/x-www-form-urlencoded"
},
...other,
complete: (res) => {
wx.hideLoading();
console.log(`耗时${Date.now() - timeStart}`);
if (res.statusCode >= 200 && res.statusCode < 300) {
resolve(res.data)
} else {
reject(res)
}
}
})
})
}
17.说一下微信小程序的适配问题
18.小程序跳转页面的方式
- navigateTo (有饭护肩,不可以跳转tabBar页面) ```javascript //保留当前页面,跳转到应用内的某个页面 wx.navigateTo({ url: ‘/pages/detail/detail?id=1’ })
2. switchTab (没有返回键,只能跳转到tabBar页面,不可以携带参数)
```javascript
wx.switchTab({
url: '/pages/detail/detail',
})
- reLaunch (跳转任意页面,没有返回,有 首页按钮) ```javascript wx.reLaunch({ url: ‘/pages/detail/detail’ })
4. redirectTo (只可以跳转tabBar页面,没有返回,担有首页按钮)
```javascript
wx.redirectTo({
url: `/pages/detail/detail`,
})
- navigateBack ( 应用在目标页面,delta值为1 ,表示跳转上一页,2表示跳两级) ```javascript wx.navigateBack({ delta:1 })
<a name="EbFze"></a>
##### 页面栈
页面栈是以栈的形式维护页面与页面之间的关系,遵循栈的原则,先进后出,在微信小程序中有getCurrentPages()函数获取页面栈。
<a name="mbc6G"></a>
### 19.微信小程序如何跳转到其他小程序
<a name="sdAJS"></a>
### 20.微信小程序登录流程
![image.png](https://cdn.nlark.com/yuque/0/2022/png/27308234/1652834721737-bcd7ba8d-4ae7-4502-a34e-50c49ae95fdb.png#clientId=u649b9fcf-e623-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u83d3f965&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1136&originWidth=3220&originalType=url&ratio=1&rotation=0&showTitle=false&size=277653&status=done&style=none&taskId=u50653480-a4bb-4256-97d5-a3d09341927&title=)
- **流程1**:微信小程序通过wx.login获取到code,并将该code发送到后台,后台是根据开发去决定的,Java或者node,云开发等
--------真实开发时最好对wx.request这种常用的进行Promise封装
```javascript
// app.ts
App<IAppOption>({
globalData: {},
onLaunch(): void {
const token: string = wx.getStorageSync('token');
// 未保存token
if (!token) {
wx.login({
success ({code}): void {
if (code) {
console.log(code);
wx.request({
url: 'http://127.0.0.1:8080/wx/login',
method: 'POST',
data: {
appid: 'wxe8a141f1bb800ff7',
secret: 'ede7d29a505f77e8318fa54c0d1dd057',
js_code: code
},
success({data}: any): void {
console.log(data);
wx.setStorage({
key: "token",
data: data.data
})
}
});
}
}
});
return;
}
}
})
- 流程2: 后台利用appId,appSecret和code,发送给微信官方服务器进行校验,通过官方文档可以得出调用author.code2Session接口,换取用户唯一表示OpenID.用户在微信开发平台账号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台账号)和会话密钥session_key
——— url:GET https://api.weixin.qq.com/sns/jscode2session?
——— appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
// 此处只粘贴重要代码
HttpGet get = new HttpGet(AUTH_URL + "appid=" + user.getAppid() + "&secret=" + user.getSecret() + "&js_code=" + user.getJs_code() + "&grant_type=" + user.getGrant_type()); // url拼接
get.setConfig(config); // 装配配置信息
CloseableHttpResponse res = this.httpClient.execute(get);
User retUser = null;
if (res.getStatusLine().getStatusCode() == 200) {
retUser = new ObjectMapper().readValue(EntityUtils.toString(res.getEntity()), User.class);// json转对象
wxMapper.insert(retUser); // 添加入数据库
}
res.close(); // 关闭返回结果
httpClient.close(); // 关闭httpClient
- 流程3: 后台返回给前端一个jwt生成的token ```javascript JWTUtils.getToken(claims, null); // 自己封装过的JWT工具类, 生成token扔给下程序
> **主要**:拿到前端传过来的code、secret、appid、grant_type三个参数然后通过httpClient发送GET请求,获取到返回的json对象,将该对象保存在数据库,再用JWT将一些不隐私且常用的数据转成token并返回给小程序
>
> **注意**: 请求回来的session_key和openid,先留着存在数据库,token令牌用我们自己转换的
- **流程4: **小程序保存token
- **流程5: **前端请求携带token在请求头,后端通过数据库查询对比判断用户是否登录(效率更高课一采用jwt而不是每次都查询数据库)
```javascript
wx.request({
url: 'http://127.0.0.1:8080/wx/findsome',
header: {
Authentication: wx.getStorageSync('token')
},
success({data}: any): void {
console.log(data);
}
})
21.在小程序中如何获取用户信息
- 小程序为升级前:可使用wx.getUserInfo直接获取用户信息,目前逐渐不能使用该方法了
- 升级后,可使用以下方法获取用户的账户信息:
- 使用button,设置其属性:open-type=”getUserInfo”
其实两种获取方式都是一样的,都是用wx.getUserProfile方法进行获取,但是只是采取了不同的数据处理方式,让开发更加的便捷
22.小程序中如何实现分享功能,微信有什么限制
发送给朋友:onShareAppMessage(Object object);
分享到朋友圈: onShareTimeline();
限制:
“单页模式”下,一些组件或接口存在一定限制:
- 页面无登录态,与登录相关的接口,入wx.login()均不可用;
- 不允许跳转其他页面,包括跳转小程序页面,跳转其他小程序,跳转微信原生页面;
- 不允许横屏,页面包含的tabbar不会渲染,包括自定的tabbar;
-
23.你的小程序是如何上线的,审核大概需要多久?
(1)在微信web开发者工具里找到项目,并且设置好服务器的域名,如果你的小程序没有用到外网请求,可以不用配置服务器。配置好服务器,先预览一下,看看有没有问题,如果没有问题的话,点击上传。
(2)上传代码之后,在微信公众号平台登录微信小程序后台,点击开发管理,就可以看到刚刚上传的代码,点击提交审核,就可以了。接下来就是等待微信官方的审核。
(3)一般都是1~3天左右24.小程序中如何用像Vant一样的第三方组件
(1)打开cmd,进入你的项目中,在cmd中执行:npm init,初始化项目
(2)然后安装Vant
(3)打开小程序客户端,选择【工具】菜单 -> 选择【构建 npm】命令25.小程序如何实现父子组件传参
1、父组件给子组件传值
在子组件中定义属性 ```javascript properties: {
// 复杂定义
name:{
type: String,
value:’张三丰’
},// 简单定义
name2:String
},
父组件在引用子组件的时候通过设置属性的方式给子组件传值<br />2、 子组件给父组件传值<br />在组件中绑定一个自定义事件
```html
// 引用了自定义的组件, 绑定了myevent事件,这个事件对应的是parentEvent方法
<test-button name="张无忌" bindmyevent="parentEvent"></test-button>
在子组件中触发这个事件,可以给父组件传值。
- 子组件中通过triggerEvent触发事件
methods: {
方法名字: function(){
var myEventDetail = {} // detail对象,提供给事件监听函数
var myEventOption = {} // 触发事件的选项 this.triggerEvent('myevent', myEventDetail, myEventOption)
}
}
其他方式
26.小程序中APP的生命周期有哪些
onLaunch(options)
小程序被加载完毕的时候调用。这个方法一般用来做一些初始化的事情。比如获取用户 信息、获取历史缓存信息、获取小程序打开来源等。
onShow(options)
小程序启动,或从后台进入前台显示时调用。如果想要在小程序每次进入到前台的时候 都执行一些事情,那么可以把代码放在这个里面。比如一些实时动态更改的数据,用户每次进来都要从服务器更新,那么我们就可以在这个里面做。
onHide()
小程序被切换到后台(包括微信自身被切换到后台或者小程序暂时被切换到后台时)。可以在这个方法中做一些数据的保存。
onError(String error)
小程序发生脚本错误,或者 api 调用失败时触发。在小程序发生错误的时候,会把错误 信息发送到这个函数中,所以可以在这个函数中做一些错误收集。
onPageNotFound(Object)
小程序要打开的页面不存在时触发。一般在代码更新的时候,有些页面被删除了,但是 其他地方没有改过来的情况下会发生这种情况,或者一些活动页面,活动结束后被关掉了。也可以 在这个里面做一些错误的收集和页面的重新跳转。
getApp()
获取当前的 app 对象。一般在app.js外的地方调用。在app.js内部可以使用this获得当前的大对象;在外面要用定义在app.js的全局数据时,要用getApp()。
27.小程序中Page的生命周期有哪些
onLoad()、onReady()、onShow()、onHide()、onUnload()五个页面生命周期函数,其分别是页面加载、就绪、渲染、隐藏、卸载时被调用。
28.小程序如何定义事件
在小程序中绑定事件可以以bind开头然后跟上事件的类型,如bindtap绑定一个点击事件,对应的值是一个字符串,需要在page构造器中定义同名函数,每次触发事件之后就会执行对应函数的内容。
29.如何阻止小程序的事件冒泡
在小程序中除了通过bind之外,还可以通过catch进行事件绑定,通过catch绑定的事件不会触发事件冒泡。
30.如何让事件在捕获阶段触发
事件的触发分为两个阶段,首先是捕获阶段,其次是冒泡阶段。默认情况下事件都是在冒泡阶段触发。如果希望事件可以在捕获阶段触发,可以通过capture-bind进行事件绑定。
31.如何实现下拉刷新
首先在全局 config 中的 window配置 enablePullDownRefresh ,在 Page 中定义onPullDownRefresh 钩子函数,到达下拉刷新条件后,该钩子函数执行,发起请求方法 请求返回后,调用wx.stopPullDownRefresh停止下拉刷新
32.bindtap和catchtap的区别是什么
相同点:首先他们都是作为点击事件函数,就是点击时触发。在这个作用上他们是一样的,可以不做区分
不同点:他们的不同点主要是bindtap是不会阻止冒泡事件的,catchtap是阻值冒泡的
33.简述下 wx.navigateTo(), wx.redirectTo(), wx.switchTab(), wx.navigateBack(), wx.reLaunch()的区别
wx.navigateTo():保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面
wx.redirectTo():关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面
wx.switchTab():跳转到 abBar 页面,并关闭其他所有非 tabBar 页面
wx.navigateBack():关闭当前页面,返回上一页面或多级页面。可通过getCurrentPages() 获取当前的页面栈,决定需要返回几层
wx.reLaunch():关闭所有页面,打开到应用内的某个页面
34.小程序调用后台接口遇到哪些问题?
- 数据的大小有限制,超过范围会直接导致整个小程序崩溃,除非重启小程序;
- 小程序不可以直接渲染文章内容页这类型的html文本内容,若需显示要借住插件,但插件渲染会导致页面加载变慢,所以最好在后台对文章内容的html进行过滤,后台直接处理批量替换p标签div标签为view标签,然后其它的标签让插件来做,减轻前端的时间。
35.stroageSync和stroage区别?
以Sync(同步,同时)结尾的都是都是同步缓存,二者的区别是,异步不会阻塞当前任务,同步缓存直到同步方法处理完才能继续往下执行。
- 通俗点说,异步就是不管保没保存成功,程序都会继续往下执行.同步是等保存成功了,才会执行下面的代码.使用异步,性能会更好;而使用同步,数据会更安全。
- 它们都是将数据存储在本地缓存指定的key中,单个key最大数据长度为 1MB,所有数据存储上限为 10MB
- setStorageSync只支持原生类型、Date、及能够通过JSON.stringify序列化的对象,不能直接传入对象。
否则报错:setStorage:fail parameter error: parameter should be String instead of Object;
36.支付流程预支付
预支付就是A服务器使用统一下单命令向B服务器发送数据并返回一个json数据,这个json数据到时候是要发送给客户端,完成第二次下单操作的参数
关于同一下单,需要几个参数我们需要先获取一下openid (用户标识)
- nonce_str(随机字符串)
- out_trade_no (商户订单号)
- sign(签名)
openID和unionID区别
UnionID 机制说明
如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,UnionID是相同的。
openID 机制说明
openid是微信用户在公众号appid下的唯一用户标识(appid不同,则获取到的openid就不同),可用于永久标记一个用户,同时也是微信JSAPI支付的必传参数。
使用场景
openID (微信用户在微信的某个应用)
移动应用,网站应用,公众号,小程序里唯一性的话,代表同一用户的话,使用openID。
UnionID (微信用户的唯一标识)
开发者有公众号,移动应用,多个应用的时候,应该用UnionID来代表同一用户。
小程序的本地存储
1、同步
(1)wx.setStorageSync();//存储值
(2)wx.removeStorageSync();/移除指定的值
(3)wx.getStorageSync();// 获取值
(4) wx.getStoragelnfoSync();//获取当前 storage中所有的 key
(5)wx.clearStorageSync();//清除所有的key
2、异步
(1) wx.setStorage();//存储值
将数据存储在本地缓存中指定的key中。会覆盖掉原来该key对应的内容。数据存储生命周期跟小程序本身一致,即除用户主动删除或超过一定时间被自动清理,否则数据都一直可用。单个key允许存储的最大数据长度为1MB,所有数据存储上限为10MB。
(2) wx removeStorage();//移除指定的值
(3) wxgetStorage();//获取值
(4)wx getStoragelnfo();//获取当前 storage中所有的 key
(5) wx.clearStorage(),//清除所有的key