将下载的文件放在 public/plugins/alipay
在 config 支付方法
'pay_type' => [ 'alipay' => ['pay_code'=>'alipay', 'pay_name'=>'支付宝', 'logo'=>'/static/home/img/_/pay2.jpg'], 'wechat' => ['pay_code'=>'wechat', 'pay_name'=>'微信支付', 'logo'=>'/static/home/img/_/pay3.jpg'], 'union' => ['pay_code'=>'union', 'pay_name'=>'银联', 'logo'=>'/static/home/img/_/pay4.jpg'], ], html页面
<form id="orderForm" action="{:url('home/order/save')}" method="post" style="display: none;"> <input type="hidden" name="address_id" value=""> </form>
<script> $(function(){ //封装函数 将选中的地址,放到页面右下角展示 var show_address = function(element){ //获取到选中的地址信息 if(element){ var li = $(element).closest('li'); }else{ var li = $('.addressInfo').find('.name.selected').closest('li'); } var consignee_address = li.find('.consignee_address').html(); var consignee_phone = li.find('.consignee_phone').html(); var consignee_name = li.find('.consignee_name').html(); //展示到页面右下角 $('.fc-receiverInfo').html('寄送至:' + consignee_address +' 收货人:' + consignee_name + ' ' + consignee_phone); }; show_address(); //点击地址 切换右下角的地址 $('.addressInfo').find('.name').click(function(){ show_address(this); }); //提交订单 $('.submit').click(function(){ //获取选中的收货地址id var address_id = $('.addressInfo').find('.name.selected').attr('address_id'); //将地址id放到表单中 $('input[name=address_id]').val(address_id); //提交表单 $('#orderForm').submit(); }); }); </script> 订单提交到
public function save(Request $request) { // 生成订单 $params = input(); $address = Address::where('id', $params['address'])->find(); $order_sn = time() . mt_rand(100000, 999999); $user_id = session('uid'); $data = [ 'user_id' => $user_id, 'order_sn' => $order_sn, 'consignee' => $address['consignee'], 'address' => $address['address'], 'phone' => $address['phone'], 'goods_price' => $params['tot'], ]; $sku = SpecValue::all(); Db::startTrans(); try { // 创建订单前 进行库存检测、 // foreach ($sku as $v) { // // $v['number'] $v['goods_number'] // if ($v['store_count'] > $params['number']) { // //抛出异常 直接进入catch语法结构 // throw new \Exception('订单中包含库存不足的商品'); // } // } // //向订单商品表添加多条数据 $orderId = \app\goods\model\Order::addInfo($data); session('orderId', $orderId['id']); Db::commit(); //展示选择支付方式页面 。。。 $pay_type = config('pay_type'); return view('pay', ['order_sn' => $order_sn, 'pay_type' => $pay_type, 'total_price' => $data['goods_price']]); } catch (\Exception $e) { //回滚事务 \think\Db::rollback(); //$msg = $e->getMessage(); //$this->error($msg); $this->error('创建订单失败,请重试'); } } 或
public function save(){ //接收参数 $params = input(); //参数检测 $validate = $this->validate($params, [ 'address_id' => 'require|integer|gt:0' ]); if($validate !== true){ $this->error($validate); } //组装订单表数据 添加一条 //查询收货地址 $address = \app\common\model\Address::find($params['address_id']); if(!$address){ $this->error('请重新选择收货地址'); } //订单编号 $order_sn = time() . mt_rand(100000, 999999); $user_id = session('user_info.id'); //查询结算的商品(选中的购物记录以及商品和SKU信息) $res = \app\home\logic\OrderLogic::getCartDataWithGoods(); //$res['cart_data'] $res['total_number'] $res['total_price'] $order_data = [ 'user_id' => $user_id, 'order_sn' => $order_sn, 'consignee' => $address['consignee'], 'address' => $address['area'] . $address['address'], 'phone' => $address['phone'], 'goods_price' => $res['total_price'], //商品总价 'shipping_price' => 0,//邮费 'coupon_price' => 0,//优惠金额 'order_amount' => $res['total_price'],//应付金额=商品总价+邮费-优惠金额 'total_amount' => $res['total_price'],//订单总金额=商品总价+邮费 ]; //开启事务 \think\Db::startTrans(); try{ //创建订单前 进行库存检测 foreach($res['cart_data'] as $v){ // $v['number'] $v['goods_number'] if($v['number'] > $v['goods_number']){ //抛出异常 直接进入catch语法结构 throw new \Exception('订单中包含库存不足的商品'); } } $order = \app\common\model\Order::create($order_data); // //向订单商品表添加多条数据 // $order_goods_data = []; // foreach($res['cart_data'] as $v){ // $row = [ // 'order_id' => $order['id'], // 'goods_id' => $v['goods_id'], // 'spec_goods_id' => $v['spec_goods_id'], // 'number' => $v['number'], // 'goods_name' => $v['goods_name'], // 'goods_logo' => $v['goods_logo'], // 'goods_price' => $v['goods_price'], // 'spec_value_names' => $v['value_names'], // ]; // $order_goods_data[] = $row; // } // //批量添加 // $model = new \app\common\model\OrderGoods(); // $model->saveAll($order_goods_data); // //从购物车表删除对应数据 // //\app\common\model\Cart::where(['user_id' => $user_id, 'is_selected'=>1])->delete(); // //\app\common\model\Cart::where('user_id',$user_id)->where('is_selected',1)->delete(); // //库存预扣减(冻结库存) // $spec_goods = []; // $goods = []; // foreach($res['cart_data'] as $v){ // //判断是否有SKU 有则修改SKU表,无则修改商品表 // if($v['spec_goods_id']){ // //修改SKU表 购买数量$v['number'] 库存$v['goods_number'] 冻结$v['frozen_number'] // $row = [ // 'id'=>$v['spec_goods_id'], // 'store_count' => $v['goods_number'] - $v['number'], // 'store_frozen' => $v['frozen_number'] + $v['number'] // ]; // $spec_goods[] = $row; // }else{ // //修改商品表 购买数量$v['number'] 库存$v['goods_number'] 冻结$v['frozen_number'] // $row = [ // 'id'=>$v['goods_id'], // 'goods_number' => $v['goods_number'] - $v['number'], // 'frozen_number' => $v['frozen_number'] + $v['number'] // ]; // $goods[] = $row; // } // } // //批量修改库存 // $sku_model = new \app\common\model\SpecGoods(); // $sku_model->saveAll($spec_goods); // $goods_model = new \app\common\model\Goods(); // $goods_model->saveAll($goods); // //提交事务 \think\Db::commit(); //展示选择支付方式页面 。。。 $pay_type = config('pay_type'); return view('pay', ['order_sn' => $order_sn, 'pay_type'=>$pay_type, 'total_price'=>$res['total_price']]); }catch (\Exception $e){ //回滚事务 \think\Db::rollback(); //$msg = $e->getMessage(); //$this->error($msg); $this->error('创建订单失败,请重试'); } }
到
<title>支付页</title> <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script> <link rel="stylesheet" type="text/css" href="/static/home/css/pages-pay.css" /> <div class="cart py-container"> <!--主内容--> <div class="checkout py-container pay"> <div class="checkout-tit"> <h4 class="tit-txt"><span class="success-icon"></span><span class="success-info">订单提交成功,请您及时付款,以便尽快为您发货~~</span></h4> <div class="paymark"> <span class="fl">请您在提交订单<em class="orange time">30分钟</em>之内完成支付,超时订单会自动取消。订单号:<em>{$order_sn}</em></span> <span class="fr"><em class="sui-lead">应付金额:</em><em class="orange money">¥{$total_price}</em></span> </div> </div> <!--<div class="check-info"> <h4>重要说明:</h4> <ol> <li>品优购商城支付平台目前支持<span class="zfb">支付宝</span>支付方式。</li> <li>其它支付渠道正在调试中,敬请期待。</li> <li>为了保证您的购物支付流程顺利完成,请保存以下支付宝信息。</li> </ol> <h4>支付宝账户信息:(很重要,<span class="save">请保存!!!</span>)</h4> <ul> <li>支付帐号:duqthf1038@sandbox.com</li> <li>密码:111111</li> <li>支付密码:111111</li> </ul> </div>--> <!--需增加的代码开始--> <div class="qrpay"> <div class="step-tit"> <h5>扫码付(支持支付宝、微信)</h5> </div> </div> <!--需增加的代码结束--> <div class="checkout-steps"> <!--收件人信息--> <div class="step-tit"> <h5>支付平台</h5> </div> <div class="step-cont"> <ul class="payType"> {foreach $pay_type as $v} <li class="" pay_code="{$v.pay_code}" {if($v.pay_code == 'alipay')}style="border: 2px solid rgb(228, 57, 60);"{/if}><img src="{$v.logo}"></li> {/foreach} </ul> </div> <div class="hr"></div> <!--支付和送货--> <!--<div class="payshipInfo"> <div class="step-tit"> <h5>支付网银</h5> </div> <div class="step-cont"> <ul class="payType"> <li><img src="/static/home/img/_/pay10.jpg"></li> <li><img src="/static/home/img/_/pay11.jpg"></li> <li><img src="/static/home/img/_/pay12.jpg"></li> <li><img src="/static/home/img/_/pay13.jpg"></li> <li><img src="/static/home/img/_/pay14.jpg"></li> <li><img src="/static/home/img/_/pay15.jpg"></li> <li><img src="/static/home/img/_/pay16.jpg"></li> <li><img src="/static/home/img/_/pay17.jpg"></li> <li><img src="/static/home/img/_/pay18.jpg"></li> <li><img src="/static/home/img/_/pay19.jpg"></li> <li><img src="/static/home/img/_/pay20.jpg"></li> <li><img src="/static/home/img/_/pay21.jpg"></li> <li><img src="/static/home/img/_/pay22.jpg"></li> </ul> </div> <div class="hr"></div> </div>--> <div class="submit sui-text-center"> <button class="btn"> 立即支付</button> </div> <!--<div class="otherpay"> <div class="step-tit"> <h5>其他支付方式</h5> </div> <div class="step-cont"> <span><a href="weixinpay.html" target="_blank">微信支付</a></span> <span>中国银联</span> </div> </div>--> </div> </div> </div> <form id="payForm" action="/order/pay" method="post"> <input type="hidden" name="order_sn" value="{$order_sn}"> <input type="hidden" name="pay_code" value=""> </form> <script type="text/javascript"> $(function(){ $("ul.payType li").click(function(){ $(this).css("border","2px solid #E4393C").siblings().css("border-color","#ddd"); }); //去支付 $('.submit').click(function(){ //获取选择的支付方式 var pay_code = ''; $('.payType li').each(function(i,v){ //i是下标,v是li标签 //console.log($(v).css('border-color')); if($(v).css('border-color') == 'rgb(228, 57, 60)'){ //console.log($(v).attr('pay_code')); pay_code = $(v).attr('pay_code'); } }); //将支付方式pay_code放到表单中 $('input[name=pay_code]').val(pay_code); //发送请求 表单提交 $('#payForm').submit(); }) }) </script> <script> $(function(){ //轮询, 查询支付状态 var order_sn = "{$order_sn}"; var timer = setInterval(function(){ $.ajax({ "url":"{:url('home/order/status')}", "type":"post", "data":"order_sn=" + order_sn, "dataType":"json", "success":function(res){ if(res.code == 200 && res.data == 1){ clearInterval(timer); location.href = "{:url('home/order/payresult')}?order_sn=" + order_sn; } } }); }, 1000); }) </script> 支付控制器
//支付 public function pay() { $params = input(); $validate = Loader::validate('Order'); if (!$validate->check($params)) { $this->error($validate->getError()); } // 根据订单号查询订单是否存在 $order = \app\goods\model\Order::where('order_sn', $params['order_sn'])->find(); if (!$order) { $this->error('订单不存在'); } // //将选择的支付方式,修改到订单表 $pay_type = config('pay_type'); $order->pay_code = $params['pay_code']; //$order->pay_name = config('pay_type.' . $params['pay_code'])['pay_name']; $order->pay_name = $pay_type[$params['pay_code']]['pay_name']; $order->save(); // print_r($order);die(); // print_r($money); //默认 支付宝 echo "<form id='alipayment' action='/plugins/alipay/pagepay/pagepay.php' method='post' style='display:none'> <input id='WIDout_trade_no' name='WIDout_trade_no' value='{$order['order_sn']}'/> <input id='WIDsubject' name='WIDsubject' value='品优购订单' /> <input id='WIDtotal_amount' name='WIDtotal_amount' value='{$order['goods_price']}'/> <input id='WIDbody' name='WIDbody' value='品优购订单,测试订单,你付款了我也不发货' /> </form><script>document.getElementById('alipayment').submit();</script>";
/plugins/alipay/pagepay/pagepay.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>支付</title> </head> <?php require_once dirname(dirname(__FILE__)).'/config.php'; require_once dirname(__FILE__).'/service/AlipayTradeService.php'; require_once dirname(__FILE__).'/buildermodel/AlipayTradePagePayContentBuilder.php'; //商户订单号,商户网站订单系统中唯一订单号,必填 $out_trade_no = trim($_POST['WIDout_trade_no']); //订单名称,必填 $subject = trim($_POST['WIDsubject']); //付款金额,必填 $total_amount = trim($_POST['WIDtotal_amount']); //商品描述,可空 $body = trim($_POST['WIDbody']); //构造参数 $payRequestBuilder = new AlipayTradePagePayContentBuilder(); $payRequestBuilder->setBody($body); $payRequestBuilder->setSubject($subject); $payRequestBuilder->setTotalAmount($total_amount); $payRequestBuilder->setOutTradeNo($out_trade_no); $aop = new AlipayTradeService($config); /** * pagePay 电脑网站支付请求 * @param $builder 业务参数,使用buildmodel中的对象生成。 * @param $return_url 同步跳转地址,公网可以访问 * @param $notify_url 异步通知地址,公网可以访问 * @return $response 支付宝返回的信息 */ $response = $aop->pagePay($payRequestBuilder,$config['return_url'],$config['notify_url']); //输出表单 var_dump($response); ?> </body> </html> 控制器 回调
function callback(){ //参考/plugins/alipay/return_url.php //接收参数 $params = input(); //参数检测(签名验证) 接收到的参数 和 支付宝传递的参数 是否发生改变 require_once("./plugins/alipay/config.php"); require_once './plugins/alipay/pagepay/service/AlipayTradeService.php'; $alipaySevice = new \AlipayTradeService($config); $result = $alipaySevice->check($params); if($result){ //验签成功 $order_sn = $params['out_trade_no']; $order = \app\goods\model\Order::where('order_sn', $order_sn)->find(); //展示结果 return view('paysuccess', ['pay_name' => '支付宝', 'order_amount'=>$params['total_amount'], 'order' => $order]); }else{ //验签失败 //展示结果 return view('payfail', ['msg' => '支付失败']); } } 成功页面
<title>支付页-成功</title> <link rel="stylesheet" type="text/css" href="/static/home/css/pages-paysuccess.css" /> <div class="cart py-container"> <!--主内容--> <div class="paysuccess"> <div class="success"> <h3><img src="/static/home/img/_/right.png" width="48" height="48"> 恭喜您,支付成功啦!</h3> <div class="paydetail"> <p>支付方式:{$pay_name}</p> <p>支付金额:¥{$order_amount}元</p> <p class="button"><a href="javascript:;" class="sui-btn btn-xlarge btn-danger">查看订单</a> <a href="{:url('home/index/index')}" class="sui-btn btn-xlarge ">继续购物</a></p> </div> </div> </div> </div> 失败页面
<title>支付页-失败</title> <link rel="stylesheet" type="text/css" href="/static/home/css/pages-payfail.css" /> <div class="cart py-container"> <!--主内容--> <div class="payfail"> <div class="fail"> <h3><img src="/static/home/img/_/fail.png" width="48" height="48"> 支付失败,请稍后再试</h3> <div class="fail-text"> <p>失败原因:{$msg}</p> <p>您可以先去 <a href="{:url('home/index/index')}" target="_blank">品优购首页</a> 逛逛</p> <p class="button"><a href="javascript:;" class="sui-btn btn-xlarge btn-danger">重新支付</a></p> </div> </div> </div> </div>