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 '内部错误'; } }
/** * 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('非法访问'); } }
/** * 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(); }