微信小程序开发详解 7 微餐厅 -- 餐饮管理系统
2018-01-20 22:07
531 查看
试想我们到餐馆消费,拿出手机扫一下二维码就可以排号、查看排队情况、查看菜单、点菜、买单,是不是很方便快捷?对餐厅的管理者来说,不需要开发或购买专门的排队软件,不需要添加额外的硬件设施,让用户扫一扫即可排号、点菜,随用随走。用户使用过小程序后,使用记录会留在微信的小程序列表中,方便用户再次使用,这又能增加回头客。
小程序端实现排队、查看菜单等功能。
搭建开发环境:PHP + MySql,使用ThinkPHP 3.2框架。
将server的所有文件上传到PHP的服务器根目录里。
小程序:utils/common.js
var baseUrl = 'http://www.example.com/restaurant/';
餐桌类型表category结构
餐桌表tables结构
排队信息表queue结构:用queue表记录用户的排队信息
用户信息表user结构:支持微信登录,需要user表来保存用户的登录态,用户信息表user结构
菜单表menu结构
管理后台介绍:包括餐桌类型管理、餐桌管理、排队管理和菜单管理,
餐桌类型管理、餐桌管理可添加、编辑、删除操作。
排队管理:
菜单管理:
API接口:
encryptedData,包括敏感数据在内的完整用户信息的加密数据,需要进行解密。
微信登录:
调用wx.login,调用接口获取登录凭证(code)进而换取用户登录信息,包括用户的唯一标识(openid)和本次登录的会话密钥(session_key)。
调用wx.getUserInfo获取用户的公开信息和加密数据encryptedData。
小程序获取code后,提交到服务器端以换取session_key。
小程序端获取用户公开信息和加密数据encryptedData。
app.js
//app.js
var common = require('./utils/common.js')
App({
onLaunch: function () {
},
getUserInfo: function (cb) {
var that = this
if (this.globalData.userInfo) {
typeof cb == "function" && cb(this.globalData.userInfo)
} else {
//调用登录接口
wx.login({
success: function (res) {
wx.getUserInfo({
success: function (res) {
console.log(res);
that.globalData.userInfo = res.userInfo
typeof cb == "function" && cb(that.globalData.userInfo)
}
})
if (res.code) {
console.log(res);
//发起网络请求
wx.request({
url: common.baseUrl + 'index.php/api/user/wxlogin',
data: {
code: res.code
},
success: function (res) {
that.globalData.openid = res.data.openid
wx.setStorage({
key: "openid",
data: res.data.openid
})
}
})
} else {
console.log('获取用户登录态失败!' + res.errMsg)
}
}
})
}
},
globalData: {
userInfo: null,
openid: null
}
}) 服务器端:code换取session_key , Application/Api/Controller/UserController.class.php
public function wxlogin(){
$code = $_GET['code'];
$url_format = 'https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code';
$url = sprintf($url_format,C('APPID'),C('APPSECRET'),$code);
$json = file_get_contents($url);
$data = json_decode($json,true);
if($data['openid']){
$data['created_at'] = time();
$UserModel = M('user');
$where = array(
"openid"=>$data['openid']
);
if($UserModel->where($where)->find()){
$UserModel->where($where)->save($data);
}else{
$UserModel->add($data);
}
echo json_encode(array('msg'=>'ok','openid'=>$data['openid']));
}else{
echo json_encode(array('msg'=>'error'));
}
}
数据签名加密:两个用途
(1)加密敏感信息,如openid、unionid等与业务安全相关的信息。
(2)数据完整校验,检测接口返回的内容是否被篡改、伪造或截断。
步骤:
签名校验算法涉及用户的session_key,通过wx.login登录流程获取用户的session_key,并自行维护与应用自身登录态的对应关系。
通过调用接口(如wx.getUserInfo)获取数据时,接口会返回rawData、signature。其中,signature=sha1(rawData+session_key)。
开发者将signature、rawData发送到开发者服务器进行校验。服务器利用用户对应的session_key使用相同的算法计算签名signature2,比对signature与signature2即可校验数据的完整性
public function sign_test(){
$data = array();
$appid = 'wx4f4bc4dec97d474b';
$sessionKey = 'tiihtNczf5v6AKRyjwEUhQ==';
$encryptedData="CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZM
QmRzooG2xrDcvSnxIMXFufNstNGTyaGS
9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+
3hVbJSRgv+4lGOETKUQz6OYStslQ142d
NCuabNPGBzlooOmB231qMM85d2/fV6Ch
evvXvQP8Hkue1poOFtnEtpyxVLW1zAo6
/1Xx1COxFvrc2d7UL/lmHInNlxuacJXw
u0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn
/Hz7saL8xz+W//FRAUid1OksQaQx4CMs
8LOddcQhULW4ucetDf96JcR3g0gfRK4P
C7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB
6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns
/8wR2SiRS7MNACwTyrGvt9ts8p12PKFd
lqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYV
oKlaRv85IfVunYzO0IKXsyl7JCUjCpoG
20f0a04COwfneQAGGwd5oa+T8yO5hzuy
Db/XcxxmK01EpqOyuxINew==";
$iv = 'r7BXXKkLb8qrSNn05n0qiA==';
$pc = new \Org\Util\Weixin\DataCrypt($appid, $sessionKey);
$errCode = $pc->decryptData($encryptedData, $iv, $data );
if ($errCode == 0) {
print($data . "\n");
} else {
print($errCode . "\n");
}
}
7.1 项目部署
服务器端提供餐桌管理、排队管理、菜单管理等管理后台,同时为小程序提供Restful API。小程序端实现排队、查看菜单等功能。
搭建开发环境:PHP + MySql,使用ThinkPHP 3.2框架。
将server的所有文件上传到PHP的服务器根目录里。
小程序:utils/common.js
var baseUrl = 'http://www.example.com/restaurant/';
7.2 服务器端介绍
数据库设计:餐厅有多种不同大小的餐桌,以满足不同数量的客人需求,比如小桌供1或2人使用,中桌供3或4人使用,大桌供5~10人使用,包厢供10人以上使用。餐桌类型表category结构
餐桌表tables结构
排队信息表queue结构:用queue表记录用户的排队信息
用户信息表user结构:支持微信登录,需要user表来保存用户的登录态,用户信息表user结构
菜单表menu结构
管理后台介绍:包括餐桌类型管理、餐桌管理、排队管理和菜单管理,
餐桌类型管理、餐桌管理可添加、编辑、删除操作。
排队管理:
菜单管理:
API接口:
7.3 微信授权登录
用户的公开信息,包括头像、昵称、国家、省份、城市、性别、微信客户端语言,不包含openid等敏感信息。encryptedData,包括敏感数据在内的完整用户信息的加密数据,需要进行解密。
微信登录:
调用wx.login,调用接口获取登录凭证(code)进而换取用户登录信息,包括用户的唯一标识(openid)和本次登录的会话密钥(session_key)。
调用wx.getUserInfo获取用户的公开信息和加密数据encryptedData。
小程序获取code后,提交到服务器端以换取session_key。
小程序端获取用户公开信息和加密数据encryptedData。
app.js
//app.js
var common = require('./utils/common.js')
App({
onLaunch: function () {
},
getUserInfo: function (cb) {
var that = this
if (this.globalData.userInfo) {
typeof cb == "function" && cb(this.globalData.userInfo)
} else {
//调用登录接口
wx.login({
success: function (res) {
wx.getUserInfo({
success: function (res) {
console.log(res);
that.globalData.userInfo = res.userInfo
typeof cb == "function" && cb(that.globalData.userInfo)
}
})
if (res.code) {
console.log(res);
//发起网络请求
wx.request({
url: common.baseUrl + 'index.php/api/user/wxlogin',
data: {
code: res.code
},
success: function (res) {
that.globalData.openid = res.data.openid
wx.setStorage({
key: "openid",
data: res.data.openid
})
}
})
} else {
console.log('获取用户登录态失败!' + res.errMsg)
}
}
})
}
},
globalData: {
userInfo: null,
openid: null
}
}) 服务器端:code换取session_key , Application/Api/Controller/UserController.class.php
public function wxlogin(){
$code = $_GET['code'];
$url_format = 'https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code';
$url = sprintf($url_format,C('APPID'),C('APPSECRET'),$code);
$json = file_get_contents($url);
$data = json_decode($json,true);
if($data['openid']){
$data['created_at'] = time();
$UserModel = M('user');
$where = array(
"openid"=>$data['openid']
);
if($UserModel->where($where)->find()){
$UserModel->where($where)->save($data);
}else{
$UserModel->add($data);
}
echo json_encode(array('msg'=>'ok','openid'=>$data['openid']));
}else{
echo json_encode(array('msg'=>'error'));
}
}
数据签名加密:两个用途
(1)加密敏感信息,如openid、unionid等与业务安全相关的信息。
(2)数据完整校验,检测接口返回的内容是否被篡改、伪造或截断。
步骤:
签名校验算法涉及用户的session_key,通过wx.login登录流程获取用户的session_key,并自行维护与应用自身登录态的对应关系。
通过调用接口(如wx.getUserInfo)获取数据时,接口会返回rawData、signature。其中,signature=sha1(rawData+session_key)。
开发者将signature、rawData发送到开发者服务器进行校验。服务器利用用户对应的session_key使用相同的算法计算签名signature2,比对signature与signature2即可校验数据的完整性
public function sign_test(){
$data = array();
$appid = 'wx4f4bc4dec97d474b';
$sessionKey = 'tiihtNczf5v6AKRyjwEUhQ==';
$encryptedData="CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZM
QmRzooG2xrDcvSnxIMXFufNstNGTyaGS
9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+
3hVbJSRgv+4lGOETKUQz6OYStslQ142d
NCuabNPGBzlooOmB231qMM85d2/fV6Ch
evvXvQP8Hkue1poOFtnEtpyxVLW1zAo6
/1Xx1COxFvrc2d7UL/lmHInNlxuacJXw
u0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn
/Hz7saL8xz+W//FRAUid1OksQaQx4CMs
8LOddcQhULW4ucetDf96JcR3g0gfRK4P
C7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB
6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns
/8wR2SiRS7MNACwTyrGvt9ts8p12PKFd
lqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYV
oKlaRv85IfVunYzO0IKXsyl7JCUjCpoG
20f0a04COwfneQAGGwd5oa+T8yO5hzuy
Db/XcxxmK01EpqOyuxINew==";
$iv = 'r7BXXKkLb8qrSNn05n0qiA==';
$pc = new \Org\Util\Weixin\DataCrypt($appid, $sessionKey);
$errCode = $pc->decryptData($encryptedData, $iv, $data );
if ($errCode == 0) {
print($data . "\n");
} else {
print($errCode . "\n");
}
}
7.4 在线排号页
7.5 确认取号页
7.6 我的排号
7.7 查看菜单
相关文章推荐
- 微信小程序开发之相册选择和拍照详解及实例代码
- 微信小程序开发 | 把玩系列:各种组件和API实用详解
- 微信小程序开发教程(七)逻辑层——.js详解
- 微信小程序开发详解(五)---微信小程序事件
- 微信小程序开发学习笔记005--微信小程序组件详解
- 微信开发之小程序Flex布局详解
- 微信小程序开发详解 6 测测你是三国杀中的谁---调查测试类小程序
- 微信小程序开发详解(十)---微信小程序样式基础
- 微信小程序 欢迎界面开发的实例详解
- 微信小程序开发工具安装详解
- 详解微信小程序开发教程
- 微信小程序蓝牙功能开发流程详解和思维导图--shewei
- 使用微信小程序开发弹出框应用实例详解
- 微信小程序开发详解 5 博客园客户端---新闻资讯类小程序
- 详解微信小程序开发
- 微信小程序开发详解(二)---开发工具使用简介
- 微信小程序开发(一) 微信登录流程详解
- 微信小程序开发详解 4 组件与API
- 微信小程序开发详解(四)---微信小程序开发组件使用初步