Example #1
0
 public function run()
 {
     $order_id = Input::get('order_id', 0);
     $user_id = Input::get('user_id', 0);
     $open_id = Input::get('open_id', '');
     $pay_ment = PayMentORM::whereOrderId($order_id)->where('openid', '<>', '')->first();
     if (empty($pay_ment)) {
         $order = OrderORM::whereId($order_id)->wherePayStatus(BaseORM::DISABLE)->first();
         if (empty($order)) {
             return '订单未找到';
         }
         if ($user_id != $order->user_id) {
             return '用户不正确';
         }
         $album = AlbumORM::whereId($order->album_id)->first();
         if (empty($album)) {
             return '相册未找到';
         }
         $template = TemplateORM::whereId($album->template_id)->first();
         if (empty($template)) {
             return '相册模版未找到';
         }
         $params['out_trade_no'] = $this->_generate_out_trade_no($order_id, $user_id);
         $params['subject'] = '购买相册打印服务';
         $params['quantity'] = $order->quantity;
         $params['total_fee'] = $order->total_amount;
         $params['price'] = $template->price;
         $params['body'] = '购买相册打印服务';
         $params['user_id'] = $user_id;
         $params['openid'] = $open_id;
         $params['order_id'] = $order_id;
         $r = PayMentORM::edit(0, $params);
         $pay_ment = $r[1];
     }
     try {
         $m = new Wxpay();
         $jsParameters = $m->getJsApiParameters($pay_ment->out_trade_no, $pay_ment->total_fee * 100, $pay_ment->openid);
         return json_decode($jsParameters, true);
     } catch (Exception $e) {
         return '内部错误';
     }
 }
Example #2
0
 /**
  * tips页显示
  * @param Request $request
  * @param Response $response
  */
 public function order_topay(Request $request, Response $response)
 {
     if ($request->is_post()) {
         global $user;
         if (!$user->uid) {
             Fn::show_error_message('未登录,请先登录');
         }
         $this->v = new PageView('', 'topay');
         $pay_mode = $request->post('pay_mode', 'wxpay');
         //默认微信支付
         $order_id = $request->post('order_id', 0);
         $back_url = $request->post('back_url', '');
         $supported_paymode = ['wxpay' => '微信安全支付', 'alipay' => '支付宝支付'];
         if (!in_array($pay_mode, array_keys($supported_paymode))) {
             Fn::show_error_message('不支持该支付方式: ' . $pay_mode);
         }
         if (!$order_id) {
             Fn::show_error_message('订单为空');
         }
         $order_info = Order::info($order_id);
         if (empty($order_info)) {
             Fn::show_error_message('订单不存在');
         } else {
             $order_info['order_goods'] = Goods::getOrderGoods($order_info['order_id']);
             if (empty($order_info['order_goods'])) {
                 Fn::show_error_message('订单下没有对应商品');
             }
         }
         if ('wxpay' == $pay_mode) {
             $jsApiParams = Wxpay::unifiedOrder($order_info, $user->openid);
             $this->v->assign('jsApiParams', $jsApiParams);
         }
         $this->v->assign('pay_mode', $pay_mode);
         $this->v->assign('supported_paymode', $supported_paymode);
         $this->v->assign('back_url', $back_url);
         $response->send($this->v);
     } else {
         Fn::show_error_message('非法访问');
     }
 }
Example #3
0
 /**
  * action 'notify'
  * 微信支付统一下订单回调
  *
  * @param Request $request
  * @param Response $response
  */
 public function notify(Request $request, Response $response)
 {
     Wxpay::nofify(function ($data, &$msg) {
         //trace_debug('wxpay_notify_data', $data);
         //trace_debug('wxpay_notify_msg', $msg);
         if ('OK' == $msg) {
             // 成功合法的订单
             // 关注的数据
             $openid = $data['openid'];
             //用户openid
             $is_subscribe = $data['is_subscribe'];
             //是否关注公众账号:'Y' or 'N'
             $total_fee = $data['total_fee'];
             //订单总金额,单位为分
             $bank_type = $data['bank_type'];
             //付款银行
             $transaction_id = $data['transaction_id'];
             //微信支付订单号
             $order_sn = $data['out_trade_no'];
             //自身订单号
             $attach = isset($data['attach']) ? $data['attach'] : '';
             //商家自定义数据,原样返回
             $time_end = $data['time_end'];
             //支付完成时间,格式为yyyyMMddHHmmss,如:20141030133525
             $time_end = Fn::to_timestamp($time_end);
             //对日志表"写锁定",避免其他线程进入干扰(这时其他线程对表pay_log的读写都要等待)
             $tb_paylog = C('storage.mysql-config.tablePrefix') . 'pay_log';
             D()->lock_tables($tb_paylog, DB::LOCK_WRITE, '', TRUE);
             //检查支付日志表,以确定订单是否存在(之所以用日志表而不是主表order_info,是为了在锁表期间不阻塞到前台访问频繁的主表)
             $pay_log = D()->from($tb_paylog, DB::WRITABLE)->where(['order_sn' => $order_sn])->select()->get_one();
             if (empty($pay_log)) {
                 $msg = '订单号不存在';
                 D()->unlock_tables();
                 // 解锁
                 return false;
             }
             $order_id = $pay_log['order_id'];
             //检查支付金额是否正确
             if (intval($pay_log['order_amount'] * 100) != $total_fee) {
                 $msg = '金额不对';
                 D()->unlock_tables();
                 // 解锁
                 return false;
             }
             //检查订单状态
             if (!$pay_log['is_paid']) {
                 //未付款
                 //更新pay_log
                 D()->update($tb_paylog, ['is_paid' => 1], ['order_id' => $order_id], true);
                 // 更新完立马解锁
                 D()->unlock_tables();
                 //立马修改订单状态为已付款
                 $updata = ['pay_trade_no' => $transaction_id, 'order_status' => OS_CONFIRMED, 'confirm_time' => simphp_time(), 'pay_status' => PS_PAYED, 'pay_time' => simphp_time($time_end), 'money_paid' => $pay_log['order_amount'], 'order_amount' => 0, 'pay_data2' => json_encode($data)];
                 D()->update('order_info', $updata, ['order_id' => $order_id]);
                 //记录订单操作记录
                 Order::order_action_log($order_id, ['action_note' => '用户支付']);
                 //更新订单下所有商品的"订单数"
                 //Goods::updateGoodsOrderCntByOrderid($order_id);
                 //订单成功后的操作,如送分、送票等
                 Order::order_success_after($order_id);
             } else {
                 D()->unlock_tables();
                 // 解锁
             }
             return true;
         }
         return false;
     });
 }
 public function pay()
 {
     $this->is_login();
     $userinfo = session('P');
     $wxpay_config = $this->ag_hongbao_config();
     if (empty($wxpay_config['Allow_type'])) {
         $this->error('暂不支持任何形式付款');
     }
     if (IS_POST && count($_SESSION['cart']) > 0) {
         import('@.ORG.Cart');
         $cart = new \Cart();
         $user_address = M('shop_useraddress');
         $item_order = M('shop_orders');
         $order_detail = M('order_detail');
         //生成订单号
         $dingdanhao = date("Y-m-dH-i-s");
         $dingdanhao = str_replace("-", "", $dingdanhao);
         $dingdanhao .= rand(1000, 9999);
         $time = time();
         //订单添加时间
         $address_options = I('post.address_options', '', 'intval');
         //地址  0:刚填的地址 大于0历史的地址
         $shipping_id = I('post.shipping_id', '', 'intval');
         //配送方式
         $postscript = I('post.postscript', '', 'trim');
         //卖家留言
         if (!empty($postscript)) {
             //卖家留言
             $data['note'] = $postscript;
         }
         //仅支持卖家包邮
         //if(empty($shipping_id)){//卖家包邮
         $data['freetype'] = 0;
         $data['order_sumPrice'] = $cart->getPrice();
         //} else{
         // $data['freetype']       = $shipping_id;
         // $data['freeprice']      = $this->getFree($shipping_id);//取到运费
         // $data['order_sumPrice'] = $cart->getPrice()+$this->getFree($shipping_id);
         //}
         $data['orderId'] = $dingdanhao;
         //订单号
         $data['add_time'] = $time;
         //添加时间
         $data['goods_sumPrice'] = $cart->getPrice();
         //商品总额
         $data['userId'] = $userinfo['id'];
         //用户ID
         if ($address_options == 0) {
             $consignee = I('post.consignee', '', 'trim');
             //真实姓名
             $sheng = I('post.sheng', '', 'trim');
             //省
             $shi = I('post.shi', '', 'trim');
             //市
             $qu = I('post.qu', '', 'trim');
             //区
             $address = I('post.address', '', 'trim');
             //详细地址
             $phone_mob = I('post.phone_mob', '', 'trim');
             //电话号码
             $save_address = I('post.save_address', '', 'trim');
             //是否保存地址
             $data['address_name'] = $consignee;
             //收货人姓名
             $data['mobile'] = $phone_mob;
             //电话号码
             $data['address'] = $sheng . $shi . $qu . $address;
             //地址
             //自动保存地址进数据库
             if ($save_address) {
                 $add_address['consignee'] = $consignee;
                 $add_address['address'] = $address;
                 $add_address['mobile'] = $phone_mob;
                 $add_address['sheng'] = $sheng;
                 $add_address['shi'] = $shi;
                 $add_address['qu'] = $qu;
                 $user_address->add($add_address);
             }
         } else {
             $userId = $userinfo['id'];
             //提取用户地址
             $address = $user_address->where("uid='{$userId}'")->find($address_options);
             //取到地址
             $data['address_name'] = $address['consignee'];
             //收货人姓名
             $data['mobile'] = $address['mobile'];
             //电话号码
             $data['address'] = $address['sheng'] . $address['shi'] . $address['qu'] . $address['address'];
             //地址
         }
         $orderid = $item_order->add($data);
         //添加订单
         if ($orderid) {
             $orders['orderId'] = $dingdanhao;
             $item_goods = M('docunment_shop');
             foreach ($_SESSION['cart'] as $item) {
                 //减少库存
                 $item_goods->where(array('id' => $item['id']))->setDec('shop_goods_stock', $item['num']);
                 //$item_goods->where('id ='.$item['id'])->setDec('goods_stock',$item['num']);
                 $orders['itemId'] = $item['id'];
                 //商品ID
                 $orders['title'] = $item['name'];
                 //商品名称
                 $orders['img'] = $item['img'];
                 //商品图片
                 $orders['price'] = $item['price'];
                 //商品价格
                 $orders['quantity'] = $item['num'];
                 //购买数量
                 $order_detail->add($orders);
             }
             $cart->clear();
             //清空购物车
             $this->assign('orderid', $orderid);
             //订单ID
             $this->assign('dingdanhao', $dingdanhao);
             //订单号
             $this->assign('order_sumPrice', $data['order_sumPrice']);
         } else {
             $this->error('生成订单失败!');
         }
     } else {
         if (isset($_GET['orderId'])) {
             $item_order = M('shop_orders');
             //订单号
             $userId = $userinfo['id'];
             //去除单号  安全后缀  空格
             $orderId = str_replace(' ', '', str_replace('.html?showwxpaytitle=1', '', $_GET['orderId']));
             $orders = $item_order->where("userId='{$userId}' and orderId='{$orderId}'")->find();
             if (!is_array($orders)) {
                 $this->error('该订单不存在');
             }
             Wxpay::get_prepay_id();
             if (empty($orders['supportmetho'])) {
                 //是否已有支付方式
                 $this->assign('orderid', $orders['id']);
                 //订单ID
                 $this->assign('dingdanhao', $orders['orderId']);
                 //订单号
                 $this->assign('order_sumPrice', $orders['order_sumPrice']);
             } else {
                 //微信支付
                 $alipay = M('alipay')->find();
                 echo "<script>location.href='wapapli/alipayapi.php?WIDseller_email=" . $alipay['alipayname'] . "&WIDout_trade_no=" . $orderId . "&WIDsubject=" . $orderId . "&WIDtotal_fee=" . $orders['order_sumPrice'] . "'</script>";
                 die;
             }
         }
     }
     $this->book_menu($userinfo);
     //选择支付方式  货到付款  微信支付
     if (!empty($wxpay_config['hb_dh_diyong'])) {
         $time = time();
         $map['hb_star'] = array('lt', $time);
         $map['hb_end'] = array('gt', $time);
         $map['status'] = 1;
         $map['userid'] = $userinfo['id'];
         $hblist = M('wxpay_userhongbao')->where($map)->select();
         $this->assign('hblist', $hblist);
     }
     $this->assign('paylist', $wxpay_config['Allow_type']);
     $this->display();
 }