You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

238 lines
8.4 KiB

<?php
/**
* Created by PhpStorm.
* User: zc
* Date: 2018/5/21
* Time: 14:30
*/
namespace app\controllers;
use app\models\alipay\MpConfig;
use app\models\FormId;
use luweiss\wechat\DataTransform;
use app\models\IntegralCouponOrder;
use app\models\Coupon;
use app\models\User;
use app\models\UserCoupon;
use app\models\IntegralOrder;
use app\models\IntegralOrderDetail;
use app\models\IntegralGoods;
use app\models\Register;
class InPayNotifyController extends Controller
{
public $enableCsrfValidation = false;
public function actionIndex()
{
$xml = file_get_contents("php://input");
if (\Yii::$app->fromAlipayApp()) {
$this->alipayNotify();
} else {
$res = DataTransform::xmlToArray($xml);
if ($res && !empty($res['out_trade_no'])) {//微信支付回调
$this->wechatPayNotify($res);
}
}
}
private function wechatPayNotify($res)
{
if ($res['result_code'] != 'SUCCESS' && $res['return_code'] != 'SUCCESS') {
return;
}
$orderNoHead = substr($res['out_trade_no'], 0, 1);
if ($orderNoHead == 'G') {
// 商品购买回调
return $this->goodsOrderNotify($res);
}
$icOrder = IntegralCouponOrder::findOne(['order_no' => $res['out_trade_no']]);
$user = User::findOne(['id' => $icOrder->user_id]);
$icOrder->is_pay = 1;
$icOrder->pay_time = time();
$icOrder->save();
$coupon = Coupon::findOne(['id' => $icOrder->coupon_id]);
$coupon->total_num -= 1;
$coupon->save();
$new_coupon = new Coupon();
$new_coupon->attributes = $coupon->attributes;
$new_coupon->is_delete = 1;
$new_coupon->save();
$userCoupon = new UserCoupon();
$userCoupon->store_id = $icOrder->store_id;
$userCoupon->user_id = $icOrder->user_id;
$userCoupon->coupon_id = $new_coupon->id;
$userCoupon->coupon_auto_send_id = 0;
$userCoupon->is_expire = 0;
$userCoupon->is_use = 0;
$userCoupon->is_delete = 0;
$userCoupon->addtime = time();
$userCoupon->type = 3;
$userCoupon->price = $coupon->price;
$userCoupon->integral = $coupon->integral;
if ($coupon->expire_type == 1) {
$userCoupon->begin_time = time();
$userCoupon->end_time = time() + max(0, 86400 * $coupon->expire_day);
} elseif ($coupon->expire_type == 2) {
$userCoupon->begin_time = $coupon->begin_time;
$userCoupon->end_time = $coupon->end_time;
}
$userCoupon->save();
$user->integral -= $coupon->integral;
$user->save();
$register = new Register();
$register->store_id = $icOrder->store_id;
$register->user_id = $user->id;
$register->register_time = '..';
$register->addtime = time();
$register->continuation = 0;
$register->type = 10;
$register->integral = $coupon->integral;
$register->order_id = $icOrder->id;
$register->save();
echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
return;
}
private function goodsOrderNotify($res)
{
$order = IntegralOrder::findOne(['order_no' => $res['out_trade_no']]);
$order->is_pay = 1;
$order->pay_time = time();
$order->pay_type = 1;
$order->save();
$user = User::findOne(['id' => $order->user_id]);
$user->integral -= $order->integral;
$user->save();
$register = new Register();
$register->store_id = $order->store_id;
$register->user_id = $user->id;
$register->register_time = '..';
$register->addtime = time();
$register->continuation = 0;
$register->type = 11;
$register->integral = '-' . $order->integral;
$register->order_id = $order->id;
$register->save();
echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
return;
}
private function alipayNotify()
{
$res = $_POST;
if ($res['trade_status'] != 'TRADE_SUCCESS') {
return;
}
$orderNoHead = substr($res['out_trade_no'], 0, 1);
if ($orderNoHead == 'G') {
// 商品购买回调
return $this->AliGoodsOrderNotify($res);
}
$icOrder = IntegralCouponOrder::findOne(['order_no' => $res['out_trade_no']]);
$config = MpConfig::get($icOrder->store_id);
$aop = $config->getClient();
if ($aop->verify() === false) {
return;
}
if (isset($_POST['trade_no'])) {
FormId::addFormId([
'store_id' => $icOrder->store_id,
'user_id' => $icOrder->user_id,
'wechat_open_id' => $icOrder->user->wechat_open_id,
'form_id' => $_POST['trade_no'],
'type' => 'prepay_id',
'order_no' => $res['out_trade_no'],
]);
}
$user = User::findOne(['id' => $icOrder->user_id]);
$icOrder->is_pay = 1;
$icOrder->pay_time = time();
$icOrder->save();
$coupon = Coupon::findOne(['id' => $icOrder->coupon_id]);
$coupon->total_num -= 1;
$coupon->save();
$new_coupon = new Coupon();
$new_coupon->attributes = $coupon->attributes;
$new_coupon->is_delete = 1;
$new_coupon->save();
$userCoupon = new UserCoupon();
$userCoupon->store_id = $icOrder->store_id;
$userCoupon->user_id = $icOrder->user_id;
$userCoupon->coupon_id = $new_coupon->id;
$userCoupon->coupon_auto_send_id = 0;
$userCoupon->is_expire = 0;
$userCoupon->is_use = 0;
$userCoupon->is_delete = 0;
$userCoupon->addtime = time();
$userCoupon->type = 3;
$userCoupon->price = $coupon->price;
$userCoupon->integral = $coupon->integral;
if ($coupon->expire_type == 1) {
$userCoupon->begin_time = time();
$userCoupon->end_time = time() + max(0, 86400 * $coupon->expire_day);
} elseif ($coupon->expire_type == 2) {
$userCoupon->begin_time = $coupon->begin_time;
$userCoupon->end_time = $coupon->end_time;
}
$userCoupon->save();
$user->integral -= $coupon->integral;
$user->save();
$register = new Register();
$register->store_id = $icOrder->store_id;
$register->user_id = $user->id;
$register->register_time = '..';
$register->addtime = time();
$register->continuation = 0;
$register->type = 10;
$register->integral = $coupon->integral;
$register->order_id = $icOrder->id;
$register->save();
echo 'success';
return;
}
private function AliGoodsOrderNotify($res)
{
$order = IntegralOrder::findOne(['order_no' => $res['out_trade_no']]);
$config = MpConfig::get($order->store_id);
$aop = $config->getClient();
if ($aop->verify() === false) {
return;
}
if (isset($_POST['trade_no'])) {
FormId::addFormId([
'store_id' => $order->store_id,
'user_id' => $order->user_id,
'wechat_open_id' => $order->user->wechat_open_id,
'form_id' => $_POST['trade_no'],
'type' => 'prepay_id',
'order_no' => $res['out_trade_no'],
]);
}
$order->is_pay = 1;
$order->pay_time = time();
$order->pay_type = 1;
$order->save();
$user = User::findOne(['id' => $order->user_id]);
$user->integral -= $order->integral;
$user->save();
$register = new Register();
$register->store_id = $order->store_id;
$register->user_id = $user->id;
$register->register_time = '..';
$register->addtime = time();
$register->continuation = 0;
$register->type = 11;
$register->integral = '-' . $order->integral;
$register->order_id = $order->id;
$register->save();
echo 'success';
return;
}
}