文件
mashangyoujiu/Application/Pay/Controller/VipPayController.class.php

564 行
24 KiB
PHP
可执行文件

<?php
namespace Pay\Controller;
use Common\Business\PayCoupon;
use Common\Model\InstallAccountModel;
use Common\Model\RetailPayOrderModel;
use Common\Model\RetailPaySetModel;
use Common\Model\RetailScoreMallExchangeModel;
use Common\Model\ScoreMallModel;
use Think\Controller;
//[1.9.5]
/**
* 会员卡支付回调
* Class VipPayController
* @package Pay\Controller
*/
class VipPayController extends Controller
{
/**
* 充值下单
*/
public function submitRechargeOrder()
{
$vid = I('post.vid'); //会员id
$store_id = I('post.store_id'); //门店id
$merchant_id = I('post.merchant_id'); //商户id
$trade_amount = I('post.trade_amount'); //充值金额
$recharge_id = I('post.recharge_id'); //充值活动id
if (empty($trade_amount)) {
$result['status'] = 0;
$result['msg'] = '缺少充值金额';
$this->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 结束 ******************************/
}