Commit e219e99b by banice

关于支付的订单接口完成,支付结果进行中

parent d1e2c132
......@@ -101,8 +101,6 @@ class Client
$this->response = $this->client->get(self::URI . '?' . $str);
Log::debug($str);
$data = json_decode($this->response->getBody(), true);
Log::debug($data);
......
......@@ -14,6 +14,7 @@ use Dingo\Api\Http\Request;
use Dingo\Api\Transformer\Binding;
use Illuminate\Support\Facades\Log;
use Lib\wx\pay\Order;
use Lib\wx\Tool;
use Src\Battery;
use Src\wallet\Wallet;
......@@ -53,6 +54,8 @@ class MyCustomTransformer implements Adapter
'signType' => config('wx.sign_type'),
];
$data['paySign'] = Tool::sign($data);
} else if ($response instanceof \Src\order\Order) {
......
......@@ -20,14 +20,15 @@ class Client
/**
* @param Order $order
* @param UnifiedOrder $order
* @param string $url
* @throws \Exception
* @return bool
* @throws \Exception
*/
public function request(UnifiedOrder $order, string $url): bool
{
$client = new \GuzzleHttp\Client();
$content = $order->getOrderRequest();
......@@ -46,12 +47,13 @@ class Client
}
$body = ArrayToXml::convert($body);
$response = $client->post($url, [
'Content-Type' => 'text/xml',
'Content-Type' => 'text/xml; charset=UTF8',
'body' => $body,
'http_errors' => false,
]);
if ($response->getStatusCode() === 200) {
......
<?php
/**
* Created by PhpStorm.
* User: suhangyang
* Date: 2018/5/3
* Time: 上午9:31
*/
namespace Lib\wx\pay;
/**
* 微信支付异步回调数据接收器
* Class Receiver
* @package Lib\wx
*/
class Receiver
{
protected $variableNameMap = [
'return_code' => 'returnCode',
'return_msg' => 'returnMsg',
'appid' => 'appId',
'mch_id' => 'mchId',
'device_info' => 'deviceInfo',
'nonce_str' => 'nonceStr',
'sign' => 'sign',
'sign_type' => 'signType',
'result_code' => 'resultCode',
'err_code' => 'errCode',
'err_code_des' => 'errCodeDes',
'openid' => 'openid',
'is_subscribe' => 'isSubscribe',
'trade_type' => 'tradeType',
'bank_type' => 'bankType',
'total_fee' => 'totalFee',
'settlement_total_fee' => 'settlementTotalFee',
'fee_type' => 'feeType',
'cash_fee' => 'cashFee',
'cash_fee_type' => 'cashFeeType',
'coupon_fee' => 'couponFee',
'coupon_count' => 'couponCount',
'transaction_id' => 'transactionId',
'out_trade_no' => 'outTradeNo',
'attach' => 'attach',
'time_end' => 'timeEnd',
];
protected $allData;
protected $returnCode;
protected $returnMsg;
protected $appId;
protected $mchId;
protected $deviceInfo;
protected $nonceStr;
protected $sign;
protected $signType;
protected $resultCode;
protected $errCode;
protected $errCodeDes;
protected $openid;
protected $isSubscribe;
protected $tradeType;
protected $bankType;
protected $totalFee;
protected $settlementTotalFee;
protected $feeType;
protected $cashFee;
protected $cashFeeType;
protected $couponFee = 0;
protected $couponCount = 0;
protected $couponType;
protected $transactionId;
protected $outTradeNo;
protected $attach;
protected $timeEnd;
/**
* @param array $receiveData
*/
public function resolve(array $receiveData)
{
foreach ($this->variableNameMap as $key => $value) {
if (isset($receiveData[$key])) {
$this->$value = $receiveData[$key];
$this->allData[$value] = $receiveData[$key];
}
}
}
/**
* @return array
*/
public function getVariableNameMap(): array
{
return $this->variableNameMap;
}
/**
* @return mixed
*/
public function getReturnCode()
{
return $this->returnCode;
}
/**
* @return mixed
*/
public function getReturnMsg()
{
return $this->returnMsg;
}
/**
* @return mixed
*/
public function getAppId()
{
return $this->appId;
}
/**
* @return mixed
*/
public function getMchId()
{
return $this->mchId;
}
/**
* @return mixed
*/
public function getDeviceInfo()
{
return $this->deviceInfo;
}
/**
* @return mixed
*/
public function getNonceStr()
{
return $this->nonceStr;
}
/**
* @return mixed
*/
public function getSign()
{
return $this->sign;
}
/**
* @return mixed
*/
public function getSignType()
{
return $this->signType;
}
/**
* @return mixed
*/
public function getResultCode()
{
return $this->resultCode;
}
/**
* @return mixed
*/
public function getErrCode()
{
return $this->errCode;
}
/**
* @return mixed
*/
public function getErrCodeDes()
{
return $this->errCodeDes;
}
/**
* @return mixed
*/
public function getOpenid()
{
return $this->openid;
}
/**
* @return mixed
*/
public function getisSubscribe()
{
return $this->isSubscribe;
}
/**
* @return mixed
*/
public function getTradeType()
{
return $this->tradeType;
}
/**
* @return mixed
*/
public function getBankType()
{
return $this->bankType;
}
/**
* @return mixed
*/
public function getTotalFee()
{
return $this->totalFee;
}
/**
* @return mixed
*/
public function getSettlementTotalFee()
{
return $this->settlementTotalFee;
}
/**
* @return mixed
*/
public function getFeeType()
{
return $this->feeType;
}
/**
* @return mixed
*/
public function getCashFee()
{
return $this->cashFee;
}
/**
* @return mixed
*/
public function getCashFeeType()
{
return $this->cashFeeType;
}
/**
* @return mixed
*/
public function getCouponFee()
{
return $this->couponFee;
}
/**
* @return mixed
*/
public function getCouponCount()
{
return $this->couponCount;
}
/**
* @return mixed
*/
public function getCouponType()
{
return $this->couponType;
}
/**
* @return mixed
*/
public function getTransactionId()
{
return $this->transactionId;
}
/**
* @return mixed
*/
public function getOutTradeNo()
{
return $this->outTradeNo;
}
/**
* @return mixed
*/
public function getAttach()
{
return $this->attach;
}
/**
* @return mixed
*/
public function getTimeEnd()
{
return $this->timeEnd;
}
/**
* @return mixed
*/
public function getAllData()
{
return $this->allData;
}
/**
* @param mixed $allData
*/
public function setAllData($allData): void
{
$this->allData = $allData;
}
}
\ No newline at end of file
......@@ -11,7 +11,7 @@ namespace Lib\wx\pay;
/**
* 微信支付
* Class Pay
* Class PayModel
* @package Lib\wx
*/
class UnifiedOrder
......@@ -59,7 +59,7 @@ class UnifiedOrder
/**
* Pay constructor.
* PayModel constructor.
*/
public function __construct()
{
......
......@@ -28,12 +28,12 @@ class GeoHash extends Command
*/
public function handle()
{
// $sites = SiteModel::all(['id', 'longitude', 'latitude'])->toArray();
$sites = ServiceModel::all(['id', 'longitude', 'latitude'])->toArray();
$sites = SiteModel::all(['id', 'longitude', 'latitude'])->toArray();
// $sites = ServiceModel::all(['id', 'longitude', 'latitude'])->toArray();
$geoTools = new Geotools();
foreach ($sites as $site) {
$coorToGeoHash = new Coordinate($site['longitude'] . ',' . $site['latitude']);
// $coorToGeoHash = new Coordinate($site['longitude'] . ',' . $site['latitude']);
$coorToGeoHash = new Coordinate([$site['latitude'], $site['longitude']]);
$encoded = $geoTools->geohash()->encode($coorToGeoHash, 5);
......
......@@ -16,25 +16,30 @@ use Auth;
class BindController extends Controller
{
/**
* 用户绑定电池,生成第一条订单
* @param Request $request
* @return mixed
*/
public function bind(Request $request)
{
$validator = Validator::make($request->all(), [
'battery_code' => 'required|exists:batteries,code',
'battery_code' => 'required|exists:batteries,code|unique:guests,battery_code',
]);
if ($validator->fails() === true) {
abort(400, $validator->errors()->first());
}
$user = Auth::user();
$userId = $user->id;
$userModel = Auth::user();
$userId = $userModel->id;
$batteryCode = $request->get('battery_code');
$user->battery_code = $batteryCode;
$userModel->battery_code = $batteryCode;
if ($user->save() == false) {
if ($userModel->save() == false) {
abort(500, 'save error');
}
......
......@@ -43,14 +43,11 @@ class ReplaceController extends Controller
abort(400, $validator->errors()->first());
}
//todo 检查用户当前是否有正在换电未支付的订单
// 检查用户当前是否有正在换电未支付的订单
$userModel = Auth::user();
$userId = $userModel->id;
$userOpenId = $userModel->open_id;
Log::debug($userId);
$orderModel = new OrderModel();
$lastOrder = $orderModel->searchLastOrder($userId);
......@@ -67,11 +64,9 @@ class ReplaceController extends Controller
$box->setCode($boxCode);
try {
/**
* 查找是否有空的柜门,并占用
*/
// $freeDoorId = $box->searchByState($boxCode, Door::STATE['close_free']);
$freeDoorId = 1;
//fixme
$freeDoorId = $box->searchByState($boxCode, Door::STATE['close_free']);
// $freeDoorId = 1;
} catch (\Exception $exception) {
Log::error($exception->getMessage());
abort(500, $exception->getMessage());
......@@ -89,25 +84,25 @@ class ReplaceController extends Controller
$returnDoor->setId($freeDoorId);
$returnDoorModel = $returnDoor->getDoorModelById(['box_id', 'name']);
if ($returnDoorModel == null) {
Door::freeDoorOccupy($freeDoorId);
// Door::freeDoorOccupy($freeDoorId);
abort(500, '舱门无效');
}
$returnBoxId = $returnDoorModel->box_id;
$returnDoorName = $returnDoorModel->name;
//fixme
$returnDoorName = 1;
// $returnDoorName = 1;
$returnDoor->setName($returnDoorName);
$returnBox = new Box();
$returnBox->setId($returnBoxId);
if ($returnBox->searchById($returnBoxId, ['box_type', 'site_id', 'site_name']) === false) {
Door::freeDoorOccupy($freeDoorId);
// Door::freeDoorOccupy($freeDoorId);
abort(500, '电柜丢失');
}
$returnBoxName = $returnBox->getValue('box_type');
//fixme
$returnBoxName = 0;
// $returnBoxName = 0;
$returnBox->setName($returnBoxName);
$site->setId($returnBox->getValue('site_id'));
......@@ -144,8 +139,13 @@ class ReplaceController extends Controller
if ($client->request() === true) {
DB::table('orders')->where('code', $order->getOutTradeNo())->update([
'status' => 11,
'status' => 10,
'in_box_id' => $order->getReturnBox()->getId(),
'in_room_id' => $order->getReturnDoor()->getId(),
'in_room_name' => $order->getReturnDoor()->getName(),
'in_site_id' => $site->getId(),
]);
return $this->response->item($order, new MyCustomTransformer());
} else {
......
......@@ -38,7 +38,7 @@ class NeighbourController extends Controller
$centerPoint = new Coordinate([$lat, $lng]);
$encoded = $geoTools->geohash()->encode($centerPoint, 5);
$geoHashValue = $encoded->getGeohash();//比对相同的value
$services = ServiceModel::where('geo_hash', $geoHashValue)->get(['id', 'type', 'service_time', 'address', 'longitude', 'latitude', 'service_phone'])->toArray();
$services = ServiceModel::where('geo_hash', $geoHashValue)->get(['id', 'type', 'service_time', 'address', 'facilitator_name', 'longitude', 'latitude', 'service_phone'])->toArray();
$neighbourSite = [];
foreach ($services as $service) {
......
......@@ -10,14 +10,17 @@ namespace App\Http\Controllers\v1\station;
use App\Http\Controllers\Controller;
use App\model\BoxModel;
use App\model\DoorModel;
use App\model\SiteModel;
use App\model\SystemModel;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use League\Geotools\Geotools;
use Validator;
use League\Geotools\Coordinate\Coordinate;
use League\Geotools\Coordinate\Ellipsoid;
use DB;
class NeighbourController extends Controller
{
......@@ -33,12 +36,20 @@ class NeighbourController extends Controller
abort(400, $validator->errors()->first());
}
$powerLimit = DB::table('system')->first(['battery_full']);
$powerLimit = $powerLimit->battery_full;
$boxCount = DoorModel::where('site_id', $id)->count();
$boxes = DoorModel::where('site_id', $id)->get()->groupBy('box_id')->toArray();
$responseBox = [];
$count = DB::table('box_rooms')->where('site_id', $id)->where('battery_power', '>', $powerLimit)->count();
$siteInfo = DB::table('sites')->where('id', $id)->first(['longitude', 'latitude', 'img', 'name', 'id', 'province', 'city', 'area', 'area_name', 'address', 'service_time']);
$siteInfo = (array)$siteInfo;
$responseBox = [];
foreach ($boxes as $boxId => $doors) {
$tmp = [];
$tmp['box_code'] = $doors[0]['box_code'];
......@@ -52,7 +63,9 @@ class NeighbourController extends Controller
'data' => [
'box_code' => $boxCount,
'box' => $responseBox
'box' => $responseBox,
'site' => $siteInfo,
'site_available_count' => $count,
]
]);
......@@ -79,17 +92,25 @@ class NeighbourController extends Controller
$encoded = $geoTools->geohash()->encode($centerPoint, 5);
$geoHashValue = $encoded->getGeohash();//比对相同的value
$sites = SiteModel::where('geo_hash', $geoHashValue)->get(['longitude', 'latitude', 'img', 'status', 'name', 'id', 'province', 'city', 'area', 'area_name', 'address', 'service_time'])->toArray();
$sites = SiteModel::where('geo_hash', $geoHashValue)->where('status', 1)->get(['longitude', 'latitude', 'img', 'name', 'id', 'province', 'city', 'area', 'area_name', 'address', 'service_time'])->toArray();
$powerLimit = DB::table('system')->first(['battery_full']);
$powerLimit = $powerLimit->battery_full;
$neighbourSite = [];
foreach ($sites as $site) {
$point = new Coordinate([$site['latitude'], $site['longitude']]);
$distance = $geoTools->distance()->setFrom($centerPoint)->setTo($point);
$distanceValue = $distance->flat();
if ($distanceValue <= 2000) {
$count = DB::table('box_rooms')->where('site_id', $site['id'])->where('battery_power', '>', $powerLimit)->count();
$tmp = $site;
$tmp['available_battery_count'] = $count;
if (blank($site['area'])) {
$tmp['area'] = '';
}
$tmp['distance'] = $distanceValue;
......@@ -100,6 +121,8 @@ class NeighbourController extends Controller
$sitesCount = count($neighbourSite);
$data = [];
$data['available_power'] = (float)$powerLimit / 100;
$data['site_count'] = $sitesCount;
if ($sitesCount !== 0) {
$data['img_domain'] = '.com';//fixme
......
......@@ -71,12 +71,13 @@ class RegisterController extends Controller
}
} else {
UserModel::where('telephone', $telephone)->update([
'nickname' => $request->get('nickname'),
'img' => $request->get('header_url'),
]);
$userModel->nickname = $request->get('nickname');
$userModel->img = $request->get('header_url');
if ($userModel->save() == false) {
$this->resultCode = 'FAIL';
$this->returnCode = 50001;
return $this->response->array($this->getResponseCode());
}
}
$token = Auth::login($userModel);
......@@ -125,10 +126,20 @@ class RegisterController extends Controller
$userModel->img = $request->get('header_url');
$userModel->save();
} else {
UserModel::where('telephone', $phone)->update([
'nickname' => $request->get('nickname'),
'img' => $request->get('header_url'),
]);
$userModel->nickname = $request->get('nickname');
$userModel->img = $request->get('header_url');
if ($userModel->save() == false) {
$this->resultCode = 'FAIL';
$this->returnCode = 50001;
return $this->response->array($this->getResponseCode());
}
// UserModel::where('telephone', $phone)->update([
// 'nickname' => $request->get('nickname'),
// 'img' => $request->get('header_url'),
// ]);
}
$token = Auth::login($userModel);
......
......@@ -14,6 +14,7 @@ use App\model\PayGroupModel;
use Illuminate\Http\Request;
use Lib\custom\MyCustomTransformer;
use Lib\wx\Client;
use Lib\wx\login\Login;
use Lib\wx\pay\Order;
use Lib\wx\pay\UnifiedOrder;
use Validator;
......@@ -29,15 +30,13 @@ class CardController extends Controller
['begin_date', '<', $date],
['end_date', '>', $date],
['type', 2],
])->get(['money'])->toArray();
])->get(['money', 'begin_date', 'end_date', 'name', 'day'])->toArray();
return $this->response->array($this->getResponseCode() + [
'data' =>
[
'count' => count($payGroup),
'items' => $payGroup
],
]);
......@@ -58,6 +57,7 @@ class CardController extends Controller
'amount' => 'required',
'day' => 'required',
'card_id' => 'required',
'code' => 'required',
]);
if ($validator->fails() === true) {
......@@ -70,8 +70,14 @@ class CardController extends Controller
$day = $request->get('day');
$amount = $request->get('amount');
$notifyUrl = '';
$openid = 'own8r5AR8dvJqy8GQM_zNX9weR8Y';
$notifyUrl = 'https://';
$login = new Login($request->get('code'));
if ($login->request() === true) {
$openid = $login->getOpenId();
} else {
abort(400, 'open_id fail');
}
$unifiedOrder->setParameters([
......@@ -84,7 +90,7 @@ class CardController extends Controller
'openid' => $openid,
]);
$client = new Client();
if ($client->request($unifiedOrder, config('wx.unified_order_url') === true)) {
if ($client->request($unifiedOrder, config('wx.unified_order_url')) === true) {
$response = $client->getResponse();
$order = new Order();
......
......@@ -19,11 +19,16 @@ use Lib\wx\pay\Order;
use Lib\wx\pay\UnifiedOrder;
use Validator;
use Log;
use Auth;
class DepositController extends Controller
{
/**
* @param Request $request
* @return mixed
*/
public function getPrice(Request $request)
{
$deposit = SystemModel::first(['money']);
......@@ -46,30 +51,39 @@ class DepositController extends Controller
}
/**
* @param Request $request
* @param Login $login
* @param UnifiedOrder $unifiedOrder
* @return \Dingo\Api\Http\Response
* @throws \Exception
*/
public function pay(Request $request, UnifiedOrder $unifiedOrder)
{
$userModel = Auth::user();
$validator = Validator::make($request->all(), [
'amount' => 'required|int',
// 'code' => 'required'
'code' => 'required'
]);
// $code = $request->get('code');
//
// $login = new Login($code);
// if ($login->request() === true) {
// $openid = $login->getOpenId();
// //fixme 存储用户的sessionId
// }
if ($validator->fails()) {
Log::error($validator->errors()->first());
abort(400, $validator->errors()->first());
}
$code = $request->get('code');
$login = new Login($code);
if ($login->request() === true) {
$openid = $login->getOpenId();
} else {
abort(400, 'open_id fail');
}
$openid = 'own8r5AR8dvJqy8GQM_zNX9weR8Y';
// $openid = 'own8r5AR8dvJqy8GQM_zNX9weR8Y';
//todo 验证押金金额
$amount = $request->get('amount');
......@@ -84,6 +98,10 @@ class DepositController extends Controller
'notify_url' => $notifyUrl,
'trade_type' => 'JSAPI',
'openid' => $openid,
'attach' => json_encode([
'userId' => $userModel->id,
'name' => $userModel->name,
])
]);
$client = new Client();
......
......@@ -12,11 +12,15 @@ namespace App\Http\Controllers\v1\wx\pay;
use App\Http\Controllers\Controller;
use App\model\PayGroupModel;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Lib\custom\MyCustomTransformer;
use Lib\wx\Client;
use Lib\wx\login\Login;
use Lib\wx\pay\Order;
use Lib\wx\pay\UnifiedOrder;
use Validator;
use Auth;
/**
......@@ -37,15 +41,19 @@ class TopUpController extends Controller
['begin_date', '<', $date],
['end_date', '>', $date],
['type', 1],
])->orWhere([
['status', 1],
['begin_date', null],
['end_date', null],
['type', 1],
])->get(['money'])->toArray();
return $this->response->array($this->getResponseCode() + [
'data' =>
[
'count' => count($payGroup),
'items' => $payGroup
],
]);
......@@ -61,6 +69,8 @@ class TopUpController extends Controller
*/
public function pay(Request $request, UnifiedOrder $unifiedOrder)
{
$userModel = Auth::user();
$validator = Validator::make($request->all(), [
'amount' => 'required',
'code' => 'required'
......@@ -69,12 +79,43 @@ class TopUpController extends Controller
if ($validator->fails() === true) {
abort(400, $validator->errors()->first());
}
//todo code 获取openid和更新session id 验证金额
$amount = $request->get('amount');
$openid = 'own8r5AR8dvJqy8GQM_zNX9weR8Y';
$notifyUrl = '';
$date = date('Y-m-d H:i:s');
$payGroup = PayGroupModel::where([
['status', 1],
['begin_date', '<', $date],
['end_date', '>', $date],
['type', 1],
['money', $amount]
])->exists();
$login = new Login($request->get('code'));
if ($login->request() === false) {
abort(400, 'open_id wrong');
}
$openid = $login->getOpenId();
if ($userModel->open_id !== $openid) {
Log::info('open_id not equal');
}
// $openid = 'own8r5FidJCtQ08xouES8K6oJcos';
if ($validator->fails()) {
Log::error($validator->errors()->first());
abort(400, $validator->errors()->first());
}
$urlGenerator = app('Dingo\Api\Routing\UrlGenerator');
$urlGenerator->forceScheme('https');
$notifyUrl = $urlGenerator->version('v1')->route('top_up_receiver');
$amount = 1;
$unifiedOrder->setParameters([
'body' => '余额充值',
......@@ -84,9 +125,16 @@ class TopUpController extends Controller
'notify_url' => $notifyUrl,
'trade_type' => 'JSAPI',
'openid' => $openid,
'attach' => json_encode([
'userId' => $userModel->id,
'phone' => $userModel->telephone,
'name' => $userModel->name
])
]);
$client = new Client();
if ($client->request($unifiedOrder, config('wx.unified_order_url') === true)) {
if ($client->request($unifiedOrder, config('wx.unified_order_url')) === true) {
$response = $client->getResponse();
$order = new Order();
......
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/11/1
* Time: 下午8:51
*/
namespace App\Http\Controllers\v1\wx\pay\notify;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class CardController extends Controller
{
public function notify(Request $request)
{
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/11/1
* Time: 下午8:22
*/
namespace App\Http\Controllers\v1\wx\pay\notify;
use App\Http\Controllers\Controller;
use App\model\SystemModel;
use App\model\UserModel;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
use Lib\wx\pay\Receiver;
use Lib\wx\Tool;
use Src\order\DepositOrder;
/**
* 押金
* Class DepositController
* @package App\Http\Controllers\v1\wx\pay\notify
*/
class DepositController extends Controller
{
const RETURN_MESSAGE = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
/**
* @param Request $request
* @param Receiver $receiver
* @return $this
* @throws \Exception
*/
public function notify(Request $request, Receiver $receiver)
{
$receiveData = $request->getContent();
$recArray = Tool::xmlToArray($receiveData);
Log::debug(json_encode($recArray));
if (Tool::validateSign($recArray) === false) {
Log::error('sign wrong');
Log::error($recArray);
return response(self::RETURN_MESSAGE, 200)->header('Content-Type', 'text/xml');
}
$validator = Validator::make($recArray, [
'out_trade_no' => 'required|unique:pays,code',
]);
if ($validator->fails()) {
Log::error($validator->errors()->first());
Log::error($recArray);
return;
}
$receiver->resolve($recArray);
$deposit = SystemModel::first(['money']);
$deposit = $deposit->money;
$depositOrder = new DepositOrder();
try {
DB::beginTransaction();
$depositOrder->addRecord($receiver, $deposit);
UserModel::incrementDeposit($depositOrder->getUserId(), $deposit);
DB::commit();
} catch (\Exception $exception) {
Log::error($exception->getMessage());
Log::error($receiver->getAllData());
}
return response(self::RETURN_MESSAGE, 200)->header('Content-Type', 'text/xml');
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/11/1
* Time: 下午2:11
*/
namespace App\Http\Controllers\v1\wx\pay\notify;
use App\Http\Controllers\Controller;
use App\model\UserModel;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
use Lib\wx\pay\Receiver;
use Lib\wx\Tool;
use Src\order\TopUpOrder;
class TopUpController extends Controller
{
const RETURN_MESSAGE = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
/**
* @param Request $request
* @return $this
* @throws \Exception
*/
public function notify(Request $request)
{
$receiveData = $request->getContent();
$recArray = Tool::xmlToArray($receiveData);
Log::debug(json_encode($recArray));
if (Tool::validateSign($recArray) === false) {
Log::error('sign wrong');
Log::error($recArray);
return response(self::RETURN_MESSAGE, 200)->header('Content-Type', 'text/xml');
}
$validator = Validator::make($recArray, [
'out_trade_no' => 'required|unique:pays,code',
'total_fee' => 'required|integer',
'appid' => env('WX_APP_ID'),
'mch_id' => env('WX_MCH_ID'),
]);
if ($validator->fails()) {
return response(self::RETURN_MESSAGE, 200)->header('Content-Type', 'text/xml');
}
$receiver = new Receiver();
$receiver->resolve($recArray);
$topUpOrder = new TopUpOrder();
try {
DB::beginTransaction();
$topUpOrder->addRecord($receiver);
UserModel::incrementBalance((int)$topUpOrder->getAmount() + (int)$topUpOrder->getGiftAmount(), $topUpOrder->getUserId());
DB::commit();
} catch (\Exception $exception) {
Log::error($exception->getMessage());
Log::error($recArray);
DB::rollBack();
}
return response(self::RETURN_MESSAGE, 200)->header('Content-Type', 'text/xml');
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/11/1
* Time: 下午3:36
*/
namespace App\model;
use Illuminate\Database\Eloquent\Model;
class PayModel extends Model
{
protected $table = 'pays';
}
\ No newline at end of file
......@@ -31,6 +31,22 @@ class UserModel extends Model implements JWTSubject, AuthenticatableContract, Au
}
/**
* @param int $amount
* @param int $userId
* @return mixed
*/
public static function incrementBalance(int $amount, int $userId)
{
return UserModel::where('id', $userId)->increment('money', $amount);
}
public static function incrementDeposit(int $amount, int $userId)
{
return UserModel::where('id', $userId)->increment('deposit', $amount);
}
public function getJWTCustomClaims()
{
$return = [
......
......@@ -18,14 +18,14 @@ return [
// 'mch_id' => '1480201542',
'cache_user_token' => 'wx_user_token_',
'app_id' => env('WX_APP_ID'),
'app_secret' => env('WX_APP_SECRET'),
'mch_id' => env('WX_MCH_ID'),
'lang' => env('WX_LANG'),
'app_key' => env('WX_APP_KEY'),
'unified_order_url' => 'https://api.mch.weixin.qq.com/pay/unifiedorder',
'sign_type' => 'MD5',
'cache_user_token' => 'wx_user_token_',
'app_id' => env('WX_APP_ID'),
'app_secret' => env('WX_APP_SECRET'),
'mch_id' => env('WX_MCH_ID'),
'lang' => env('WX_LANG'),
'app_key' => env('WX_APP_KEY'),
'unified_order_url' => 'https://api.mch.weixin.qq.com/pay/unifiedorder',
'sign_type' => 'MD5',
];
\ No newline at end of file
......@@ -41,7 +41,6 @@ $api->version('v1', ['namespace' => 'App\Http\Controllers\v1', 'prefix' => 'api/
//获取押金金额
$api->get('deposit', 'wx\pay\DepositController@getPrice');
//
$api->get('top_up/items', 'wx\pay\TopUpController@get');
//换电卡种类
......@@ -74,6 +73,21 @@ $api->version('v1', ['namespace' => 'App\Http\Controllers\v1', 'prefix' => 'api/
$api->get('service/neighbour', 'service\NeighbourController@get');
$api->group(['prefix' => 'payment/ticket'], function ($api) {
$api->get('top_up', 'wx\pay\TopUpController@pay');
$api->get('deposit', 'wx\pay\DepositController@pay');
$api->get('card', 'wx\pay\CardController@pay');
});
$api->group(['prefix' => 'payment/receiver',], function ($api) {
$api->post('top_up', ['as' => 'top_up_receiver', 'uses' => 'wx\pay\notify\TopUpController@notify']);
});
});
......
......@@ -24,6 +24,17 @@ trait SearchByState
*/
public function searchByState(string $boxCode, int $state): int
{
$door = DB::table('box_rooms')->where('box_code', $boxCode)->where([
['battery_code', null],
['reserve_status', 1],
['door_status', 2],
])->first(['id']);
return blank($door) ? 0 : $door->id;
$redis = app('Redis');
if ($redis instanceof \Redis) {
$freeDoorIds = $redis->zRangeByScore(Door::getBoxDoorStateKey($boxCode), $state, $state);
......
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/11/1
* Time: 下午8:29
*/
namespace Src\order;
use App\model\PayModel;
use Illuminate\Support\Facades\Log;
use Lib\wx\pay\Receiver;
class DepositOrder extends PayOrder
{
protected $type = 'deposit';
public function addRecord(Receiver $receiver,int $deposit)
{
$attach = json_decode($receiver->getAttach(), true);
$userId = $attach['userId'];
$userName = $attach['name'];
$amount = $receiver->getTotalFee();
if ((int)$amount !== $deposit) {
Log::error('deposit amount not equal', $receiver->getAllData());
return;
}
$payModel = new PayModel();
$payModel->code = $receiver->getOutTradeNo();
$payModel->guest_id = $userId;
$payModel->guest_name = $userName;
$payModel->type = self::TYPE['deposit'];
$payModel->money = $amount;
$payModel->pay_type = self::PAY_TYPE['wx'];
$payModel->buy_type = self::BUY_TYPE['deposit'];
$payModel->status = 1;
$payModel->save();
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/11/1
* Time: 下午3:00
*/
namespace Src\order;
abstract class PayOrder
{
const TYPE = [
'top_up' => 1,
'consume' => 3,
];
const PAY_TYPE = [
'wx' => 2,
];
const BUY_TYPE = [
'wallet' => 2,
'deposit' => 1,
];
protected $type = 'top_up';
protected $payType = 'wx';
protected $buyType = 'wallet';
protected $amount = 0;
protected $userId = 0;
protected $userName = 0;
/**
* @return string
*/
public function getType(): string
{
return $this->type;
}
/**
* @param string $type
*/
public function setType(string $type): void
{
$this->type = $type;
}
/**
* @return string
*/
public function getPayType(): string
{
return $this->payType;
}
/**
* @param string $payType
*/
public function setPayType(string $payType): void
{
$this->payType = $payType;
}
/**
* @return string
*/
public function getBuyType(): string
{
return $this->buyType;
}
/**
* @param string $buyType
*/
public function setBuyType(string $buyType): void
{
$this->buyType = $buyType;
}
/**
* @return int
*/
public function getAmount(): int
{
return $this->amount;
}
/**
* @param int $amount
*/
public function setAmount(int $amount): void
{
$this->amount = $amount;
}
/**
* @return int
*/
public function getUserId(): int
{
return $this->userId;
}
/**
* @param int $userId
*/
public function setUserId(int $userId): void
{
$this->userId = $userId;
}
/**
* @return int
*/
public function getUserName(): int
{
return $this->userName;
}
/**
* @param int $userName
*/
public function setUserName(int $userName): void
{
$this->userName = $userName;
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: banice
* Date: 2018/11/1
* Time: 下午3:00
*/
namespace Src\order;
use App\model\PayGroupModel;
use App\model\PayModel;
use App\model\UserModel;
use Illuminate\Support\Facades\Log;
use Lib\wx\pay\Receiver;
class TopUpOrder extends PayOrder
{
private $giftAmount = 0;
public function addRecord(Receiver $receiver)
{
$payAmount = $receiver->getCashFee();
$attach = json_decode($receiver->getAttach(), true);
$this->userId = $userId = $attach['userId'];
$userName = $attach['name'];
$date = date('Y-m-d H:i:s');
$payGroup = PayGroupModel::where([
['status', 1],
['begin_date', '<', $date],
['end_date', '>', $date],
['type', 1],
['money', $receiver->getCashFee()],
])->orWhere([
['status', 1],
['begin_date', null],
['end_date', null],
['type', 1],
['money', $receiver->getCashFee()]
])->first([back_money]);
if (blank($payGroup)) {
Log::error('can not find back money - ' . $receiver->getOutTradeNo());
return;
}
$this->giftAmount = $payGroup->back_money;
$this->amount = $receiver->getCashFee();
$payModel = new PayModel();
$payModel->code = $receiver->getOutTradeNo();
$payModel->guest_id = $userId;
$payModel->guest_name = $userName;
$payModel->type = self::TYPE['top_up'];
$payModel->money = $receiver->getTotalFee();
$payModel->activity_money = $this->giftAmount;
$payModel->pay_type = self::PAY_TYPE['wx'];
$payModel->buy_type = self::BUY_TYPE['wallet'];
$payModel->status = 1;
$payModel->save();
}
/**
* @return int
*/
public function getGiftAmount(): int
{
return $this->giftAmount;
}
/**
* @param int $giftAmount
*/
public function setGiftAmount(int $giftAmount): void
{
$this->giftAmount = $giftAmount;
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment