文件
mashangyoujiu/Application/PayApi/Controller/PayController.class.php

520 行
27 KiB
PHP
可执行文件

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?php
namespace PayApi\Controller;
use Common\Business\PaymentRefund;
use Common\Lib\HappyPay;
use Common\Model\RetailBillDiscountModel;
use Common\Model\RetailSmallProgramUserModel;
use Common\Model\RetailVipModel;
use Pay\Controller\CloudPayController;
use Think\Controller;
//[1.9.5]
/**
* Class VipPayController
* @package Api\Controller
*/
class PayController extends Controller
{
/**
* 购买礼品卡支付成功回调
* @param $pay_order pay_order表记录或id
* @return array
*/
public function gift_continent_pay_v1($pay_order)
{
if (empty($pay_order)) {
return array('status' => 0, 'msg' => '操作有误');
}
if (is_array($pay_order)) {
$PayOrderModel = D('RetailPayOrder');
$pay_order_id = $pay_order[$PayOrderModel::ID];
} else {
$pay_order_id = $pay_order;
}
$GCRModel = D('RetailGiftCardRecord');
$gift_order = $GCRModel->getFind(array($GCRModel::PAY_ORDER_ID => $pay_order_id));
if (!empty($gift_order)) {
$update = $GCRModel->updateOrder(array($GCRModel::ID => $gift_order[$GCRModel::ID]), array($GCRModel::STATE => 1));
$GCPModel = D('RetailGiftCardPrice');
$update1 = $GCPModel->toSetDec(array($GCPModel::ID => $gift_order[$GCRModel::GIFT_PRICE_ID]), $GCPModel::LESS_NUM, 1);
$res['status'] = 1;
$res['msg'] = '购买成功';
} else {
$res['status'] = 0;
$res['msg'] = '订单不存在';
}
return $res;
}
/**
* 小程序订单退款
** @param $billOrder 新退款记录(bill_order表数据)
* @param $old_bill_order 原购买订单
* @param int $cashier_id 收银员id
* @return array
*/
public function onlineRefund_v1($billOrder, $old_bill_order, $cashier_id = 0)
{
if (!$billOrder || !is_array($billOrder)) {
$result['status'] = 0;
$result['msg'] = '缺少参数';
return $result;
}
$BillModel = D('RetailBillOrder');
$merchant_id = $old_bill_order[$BillModel::MERCHANT_ID];
$refundOrder = D('RefundOrder')->getFindOrderAsc($merchant_id);//退款顺序
$lessRefundMoney = $billOrder[$BillModel::ALL_MONEY];//存储剩余退款的金额
$PayOrderModel = D('RetailPayOrder');
$pMap = array(
$PayOrderModel::BILL_ID => $old_bill_order[$BillModel::ID],
$PayOrderModel::ORDER_TYPE => 1,
$PayOrderModel::ORDER_STATE => 'SUCCESS',
);
$balance = 0;
$Wx = 0;
foreach ($refundOrder as $key => $value) {
if ($key == 'vip_refund_order') {
$pMap[$PayOrderModel::PAY_TYPE] = 6;
$bPayOrder = $PayOrderModel->getFind($pMap);
if (!empty($bPayOrder)) {
$lessMoney = round($bPayOrder[$PayOrderModel::TRADE_AMOUNT] - $bPayOrder[$PayOrderModel::REFUND_MONEY], 2);//剩余可用来退款的金额
if ($lessMoney > 0) {
if ($lessMoney > $lessRefundMoney) {
$balance = $lessRefundMoney;
} else {
$balance = $lessMoney;
}
$lessRefundMoney = round($lessRefundMoney - $balance, 2);
}
}
} else if ($key == 'wx_refund_order') {
$pMap[$PayOrderModel::PAY_TYPE] = 4;
$wxPayOrder = $PayOrderModel->getFind($pMap);
if (!empty($wxPayOrder)) {
if ($wxPayOrder['pay_coupon_fee'] > 0) {
//微信支付
$wxPayOrder[$PayOrderModel::TRADE_AMOUNT] = bcadd($wxPayOrder[$PayOrderModel::TRADE_AMOUNT], $wxPayOrder['pay_coupon_fee'], 2);
$wxPayOrder[$PayOrderModel::REFUND_MONEY] = bcadd($wxPayOrder[$PayOrderModel::REFUND_MONEY], $wxPayOrder['refund_coupon_fee'], 2);
}
file_put_contents('./all4.txt', json_encode($wxPayOrder) . PHP_EOL, FILE_APPEND);
$lessMoney = round($wxPayOrder[$PayOrderModel::TRADE_AMOUNT] - $wxPayOrder[$PayOrderModel::REFUND_MONEY], 2);//剩余可用来退款的金额
if ($lessMoney > 0) {
if ($lessMoney > $lessRefundMoney) {
$Wx = $lessRefundMoney;
} else {
$Wx = $lessMoney;
}
$lessRefundMoney = round($lessRefundMoney - $Wx, 2);
}
}
}
if ($lessRefundMoney == 0) {
break;
}
}
if ($Wx > 0 || $balance > 0) {
$item = array(
$PayOrderModel::SCENE_TYPE => 2, //'1付款 2退款',
$PayOrderModel::ORDER_TYPE => 1, //'1购买商品',
$PayOrderModel::STORE_ID => $billOrder[$BillModel::STORE_ID], //'门店id',
$PayOrderModel::MERCHANT_ID => $billOrder[$BillModel::MERCHANT_ID], //'商户id',
$PayOrderModel::CASHIER_ID => $cashier_id, //'收银员id',
$PayOrderModel::ADD_TIME => time(), //'订单创建时间',
$PayOrderModel::BILL_ID => $billOrder[$BillModel::ID], //'bill表id',
$PayOrderModel::VID => $billOrder[$BillModel::VID], //'会员id',
$PayOrderModel::UID => $billOrder[$BillModel::UID], //'小程序用户id',
$PayOrderModel::ORDER_STATE => 'WAIT_REFUND',
);
}
if (!empty($wxPayOrder) && $Wx > 0) {
//微信退款
$pay_type = 6;
$item[$PayOrderModel::PAY_ORDER_ID] = $wxPayOrder[$PayOrderModel::ID];
$item[$PayOrderModel::PAY_TYPE] = 4; //'1微信 2支付宝 3现金 4小程序微信 5其他支付方式 6会员余额',
$item[$PayOrderModel::TRADE_AMOUNT] = $Wx; //'订单金额',
$item[$PayOrderModel::TRADE_NO] = $wxPayOrder[$PayOrderModel::TRADE_NO]; //'订单微信支付宝流水号',
$item[$PayOrderModel::M_PAY_TYPE] = $wxPayOrder[$PayOrderModel::M_PAY_TYPE]; //'订单支付类型 1普通商户模式 2服务商模式 3新大陆模式',
$new_pay_order = $PayOrderModel->addPayOrder($item);
if ($new_pay_order) {
$PaySetModel = D('RetailPaySet');
$paySet = $PaySetModel->getFindMerchantPaySet($merchant_id);//支付设置
if ($paySet['status'] == 0) {
return $paySet;
} else {
$out_refund_no = $new_pay_order[$PayOrderModel::OUT_TRADE_NO];
if ($wxPayOrder[$PayOrderModel::M_PAY_TYPE] == 3) {
$new_pay_order['before_trade_no'] = $wxPayOrder[$PayOrderModel::OUT_TRADE_NO];
$new_pay_order['before_amount'] = $wxPayOrder[$PayOrderModel::TRADE_AMOUNT];
$res = A('Pay/PayContinent')->toOrderRefund_v3($new_pay_order);
if ($res['status'] == 1) {
$map = array($PayOrderModel::ID => $new_pay_order[$PayOrderModel::ID]);
$save = array(
$PayOrderModel::ORDER_STATE => 'REFUND',
$PayOrderModel::TRADE_DATE => time()
);
$PayOrderModel->updateOrder($map, $save);
$PayOrderModel->toSetInc([
'id' => $wxPayOrder[$PayOrderModel::ID]
], 'refund_money', $Wx);
}
$resultArr[] = $res;
} else if ($wxPayOrder[$PayOrderModel::M_PAY_TYPE] == 4) {
$new_pay_order['before_trade_no'] = $wxPayOrder[$PayOrderModel::OUT_TRADE_NO];
$new_pay_order['before_amount'] = $wxPayOrder[$PayOrderModel::TRADE_AMOUNT];
//云闪付
$payObj = new CloudPayController();
$res = $payObj->cloudRefund($new_pay_order, $paySet['config'], $item[$PayOrderModel::PAY_TYPE]);
if ($res['status'] == 1) {
$map = array($PayOrderModel::ID => $new_pay_order[$PayOrderModel::ID]);
$save = array(
$PayOrderModel::ORDER_STATE => 'REFUND',
$PayOrderModel::TRADE_DATE => time()
);
$PayOrderModel->updateOrder($map, $save);
$PayOrderModel->toSetInc([
'id' => $wxPayOrder[$PayOrderModel::ID]
], 'refund_money', $Wx);
}
$resultArr[] = $res;
} else if ($wxPayOrder[$PayOrderModel::M_PAY_TYPE] == 5) {
//乐返
$new_pay_order['before_amount'] = $wxPayOrder[$PayOrderModel::TRADE_AMOUNT];
$new_pay_order['before_trade_no'] = $wxPayOrder[$PayOrderModel::OUT_TRADE_NO];
$happyPay = new \HappyPay\Business\HappyPay();
$res = $happyPay->happyMoneyHandle($new_pay_order, $paySet['config']);
if ($res['status'] == 1) {
A('Pay/Base')->doRefundRate($new_pay_order['trade_no'], $new_pay_order['trade_amount'], 4);//乐返分润
}
$resultArr[] = $res;
} else if ($wxPayOrder[$PayOrderModel::M_PAY_TYPE] == 7) {
//钱客云,小程序,售后订单退款
$new_pay_order['before_amount'] = $wxPayOrder[$PayOrderModel::TRADE_AMOUNT];
$new_pay_order['before_trade_no'] = $wxPayOrder[$PayOrderModel::OUT_TRADE_NO];
$moneyGuest = new \MoneyGuestPay\Business\MoneyGuest();
$res = $moneyGuest->moneyGuestRefund($new_pay_order, $paySet['config']);
if($res['status'] == 1){
A('Pay/Base')->doRefundRate($new_pay_order['trade_no'], $new_pay_order['trade_amount'], 6);//钱客云分润
}
$resultArr[] = $res;
} else {
$payConfig = $paySet['config'];
if ($wxPayOrder[$PayOrderModel::M_PAY_TYPE] == 1 || $wxPayOrder[$PayOrderModel::M_PAY_TYPE] == 0) {
$key = $payConfig[$PaySetModel::XCX_SECRET_KEY];
$post['appid'] = $payConfig[$PaySetModel::XCX_APPID];
$post['mch_id'] = $payConfig[$PaySetModel::XCX_MCH_ID];
$apiclient_cert = $payConfig[$PaySetModel::XCX_AC_CERT];
$apiclient_key = $payConfig[$PaySetModel::XCX_AC_KEY];
} else {
$SystemConfigModel = D('SystemConfig');
$systemConfig = $payConfig['systemConfig'];
$post['appid'] = $systemConfig[$SystemConfigModel::WX_APPID];
$post['mch_id'] = $systemConfig[$SystemConfigModel::MCH_ID];
$post['sub_mch_id'] = $payConfig[$PaySetModel::XCX_SUB_MCH_ID];
$post['sub_appid'] = $payConfig[$PaySetModel::XCX_SUB_APPID];
$key = $systemConfig[$SystemConfigModel::WX_KEY];
$apiclient_cert = $systemConfig[$SystemConfigModel::WX_AC_CERT];
$apiclient_key = $systemConfig[$SystemConfigModel::WX_AC_KEY];
}
$post['nonce_str'] = createKey();
$post['out_refund_no'] = $out_refund_no;
$post['out_trade_no'] = $wxPayOrder[$PayOrderModel::OUT_TRADE_NO];
$post['spbill_create_ip'] = $_SERVER['SERVER_ADDR']; //服务器终端的ip
$post['total_fee'] = $wxPayOrder[$PayOrderModel::TRADE_AMOUNT] * 100; //总金额 最低为一分钱 必须是整数
$post['refund_fee'] = $Wx * 100;
$sign = createSign($post, $key); //生成签名
$post['sign'] = $sign;
$post_xml = arrToXml($post);
$url = 'https://api.mch.weixin.qq.com/secapi/pay/refund';
$xml = http_cert_request($url, $post_xml, $apiclient_cert, $apiclient_key);//POST方式请求http
$array = xmlToArray($xml);
file_put_contents('./xcxRefund.txt', date('Y-m-d H:i:s') . ' array: ' . json_encode([$array, $url, $post_xml, $apiclient_cert, $apiclient_key, $merchant_id]) . "\r\n", FILE_APPEND);
if ($array['return_code'] == "SUCCESS" && $array['result_code'] == "SUCCESS") {
if ($wxPayOrder[$PayOrderModel::M_PAY_TYPE] == 1 || $wxPayOrder[$PayOrderModel::M_PAY_TYPE] == 0) {
$search['appid'] = $payConfig[$PaySetModel::XCX_APPID];
$search['mch_id'] = $payConfig[$PaySetModel::XCX_MCH_ID];
} else {
$search['appid'] = $systemConfig[$SystemConfigModel::WX_APPID];
$search['mch_id'] = $systemConfig[$SystemConfigModel::MCH_ID];
$search['sub_mch_id'] = $payConfig[$PaySetModel::XCX_SUB_MCH_ID];
$search['sub_appid'] = $payConfig[$PaySetModel::XCX_SUB_APPID];
}
$search['nonce_str'] = createKey();
$search['transaction_id'] = $array['transaction_id'];
$sign = createSign($search, $key); //签名
$search['sign'] = $sign;
$search_xml = arrToXml($search);
$url = 'https://api.mch.weixin.qq.com/pay/refundquery';
$xml = http_request($url, $search_xml, $apiclient_cert, $apiclient_key); //POST方式请求http
$search_res = xmlToArray($xml);
// $result['search'] = $res;
file_put_contents('./xcxRefund.txt', date('Y-m-d H:i:s') . ' search_res: ' . json_encode([$search_res, $url, $search_xml, $apiclient_cert, $apiclient_key, $merchant_id]) . "\r\n", FILE_APPEND);
if ($search_res['return_code'] == "SUCCESS" && $search_res['result_code'] == "SUCCESS") {
switch ($search_res['refund_status_0']) {
case 'SUCCESS':
case 'PROCESSING':
$result['status'] = 1;
$result['refund_no'] = $search_res['refund_id_0'];
$result['msg'] = '退款成功';
$PayOrderModel->toSetInc([
'id' => $wxPayOrder[$PayOrderModel::ID]
], 'refund_money', $Wx);
$map = array($PayOrderModel::ID => $new_pay_order[$PayOrderModel::ID]);
$save = array(
$PayOrderModel::TRADE_NO => $search_res['refund_id_0'],
$PayOrderModel::ORDER_STATE => 'REFUND',
$PayOrderModel::TRADE_DATE => time()
);
if ($array['coupon_refund_count'] > 0) {
//代金券修改状态
$PayCouponClass = new PaymentRefund();
$couponResult = $PayCouponClass->paymentRefund(json_encode([
'refund_info' => $array,
'merchant_id' => $merchant_id,
'type' => 1,
'old_pay_order_id' => $wxPayOrder['id']
]));
if ($couponResult['status'] == 1) {
$save['trade_amount'] = $couponResult['data']['cash_fee'];
$save['pay_coupon_id_str'] = $couponResult['data']['pay_coupon_id_str'];
$save['pay_coupon_fee'] = $wxPayOrder['pay_coupon_fee'];
$save['refund_coupon_fee'] = $couponResult['data']['pay_coupon_fee'];
//退款代金券退还的金额
$PayOrderModel->toSetInc([
'id' => $wxPayOrder['id']
], 'refund_coupon_fee', $couponResult['data']['pay_coupon_fee']);
$PayOrderModel->toSetDec([
'id' => $wxPayOrder['id']
], 'refund_money', $couponResult['data']['pay_coupon_fee']);
$pay_coupon_info = [
'pay_coupon_id_str' => $couponResult['data']['pay_coupon_id_str'],
'refund_coupon_fee' => $couponResult['data']['pay_coupon_fee']
];
}
}
$PayOrderModel->updateOrder($map, $save);
break;
case 'REFUNDCLOSE':
$result['status'] = 0;
$result['msg'] = '退款关闭';
break;
case 'CHANGE':
$result['status'] = 0;
$result['msg'] = '退款异常,请到商户品台手动处理';
default:
$result['status'] = 0;
$result['msg'] = '退款失败';
}
} else {
$result['status'] = 0;
$result['msg'] = '退款失败';
}
$resultArr[] = $result;
} else {
$result['return'] = $array;
$result['status'] = 0;
$result['msg'] = $array['err_code_des'] ? $array['err_code_des'] : ($array['return_msg'] ? $array['return_msg'] : '退款失败');
$resultArr[] = $result;
}
}
}
} else {
$res['status'] = 0;
$res['msg'] = '微信退款记录添加失败';
$resultArr[] = $res;
}
}
if (!empty($bPayOrder) && $balance > 0) {
//余额退款
$item[$PayOrderModel::PAY_ORDER_ID] = $bPayOrder[$PayOrderModel::ID];
$item[$PayOrderModel::PAY_TYPE] = 6; //'1微信 2支付宝 3现金 4小程序微信 5其他支付方式 6会员余额',
$item[$PayOrderModel::TRADE_AMOUNT] = $balance; //'订单金额',
$new_pay_order = $PayOrderModel->addPayOrder($item);
if ($new_pay_order) {
$res = A('PayApi/VipPay')->refundForVip_v1($new_pay_order, 4, 5);
if ($res['status'] == 1) {
$PayOrderModel->toSetInc([
'id' => $bPayOrder['id']
], 'refund_money', $balance);
$map = array($PayOrderModel::ID => $new_pay_order[$PayOrderModel::ID]);
$save = array(
$PayOrderModel::ORDER_STATE => 'REFUND',
$PayOrderModel::TRADE_DATE => time()
);
$PayOrderModel->updateOrder($map, $save);
}
} else {
$res['status'] = 0;
$res['msg'] = '余额退款记录添加失败';
}
$resultArr[] = $res;
if ($pay_type) {
$pay_type = 8;
} else {
$pay_type = 5;
}
}
$status = 0;
$msg = '';
foreach ($resultArr as $value) {
if ($value['status']) {
$status = 1;
}
$msg .= $value['msg'] . ',';
}
$res = array(
'status' => $status,
'msg' => trim($msg, ','),
'pay_type' => $pay_type,
'return_info' => $array,
'pay_coupon_info' => $pay_coupon_info ? $pay_coupon_info : []
);
return $res;
}
/**
* 2019-11-11购买plus会员支付成功回调
* @param $pay_order
* @return bool
*/
public function plus_continent_pay_v2($pay_order)
{
if (empty($pay_order)) {
return false;
}
if (is_array($pay_order)) {
$PayOrderModel = D('RetailPayOrder');
$pay_order_id = $pay_order[$PayOrderModel::ID];
} else {
$pay_order_id = $pay_order;
}
// 查询付费记录
$PlusRecordModel = D('RetailPlusRecord');
$rMap = array(
$PlusRecordModel::PAY_ORDER_ID => $pay_order_id,
$PlusRecordModel::PAY_STATE => 0
);
$record = $PlusRecordModel->getFind($rMap);
if (empty($record)) {
$res['status'] = 0;
$res['msg'] = '记录查询失败';
return $res;
}
// 修改plus_record表支付状态
$upItem = array(
$PlusRecordModel::PAY_STATE => 1,
$PlusRecordModel::PAY_TYPE => 1,
);
$save1 = $PlusRecordModel->updateOrder($rMap, $upItem);
if (!$save1) {
$res['status'] = 0;
$res['msg'] = '订单更新失败';
return $res;
}
$PlusVipModel = D('RetailPlusVip');
$PlusActivityModel = D('PlusActivity');
$cMap = array(
$PlusActivityModel::ID => $record[$PlusRecordModel::ACTIVITY_ID],
);
$plus_time = $PlusActivityModel->getFindField($cMap, $PlusActivityModel::TIME);
$plus_time = $plus_time * 86400;
if ($record[$PlusRecordModel::TYPE] == 1) { // 开通
$flag = false;
if (!empty($record['vip_id'])) {
//判断是否曾经购买过plus会员、过期后续费
$plus_vip = $PlusVipModel->getFind(['vip_id' => $record['vip_id']]);
if (!empty($plus_vip)) {
$flag = true;
}
}
$time = time();
if ($flag) {
$up1[$PlusVipModel::STATE] = 1;
$up1[$PlusVipModel::START_TIME] = $time;
$up1[$PlusVipModel::END_TIME] = $time + $plus_time;
$plus_id = $plus_vip['id'];
$PlusVipModel->updateOrder(array($PlusVipModel::ID => $plus_id), $up1);
} else {
$plusItem = array(
$PlusVipModel::VIP_ID => $record[$PlusRecordModel::VIP_ID],
$PlusVipModel::XCX_VIP_ID => $record[$PlusRecordModel::XCX_UID],
$PlusVipModel::MERCHANT_ID => $record[$PlusRecordModel::MERCHANT_ID],
$PlusVipModel::STORE_ID => $record[$PlusRecordModel::STORE_ID],
$PlusVipModel::ADD_TIME => $time,
$PlusVipModel::START_TIME => $time,
$PlusVipModel::END_TIME => $time + $plus_time,
);
$plus_id = $PlusVipModel->addOrder($plusItem);
}
if (!$plus_id) {
$res['status'] = 0;
$res['msg'] = '添加Plus用户失败';
return $res;
}
} else if ($record[$PlusRecordModel::TYPE] == 2) { // 续费
$pMap = array(
$PlusVipModel::VIP_ID => $record[$PlusRecordModel::VIP_ID]
);
$plus = $PlusVipModel->getFind($pMap);
if (!$plus) {
$res['status'] = 0;
$res['msg'] = 'plus会员查询失败';
return $res;
}
$plus_id = $plus['id'];
$time = time();
if ($plus[$PlusVipModel::END_TIME] > $time) {
//没过期
$up1[$PlusVipModel::END_TIME] = $plus[$PlusVipModel::END_TIME] + $plus_time;
} else {
//已过期
$up1[$PlusVipModel::END_TIME] = $time + $plus_time;
}
$up1[$PlusVipModel::STATE] = 1;
$up1[$PlusVipModel::START_TIME] = $time;
$pMap = array(
$PlusVipModel::ID => $plus[$PlusVipModel::ID],
);
$save4 = $PlusVipModel->updateOrder($pMap, $up1);
if (!$save4) {
$res['status'] = 0;
$res['msg'] = '过期日期修改失败';
return $res;
}
}
// 改变用户类型
$RSPUModel = new RetailSmallProgramUserModel();
$uMap = [
'vid' => $record['vip_id'],
];
$nUp = [
'type' => 2,
'plus_vip_id' => $plus_id,
];
$RSPUModel->updateOrder($uMap, $nUp);
// 改变会员类型
$VipModel = new RetailVipModel();
$vMap = array(
'id' => $record['vip_id']
);
$vUp = array(
'plus_id' => $plus_id,
'plus_type' => 2,
'plus_state' => 1,
);
$save3 = $VipModel->updateOrder($vMap, $vUp);
if (!$save3) {
$res['status'] = 0;
$res['msg'] = '会员类型变更失败';
} else {
$res['status'] = 1;
$res['msg'] = '购买成功';
}
return $res;
}
}