作者 谢百川

支付回调完成,提现脚本完成

<?php
function handleOrder($orderInfo) {
try {
if(!is_array($orderInfo)) {
return false;
}
$orderInfo['other'] = json_decode($orderInfo['other'], true);
if($orderInfo['type'] == 1) { // 打赏
$user = new \app\api\model\User();
$userInfo = $user->infoAndLockById($orderInfo['other']['user_id']);
if(!$userInfo) {
return false;
}
$insertData = [
'user_id' => $orderInfo['other']['user_id'],
'money' => $orderInfo['other']['money'],
'memo' => '收到打赏',
'createtime' => time(),
];
$userMoneyLog = new \app\api\model\UserMoneyLog();
$res = $userMoneyLog->addOne($insertData);
if(!$res) {
return false;
}
$updateData = [
'money' => bcadd($userInfo['money'], $orderInfo['other']['money'], 2)
];
$res = $user->updateOne($orderInfo['other']['user_id'], $updateData);
if(!$res) {
return false;
}
return true;
} elseif ($orderInfo['type'] == 2) { // 购买vip
$student = new \app\api\model\Student();
$studentInfo = $student->infoByUserId($orderInfo['other']['user_id']);
if(!$student) {
return false;
}
if($studentInfo['vip_endtime']) {
if($studentInfo['vip_level'] == $orderInfo['other']['vip_level']) {
$vipEndTime = bcadd($studentInfo['vip_endtime'], bcmul($orderInfo['other']['keep'], bcmul(3600, 24, 0), 0), 0);
} else {
$vipEndTime = bcmul($orderInfo['other']['keep'], bcmul(3600, 24, 0), 0);
}
} else {
$vipEndTime = bcmul($orderInfo['other']['keep'], bcmul(3600, 24, 0), 0);
}
$updateData = [
'vip_level' => $orderInfo['other']['vip_level'],
'vip_endtime' => $vipEndTime,
];
$res = $student->updateOne($studentInfo['id'], $updateData);
if(!$res) {
return false;
}
return true;
} else {
return false;
}
} catch (\Exception $e) {
return false;
}
}
\ No newline at end of file
... ...
... ... @@ -2,11 +2,14 @@
namespace app\api\controller;
use addons\epay\library\Service;
use app\api\model\Order;
use app\common\controller\Api;
use app\common\model\Area;
use app\common\model\Version;
use fast\Random;
use think\Config;
use think\Db;
/**
* 公共接口
... ... @@ -40,6 +43,8 @@ class Common extends Api
}
}
/**
* 上传文件
* @ApiMethod (POST)
... ... @@ -139,4 +144,53 @@ class Common extends Api
$this->error($file->getError());
}
}
/**
* 支付回调
* @ApiTitle (支付回调)
* @ApiSummary ()
* @ApiMethod (POST)
*/
public function payNotify()
{
$payType = 'wechat';
$pay = Service::checkNotify($payType);
if (!$pay) {
echo '签名错误';
return;
}
$data = $pay->verify();
$order = new Order();
Db::startTrans();
try {
$out_trade_no = $data['out_trade_no'];
$orderInfo = $order->infoAndLockById($out_trade_no);
if(!$orderInfo) {
Db::rollback();
} else {
if($orderInfo['status'] == 3) {
Db::rollback();
} else {
$res = $order->updateOne($orderInfo['id'], ['status' => 3, 'updatetime' => time()]);
if(!$res) {
Db::rollback();
} else {
// 根据订单内容修改相应的数据
$res = handleOrder($orderInfo);
if(!$res) {
Db::rollback();
} else {
Db::commit();
}
}
}
}
} catch (\Exception $e) {
}
$pay->success();
}
}
... ...
... ... @@ -122,7 +122,7 @@ class Vip extends Api
'money' => $vipConfigInfo['money'],
'type' => 2,
'status' => 1,
'other' => json_encode(['user_id' => $userId, 'keep' => $vipConfigInfo['keep']])
'other' => json_encode(['user_id' => $userId, 'keep' => $vipConfigInfo['keep'], 'vip_level' => $vipConfigInfo['vip_level']])
];
$res = $order->addOne($insertData);
if(!$res) {
... ...
... ... @@ -14,9 +14,27 @@ class Order extends Model
protected $updateTime = 'updatetime';
protected $deleteTime = 'deletetime';
// 添加一个订单
public function addOne($data)
{
return $this->insert($data);
}
// 根据条件查询订单
public function listByWhere($where)
{
return $this->where($where)->useSoftDelete($this->deleteTime)->select();
}
// 获取并锁定一个订单
public function infoAndLockById($id)
{
return $this->where(['id' => ['=', $id]])->useSoftDelete($this->deleteTime)->find();
}
// 修改一个订单
public function updateOne($id, $data)
{
return $this->where(['id' => ['=', $id]])->update($data);
}
}
\ No newline at end of file
... ...
... ... @@ -66,4 +66,10 @@ class Student extends Model
->page($page, $size)
->select();
}
// 修改一个学生的数据
public function updateOne($id, $data)
{
return $this->where(['id' => ['=', $id]])->update($data);
}
}
\ No newline at end of file
... ...
<?php
/**
* Created by PhpStorm.
* User: DELL
* Date: 2019/5/31
* Time: 9:25
*/
/**
* Created by PhpStorm.
* User: DELL
* Date: 2019/4/9
* Time: 10:58
*/
namespace app\command;
use app\api\model\Order;
use think\console\Input;
use think\console\Output;
use think\console\Command;
use addons\epay\library\Service;
use think\Db;
use think\Log;
use Yansongda\Pay\Pay;
class OrderQuery extends Command{
protected function configure()
{
$this->setName('OrderQuery')->setDescription('查询订单的支付结果');
}
protected function execute(Input $input, Output $output)
{
$config = Service::getConfig('wechat');
$pay = new Pay($config);
$order = new Order();
$where = ['status' => ['=', 1], 'createtime' => ['<', bcsub(time(), 3600, 0)]]; // 下单已经一小时并等待支付的订单
$orderList = $order->listByWhere($where);
foreach ($orderList as $v) {
$res = $pay->driver('wechat')->find($v['order_id']);
if(isset($res['return_code']) && ($res['return_code'] == 'SUCCESS') && isset($res['result_code']) && ($res['result_code'] == 'SUCCESS')) {
Db::startTrans();
try {
$res = $order->infoAndLockById($v['id']);
if(!$res) {
Db::rollback();
} else {
if($res['status'] == 3) {
Db::rollback();
} else {
$res = $order->updateOne($v['id'], ['status' => 3, 'updatetime' => time()]);
if(!$res) {
Db::rollback();
} else {
// 根据订单内容修改相应的数据
$res = handleOrder($v);
if(!$res) {
Db::rollback();
} else {
Db::commit();
}
}
}
}
} catch (\Exception $e) {
Db::rollback();
Log::write('订单查询成功,脚本修改异常:'.$v['order_id'], 'debug');
}
} else {
Log::write('订单查询异常:'.$v['order_id'], 'debug');
}
}
}
}
\ No newline at end of file
... ...
... ... @@ -15,6 +15,7 @@
namespace app\command;
use app\api\model\Third;
use app\api\model\User;
use app\api\model\UserMoneyLog;
use app\api\model\WithdrawLog;
use think\console\Input;
... ... @@ -22,7 +23,6 @@ use think\console\Output;
use think\console\Command;
use addons\epay\library\Service;
use think\Db;
use think\Log;
use Yansongda\Pay\Pay;
class PayToUser extends Command{
... ... @@ -52,21 +52,19 @@ class PayToUser extends Command{
];
$res = $pay->driver('wechat')->gateway('transfer')->pay($order);
if(isset($res['return_code']) && ($res['return_code'] == 'SUCCESS') && isset($res['result_code']) && ($res['result_code'] == 'SUCCESS')) {
$withdrawLog->updateOne($v['id'], ['status' => 1, 'updatetime' => time()]);
} else {
Db::startTrans();
try {
$insertData = [
'user_id' => $v['user_id'],
'money' => $v['money'],
'memo' => '提现失败,全额返还',
'memo' => '提现到账',
'createtime' => time(),
];
$res = $userMoneyLog->addOne($insertData);
if(!$res) {
Db::rollback();
} else {
$res = $withdrawLog->updateOne($v['id'], ['status' => 2, 'updatetime' => time()]);
$res = $withdrawLog->updateOne($v['id'], ['status' => 1, 'updatetime' => time()]);
if(!$res) {
Db::rollback();
} else {
... ... @@ -75,7 +73,40 @@ class PayToUser extends Command{
}
} catch (\Exception $e) {
Db::rollback();
Log::write('提现失败,返还到用户账户失败', 'debug');
}
} else {
$user = new User();
Db::startTrans();
try {
$userInfo = $user->infoAndLockById($v['user_id']);
if(!$userInfo) {
Db::rollback();
} else {
$insertData = [
'user_id' => $v['user_id'],
'money' => $v['money'],
'memo' => '提现失败,全额返还',
'createtime' => time(),
];
$res = $userMoneyLog->addOne($insertData);
if(!$res) {
Db::rollback();
} else {
$res = $withdrawLog->updateOne($v['id'], ['status' => 2, 'updatetime' => time()]);
if(!$res) {
Db::rollback();
} else { // 返还
$res = $user->updateOne($v['user_id'], ['money' => bcadd($userInfo['money'], $v['money'], 0)]);
if(!$res) {
Db::rollback();
} else {
Db::commit();
}
}
}
}
} catch (\Exception $e) {
Db::rollback();
}
}
}
... ...