浏览代码

添加 THeadPay 支付

兔姬桑 4 年之前
父节点
当前提交
ffc1e449a4

+ 3 - 0
app/Http/Controllers/Admin/SystemController.php

@@ -48,6 +48,9 @@ class SystemController extends Controller
         if (sysConfig('paybeaver_app_id') && sysConfig('paybeaver_app_secret')) {
             $payment[] = 'paybeaver';
         }
+        if (sysConfig('theadpay_mchid') && sysConfig('theadpay_key')) {
+            $payment[] = 'theadpay';
+        }
 
         return $payment ?? [];
     }

+ 72 - 0
app/Http/Controllers/Gateway/THeadPay.php

@@ -0,0 +1,72 @@
+<?php
+
+namespace App\Http\Controllers\Gateway;
+
+use Auth;
+use Http;
+use Illuminate\Http\JsonResponse;
+use Log;
+use Response;
+
+class THeadPay extends AbstractPayment
+{
+    public function purchase($request): JsonResponse
+    {
+        $payment = $this->creatNewPayment(Auth::id(), $request->input('id'), $request->input('amount'));
+
+        $data = [
+            'mchid'        => sysConfig('theadpay_mchid'),
+            'out_trade_no' => $payment->trade_no,
+            'total_fee'    => (string) ($payment->amount * 100),
+            'notify_url'   => route('payment.notify', ['method' => 'theadpay']),
+        ];
+        $data['sign'] = $this->sign($data);
+
+        $response = Http::post(sysConfig('theadpay_url').'/orders', $data);
+        if ($response->ok()) {
+            $result = $response->json();
+            if ($result['status'] === 'success') {
+                $payment->update(['qr_code' => 1, 'url' => $result['code_url']]);
+
+                return Response::json(['status' => 'success', 'data' => $payment->trade_no, 'message' => '创建订单成功!']);
+            } else {
+                Log::error('【平头哥支付】 返回错误信息:'.$result['message']);
+            }
+        }
+
+        Log::error('【平头哥支付】 支付渠道建立订单出现问题');
+
+        return Response::json(['status' => 'fail', 'message' => '创建在线订单失败,请工单通知管理员!']);
+    }
+
+    private function sign($params)
+    {
+        unset($params['sign']);
+        ksort($params, SORT_STRING);
+        reset($params);
+        $params['key'] = sysConfig('theadpay_key');
+
+        return strtoupper(md5(http_build_query($params)));
+    }
+
+    public function notify($request): void
+    {
+        if ($this->verify_notify($request)) {
+            $tradeNo = $request->input('out_trade_no');
+            if ($tradeNo) {
+                if ($this->paymentReceived($tradeNo)) {
+                    exit(200);
+                }
+            } else {
+                Log::error('【平头哥支付】交易失败:订单信息-'.var_export($request->all(), true));
+            }
+        }
+
+        exit('fail');
+    }
+
+    private function verify_notify($params)
+    {
+        return $params['sign'] === $this->sign($params);
+    }
+}

+ 3 - 0
app/Http/Controllers/PaymentController.php

@@ -12,6 +12,7 @@ use App\Http\Controllers\Gateway\PayBeaver;
 use App\Http\Controllers\Gateway\PayJs;
 use App\Http\Controllers\Gateway\PayPal;
 use App\Http\Controllers\Gateway\Stripe;
+use App\Http\Controllers\Gateway\THeadPay;
 use App\Models\Coupon;
 use App\Models\Goods;
 use App\Models\Order;
@@ -56,6 +57,8 @@ class PaymentController extends Controller
                 return new Stripe();
             case 'paybeaver':
                 return new PayBeaver();
+            case 'theadpay':
+                return new THeadPay();
             default:
                 Log::warning('未知支付:'.self::$method);
 

+ 1 - 0
config/common.php

@@ -12,6 +12,7 @@ return [
             'payjs'     => 'PayJs',
             'paypal'    => 'PayPal',
             'stripe'    => 'Stripe',
+            'theadpay'  => '平头哥支付',
             'youzan'    => '有赞云',
         ],
         'icon'   => [

+ 30 - 0
database/migrations/2021_05_16_215434_add_theadpay_payment.php

@@ -0,0 +1,30 @@
+<?php
+
+use App\Models\Config;
+use Illuminate\Database\Migrations\Migration;
+
+class AddTheadpayPayment extends Migration
+{
+    protected $configs = [
+        'theadpay_url',
+        'theadpay_mchid',
+        'theadpay_key',
+    ];
+
+    public function up()
+    {
+        foreach ($this->configs as $config) {
+            Config::insert(['name' => $config]);
+        }
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Config::destroy($this->configs);
+    }
+}

+ 50 - 3
resources/views/admin/config/system.blade.php

@@ -1277,6 +1277,7 @@
                                                 <option value="codepay">码支付</option>
                                                 <option value="epay">易支付</option>
                                                 <option value="paybeaver">海狸支付</option>
+                                                <option value="theadpay">平头哥支付</option>
                                             </select>
                                         </div>
                                         <div class="form-group col-lg-6">
@@ -1659,15 +1660,57 @@
                                                 <div class="input-group">
                                                     <input type="text" class="form-control" id="paybeaver_app_secret" value="{{$paybeaver_app_secret}}"/>
                                                     <span class="input-group-append">
-                                                            <button class="btn btn-primary" type="button"
-                                                                    onclick="update('paybeaver_app_secret')">{{trans('common.update')}}</button>
-                                                        </span>
+                                                        <button class="btn btn-primary" type="button" onclick="update('paybeaver_app_secret')">{{trans('common.update')}}</button>
+                                                    </span>
                                                 </div>
                                                 <span class="text-help"><a href="https://merchant.paybeaver.com/" target="_blank">商户中心</a> -&gt; 开发者 -&gt; App Secret</span>
                                             </div>
                                         </div>
                                     </div>
                                 </div>
+                                <div class="tab-pane" id="THeadPay" role="tabpanel">
+                                    <div class="row">
+                                        <div class="form-group col-lg-6 d-flex">
+                                            <label class="col-md-3 col-form-label">平头哥支付 THeadPay</label>
+                                            <div class="col-md-7">
+                                                请到<a href="https://theadpay.com/" target="_blank">平头哥支付 THeadPay</a>申请账号
+                                            </div>
+                                        </div>
+                                        <div class="form-group col-lg-6 d-flex">
+                                            <label class="col-md-3 col-form-label" for="theadpay_url">接口地址</label>
+                                            <div class="col-md-7">
+                                                <div class="input-group">
+                                                    <input type="text" class="form-control" id="theadpay_url" value="{{$theadpay_url}}"/>
+                                                    <span class="input-group-append">
+                                                        <button class="btn btn-primary" type="button" onclick="update('theadpay_url')">{{trans('common.update')}}</button>
+                                                    </span>
+                                                </div>
+                                            </div>
+                                        </div>
+                                        <div class="form-group col-lg-6 d-flex">
+                                            <label class="col-md-3 col-form-label" for="theadpay_mchid">商家ID</label>
+                                            <div class="col-md-7">
+                                                <div class="input-group">
+                                                    <input type="text" class="form-control" id="theadpay_mchid" value="{{$theadpay_mchid}}"/>
+                                                    <span class="input-group-append">
+                                                        <button class="btn btn-primary" type="button" onclick="update('theadpay_mchid')">{{trans('common.update')}}</button>
+                                                    </span>
+                                                </div>
+                                            </div>
+                                        </div>
+                                        <div class="form-group col-lg-6 d-flex">
+                                            <label class="col-md-3 col-form-label" for="theadpay_key">商家密钥</label>
+                                            <div class="col-md-7">
+                                                <div class="input-group">
+                                                    <input type="text" class="form-control" id="theadpay_key" value="{{$theadpay_key}}"/>
+                                                    <span class="input-group-append">
+                                                        <button class="btn btn-primary" type="button" onclick="update('theadpay_key')">{{trans('common.update')}}</button>
+                                                    </span>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
                             </div>
                             <ul class="nav nav-tabs nav-tabs-bottom nav-tabs-line dropup" role="tablist">
                                 <li class="nav-item">
@@ -1697,6 +1740,9 @@
                                 <li class="nav-item">
                                     <a class="nav-link" data-toggle="tab" href="#PayBeaver" aria-controls="PayBeaver" role="tab">PayBeaver</a>
                                 </li>
+                                <li class="nav-item">
+                                    <a class="nav-link" data-toggle="tab" href="#THeadPay" aria-controls="THeadPay" role="tab">平头哥支付</a>
+                                </li>
                                 <li class="nav-item dropdown" style="display: none;">
                                     <a class="dropdown-toggle nav-link" data-toggle="dropdown" href="#" aria-expanded="false" aria-haspopup="true">菜单</a>
                                     <div class="dropdown-menu" role="menu">
@@ -1709,6 +1755,7 @@
                                         <a class="dropdown-item" data-toggle="tab" href="#PayPal" aria-controls="PayPal" role="tab">PayPal</a>
                                         <a class="dropdown-item" data-toggle="tab" href="#Stripe" aria-controls="Stripe" role="tab">Stripe</a>
                                         <a class="dropdown-item" data-toggle="tab" href="#PayBeaver" aria-controls="PayBeaver" role="tab">PayBeaver</a>
+                                        <a class="dropdown-item" data-toggle="tab" href="#THeadPay" aria-controls="THeadPay" role="tab">平头哥支付</a>
                                     </div>
                                 </li>
                             </ul>

+ 1 - 1
resources/views/user/services.blade.php

@@ -250,10 +250,10 @@
                         $('#charge_msg').show().html('{{trans('user.payment.creating')}}');
                     },
                     success: function(ret) {
+                        $('#charge_msg').show().html(ret.message);
                         if (ret.status === 'fail') {
                             return false;
                         } else {
-                            $('#charge_msg').show().html(ret.message);
                             if (ret.data) {
                                 window.location.href = '{{route('orderDetail' , '')}}/' + ret.data;
                             } else if (ret.url) {