0, 'msg' => '下单失败' ); $this->ajaxReturn($res); } // 判断支付类型 if (!in_array($pay_type, array('1', '2'))) { $res = array( 'status' => 0, 'msg' => '支付类型有误' ); $this->ajaxReturn($res); } // 判断金额 if (!verifyPrice($all_money)) { $res = array( 'status' => 0, 'msg' => '订单金额有误' ); $this->ajaxReturn($res); } // 查询bill订单 $BillModel = D('RetailBillOrder'); $map = array( 'b.' . $BillModel::ORDER_NO => strval($order_no), 'b.' . $BillModel::MERCHANT_ID => self::$merchant_id, 'b.' . $BillModel::STORE_ID => self::$store_id, ); $bill_order = $BillModel->getOrderLinkFind($map); if (!$bill_order) { $res = array( 'status' => 0, 'msg' => '订单查询失败' ); $this->ajaxReturn($res); } // 验证金额 $CashierModel = D('RetailCashier'); $StoreModel = D('RetailStore'); $item = array( 'bill_order' => $bill_order, 'vid' => $vid, //会员id 'coupon_id' => $coupon_id, //优惠券id 'discount' => $discount, //收银员手动打折折扣值 'small_changes_money' => $small_changes_money, //抹零金额 'allMoney' => $all_money, //前台计算的总价 'integral_cashing' => $integral_cashing, //积分抵现开启状态 'guide_id' => $guide_id, //导购员id 'cashier_preferential_state' => self::$cashier[$CashierModel::PREFERENTIAL_STATE],//收银员打折权限 'store_preferential_state' => self::$store[$StoreModel::PREFERENTIAL_STATE],//门店打折权限 'guide_open_state' => self::$store[$StoreModel::GUIDE_OPEN_STATE],//导购员分佣开启状态 ); $calculation = A('PayApi/Order')->calculationOrder_v1($item);//重新计算该付的金额 if ($calculation['status'] == 1) { $bill_order = $calculation['order']; if (round($bill_order[$BillModel::ALL_MONEY] - $all_money) < 0) { $result['all_money'] = $bill_order[$BillModel::ALL_MONEY]; $result['status'] = 0; $result['msg'] = '支付金额超出订单总额1'; $this->ajaxReturn($result); } $bill_order[$BillModel::GUIDE_ID] = $guide_id; $bill_order[$BillModel::PAY_STATE] = 2; $bill_order[$BillModel::PAY_TYPE] = $pay_type == 1 ? 3 : 4;//1现金 3微信支付 4支付宝支付 5会员卡余额支付 6小程序商城微信支付 7其他支付方式 8组合支付 $update = $BillModel->updateOrder(array($BillModel::ID => $bill_order[$BillModel::ID]), $bill_order); if (!$update) { $result['status'] = 0; $result['msg'] = '订单更新失败,请重试'; $this->ajaxReturn($result); } } else { $this->ajaxReturn($calculation); } // pay_order表模型 $RPOModel = D('RetailPayOrder'); // 支付 if ($pay_type == 1) { $payOrderItem[$RPOModel::PAY_TYPE] = 1; } else { $payOrderItem[$RPOModel::PAY_TYPE] = 2; } // 查询商户支付模式设置 $RPSModel = D('RetailPaySet'); $pay_set = $RPSModel->getFindMerchantConfig(self::$merchant_id, $pay_type); if ($pay_set['status'] != 1) { $res = array('status' => 0, 'msg' => $pay_set['msg']); $this->ajaxReturn($res); } // 商户支付设置 $config = $pay_set['config']; $RMModel = D('RetailMerchant'); // 商户表模型 $config['body'] = self::$merchant[$RMModel::NAME] . '-' . self::$store[$StoreModel::STORE_NAME]; // 下单(pay_order) $payOrderItem[$RPOModel::M_PAY_TYPE] = $pay_set['m_pay_type']; $payOrderItem[$RPOModel::ORDER_TYPE] = 1; $payOrderItem[$RPOModel::PAY_TYPE] = $pay_type; $payOrderItem[$RPOModel::TRADE_AMOUNT] = $all_money; $payOrderItem[$RPOModel::STORE_ID] = self::$store_id; $payOrderItem[$RPOModel::MERCHANT_ID] = self::$merchant_id; $payOrderItem[$RPOModel::CASHIER_ID] = self::$cashier_id; $payOrderItem[$RPOModel::VID] = 0; $payOrderItem[$RPOModel::ORDER_STATE] = 'WAIT_BUYER_PAY'; $payOrderItem[$RPOModel::ADD_TIME] = time(); $payOrderItem[$RPOModel::BILL_ID] = $bill_order[$BillModel::ID]; $payOrderItem[$RPOModel::NOTIFY_URL] = 'NotifyApi/SelfHelpCashier/newPayNotifyUrl'; $add_order = $RPOModel->addPayOrder($payOrderItem); // 判断下单 if (!$add_order) { $res = array( 'status' => 0, 'msg' => '下单失败' ); $this->ajaxReturn($res); } $store_name = self::$store[$StoreModel::STORE_NAME]; // 新大陆或微信或支付宝下单 if ($add_order[$RPOModel::M_PAY_TYPE] == 3) { // 新大陆 $res = A('Pay/PayContinent')->sweepCodePay($add_order); if ($res['status'] == 0) { $this->ajaxReturn($res); } } else if ($add_order[$RPOModel::M_PAY_TYPE] == 4) { // 云闪付 $payObj = new CloudPayController(); $res = $payObj->cloudPaybarCodeAll($add_order,$config, $pay_type,$store_name); if ($res['status'] == 0) { $this->ajaxReturn($res); } } else if ($pay_type == 1) { // 微信 $wx_result = A("Api/PaymentCodes")->createWxPayOrder($add_order, $config, $store_name, 1); if ($wx_result['status'] == 0) { $this->ajaxReturn($wx_result); } $res['qr_code'] = $wx_result['data']['code_url']; } else if ($pay_type == 2) { // 支付宝 $al_result = A("Api/PaymentCodes")->createAliPayOrder($add_order, $config, $store_name, 1); if ($al_result['status'] == 0) { $this->ajaxReturn($al_result); } $res['qr_code'] = $al_result['qr_code']; } else { $res = array( 'status' => 0, 'msg' => '支付类型有误' ); $this->ajaxReturn($res); } $res['status'] = 1; $res['out_trade_no'] = $add_order[$RPOModel::OUT_TRADE_NO]; $res['msg'] = '下单成功'; $this->ajaxReturn($res); } /** * 自助收银支付 * @param string $order_no 订单号 * @param int $pay_type 支付类型 1.微信 2.支付宝 * @param int $all_money 金额 * @return array $res */ public function SelfHelpCashierPay_v2() { // 接受数据 $order_no = I('post.order_no'); $pay_type = I('post.pay_type'); $all_money = I('post.all_money'); $vid = I('post.vid'); $coupon_id = I('post.coupon_id'); $discount = I('post.discount') ? I('post.discount') : 1; $small_changes_money = I('post.small_changes_money') ? I('post.small_changes_money') : 0; $integral_cashing = I('post.integral_cashing') == 1 ? 1 : 0; $guide_id = I('post.guide_id') ? I('post.guide_id') : 0; $integral_dis_num = I('post.integral_dis_num')?I('post.integral_dis_num'):0; //扣除的总积分 $integral_dis_money = I('post.integral_dis_money')?I('post.integral_dis_money'):0; //抵现积分的金额 // 判断订单号 if (!$order_no) { $res = array( 'status' => 0, 'msg' => '下单失败' ); $this->ajaxReturn($res); } // 判断支付类型 if (!in_array($pay_type, array('1', '2'))) { $res = array( 'status' => 0, 'msg' => '支付类型有误' ); $this->ajaxReturn($res); } // 判断金额 if (!verifyPrice($all_money)) { $res = array( 'status' => 0, 'msg' => '订单金额有误' ); $this->ajaxReturn($res); } // 查询bill订单 $BillModel = D('RetailBillOrder'); $map = array( 'b.' . $BillModel::ORDER_NO => strval($order_no), 'b.' . $BillModel::MERCHANT_ID => self::$merchant_id, 'b.' . $BillModel::STORE_ID => self::$store_id, ); $bill_order = $BillModel->getOrderLinkFind($map); if (!$bill_order) { $res = array( 'status' => 0, 'msg' => '订单查询失败' ); $this->ajaxReturn($res); } // 验证金额 $CashierModel = D('RetailCashier'); $StoreModel = D('RetailStore'); $item = array( 'bill_order' => $bill_order, 'vid' => $vid, //会员id 'coupon_id' => $coupon_id, //优惠券id 'discount' => $discount, //收银员手动打折折扣值 'small_changes_money' => $small_changes_money, //抹零金额 'allMoney' => $all_money, //前台计算的总价 'integral_cashing' => $integral_cashing, //积分抵现开启状态 'guide_id' => $guide_id, //导购员id 'integral_dis_money' => $integral_dis_money, //积分抵现开启抵现的金额 'integral_dis_num' => $integral_dis_num, //积分抵现开启状态抵现的积分 'cashier_preferential_state' => self::$cashier[$CashierModel::PREFERENTIAL_STATE],//收银员打折权限 'store_preferential_state' => self::$store[$StoreModel::PREFERENTIAL_STATE],//门店打折权限 'guide_open_state' => self::$store[$StoreModel::GUIDE_OPEN_STATE],//导购员分佣开启状态 ); $calculation = A('PayApi/Order')->calculationOrder_v2($item);//重新计算该付的金额 if ($calculation['status'] == 1) { $bill_order = $calculation['order']; if (round($bill_order[$BillModel::ALL_MONEY] - $all_money) < 0) { $result['all_money'] = $bill_order[$BillModel::ALL_MONEY]; $result['status'] = 0; $result['msg'] = '支付金额超出订单总额1'; $this->ajaxReturn($result); } $bill_order[$BillModel::GUIDE_ID] = $guide_id; $bill_order[$BillModel::PAY_STATE] = 2; $bill_order[$BillModel::PAY_TYPE] = $pay_type == 1 ? 3 : 4;//1现金 3微信支付 4支付宝支付 5会员卡余额支付 6小程序商城微信支付 7其他支付方式 8组合支付 $update = $BillModel->updateOrder(array($BillModel::ID => $bill_order[$BillModel::ID]), $bill_order); if (!$update) { $result['status'] = 0; $result['msg'] = '订单更新失败,请重试'; $this->ajaxReturn($result); } } else { $this->ajaxReturn($calculation); } // pay_order表模型 $RPOModel = D('RetailPayOrder'); // 支付 if ($pay_type == 1) { $payOrderItem[$RPOModel::PAY_TYPE] = 1; } else { $payOrderItem[$RPOModel::PAY_TYPE] = 2; } // 查询商户支付模式设置 $RPSModel = D('RetailPaySet'); $pay_set = $RPSModel->getFindMerchantConfig(self::$merchant_id, $pay_type); if ($pay_set['status'] != 1) { $res = array('status' => 0, 'msg' => $pay_set['msg']); $this->ajaxReturn($res); } // 商户支付设置 $config = $pay_set['config']; $RMModel = D('RetailMerchant'); // 商户表模型 $config['body'] = self::$merchant[$RMModel::NAME] . '-' . self::$store[$StoreModel::STORE_NAME]; // 下单(pay_order) $payOrderItem[$RPOModel::M_PAY_TYPE] = $pay_set['m_pay_type']; $payOrderItem[$RPOModel::ORDER_TYPE] = 1; $payOrderItem[$RPOModel::PAY_TYPE] = $pay_type; $payOrderItem[$RPOModel::TRADE_AMOUNT] = $all_money; $payOrderItem[$RPOModel::STORE_ID] = self::$store_id; $payOrderItem[$RPOModel::MERCHANT_ID] = self::$merchant_id; $payOrderItem[$RPOModel::CASHIER_ID] = self::$cashier_id; $payOrderItem[$RPOModel::VID] = 0; $payOrderItem[$RPOModel::ORDER_STATE] = 'WAIT_BUYER_PAY'; $payOrderItem[$RPOModel::ADD_TIME] = time(); $payOrderItem[$RPOModel::BILL_ID] = $bill_order[$BillModel::ID]; $payOrderItem[$RPOModel::NOTIFY_URL] = 'NotifyApi/SelfHelpCashier/newPayNotifyUrl'; $add_order = $RPOModel->addPayOrder($payOrderItem); // 判断下单 if (!$add_order) { $res = array( 'status' => 0, 'msg' => '下单失败' ); $this->ajaxReturn($res); } $store_name = self::$store[$StoreModel::STORE_NAME]; // 新大陆或微信或支付宝下单 if ($add_order[$RPOModel::M_PAY_TYPE] == 3) { // 新大陆 $res = A('Pay/PayContinent')->sweepCodePay($add_order); if ($res['status'] == 0) { $this->ajaxReturn($res); } } else if ($add_order[$RPOModel::M_PAY_TYPE] == 4) { // 云闪付 $payObj = new CloudPayController(); $res = $payObj->cloudPaybarCodeAll($add_order,$config, $pay_type,$store_name); if ($res['status'] == 0) { $this->ajaxReturn($res); } } else if ($pay_type == 1) { // 微信 $wx_result = A("Api/PaymentCodes")->createWxPayOrder($add_order, $config, $store_name, 1); if ($wx_result['status'] == 0) { $this->ajaxReturn($wx_result); } $res['qr_code'] = $wx_result['data']['code_url']; } else if ($pay_type == 2) { // 支付宝 $al_result = A("Api/PaymentCodes")->createAliPayOrder($add_order, $config, $store_name, 1); if ($al_result['status'] == 0) { $this->ajaxReturn($al_result); } $res['qr_code'] = $al_result['qr_code']; } else { $res = array( 'status' => 0, 'msg' => '支付类型有误' ); $this->ajaxReturn($res); } $res['status'] = 1; $res['out_trade_no'] = $add_order[$RPOModel::OUT_TRADE_NO]; $res['msg'] = '下单成功'; $this->ajaxReturn($res); } /** * 自助收银机查询扫码支付订单状态 * @param string $out_trade_no pay_order订单号 * @return array $res */ public function searchOrderPayState() { // 接受数据 $out_trade_no = I('post.out_trade_no'); // 判断订单号 if (!$out_trade_no) { $res = array( 'status' => 0, 'msg' => '请求错误' ); $this->ajaxReturn($res); } // 查询订单 $RPOModel = D('RetailPayOrder'); $pay_order = $RPOModel->getFind(array($RPOModel::OUT_TRADE_NO => strval($out_trade_no))); // 判断订单 if (empty($pay_order)) { $res = array( 'status' => 0, 'msg' => '订单异常' ); $this->ajaxReturn($res); } // 查询bill_order $RBOModel = D('RetailBillOrder'); $map = array( 'b.' . $RBOModel::ID => $pay_order[$RPOModel::BILL_ID], 'b.' . $RBOModel::MERCHANT_ID => self::$merchant_id, 'b.' . $RBOModel::STORE_ID => self::$store_id, ); $bill_order = $RBOModel->getOrderLinkFind($map); if (empty($bill_order)) { $res = array( 'status' => 0, 'msg' => '订单查询失败' ); $this->ajaxReturn($res); } // 判断支付 if ($pay_order[$RPOModel::ORDER_STATE] == 'REVOKED' && $bill_order[$RBOModel::PAY_STATE] != 1) { $res = array( 'status' => 0, 'msg' => '订单已撤销成功' ); } else if ($pay_order[$RPOModel::ORDER_STATE] == 'SUCCESS' && $bill_order[$RBOModel::PAY_STATE] == 1) { $res = array( 'status' => 1, 'msg' => '支付成功' ); } else { $res = array( 'status' => 2, 'msg' => '等待支付' ); } $this->ajaxReturn($res); } /** * 自助收银机订单超时 关闭订单 * @param string $out_trade_no pay_order订单号 * @return array $res */ public function closePayOrder() { // 接受数据 $out_trade_no = I('post.out_trade_no'); // 判断订单号 if (!$out_trade_no) { $res = array( 'status' => 0, 'msg' => '请求错误' ); $this->ajaxReturn($res); } // 查询订单 $RPOModel = D('RetailPayOrder'); $pMap = array( $RPOModel::OUT_TRADE_NO => strval($out_trade_no) ); $pay_order = $RPOModel->getFind($pMap); // 判断订单 if (empty($pay_order)) { $res = array( 'status' => 0, 'msg' => '订单异常' ); $this->ajaxReturn($res); } // 判断订单是否支付成功 if ($pay_order[$RPOModel::ORDER_STATE] == 'SUCCESS') { $res = array( 'status' => 2, 'msg' => '订单已支付' ); $this->ajaxReturn($res); } else if ($pay_order[$RPOModel::ORDER_STATE] != 'WAIT_BUYER_PAY') { $res = array( 'status' => 0, 'msg' => '订单已被撤销' ); $this->ajaxReturn($res); } else { $RPSModel = D('RetailPaySet'); // 支付设置模型 $RPOModel = D('RetailPayOrder'); // pay_order模型 // 查询支付设置 $pay_config = $RPSModel->getFindMerchantConfig($pay_order[$RPOModel::MERCHANT_ID], 1); if ($pay_config['status'] == 0) { return $pay_config; } $config = $pay_config['config']; // 判断支付方式 if ($pay_order[$RPOModel::M_PAY_TYPE] != 3) { // 普通模式 服务商模式 撤销订单 新大陆无法撤销 // 微信订单 撤销订单 if ($pay_order[$RPOModel::PAY_TYPE] == 1) { // 微信撤销订单 // 查询微信订单状态 $close_result = $this->closeWxPayOrder($pay_order, $config); // 用户已支付 if ($close_result['status'] == 2) { $extend_content = $this->searchWxOrder($pay_order, $config); // 修改pay_order表订单 $up = array( $RPOModel::TRADE_NO => $extend_content['transaction_id'], $RPOModel::ORDER_STATE => 'SUCCESS', $RPOModel::TRADE_DATE => time(), $RPOModel::EXTEND_CONTENT => $extend_content ); $save = $RPOModel->updateOrder($pMap, $up); //更新订单信息 if (!$save) { $res = array('status' => 0, 'msg' => '用户已完成支付,订单出现异常,请联系商家'); $this->ajaxReturn($res); } // 修改bill订单 $bill_result = A('PayApi/Order')->paySuccess($pay_order[$RPOModel::BILL_ID]); if ($bill_result['status'] == 0) { $this->ajaxReturn($bill_result); } else { $res = array('status' => 2, 'msg' => '订单已支付'); $this->ajaxReturn($res); } } } else if ($pay_order[$RPOModel::PAY_TYPE] == 2) { // 支付宝撤销订单 A('Pay/NewAliPay')->revocation_v2($pay_order, $config); } } } // 修改pay_order订单状态 $RPOModel->updateOrder($pMap, array($RPOModel::ORDER_STATE => 'REVOKED')); $res = array( 'status' => 1, 'msg' => '撤销成功' ); $this->ajaxReturn($res); } /** * 微信撤销订单 * @param array $order * @return array $res */ protected function closeWxPayOrder($order, $config) { $RPSModel = D('RetailPaySet'); // 支付设置模型 $RPOModel = D('RetailPayOrder'); // pay_order模型 $out_trade_no = $order[$RPOModel::OUT_TRADE_NO]; if ($order[$RPOModel::M_PAY_TYPE] == 1) { $post['appid'] = $config[$RPSModel::WX_APPID]; $post['mch_id'] = $config[$RPSModel::WX_MCH_ID]; $apiclient_cert = $config[$RPSModel::WX_AC_CERT]; $apiclient_key = $config[$RPSModel::WX_AC_KEY]; $key = $config[$RPSModel::WX_SECRET_KEY]; } else if ($order[$RPOModel::M_PAY_TYPE] == 2) { $pay_set = M("systemconfig")->find(); // 查询合作伙伴配置 $post['appid'] = $pay_set['wx_appid']; $post['mch_id'] = $pay_set['mch_id']; $post['sub_mch_id'] = $config[$RPSModel::WX_SUB_MCH_ID]; $post['sub_appid'] = $config[$RPSModel::WX_APPID]; $apiclient_cert = $pay_set['wx_apiclient_cert']; $apiclient_key = $pay_set['wx_apiclient_key']; $key = $pay_set['wx_key']; } $item['apiclient_cert'] = $apiclient_cert; $item['apiclient_key'] = $apiclient_key; $item['key'] = $key; $WxMicroPay = new \Util\Wx\WxMicroPay($item); $post['out_trade_no'] = $out_trade_no; $post['nonce_str'] = $WxMicroPay->createNoncestr(32); $post['sign'] = $WxMicroPay->getSign($post); $xml = $WxMicroPay->arrayToXml($post); $url = 'https://api.mch.weixin.qq.com/pay/closeorder'; $response = $WxMicroPay->postXmlCurl($xml, $url, 30); $response = json_decode(json_encode(simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA)), true); if ($response['return_code'] == 'SUCCESS' && $response['result_code'] == 'SUCCESS') { $res = array('status' => 1, 'msg' => '撤销成功'); } else if ($response['result_code'] == 'FAIL' && $response['err_code'] == 'ORDERPAID') { switch ($response['err_code']) { case 'ORDERPAID': $res = array( 'status' => 2, 'msg' => '用户已支付' ); break; case 'SYSTEMERROR': $res = array( 'status' => 0, 'msg' => '系统异常' ); break; case 'ORDERCLOSED': $res = array( 'status' => 1, 'msg' => '订单已关闭' ); break; default: $res = array( 'status' => 0, 'msg' => '撤销失败' ); } } return $res; } /** * 微信查询用户订单 * @param array $order pay_order订单 * @return array $res */ protected function searchWxOrder($order, $config) { $RPOModel = D('RetailPayOrder'); // pay_order表模型 $RPSModel = D('RetailPaySet'); // 商户支付设置模型 $out_trade_no = $order[$RPOModel::OUT_TRADE_NO]; if ($order[$RPOModel::M_PAY_TYPE] == 1) { $post['appid'] = $config[$RPSModel::WX_APPID]; $post['mch_id'] = $config[$RPSModel::WX_MCH_ID]; $key = $config[$RPSModel::WX_SECRET_KEY]; } else if ($order[$RPOModel::M_PAY_TYPE] == 2) { $pay_set = M("systemconfig")->find(); // 查询合作伙伴配置 $post['appid'] = $pay_set['wx_appid']; $post['mch_id'] = $pay_set['mch_id']; $post['sub_mch_id'] = $config[$RPSModel::WX_SUB_MCH_ID]; $post['sub_appid'] = $config[$RPSModel::WX_APPID]; $key = $pay_set['wx_key']; } $item['key'] = $key; $WxMicroPay = new \Util\Wx\WxMicroPay($item); $post['out_trade_no'] = $out_trade_no; $post['nonce_str'] = $WxMicroPay->createNoncestr(32); $post['sign'] = $WxMicroPay->getSign($post); $xml = $WxMicroPay->arrayToXml($post); $url = 'https://api.mch.weixin.qq.com/pay/orderquery'; $response = $WxMicroPay->postXmlCurl($xml, $url, 30); $response = json_decode(json_encode(simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $response; } }