|
7 | 7 | use Illuminate\Http\Request; |
8 | 8 | use App\Http\Controllers\Controller; |
9 | 9 | use App\Http\Requests\User\Checkout\Store; |
| 10 | +use App\Mail\Checkout\AfterCheckout; |
10 | 11 | use Auth; |
11 | 12 | use Mail; |
12 | | -use App\Mail\Checkout\AfterCheckout; |
| 13 | +use Str; |
| 14 | +use Midtrans; |
13 | 15 |
|
14 | 16 | class CheckoutController extends Controller |
15 | 17 | { |
| 18 | + public function __construct() |
| 19 | + { |
| 20 | + Midtrans\Config::$serverKey = env('MIDTRANS_SERVERKEY'); |
| 21 | + Midtrans\Config::$isProduction = env('MIDTRANS_IS_PRODUCTION'); |
| 22 | + Midtrans\Config::$isSanitized = env('MIDTRANS_IS_SANITIZED'); |
| 23 | + Midtrans\Config::$is3ds = env('MIDTRANS_IS_3DS'); |
| 24 | + } |
| 25 | + |
16 | 26 | /** |
17 | 27 | * Display a listing of the resource. |
18 | 28 | * |
@@ -59,10 +69,12 @@ public function store(Store $request, Camp $camp) |
59 | 69 | $user->email = $data['email']; |
60 | 70 | $user->name = $data['name']; |
61 | 71 | $user->occupation = $data['occupation']; |
| 72 | + $user->phone = $data['phone']; |
62 | 73 | $user->save(); |
63 | 74 |
|
64 | 75 | // create checkout |
65 | 76 | $checkout = Checkout::create($data); |
| 77 | + $this->getSnapRedirect($checkout); |
66 | 78 |
|
67 | 79 | // Setting Email |
68 | 80 | Mail::to(Auth::user()->email)->send(new AfterCheckout($checkout)); |
@@ -126,4 +138,113 @@ public function success(Checkout $checkout) |
126 | 138 | return view('checkout.success'); |
127 | 139 | } |
128 | 140 |
|
| 141 | + /** |
| 142 | + * Midtrans handler |
| 143 | + */ |
| 144 | + public function getSnapRedirect(Checkout $checkout) |
| 145 | + { |
| 146 | + $orderId = $checkout->id.'-'.Str::random(5); |
| 147 | + $price = $checkout->Camp->price * 1000; |
| 148 | + $checkout->midtrans_booking_code = $orderId; |
| 149 | + |
| 150 | + $transaction_details = [ |
| 151 | + 'order_id' => $orderId, |
| 152 | + 'gross_amount' => $price |
| 153 | + ]; |
| 154 | + |
| 155 | + $item_details[] = [ |
| 156 | + 'id' => $orderId, |
| 157 | + 'price' => $price, |
| 158 | + 'quantity' => 1, |
| 159 | + 'name' => "Payment for {$checkout->Camp->title}" |
| 160 | + ]; |
| 161 | + |
| 162 | + $userData = [ |
| 163 | + 'first_name' => $checkout->User->name, |
| 164 | + 'last_name' => '', |
| 165 | + 'address' => '', |
| 166 | + 'city' => '', |
| 167 | + 'postal_code' => '', |
| 168 | + 'phone' => $checkout->User->phone, |
| 169 | + 'country_code' => "IDN" |
| 170 | + ]; |
| 171 | + |
| 172 | + $customer_details = [ |
| 173 | + "first_name" => $checkout->User->name, |
| 174 | + "last_name" => "", |
| 175 | + "email" => $checkout->User->email, |
| 176 | + "phone" => $checkout->User->phone, |
| 177 | + "billing_address" => $userData, |
| 178 | + "shipping_address" => $userData |
| 179 | + ]; |
| 180 | + |
| 181 | + $midtrans_params = [ |
| 182 | + 'transaction_details' => $transaction_details, |
| 183 | + 'customer_details' => $customer_details, |
| 184 | + 'item_details' => $item_details |
| 185 | + ]; |
| 186 | + |
| 187 | + try { |
| 188 | + //Get Snap Payment Page URL |
| 189 | + $paymentUrl = \Midtrans\Snap::createTransaction($midtrans_params)->redirect_url; |
| 190 | + $checkout->midtrans_url = $paymentUrl; |
| 191 | + $checkout->save(); |
| 192 | + |
| 193 | + return $paymentUrl; |
| 194 | +; } catch (Exception $e) { |
| 195 | + return false; |
| 196 | + } |
| 197 | + } |
| 198 | + |
| 199 | + public function midtransCallback(Request $request) |
| 200 | + { |
| 201 | + $notif = $request->method() == 'POST' ? new Midtrans\Notification() : Midtrans\Transaction::status($request->order_id); |
| 202 | + |
| 203 | + $transaction_status = $notif->transaction_status; |
| 204 | + $fraud = $notif->fraud_status; |
| 205 | + |
| 206 | + $checkout_id = explode('-', $notif->order_id)[0]; |
| 207 | + $checkout = Checkout::find($checkout_id); |
| 208 | + |
| 209 | + if ($transaction_status == 'capture') { |
| 210 | + if ($fraud == 'challenge') { |
| 211 | + // TODO Set payment status in merchant's database to 'challenge' |
| 212 | + $checkout->payment_status = 'pending'; |
| 213 | + } |
| 214 | + else if ($fraud == 'accept') { |
| 215 | + // TODO Set payment status in merchant's database to 'success' |
| 216 | + $checkout->payment_status = 'paid'; |
| 217 | + } |
| 218 | + } |
| 219 | + else if ($transaction_status == 'cancel') { |
| 220 | + if ($fraud == 'challenge') { |
| 221 | + // TODO Set payment status in merchant's database to 'failure' |
| 222 | + $checkout->payment_status = 'failed'; |
| 223 | + } |
| 224 | + else if ($fraud == 'accept') { |
| 225 | + // TODO Set payment status in merchant's database to 'failure' |
| 226 | + $checkout->payment_status = 'failed'; |
| 227 | + } |
| 228 | + } |
| 229 | + else if ($transaction_status == 'deny') { |
| 230 | + // TODO Set payment status in merchant's database to 'failure' |
| 231 | + $checkout->payment_status = 'failed'; |
| 232 | + } |
| 233 | + else if ($transaction_status == 'settlement') { |
| 234 | + // TODO set payment status in merchant's database to 'Settlement' |
| 235 | + $checkout->payment_status = 'paid'; |
| 236 | + } |
| 237 | + else if ($transaction_status == 'pending') { |
| 238 | + // TODO set payment status in merchant's database to 'Pending' |
| 239 | + $checkout->payment_status = 'pendiing'; |
| 240 | + } |
| 241 | + else if ($transaction_status == 'expire') { |
| 242 | + // TODO set payment status in merchant's database to 'expire' |
| 243 | + $checkout->payment_status = 'failed'; |
| 244 | + } |
| 245 | + |
| 246 | + $checkout->save(); |
| 247 | + return view('checkout/success'); |
| 248 | + } |
| 249 | + |
129 | 250 | } |
0 commit comments