商城8
问题
TP内部的错误机制
昨天在TP里面,对于如果memcache没有启动的情况下,不会进行报错。
1.如果memcache没有启动进行connet的时候报的是一个notice和warning级别的错误。这种提示信息在TP里面是不会自动报出来(TP里面使用自己定义的错误处理进行处理的)

效果: 在TP里面开启show_page_trace可以查看

在没哟使用TP之前,如果连接不成功,则提示什么信息?

如果我们要捕获这个提示信息,则该如何处理?
答:用用户自己编写错误处理函数进行处理。(意思就是我们自己写一个处理函数,来捕获notice级别的错误)
http://blog.csdn.net/e421083458/article/details/8157154

效果

TP 内部的错误处理机制

昨天代码修改

最终处理代码

QQ互联
QQ互联这种技术一般也叫作第三方登录。
好处:减少用户的记忆成本(一个账号可以通用的登录很多系统)。
弊端:用户是受限于接口提供方(腾讯的限制、百度接口)所以一般的第三方接口在一定时间之后,都是把用户想办法拉回来(用户自己的会员系统,做个活动,送东西。例如 招商银行,最先是 微信公招号可以使用,但是有些一些功能,必须去APP可以使用。)
环境准备
- 去腾讯开发者中心进行实名认证

- 去腾讯的QQ互联申请应用(AK和SK)
网站:https://connect.qq.com/manage.html

应用创建
1. 创建一个应用

2. 信息填写

回调地址传递
注意:如果审核通过,则腾讯会提供用户一个AK和一个SK。

需要注意:如果申请没有通过,则只能使用当前登录的QQ号作为测试账号使用。
APP ID:101417330
APP Key:b41ebc1f9f00675309b28cbbc7054397
下载SDK开发包
网站:http://wiki.connect.qq.com/sdk%E4%B8%8B%E8%BD%BD

QQ互联集成到TP项目
QQ 登录的业务逻辑
- QQ用户点击QQ登录的图标
- 跳转到QQ登录页面(腾讯提供的页面)
- 在QQ用户成功登录之后,腾讯那边会把用户的信息通过我们创建应用时候定义的回调地址传递过来,将用户的openid保存到session里面
- 我们网站根据openid做自己的业务
a) 根据openid去会员表里面查看当前的openid是否存在和自己网站会员的绑定信息,如果存在,则直接将用户的信息保存在session里面,则代表登录
b) 根据openid查不到用户的信息,则没有绑定,提示用户绑定之后,只要绑定一次,以后都不用在绑定,以后可以使用QQ可以进行登录(接触所有的业务都是要用户自己的绑定)
QQ 登录实操
1. 将QQ开发包复制到网站根目录的qq文件夹下

2. 到config中去配置qq互联的id和key

3. 将项目代码上传到服务器上(线上服务器)(域名: http://shop.sinsea.cn)

- 在login.html页面,为QQ图标绑定点击事件

定义点击事件的回调函数

效果

- 在qq_callback.php文件,定义一个跳转地址,完成QQ登录业务处理

- 在Home模块的MemberController.class.php控制器文件定义一个qqcheck方法,完成QQ业务处理

6. 在Home模块的MemberController.class.php控制器文件定义一个bingding方法【注册过的会员】

- 增加一个bangding.html视图页面

效果

绑定界面

额外信息
1. 腾讯在用户成功登录后的回跳信息

2. 在QQ用户成功登录后的回跳地址

购物车
单选信息展示

- 在Home模块的IndexController.class.php控制器的detail方法里面获取当前商品的单选属性,并把相同的单选属性放置在一起【构建连表sql语句】

执行$rs = array();
foreach ($radioData as $k=>$v){
$rs[$v['attr_id']][] = $v;
}
效果:

- 在detail.html页面显示对应的单选信息

效果

单选信息获取的原生sql操作:

mysql> select a.*,b.attr_name from sh_goods_attr a left join sh_attribute b on a.attr_id = b.attr_id where a.goods_id = 15 and b.attr_type = 0;
获取商品id为15的单选信息
购物车简介
考虑如下几个问题:
- 用户购买的数据存在哪里?(用什么存储介质)(mysql memcache redis cookie session)
答:注意:
实现购物车的时候应该是有区分对待:
- 登录(用户id)一般是单独的设计一张购物车的表,表里面保存用户的购买信息
- 没有登录(没有用户id)一般是将用户的购买信息保存在cookie里面,需要注意,如果用户在没有登录的情况下商品信息加入购物车后,在用户登录之后我们应该把购物车里面的新转存到购物车表,同时把cookie里面的购物车的数据要清空。
参考一下京东(登录和没登录都可以加入购物车)、淘宝(必须登录后才可以加入购物车)。
比较:对于淘宝来说,是登录后才可以加入购物车(好处: 只要加入购物车的数据到时候可以在何时何地都可以查看 弊端: 用户体验不好)对于京东(好处: 用户体验好 弊端: 如果更换浏览器,则购物车的数据就没有了)
- 到底要存在哪些信息?(商品id 商品属性id 商品数量 用户ID)
答:
一般如果是登录了, 则需要保存 商品id、商品属性id、商品数量、用户id
如果是没有登录,则需要保存 商品id、商品属性id、商品数量
问题:对于商品的价格是千万不能保存(因为价格是有可能会变,价格需要去数据库实时的获取)
- 以什么样的数据结构进行存储?
答:
数据表:
|
id |
goods_id |
goods_attr_id |
goods_number |
user_id |
|
1 |
15 |
18,23 |
123 |
2 |
|
3 |
16 |
45 |
45 |
2 |

cookie:由于我们要保存的信息偏多(不是单独的字符串)
数据结构:
array(
'goods_id-goods_attr_id' => goods_number,
'goods_id-goods_attr_id' => goods_number
)
代表用户购买了两类商品
array(
'15-18,23' => 123,
'16-45' => 45
)
存储:
setcookie('cart', '序列化的字符串', time, '/');
加入购物车
- 在detail.html页面为加入购物车增加提交地址

效果

- 在Home模块的的CartController.class.php控制器文件增加一个addToCart方法,完成购物车添加功能
由于单选属性是存在不确定性的(有可能是多个,有可能没有,取决于后台添加的商品类型下的属性)unset()

- 在Home模块的CartModel.class.php模型文件增加一个addToCart方法将用户购买的商品加入购物车


购物车展示
1. 在Home模块的CartController.class.php控制器文件增加一个cartList方法,展示购物车数据

2. 增加一个cartList.html视图页面,展示购物车数据

效果

- 在Home模块的CartModel.class.php模型文件增加一个cartList方法获取购物车数据


单选属性获取原生SQL:

mysql> select group_concat( concat(b.attr_name,':',a.goods_attr_values) separator '<br/>' ) as ga from sh_goods_attr a left join sh_attribute b on a.attr_id = b.attr_id where a.id in (17,21);
ajax更新购物车数据

- 在cartList.html购物车展示页面定义一个全局变量保存ajax更新地址

- 在cartList.html页面,在展示购物车数据的时候,在tr定义goods_id和goods_attr_id方便在ajax更新的时候获取

- 在cart1.js完成ajax更新购物车的操作

- 在Home模块的CartController.class.php控制器文件增加一个ajaxUpdate方法,完成ajax更新操作

购物车转存
在用户成功登录后,需要将没有登录前的购物车的信息转存到数据库的购物车表里面
- 在Home模块的CartModel.class.php模型文件增加一个moveCookiToDb方法,完成cookie购物数据的转存操作

- 在Home模块的MemberController.class.php控制器文件的login方法里面,在用户成功登录后,完成转存操作

结算中心

在用户点击结算中心的时候,需要判断用户是否登录。因为结算中心是必须登录之后才可以访问,并且,如果用户没有登录,在跳转到登录页面进行进行成功登录后,还需要跳到结算中心。
1. 在cartList.html页面为定义结算提交地址

- 在Home模块创建一个OrderController.class.php控制器文件,增加一个order1方法

- 在Home模块的MemberController.class.php控制器文件的login方法里面完成回跳处理

订单中心
- 订单的信息如何保存?
答:设计订单表来保存此次订单信息。
- 保存完毕后,需要进行支付(前往支付宝付款)
答:集成支付宝
表设计
完成订单功能一般需要设计两张表
第一张表:订单信息表 保存此次的订单的详情(订单id 下单人、下单收货地址、手机号码、邮编、总价、....)
第二张表:订单商品表 保存此次订单的商品的详情信息(订单id 商品ID、商品价格、商品的库存....)
订单信息表
id 主键
order_id 订单号 注意: 一般订单号是这样生成,date('YmdHis'). uniqid()
user_id 代表是哪个用户下的订单
shr 收货人姓名(人看)
address 收货地址
phone 手机号码
zcode 邮编
total_price 总价
add_time 下单时间
pay_status 支付状态,默认是0代表没有支付,1代表已经支付(用户使用支付宝付款,我们要修改其状态)
delivery_status 代表是投递状态 是否返回 默认是0代表没有发货,1代表已经发货,2代表已经收货
trade_number 代表是使用支付宝付款后,支付宝那边传递过来的一个交易订单号(支付宝那边进行一次交易),到时候如果用户需要退款,则可以使用该订单号进行退款。
订单商品表
id 主键id
order_id 所属订单
goods_id 商品的主键
goods_attr_id 代表是商品属性值主键id
good_number 商品数量
goods_price 商品单价
.....

create table tableName like tableName 快速复制一个表结构

下订单
- 在order1.html页面为提交订单绑定点击事件,完成订单提交

事件绑定

效果

- 在Home模块的OrderController.class.php控制器文件的order2方法里面完成订单处理
- 收货信息监测

- 购物车检测

- 库存检测

- 生成订单


效果

支付宝
简介
目前支付宝只支持企业(个人已经不能在使用了)以前存在一个叫做担保交易。现在统一都是即时到账(买家买完东西,付款后,支付宝会立马把钱转给商家)

文档:https://cshall.alipay.com/enterprise/knowledgeDetail.htm?knowledgeId=201602148574
在支付宝提交营业许可证之后,在通过审核之后,会商家一个账号和一个密钥。

下载SDK包

项目集成
- 将支付宝接口放置在Vendor目录下

2. 在Home模块的Model目录创建一个PayModel.class.php模型文件

- 将支付宝的配置信息加入config.php文件

4. 在Home模块里面的OrderController.class.php控制器文件的order2方法里面完成支付宝的集成



- 在Home模块的CartModel.class.php增加一个clearData方法,完成购物车清空

6. 在Home模块里面的OrderController.class.php控制器文件的定义order3和order4方法完成同步和异步的通知处理

- 支付完成后效果


浙公网安备 33010602011771号