汪总电商平台
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.
 
 
 
 
 
 

469 lines
14 KiB

<?php
namespace app\api\controller\wanlshop;
use addons\wanlshop\library\WanlPay\WanlPay;
use addons\wanlshop\library\WanlSdk\Common;
use app\common\controller\Api;
use think\Cache;
use think\Db;
use think\Exception;
/**
* WanlShop支付接口
*/
class Pay extends Api
{
protected $noNeedLogin = [];
protected $noNeedRight = ['*'];
/**
* 获取支付信息 ----
*
* @ApiSummary (WanlShop 获取支付信息)
* @ApiMethod (POST)
*
* @param string $id 订单ID
*/
public function getPay()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$id = $this->request->post('order_id');
$id ? $id : ($this->error(__('非法请求')));
$order_type = $this->request->post('order_type');
// 1.0.8升级 拼团
if($order_type == 'groups'){
$model_order = model('app\api\model\wanlshop\groups\Order');
}else{
$model_order = model('app\api\model\wanlshop\Order');
}
// 判断权限
$orderState = $model_order
->where(['id' => $id, 'user_id' => $this->auth->id])
->find();
$orderState['state'] != 1 ? ($this->error(__('订单异常'))):'';
// 获取支付信息 1.1.2升级
$pay = model('app\api\model\wanlshop\Pay')
->where(['order_id' => $id, 'type' => $order_type == 'groups' ? 'groups' : 'goods'])
->field('id,order_id,order_no,pay_no,price')
->find();
$pay['order_type'] = $order_type ? $order_type : 'goods';
// 传递Token
$pay['token'] = Common::creatToken('orderToken_'. $this->auth->id);
$this->success('ok', $pay);
}
$this->error(__('非法请求'));
}
/**
* 支付订单
*
* @ApiSummary (WanlShop 支付订单)
* @ApiMethod (POST)
*
* @param string $order_id 订单ID
* @param string $type 支付类型
*/
public function payment()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$order_id = $this->request->post('order_id/a');
$order_id ? $order_id : ($this->error(__('非法请求')));
$order_type = $this->request->post('order_type');
$type = $this->request->post('type');
$method = $this->request->post('method');
$code = $this->request->post('code');
$token = $this->request->post('token');
// 验证Token
if($token){
if(!Common::checkToken($token, 'orderToken_'. $this->auth->id)){
$this->error(__('页面安全令牌已过期!请重返此页'));
}
}else{
$this->error(__('非法提交,未传入Token'));
}
$user_id = $this->auth->id;
$type ? $type : ($this->error(__('未选择支付类型')));
// 1.0.8升级 拼团
if($order_type == 'groups'){
$model_order = model('app\api\model\wanlshop\groups\Order');
$model_order_goods = model('app\api\model\wanlshop\groups\OrderGoods');
$model_goods = model('app\api\model\wanlshop\groups\Goods');
$model_goods_sku = model('app\api\model\wanlshop\groups\GoodsSku');
}else{
$model_order = model('app\api\model\wanlshop\Order');
$model_order_goods = model('app\api\model\wanlshop\OrderGoods');
$model_goods = model('app\api\model\wanlshop\Goods');
$model_goods_sku = model('app\api\model\wanlshop\GoodsSku');
}
// 判断权限
$order = $model_order
->where('id', 'in', $order_id)
->where('user_id', $user_id)
->select();
if(!$order){
$this->error(__('没有找到任何要支付的订单'));
}
foreach($order as $item){
if($item['state'] != 1){
$this->error(__('订单已支付,或网络繁忙'));
}
// 1.0.5升级 修复付款减库存
foreach($model_order_goods->where('order_id', $item['id'])->select() as $data){
// 1.1.10升级 判断前端商品数量0
if($data['number'] <= 0){
$this->error("操作异常");
}
$redis = Common::redis();
// 获取sku
$sku = $model_goods_sku->get($data['goods_sku_id']);
// 1.1.2升级
$sku_key = ($order_type == 'groups' ? 'groups':'goods').'_'.$sku['goods_id'].'_'.$sku['id'];
// 查询商品
$goods = $model_goods
->where(['id' => $data['goods_id'], 'stock' => 'payment'])
->find();
// 库存计算方式:porder=下单减库存,payment=付款减库存 1.0.8升级
if($goods) {
// 1.1.2升级
if($data['number'] > $redis->llen("{$sku_key}")){
$this->error("系统繁忙,请稍后抢购!");
}else{
for ($i = 0; $i < $data['number']; $i ++) {
$redis->rpop("{$sku_key}");
}
$sku->setDec('stock', $data['number']); // 1.0.3升级
}
}
}
}
// 调用支付
$wanlPay = new WanlPay($type, $method, $code);
$data = $wanlPay->pay($order_id, $order_type);
if($data['code'] == 200){
$this->success('ok', $data['data']);
}else{
$this->error($data['msg']);
}
}
$this->error(__('非正常请求'));
}
/**
* 用户充值
*/
public function recharge()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$money = $this->request->post('money');
$type = $this->request->post('type');
$method = $this->request->post('method');
$code = $this->request->post('code');
$user_id = $this->auth->id;
$type ? $type : ($this->error(__('未选择支付类型')));
$money ? $money : ($this->error(__('为输入充值金额')));
// 调用支付
$wanlPay = new WanlPay($type, $method, $code);
$data = $wanlPay->recharge($money);
if($data['code'] == 200){
$this->success($data['msg'], $data['data']);
}else{
$this->error($data['msg']);
}
}
$this->error(__('非正常请求'));
}
/**
* 用户提现账户
*/
public function getPayAccount()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$row = model('app\api\model\wanlshop\PayAccount')
->where(['user_id' => $this->auth->id])
->order('createtime desc')
->select();
$this->success('ok', $row);
}
$this->error(__('非正常请求'));
}
/**
* 新增提现账户
*/
public function addPayAccount()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$post = $this->request->post();
$post['user_id'] = $this->auth->id;
$row = model('app\api\model\wanlshop\PayAccount')->allowField(true)->save($post);
if($row){
$this->success('ok', $row);
}else{
$this->error(__('新增失败'));
}
}
$this->error(__('非正常请求'));
}
/**
* 删除提现账户
*/
public function delPayAccount($ids = '')
{
$row = model('app\api\model\wanlshop\PayAccount')
->where('id', 'in', $ids)
->where(['user_id' => $this->auth->id])
->delete();
if($row){
$this->success('ok', $row);
}else{
$this->error(__('删除失败'));
}
}
/**
* 初始化提现
*/
public function initialWithdraw()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$config = get_addon_config('wanlshop');
$bank = model('app\api\model\wanlshop\PayAccount')
->where(['user_id' => $this->auth->id])
->order('createtime desc')
->find();
$this->success('ok', [
'money' => $this->auth->money,
'servicefee' => $config['withdraw']['servicefee'],
'bank' => $bank
]);
}
$this->error(__('非正常请求'));
}
/**
* 用户提现
*/
public function withdraw()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
// 金额
$money = $this->request->post('money');
// 账户
$account_id = $this->request->post('account_id');
if ($money <= 0) {
$this->error('提现金额不正确');
}
if ($money > $this->auth->money) {
$this->error('提现金额超出可提现额度');
}
if (!$account_id) {
$this->error("提现账户不能为空");
}
// 查询提现账户
$account = \app\api\model\wanlshop\PayAccount::where(['id' => $account_id, 'user_id' => $this->auth->id])->find();
if (!$account) {
$this->error("提现账户不存在");
}
$config = get_addon_config('wanlshop');
if ($config['withdraw']['state'] == 'N'){
$this->error("系统该关闭提现功能,请联系平台客服");
}
if (isset($config['withdraw']['minmoney']) && $money < $config['withdraw']['minmoney']) {
$this->error('提现金额不能低于' . $config['withdraw']['minmoney'] . '元');
}
if ($config['withdraw']['monthlimit']) {
$count = \app\api\model\wanlshop\Withdraw::where('user_id', $this->auth->id)->whereTime('createtime', 'month')->count();
if ($count >= $config['withdraw']['monthlimit']) {
$this->error("已达到本月最大可提现次数");
}
}
// 计算提现手续费
if($config['withdraw']['servicefee'] && $config['withdraw']['servicefee'] > 0){
$servicefee = number_format($money * $config['withdraw']['servicefee'] / 1000, 2);
$handingmoney = $money - number_format($money * $config['withdraw']['servicefee'] / 1000, 2);
}else{
$servicefee = 0;
$handingmoney = $money;
}
Db::startTrans();
try {
$data = [
'user_id' => $this->auth->id,
'money' => $handingmoney,
'handingfee' => $servicefee, // 手续费
'type' => $account['bankCode'],
'account' => $account['cardCode'],
'orderid' => date("Ymdhis") . sprintf("%08d", $this->auth->id) . mt_rand(1000, 9999)
];
$withdraw = \app\api\model\wanlshop\Withdraw::create($data);
$pay = new WanlPay;
$pay->money(-$money, $this->auth->id, '申请提现', 'withdraw', $withdraw['id']);
Db::commit();
} catch (Exception $e) {
Db::rollback();
$this->error($e->getMessage());
}
$this->success('提现申请成功!请等待后台审核', $this->auth->money);
}
$this->error(__('非正常请求'));
}
/**
* 获取提现日志
*/
public function withdrawLog()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$list = model('app\api\model\wanlshop\Withdraw')
->where('user_id', $this->auth->id)
->order('createtime desc')
->paginate();
$this->success('ok',$list);
}
$this->error(__('非法请求'));
}
/**
* 获取支付日志
*/
public function moneyLog()
{
//设置过滤方法
$this->request->filter(['strip_tags']);
if ($this->request->isPost()) {
$list = model('app\common\model\MoneyLog')
->where('user_id', $this->auth->id)
->order('createtime desc')
->paginate();
$this->success('ok',$list);
}
$this->error(__('非法请求'));
}
/**
* 获取支付详情
*/
public function details($id = null, $type = null)
{
if($type == 'pay'){
$field = 'id,shop_id,createtime,paymenttime';
$order = model('app\api\model\wanlshop\Order')
->where('order_no', 'in', $id)
->where('user_id', $this->auth->id)
->field($field)
->select();
//1.0.5升级 临时修改,后续升级版本重构
if(!$order){
$shop = model('app\api\model\wanlshop\Shop')->get(['user_id' => $this->auth->id]);
$order = model('app\api\model\wanlshop\Order')
->where('order_no', 'in', $id)
->where('shop_id', $shop['id'])
->field($field)
->select();
if(!$order) $this->error(__('订单异常'));
}
foreach($order as $vo){
// 1.1.2升级
$vo['pay'] = model('app\api\model\wanlshop\Pay')
->where(['order_id' => $vo['id'], 'type' => 'goods'])
->field('price,pay_no,order_no,order_price,trade_no,actual_payment,freight_price,discount_price,total_amount')
->find();
$vo->shop->visible(['shopname']);
$vo->goods = model('app\api\model\wanlshop\OrderGoods')
->where(['order_id' => $vo['id']])
->field('id,title,difference,image,price,number')
->select();
}
$this->success('ok', $order);
}else if($type == 'groups'){
$field = 'id,shop_id,createtime,paymenttime';
$order = model('app\api\model\wanlshop\groups\Order')
->where('order_no', 'in', $id)
->where('user_id', $this->auth->id)
->field($field)
->select();
//1.0.5升级 临时修改,后续升级版本重构
if(!$order){
$shop = model('app\api\model\wanlshop\Shop')->get(['user_id' => $this->auth->id]);
$order = model('app\api\model\wanlshop\groups\Order')
->where('order_no', 'in', $id)
->where('shop_id', $shop['id'])
->field($field)
->select();
if(!$order) $this->error(__('订单异常'));
}
foreach($order as $vo){
// 1.1.2升级
$vo['pay'] = model('app\api\model\wanlshop\Pay')
->where(['order_id' => $vo['id'], 'type' => 'groups'])
->field('price,pay_no,order_no,order_price,trade_no,actual_payment,freight_price,discount_price,total_amount')
->find();
$vo->shop->visible(['shopname']);
$vo->goods = model('app\api\model\wanlshop\groups\OrderGoods')
->where(['order_id' => $vo['id']])
->field('id,title,difference,image,price,number')
->select();
}
$this->success('ok', $order);
}else if($type == 'recharge' || $type == 'withdraw'){ // 用户充值
if($type == 'recharge'){
$model = model('app\api\model\wanlshop\RechargeOrder');
$field = 'id,paytype,orderid,memo';
}else{
$model = model('app\api\model\wanlshop\Withdraw');
$field = 'id,money,handingfee,status,type,account,orderid,memo,transfertime';
}
$row = $model
->where(['id' => $id, 'user_id' => $this->auth->id])
->field($field)
->find();
$this->success('ok', $row);
}else if($type == 'refund'){
$order = model('app\api\model\wanlshop\Order')
->where('order_no', $id)
->where('user_id', $this->auth->id)
->field('id,shop_id,order_no,createtime,paymenttime')
->find();
if(!$order){
$this->error(__('订单异常'));
}
$order->shop->visible(['shopname']);
$order['refund'] = model('app\api\model\wanlshop\Refund')
->where(['order_id' => $order['id'], 'user_id' => $this->auth->id])
->field('id,price,type,reason,createtime,completetime')
->find();
$this->success('ok', $order);
}else{ // 系统
$this->success('ok');
}
}
/**
* 获取余额
*/
public function getBalance()
{
$this->success('ok', $this->auth->money);
}
}