<?php
namespace app\index\controller;
use app\common\controller\Frontend;
use app\admin\model\Shangpin;
use app\admin\model\Order;
class Index extends Frontend
{
protected $noNeedLogin = '*';
protected $noNeedRight = '*';
protected $layout = '';
public function _initialize()
{
parent::_initialize();
$this->site=config("site");
//官方测试商户号和密匙
$this->site['zfpid']='20220726190052';
$this->site['zfkey']='vg9ZRZN4FOKtDM06UfqH69GDJoG4gGIJ';
}
public function index()
{
$splist=Shangpin::where("status","normal")->paginate(10);
if($this->request->isAjax()){
$this->success("ok",'',$splist);
}
$this->view->assign("splist", $splist);
return $this->view->fetch();
}
/**
* 加入购物车
*/
public function cart(){
$act=$this->request->param("act");
if($act=="delall"){
Cookie("car",[],2600000);
$this->success("购物车已清空",'',[]);
}
$id=$this->request->param("id/d");
$num=$this->request->param("num/d",0);
$car=cookie("car");
$car= empty($car) ? [] : $car;
if($act=="add"){
$car[$id]= empty($car[$id]) ? 1 : $car[$id]+1;
cookie("car",$car,2600000);
}else if(!empty($id)){ //更新购物车
if($num){ //大于0
$car[$id]= $num;
}else{ //小于0
unset($car[$id]);
}
cookie("car",$car,2600000);
}
//根据购物车读取商品
$list=Shangpin::where('id','in',array_keys($car))->where("status","normal")->select();
$allnum=0;
$alljiage=0;
$html="";
foreach ($list as $key => $item) {
$item->num=$car[$item->id];
$allnum++;
$alljiage=bcadd($alljiage,bcmul($item->jiage,$item->num,2),2);
$html.="<li><h6 class='title ellipsis'>{$item->name}</h6><span class='price'>¥<em>{$item->jiage}</em></span><div class='numbox'><a class='press sub' href='javascript:;' onclick='jiajian({$item->id},".bcsub($item->num,1,0).");'>-</a><input type='text' value='{$item->num}' class='booknum' readonly><a class='press add' href='javascript:;' onclick='jiajian({$item->id},".bcadd($item->num,1,0).");'>+</a></div></li>";
}
$this->success("购物车已更新",'',['list'=>$list,'allnum'=>$allnum,'alljiage'=>$alljiage,'html'=>$html]);
}
public function checkout()
{
//根据购物车读取商品
$car=cookie("car");
$car= empty($car) ? [] : $car;
if(empty($car)){
$this->error("您的购物车暂无商品,请先选择商品!",url('index/index/index'));
}
$list=Shangpin::where('id','in',array_keys($car))->where("status","normal")->select();
$allnum=0;
$alljiage=0;
$html="";
foreach ($list as $key => $item) {
$item->num=$car[$item->id];
$allnum++;
$alljiage=bcadd($alljiage,bcmul($item->jiage,$item->num,2),2);
}
$this->view->assign("splist", $list);
$this->view->assign("allnum", $allnum);
$this->view->assign("alljiage", $alljiage);
//判断浏览器
$type="";
if(strpos($_SERVER['HTTP_USER_AGENT'],'MicroMessenger') !== false ){
$type="wxpay";
}else if(strpos($_SERVER['HTTP_USER_AGENT'],'AlipayClient') !== false ){
$type="alipay";
}
$this->view->assign("type", $type);
return $this->view->fetch();
}
public function pay()
{
$type=$this->request->param("type",'alipay'); //支持设置支付宝:alipay 微信支付:wxpay
$car=cookie("car");
$car= empty($car) ? [] : $car;
if(empty($car)){
$this->error("您的购物车暂无商品,请先选择商品!",url('index/index/index'));
}
$list=Shangpin::where('id','in',array_keys($car))->where("status","normal")->select();
$alljiage=0;
foreach ($list as $key => $item) {
$item->num=$car[$item->id];
$alljiage=bcadd($alljiage,bcmul($item->jiage,$item->num,2),2);
}
$notify_url= request()->domain(). url('index/index/notify');//异步回调地址
$return_url= request()->domain(). url('index/index/return'); //同步回调地址
$out_trade_no=date("Ymdhms").rand(1000,9999);//商户端订单号,不可重复
$name="订单支付{$alljiage}元";//商品名称
$money=$alljiage;//订单金额,最多保留2位小数
$sign_type="MD5";//签名方式,目前仅支持MD5
$param="";//附加信息,回调时原样返回
$arr = array(
"pid" => $this->site['zfpid'],
"type" => $type,
"notify_url" => $notify_url,
"return_url" => $return_url,
"out_trade_no" => $out_trade_no,
"name" => $name,
"money" => $money,
"param" => $param,
"sign_type" => $sign_type
);
$addres=(new Order)->allowField(true)->save([
"sn"=>$out_trade_no,
"title"=>$name,
"amount"=>$money,
"payamount"=>$money,
"paytype"=>$type,
"paytime"=>0,
"json"=>json_encode($list),
"ip"=>$this->request->ip(),
"useragent"=>$_SERVER['HTTP_USER_AGENT'],
"status"=>'wait',
]);
if($addres){
$sign=$this->get_sign($arr,$this->site['zfkey']);
header("location:".$this->site['zfurl']."submit.php?pid={$this->site['zfpid']}&type=$type¬ify_url=$notify_url&return_url=$return_url&out_trade_no=$out_trade_no&name=$name&money=$money¶m=$param&sign_type=$sign_type&sign=$sign");
exit;
}else{
$this->error("订单添加失败,请联系管理员或重试!");
}
}
public function notify()
{
$money=$this->request->param('money');
$name=$this->request->param('name');
$pid=$this->request->param('pid');
$out_trade_no=$this->request->param('out_trade_no');
$trade_no=$this->request->param('trade_no');
$trade_status=$this->request->param('trade_status');
$type=$this->request->param('type');
$trade_status=$this->request->param('trade_status');
$sign=$this->request->param('sign');
$sign_type=$this->request->param('sign_type');
$arr=array(
"pid" => $pid,
"type" => $type,
"out_trade_no" => $out_trade_no,
"trade_no" => $trade_no,
"name" => $name,
"money" => $money,
"trade_status" => $trade_status,
"sign_type" => $sign_type
);
//trace($arr,"zf_arr");
if($sign==$this->get_sign($arr,$this->site['zfkey'])){
//trace("ok","zf_ok");
echo "success"; //返回success说明通知成功,不要删除本行
(new Order)->where('sn',$out_trade_no)->update(['status'=>'ok','paytime'=>time()]);
}else{
//trace("err","zf_err");
echo "error";
}
}
public function return()
{
cookie("car",[]);
return $this->view->fetch();
}
public function payres()
{
$out_trade_no=$this->request->param('out_trade_no');
$row=Order::get(['sn'=>$out_trade_no]);
if(!empty($row) && $row->status=="ok"){
$this->success("",url('index/index/return',['act'=>'chenggong']));
}else{
$this->error();
}
}
protected function get_sign(array $datas,$hashkey){
ksort($datas);
reset($datas);
$pre =array();
foreach ($datas as $key => $data){
if(is_null($data)||$data===''){continue;}
if($key=='sign' || $key=='sign_type'){
continue;
}
$pre[$key]=stripslashes($data);
}
$arg = '';
$qty = count($pre);
$index=0;
foreach ($pre as $key=>$val){
$arg.="$key=$val";
if($index++<($qty-1)){
$arg.="&";
}
}
return strtolower(md5($arg.$hashkey));
}
}
发表评论 取消回复