123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- <?php
- namespace App\Http\Controllers\Gateway;
- use App\Models\Payment;
- use App\Models\PaymentCallback;
- use App\Notifications\PaymentReceived;
- use Illuminate\Http\JsonResponse;
- use Illuminate\Http\Request;
- use Str;
- abstract class AbstractPayment
- {
- abstract public function purchase(Request $request): JsonResponse;
- abstract public function notify(Request $request): void;
- protected function creatNewPayment($uid, $oid, $amount): Payment
- {
- $payment = new Payment();
- $payment->trade_no = Str::random(8);
- $payment->user_id = $uid;
- $payment->order_id = $oid;
- $payment->amount = $amount;
- $payment->save();
- return $payment;
- }
- /**
- * @param string $trade_no 本地订单号
- * @param string $out_trade_no 外部订单号
- * @param string $amount 交易金额
- *
- * @return int
- */
- protected function addPamentCallback(string $trade_no, string $out_trade_no,$amount = ""): int
- {
- $payment = Payment::whereTradeNo($trade_no)->with('order')->first();
- if ($payment) {
- $log = new PaymentCallback();
- $log->trade_no = $payment->order->sn;
- $log->out_trade_no = $out_trade_no;
- $log->amount = $amount == "" ? (string)$payment->order->amount : $amount;
- return $log->save();
- }
- return -1;
- }
- // MD5验签
- protected function verify($data, $key, $signature, $filter = true): bool
- {
- return hash_equals($this->aliStyleSign($data, $key, $filter), $signature);
- }
- /**
- * Alipay式数据MD5签名.
- *
- * @param array $data 需要加密的数组
- * @param string $key 尾部的密钥
- * @param bool $filter 是否清理空值
- *
- * @return string md5加密后的数据
- */
- protected function aliStyleSign(array $data, string $key, $filter = true): string
- {
- // 剃离sign,sign_type,空值
- unset($data['sign'], $data['sign_type']);
- if ($filter) {
- $data = array_filter($data);
- }
- // 排序
- ksort($data, SORT_STRING);
- reset($data);
- return md5(urldecode(http_build_query($data)).$key);
- }
- protected function paymentReceived(string $tradeNo)
- {
- $payment = Payment::whereTradeNo($tradeNo)->with('order')->first();
- if ($payment) {
- $ret = $payment->order->complete();
- if ($ret) {
- $payment->user->notify(new PaymentReceived($payment->order->sn, $payment->amount));
- }
- return $ret;
- }
- return false;
- }
- }
|