ajaxReturn($result); } if (!verifyPrice($trade_amount)) { $result['status'] = 0; $result['msg'] = '充值金额有误'; $this->ajaxReturn($result); } if (empty($vid)) { $result['status'] = 0; $result['msg'] = '缺少会员id'; $this->ajaxReturn($result); } if (empty($store_id)) { $result['status'] = 0; $result['msg'] = '缺少门店id'; $this->ajaxReturn($result); } if (empty($merchant_id)) { $result['status'] = 0; $result['msg'] = '缺少商户id'; $this->ajaxReturn($result); } if (!empty($recharge_id) && !verifyNumber($recharge_id, 0, 1, 9999999999)) { $result['status'] = 0; $result['msg'] = '充值活动id有误'; $this->ajaxReturn($result); } $VipModel = D('RetailVip'); $vMap = array( $VipModel::ID => $vid, $VipModel::MERCHANT_ID => $merchant_id, ); $fields = array( $VipModel::ID, $VipModel::STATUS, $VipModel::OPEN_ID, $VipModel::PLUS_TYPE, ); $vip = $VipModel->getFind($vMap, $fields); if ($vip[$VipModel::STATUS] != 1) { $result['status'] = 0; $result['msg'] = '会员账户异常,无法充值'; $this->ajaxReturn($result); } $MerchantModel = D('RetailMerchant'); $give_money = 0; if (!empty($recharge_id)) { $VipRechargeModel = D('RetailVipRecharge'); $recharge_activity = $VipRechargeModel->checkRecharge_v1($vid, $recharge_id, $merchant_id, 1); if (empty($recharge_activity)) { $result['status'] = 0; $result['msg'] = '充值档次有误,建议刷新后再试'; $this->ajaxReturn($result); } if ($trade_amount != $recharge_activity[$VipRechargeModel::RECHARGE_MONEY]) { $result['status'] = 0; $result['msg'] = '请求参数有误'; $this->ajaxReturn($result); } $allMoney = round($recharge_activity[$VipRechargeModel::GIVE_MONEY] + $trade_amount, 2); $give_money = $recharge_activity[$VipRechargeModel::GIVE_MONEY]; } else { $allMoney = $trade_amount; $auto_use_grade = $MerchantModel->getFindField(array($MerchantModel::ID => $merchant_id), $MerchantModel::AUTO_USE_GRADE); if ($auto_use_grade == 1) { //自定义充值金额赠送优惠 $VipRechargeModel = D('RetailVipRecharge'); $recharge_activity = $VipRechargeModel->getMaxGiveMoney($merchant_id, $store_id, $allMoney, 1, $vip[$VipModel::PLUS_TYPE]); $give_money = $recharge_activity['give_money'] ? $recharge_activity['give_money'] : 0; $recharge_id = $recharge_activity['id'] ? $recharge_activity['id'] : 0; $allMoney = round($give_money + $allMoney, 2); } } $PayOrderModel = D('RetailPayOrder'); // pay_order表模型 $payOrderItem = array( $PayOrderModel::PAY_TYPE => 1, $PayOrderModel::ORDER_TYPE => 2, $PayOrderModel::STORE_ID => $store_id, $PayOrderModel::TRADE_AMOUNT => $trade_amount, $PayOrderModel::ADD_TIME => time(), $PayOrderModel::ORDER_STATE => 'WAIT_BUYER_PAY', $PayOrderModel::VID => $vid, $PayOrderModel::MERCHANT_ID => $merchant_id, $PayOrderModel::NOTIFY_URL => 'PayApi/Recharge/updateOrder', ); // 获取商户充值设置 $map = array( $MerchantModel::ID => $merchant_id, $MerchantModel::STATUS => 1 ); $field = array($MerchantModel::AGING_CYCLE, $MerchantModel::AGING_REPAY, $MerchantModel::AGING_TIME); $setting = $MerchantModel->getFind($map, $field); $addPayOrder = $PayOrderModel->addPayOrder($payOrderItem); if (!$addPayOrder) { $result = array( 'status' => 0, 'msg' => '下单失败' ); $this->ajaxReturn($result); } $RechargeOrderModel = D('RetailRechargeOrder'); $rechargeItem = array( $RechargeOrderModel::MERCHANT_ID => $merchant_id, $RechargeOrderModel::STORE_ID => $store_id, $RechargeOrderModel::VID => $vid, $RechargeOrderModel::STATUS => 0, $RechargeOrderModel::PAY_ORDER_ID => $addPayOrder[$PayOrderModel::ID], $RechargeOrderModel::MONEY => $trade_amount, $RechargeOrderModel::USER_TYPE => 0, $RechargeOrderModel::VIP_RECHARGE_ID => $recharge_id ? $recharge_id : 0, $RechargeOrderModel::SCENE_TYPE => 5, $RechargeOrderModel::TYPE => 1, $RechargeOrderModel::ADD_TIME => time(), $RechargeOrderModel::STATE => 1, $RechargeOrderModel::PAY_TYPE => 2, 'give_money' => $give_money ); if ($setting['aging_repay'] == 1 && $recharge_activity['aging_repay'] == 1) { $rechargeItem['remark'] = '公众号充值' . $trade_amount . '元获得' . $trade_amount . '元,剩余' . $give_money . '分期到账'; $rechargeItem['all_money'] = $trade_amount; $rechargeItem['repay_name'] = 1; } else { $rechargeItem['remark'] = '公众号充值' . $trade_amount . '元获得' . $allMoney . '元'; $rechargeItem['all_money'] = $trade_amount + $give_money; } $addRecharge = $RechargeOrderModel->addOrder($rechargeItem); //分期到账 if ($setting['aging_repay'] == 1 && $recharge_activity['aging_repay'] == 1) { $accountData = array( 'vip_id' => $vid, 'merchant_id' => $merchant_id, 'store_id' => $store_id, 'aging_money' => $give_money, 'order_id' => $addRecharge, 'aging_date' => date("Y-m-d", intval(time())), 'aging_cycle' => $setting['aging_cycle'], //设置->分期到账间隔时间 'aging_repay' => $setting['aging_repay'], //设置->分期到账是否开启 'aging_time' => $setting['aging_time'], //设置->分期到账间隔 'active_aging_repay' => $recharge_activity['aging_repay'], //活动->分期到账是否开启 'active_aging_time' => $recharge_activity['aging_time'], //活动->分几期到账 ); $InstallAccountModel = new InstallAccountModel(); $InstallAccountModel->waitUpgradeAccount($accountData); } if ($addRecharge) { $notify_func = '/Pay/VipPay/onlineNotify'; $result = $this->createWxOrder($addPayOrder, $vip[$VipModel::OPEN_ID], $notify_func); } else { $result['status'] = 0; $result['msg'] = '请求参数有误'; } $result['out_trade_no'] = $addPayOrder[$PayOrderModel::OUT_TRADE_NO]; $this->ajaxReturn($result); } /** * 创建微信订单 * @param $config * @param $payOrder * @param $openid * @param $notify_func * @return mixed */ protected function createWxOrder($payOrder, $openid, $notify_func) { $PayOrderModel = D('RetailPayOrder'); // pay_order表模型 $PaySetModel = D('RetailPaySet'); $paySet = $PaySetModel->getFindMerchantConfig($payOrder[$PayOrderModel::MERCHANT_ID], 1); if ($paySet['status'] != 1) { $result = array( 'status' => 0, 'msg' => $paySet['msg'] ? $paySet['msg'] : '暂无可用的支付模式', ); return $result; } $config = $paySet['config']; if ($paySet['m_pay_type'] == 1) { $mch_id = $config[$PaySetModel::WX_MCH_ID]; $post['appid'] = $config[$PaySetModel::WX_APPID]; $post['mch_id'] = $config[$PaySetModel::WX_MCH_ID]; $post['key'] = $config[$PaySetModel::WX_SECRET_KEY]; $post['openid'] = $openid; //用户openid } else if ($paySet['m_pay_type'] == 2) { $mch_id = $config[$PaySetModel::WX_SUB_MCH_ID]; $systemConfig = $config['systemConfig']; $SystemConfigModel = D('SystemConfig'); $post['appid'] = $systemConfig[$SystemConfigModel::WX_APPID]; $post['mch_id'] = $systemConfig[$SystemConfigModel::MCH_ID]; $post['sub_mch_id'] = $config[$PaySetModel::WX_SUB_MCH_ID]; $post['sub_appid'] = $config[$PaySetModel::WX_SUB_APPID]; $post['key'] = $systemConfig[$SystemConfigModel::WX_KEY]; $post['sub_openid'] = $openid; //用户openid } else if ($paySet['m_pay_type'] == 4) { // 云闪付模式 统一下单 $payObj = new CloudPayController(); /*用户标识 支付宝服务窗为用户的 buyer_id 微信公众号为用户的 openid 银联 JS 支付为用户的 userId*/ $payOrder['userId'] = $openid; $result = $payObj->unifiedorder($payOrder, $config, 1, '充值'); $pMap = array( $PayOrderModel::ID => $payOrder[$PayOrderModel::ID] ); $pSave = array( $PayOrderModel::MER_ID => $config['cloud_mer_id'], $PayOrderModel::M_PAY_TYPE => $paySet['m_pay_type'], ); $PayOrderModel->updateOrder($pMap, $pSave); return $result; } else if ($paySet['m_pay_type'] == 7) { // 钱客云模式 统一下单 /*用户标识 支付宝服务窗为用户的 buyer_id 微信公众号为用户的 openid 银联 JS 支付为用户的 userId*/ $payOrder['userId'] = $openid; $moneyGuest = new \MoneyGuestPay\Business\MoneyGuest(); $result = $moneyGuest->moneyGuestApp($payOrder, $config, 2); $pMap = array( $PayOrderModel::ID => $payOrder[$PayOrderModel::ID] ); $pSave = array( $PayOrderModel::MER_ID => $config['qian_ke_mid'], $PayOrderModel::M_PAY_TYPE => $paySet['m_pay_type'], ); $PayOrderModel->updateOrder($pMap, $pSave); return $result; } else { $result = A('Pay/PayContinent')->createOnlineOrder($payOrder, $openid, 1); return $result; } $pMap = array( $PayOrderModel::ID => $payOrder[$PayOrderModel::ID] ); $pSave = array( $PayOrderModel::MER_ID => $mch_id, $PayOrderModel::M_PAY_TYPE => $paySet['m_pay_type'], ); $PayOrderModel->updateOrder($pMap, $pSave); $post['body'] = '充值'; $post['out_trade_no'] = $payOrder[$PayOrderModel::OUT_TRADE_NO]; $post['total_fee'] = $payOrder[$PayOrderModel::TRADE_AMOUNT]; $post['notify_url'] = getServerUrl() . '/index.php' . $notify_func; // 回调地址 $post['trade_type'] = 'JSAPI'; //微信支付类型 $WxPaysdk = new \Util\Wx\Wxpaysdk($post); $response = $WxPaysdk->getPrepayId(); //转换为xml /*print_r($response); exit;*/ $result['post'] = $post; $response['signType'] = 'MD5'; if (!empty($response) && $response['return_code'] != 'FAIL') { $result['status'] = 1; $result['msg'] = '微信下单成功'; $result['data'] = $response; } else { $result['status'] = 0; $result['msg'] = '支付错误,' . $response['return_msg']; } return $result; } /** * 直连充值回调 * @return string */ public function onlineNotify() { // 接收数据 $xml = file_get_contents('php://input'); // 转换格式 $extend_content = json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)); file_put_contents('./vipPayPost.txt', 'vipPayPost: ' . $extend_content . "\r\n", FILE_APPEND); $post = json_decode($extend_content, true); // 解析数据 // 查询订单 $PayOrderModel = D('RetailPayOrder'); $pMap = array( $PayOrderModel::OUT_TRADE_NO => strval($post['out_trade_no']), ); $payOrder = $PayOrderModel->getFind($pMap); if (empty($payOrder)) { // 订单不存在 return 'fail'; } if ($payOrder[$PayOrderModel::ORDER_STATE] == 'SUCCESS') { // 订单已更新 return 'success'; } //订单状态为支付成功 if ($post['return_code'] == 'SUCCESS' && $post['result_code'] == 'SUCCESS') { // 查询支付模式设置,用于判断签名 $PaySetModel = D('RetailPaySet'); $paySet = $PaySetModel->getFindMerchantConfig($payOrder[$PayOrderModel::MERCHANT_ID], 1); $payConfig = $paySet['config']; $postSign = $post['sign']; unset($post['sign']); if ($payOrder[$PayOrderModel::M_PAY_TYPE] == 1) { //普通商户模式 $wx_key = $payConfig[$PaySetModel::WX_SECRET_KEY]; } else { //服务商模式 $SystemConfigModel = D('SystemConfig'); $wx_key = $payConfig['systemConfig'][$SystemConfigModel::WX_KEY]; } $thisSign = createSign($post, $wx_key); //再次生成签名,与$postSign比较 if ($postSign == $thisSign) { //签名验证成功 $updateData = array( $PayOrderModel::ORDER_STATE => 'SUCCESS', $PayOrderModel::EXTEND_CONTENT => json_encode($extend_content), $PayOrderModel::TRADE_DATE => time(), $PayOrderModel::TRADE_NO => $post['transaction_id'] ); $pMap = array( $PayOrderModel::ID => $payOrder[$PayOrderModel::ID] ); if ($post['coupon_count'] > 0) { //代金券核销 $PayCouponClass = new PayCoupon(); $couponResult = $PayCouponClass->couponVerification_v1(json_encode([ 'merchant_id' => $payOrder['merchant_id'], 'pay_info' => $post, 'use_type' => $payOrder['order_type'], 'order_id' => $payOrder['id'], 'store_id' => $payOrder['store_id'], 'use_scene' => 3, 'coupon_way' => 1 ])); if ($couponResult['status'] == 1) { $updateData['trade_amount'] = $couponResult['data']['cash_fee']; $updateData['pay_coupon_id_str'] = $couponResult['data']['pay_coupon_id_str']; $updateData['pay_coupon_fee'] = $couponResult['data']['pay_coupon_fee']; $payOrder['pay_coupon_id_str'] = $couponResult['data']['pay_coupon_id_str']; $payOrder['pay_coupon_fee'] = $couponResult['data']['pay_coupon_fee']; } } $PayOrderModel->updateOrder($pMap, $updateData); //更新pay_order表 define('IsPayToUpdateOrder', 'YES'); //存入常量 R($payOrder[$PayOrderModel::NOTIFY_URL], array($payOrder)); //执行回调函数 } return 'success'; } else { return 'fail'; } } /** * 查询订单是否支付成功 */ public function searchWxOnlinePay() { $out_trade_no = I('post.out_trade_no'); $PayOrderModel = D('RetailPayOrder'); $pMap = array( $PayOrderModel::OUT_TRADE_NO => strval($out_trade_no), ); $order = $PayOrderModel->getFind($pMap); // file_put_contents('./vipPayPost.txt','m: '.M()->_sql()."\r\n",FILE_APPEND); // file_put_contents('./vipPayPost.txt','order: '.json_encode($order)."\r\n",FILE_APPEND); if ($order[$PayOrderModel::ORDER_STATE] == 'SUCCESS') { //支付成功 $result['status'] = 1; $result['msg'] = '充值成功'; } else { $result['status'] = 0; $result['msg'] = '待支付'; } $result['order'] = $order; $this->ajaxReturn($result); } /** * 积分商城下单 */ public function submitScoreMallOrder() { $vid = I('post.vid'); //会员id $merchant_id = I('post.merchant_id'); //商户id $score_id = I('post.score_id'); //积分活动id if (empty($vid)) { $result['status'] = 0; $result['msg'] = '缺少会员id'; $this->ajaxReturn($result); } if (empty($merchant_id)) { $result['status'] = 0; $result['msg'] = '缺少商户id'; $this->ajaxReturn($result); } if (!empty($score_id) && !verifyNumber($score_id, 0, 1, 9999999999)) { $result['status'] = 0; $result['msg'] = '活动id有误'; $this->ajaxReturn($result); } $VipModel = D('RetailVip'); $vMap = array( $VipModel::ID => $vid, $VipModel::MERCHANT_ID => $merchant_id, ); $fields = array( $VipModel::ID, $VipModel::STATUS, $VipModel::OPEN_ID, $VipModel::INTEGRAL, $VipModel::BALANCE, ); $vip = $VipModel->getFind($vMap, $fields); if ($vip[$VipModel::STATUS] != 1) { $result['status'] = 0; $result['msg'] = '会员账户异常,无法下单'; $this->ajaxReturn($result); } $ScoreMallModel = new ScoreMallModel(); $sMap = array( $ScoreMallModel::ID => $score_id, $ScoreMallModel::MERCHANT_ID => $merchant_id, ); $scoreMall = $ScoreMallModel->getFind($sMap); if (empty($scoreMall)) { $result['status'] = 0; $result['msg'] = '请求参数有误'; $this->ajaxReturn($result); } if ($scoreMall[$ScoreMallModel::STATUS] != 1) { $result['status'] = 0; $result['msg'] = '该商品已下架'; $this->ajaxReturn($result); } if (round($vip[$VipModel::INTEGRAL] - $scoreMall[$ScoreMallModel::INTEGRAL]) < 0) { $result['status'] = 0; $result['msg'] = '会员积分不足' . $scoreMall[$ScoreMallModel::INTEGRAL]; $this->ajaxReturn($result); } $out_trade_no = ''; if ($scoreMall[$ScoreMallModel::TYPE] == 2 || $scoreMall[$ScoreMallModel::TYPE] == 3) { //积分加余额或积分加微信 需要在pay_order下单 $m_pay_type = 0; if ($scoreMall[$ScoreMallModel::TYPE] == 3) { //微信支付 $PaySetModel = new RetailPaySetModel(); // 支付设置模型 $config = $PaySetModel->getFindMerchantConfig($merchant_id, 1); if ($config['status'] != 1) { $result = array( 'status' => 0, 'msg' => $config['msg'] ? $config['msg'] : '暂无可用的支付模式', ); $this->ajaxReturn($result); } $m_pay_type = $config['m_pay_type']; } else { if (round($vip[$VipModel::BALANCE] - $scoreMall[$ScoreMallModel::PRICE], 2) < 0) { $result['status'] = 0; $result['msg'] = '会员余额不足' . $scoreMall[$ScoreMallModel::PRICE]; $this->ajaxReturn($result); } } $PayOrderModel = new RetailPayOrderModel(); // pay_order表模型 $payOrderItem = array( $PayOrderModel::M_PAY_TYPE => $m_pay_type, $PayOrderModel::PAY_TYPE => $scoreMall[$ScoreMallModel::TYPE] == 2 ? 6 : 1, //会员余额或微信 $PayOrderModel::ORDER_TYPE => 8, $PayOrderModel::STORE_ID => $vip[$VipModel::STORE_ID], $PayOrderModel::TRADE_AMOUNT => $scoreMall[$ScoreMallModel::PRICE], $PayOrderModel::ADD_TIME => time(), $PayOrderModel::ORDER_STATE => 'WAIT_BUYER_PAY', $PayOrderModel::VID => $vid, $PayOrderModel::MERCHANT_ID => $merchant_id, $PayOrderModel::NOTIFY_URL => $scoreMall[$ScoreMallModel::TYPE] == 2 ? '' : 'PayApi/ScoreMall/buyNotify', ); $addPayOrder = $PayOrderModel->addPayOrder($payOrderItem); if (!$addPayOrder) { $result = array( 'status' => 0, 'msg' => '下单失败' ); $this->ajaxReturn($result); } $out_trade_no = $addPayOrder[$PayOrderModel::OUT_TRADE_NO]; } else { //积分兑换 } $SMExchangeModel = new RetailScoreMallExchangeModel(); $barcode = time() . rand(1000, 9000); $eMap = array( $SMExchangeModel::VID => $vid, $SMExchangeModel::MERCHANT_ID => $merchant_id, $SMExchangeModel::BAR_CODE => strval($barcode), $SMExchangeModel::STATUS => 1, ); //判断条码是否存在 $oldCode = $SMExchangeModel->getFindField($eMap, $SMExchangeModel::BAR_CODE); if ($oldCode) { $barcode = time() . rand(1000, 9000); } $SMEItem = array( $SMExchangeModel::BAR_CODE => $barcode, $SMExchangeModel::SCORE_MALL_ID => $score_id, $SMExchangeModel::MERCHANT_ID => $merchant_id, $SMExchangeModel::VID => $vid, $SMExchangeModel::STATUS => 1, $SMExchangeModel::TIME => time(), $SMExchangeModel::STATE => 0, $SMExchangeModel::PAY_ORDER_ID => $addPayOrder ? $addPayOrder[$PayOrderModel::ID] : null, ); $addSME = $SMExchangeModel->addOrder($SMEItem); if ($addSME) { if ($scoreMall[$ScoreMallModel::TYPE] == 3) { //去微信下单 $notify_func = '/Pay/VipPay/onlineNotify'; $result = $this->createWxOrder($addPayOrder, $vip[$VipModel::OPEN_ID], $notify_func); } else { $result['status'] = 1; $result['msg'] = '下单成功'; } $result['score_exchange_id'] = $addSME; $result['out_trade_no'] = $out_trade_no; } else { $result['status'] = 0; $result['msg'] = '下单失败'; } $this->ajaxReturn($result); } /************************ 2019-11-15 结束 ******************************/ }