在商城系统中,会遇到这样的问题,用户提交订单后没有完成支付便中止了操作。
系统友好性和促进成单率考虑,做规划:在下单后10分钟内还没有付款的发送通知给用户,提醒其有未完成订单待支付。
1.考虑使用本地缓存文件,将待支付的订单信息全部缓存在文件中
2.在支付完成时将1中的响应信息进行移除
3.定时任务跑另一个逻辑,根据当前时间拿到缓存文件中超时的订单信息,进行业务逻辑处理并移除订单信息
在生成订单数据的时候执行以下操作
/*加入待支付订单集合队列,作为10分钟后通知的数据*/
//order_id——订单id;out_trade_no——订单号
$wait_pay = F('orders/wait_pay','',DATA_ROOT);//获取当前的集合
if(!$wait_pay){$wait_pay = array();}
$new_wait_pay = array('id'=>$order_id,'time'=>time());//新的待支付订单数据
$wait_pay[$out_trade_no] = $new_wait_pay;//追加到集合内
F('orders/wait_pay',$wait_pay,DATA_ROOT);//保存到本地
保存的待支付订单数据格式
array(3) {
["2017064571497843579"] => array(2) {
["id"] => string(2) "79"
["time"] => int(1497843579)
}
["2017069941497843627"] => array(2) {
["id"] => string(2) "80"
["time"] => int(1497843627)
}
["2017064981497843666"] => array(2) {
["id"] => string(2) "81"
["time"] => int(1497843666)
}
}
订单支付成功的时候删除相关数据
/*删除待支付订单缓存信息*/
$wait_pay = F('orders/wait_pay','',DATA_ROOT);
if($wait_pay){
//支付成功的订单号$out_trade_no
unset($wait_pay[$out_trade_no]);//删除数组内关联数据
F('orders/wait_pay',$wait_pay,DATA_ROOT);//保存新数据到本地
}
每隔7s执行一次一下操作【时间间隔酌情决定】
$wait_pay = F('orders/wait_pay','',DATA_ROOT);
if(!$wait_pay){$wait_pay = array();}
/*@$new_data--要发送通知的订单集合,最多时候只一次性处理20条订单信息*/
$new_data = array();
$now_time = time();
$time = $now_time - 60*10;
$i = 0;
foreach($wait_pay as $k=>$val){
if($val['time'] <= $time){
//把所有待通知的订单id加入到通知数组中,单次逻辑只处理最多20条
array_push($new_data,$val['id']);
if($i < 20 )
$i++;
else
break;//new_data已有20条数据,跳出循环
}else{
break;//没有十分钟以上的订单信息,跳出循环
}
}
$this->wait_pay_notice($new_data);//待通知订单消息提醒
if($i > 0){
array_splice($wait_pay,0,$i);//将集合中发送过通知的订单数据信息移除
if($wait_pay == null){
F('orders/wait_pay',null,DATA_ROOT);
}else{
F('orders/wait_pay',$wait_pay,DATA_ROOT);
}
}
//wait_pay数据更新成功
```
####贴出wait_pay_notice方法
```swift
$ids = implode(',', $new_data);
$orders = M() ->query(" select A.id,A.t_id,A.fee,A.order_sn,A.use_time,A.token,openid,nickname from xg_orders A join xg_user_child B on A.user_id = B.user_id and A.token = B.token where A.id in ($ids) and state = 0 order by A.id desc ");
/*遍历所有结果,发送模板消息*/
/*给上级分销商发消息通知*/
$template = A('Pay/Template');//实例化模板控制器
$desc['top'] = '您好,您有订单待支付,请及时付款,2小时后订单自动关闭';
$url = 'http://www.xiguakeji.cc';
foreach($orders as $val){
/*拿到产品的名称和票型*/
$name_info = M() -> query(" select concat(B.name,'--',A.name) name from xg_product_type A join xg_product B on A.pro_id = B.id where A.id = ".$val['t_id'] );
$desc['keyword1'] = $val['order_sn'];
$desc['keyword2'] = $name_info[0]['name'];
$desc['remark'] = date("Y年m月d日",$val['use_time']);
$template -> __construct($val['token']);//传参
$template ->order_pay_wait($val['openid'],$desc,$url);
}
```
![模板消息实现效果显示](http://upload-images.jianshu.io/upload_images/6517535-4f7adccc655d4a62.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/340)
通过缓存文件的好处:
这一类的消息提醒需求必须做成24小时自动持续执行的逻辑,如果直接操作数据库,会对数据库造成不小的消耗,通过本地文件缓存下来,当确定需要通知的时候再去查询相关信息推送,减少了很多不必要的开销,也就是变相优化了逻辑,提升了性能。
>[西瓜科技——专业技术开发团队](http://www.jianshu.com)
>微信应用定制开发、APP开发、小程序开发
>郑州市金水区东风路花园路世玺中心2416室