Przeglądaj źródła

加入PayPal支付测试配置设置&样例

zhangjiangbin 8 lat temu
rodzic
commit
098a608765

+ 184 - 26
app/Http/Controllers/PaymentController.php

@@ -2,50 +2,208 @@
 namespace App\Http\Controllers;
 
 use Illuminate\Http\Request;
-use PayPal\Auth\OAuthTokenCredential;
-use PayPal\Rest\ApiContext;
 use Response;
 use Redirect;
 use Captcha;
 use Cache;
-use PayPal\Api;
-use Paypal\Rest;
-use Paypal\Auth;
+
+use PayPal\Api\Amount;
+use PayPal\Api\Details;
+use PayPal\Api\Item;
+use PayPal\Api\ItemList;
+use PayPal\Api\Payer;
+use PayPal\Api\Payment;
+use PayPal\Api\PaymentExecution;
+use PayPal\Api\RedirectUrls;
+use PayPal\Api\Transaction;
+use PayPal\Api\ShippingAddress;
+use PayPal\Rest\ApiContext;
+use PayPal\Auth\OAuthTokenCredential;
 
 class PaymentController extends Controller
 {
+    protected static $config;
+    private $apiContext;
+
     function __construct()
     {
-        //
+        self::$config = $this->systemConfig();
+
+        $this->apiContext = new ApiContext(
+            new OAuthTokenCredential(self::$config['paypal_client_id'], self::$config['paypal_client_secret'])
+        );
+        $this->apiContext->setConfig([
+            'mode' => 'sandbox',
+            'log.LogEnabled' => true,
+            'log.FileName' => storage_path('logs/paypal.log'),
+            'log.LogLevel' => 'DEBUG', // PLEASE USE `INFO` LEVEL FOR LOGGING IN LIVE ENVIRONMENTS
+            'cache.enabled' => true,
+            // 'http.CURLOPT_CONNECTTIMEOUT' => 30
+            // 'http.headers.PayPal-Partner-Attribution-Id' => '123123123'
+            //'log.AdapterFactory' => '\PayPal\Log\DefaultLogFactory' // Factory class implementing \PayPal\Log\PayPalLogFactory
+        ]);
     }
 
+    // 创建支付
     public function create(Request $request)
     {
-        $apiContext = new ApiContext(
-            new OAuthTokenCredential(
-                'AYSq3RDGsmBLJE-otTkBtM-jBRd1TCQwFf9RGfwddNXWz0uFU9ztymylOhRS',     // ClientID
-                'EGnHDxD_qRPdaLdZz8iCr8N7_MzF-YHPTkjs6NKYQvQSBngp4PTTVWkPZRbL'      // ClientSecret
-            )
-        );
+        $payer = new Payer();
+        $payer->setPaymentMethod("paypal");
+
+        // 商品1
+        $item1 = new Item();
+        $item1->setName('Ground Coffee 40 oz')
+            ->setCurrency('USD')
+            ->setQuantity(1)
+            ->setSku("123123")
+            ->setPrice(20);
+
+        // 商品2
+        $item2 = new Item();
+        $item2->setName('Granola bars')
+            ->setCurrency('USD')
+            ->setQuantity(5)
+            ->setSku("456456")
+            ->setPrice(10);
 
-        $payer = new Api\Payer();
-        $payer->setPaymentMethod('paypal');
+        // 写入商品列表
+        $itemList = new ItemList();
+        $itemList->setItems([$item1, $item2]);
 
-        $amount = new \PayPal\Api\Amount();
-        $amount->setTotal('1.00');
-        $amount->setCurrency('USD');
 
-        $transaction = new \PayPal\Api\Transaction();
-        $transaction->setAmount($amount);
+        // 设定收货地址信息,防止用户自付款时可改
+        $address = new ShippingAddress();
+        $address->setRecipientName('什么名字')
+            ->setLine1('什么街什么路什么小区')
+            ->setLine2('什么单元什么号')
+            ->setCity('城市名')
+            ->setState('浙江省')
+            ->setPhone('12345678911')
+            ->setPostalCode('12345')
+            ->setCountryCode('CN');
 
-        $redirectUrls = new \PayPal\Api\RedirectUrls();
-        $redirectUrls->setReturnUrl("https://example.com/your_redirect_url.html")
-            ->setCancelUrl("https://example.com/your_cancel_url.html");
+        // 商品列表写入设定好的地址信息
+        $itemList->setShippingAddress($address);
 
-        $payment = new \PayPal\Api\Payment();
-        $payment->setIntent('sale')
+        // 订单详情,带入运费和税,小计
+        $details = new Details();
+        $details->setShipping(5)
+            ->setTax(10)
+            ->setSubtotal(70);
+
+        // 设定单据金额
+        $amount = new Amount();
+        $amount->setCurrency("USD")
+            ->setTotal(85)
+            ->setDetails($details);
+
+        // 设定交易描述
+        $transaction = new Transaction();
+        $transaction->setAmount($amount)
+            ->setItemList($itemList)
+            ->setDescription("测试支付")
+            ->setInvoiceNumber(uniqid());
+
+        // 跳转页
+        $redirectUrls = new RedirectUrls();
+        $redirectUrls->setReturnUrl(url("payment/execute"))
+            ->setCancelUrl(url("payment/cancel"));
+
+        // 整个订单
+        $payment = new Payment();
+        $payment->setIntent("sale")
             ->setPayer($payer)
-            ->setTransactions(array($transaction))
-            ->setRedirectUrls($redirectUrls);
+            ->setRedirectUrls($redirectUrls)
+            ->setTransactions([$transaction]);
+
+
+// For Sample Purposes Only.
+        $payment_request = clone $payment;
+
+        // 创建支付
+        try {
+            $payment->create($this->apiContext);
+        } catch (\Exception $ex) {
+            var_dump($ex);
+            exit(1);
+        }
+
+        // 得到支付授权跳转页(给用户点确认付款用)
+        $approvalUrl = $payment->getApprovalLink();
+
+        \Log::info($approvalUrl);
+        \Log::info('22222'.var_export($payment_request, true));
+        \Log::info('33333'.var_export($payment, true));
+
+        return $payment;
+    }
+
+    // 执行支付
+    public function execute(Request $request)
+    {
+        \Log::info('execute_params:'.var_export($request->all(), true));
+
+        $paymentId = $request->get('paymentId');
+        $token = $request->get('token');
+        $PayerID = $request->get('PayerID');
+
+        // ### Approval Status
+// Determine if the user approved the payment or not
+\Log::info($paymentId);
+\Log::info($token);
+\Log::info($PayerID);
+        if (empty($paymentId) || empty($token) || empty($PayerID)) {
+            exit("return_url支付回调地址错误");
+        } else {
+            // 支付
+            $payment = Payment::get($paymentId, $this->apiContext);
+
+            // 执行支付
+            $execution = new PaymentExecution();
+            $execution->setPayerId($PayerID);
+
+            $transaction = new Transaction();
+
+            $details = new Details();
+            $details->setShipping(5)->setTax(10)->setSubtotal(70);
+
+            $amount = new Amount();
+            $amount->setCurrency('USD');
+            $amount->setTotal(85);
+            $amount->setDetails($details);
+            $transaction->setAmount($amount);
+
+            $execution->addTransaction($transaction);
+
+            try {
+                $result = $payment->execute($execution, $this->apiContext);
+                \Log::info(var_export($result, true));
+
+                // 支付成功,写入支付单据信息
+
+            } catch (\Exception $ex) {
+                var_dump($ex);
+                echo "支付失败";
+                exit(1);
+            }
+
+            \Log::info(var_export($payment, true));
+
+            return $payment;
+        }
+    }
+
+    // 取消支付
+    public function cancel(Request $request)
+    {
+        var_dump($request->all());
+
+        echo '取消支付';
+    }
+
+    // 查询支付状态
+    public function query()
+    {
+        
     }
 }

+ 2 - 2
resources/views/admin/addArticle.blade.php

@@ -66,8 +66,8 @@
                             </div>
                             <div class="form-actions">
                                 <div class="row">
-                                    <div class="col-md-offset-5 col-md-5">
-                                        <button type="submit" class="btn green"> <i class="fa fa-check"></i> 提 交</button>
+                                    <div class="col-md-offset-6">
+                                        <button type="submit" class="btn green">提 交</button>
                                     </div>
                                 </div>
                             </div>

+ 2 - 2
resources/views/admin/addGroup.blade.php

@@ -51,8 +51,8 @@
                             </div>
                             <div class="form-actions">
                                 <div class="row">
-                                    <div class="col-md-offset-3 col-md-9">
-                                        <button type="submit" class="btn green"> <i class="fa fa-check"></i> 提 交</button>
+                                    <div class="col-md-offset-3">
+                                        <button type="submit" class="btn green"> 提 交</button>
                                     </div>
                                 </div>
                             </div>

+ 2 - 7
resources/views/admin/addNode.blade.php

@@ -253,14 +253,9 @@
                                 </div>
                                 <div class="form-actions">
                                     <div class="row">
-                                        <div class="col-md-6">
-                                            <div class="row">
-                                                <div class="col-md-offset-11 col-md-4">
-                                                    <button type="submit" class="btn green">提 交</button>
-                                                </div>
-                                            </div>
+                                        <div class="col-md-offset-6">
+                                            <button type="submit" class="btn green">提 交</button>
                                         </div>
-                                        <div class="col-md-6"> </div>
                                     </div>
                                 </div>
                             </form>

+ 2 - 7
resources/views/admin/addUser.blade.php

@@ -262,14 +262,9 @@
                         </div>
                         <div class="form-actions">
                             <div class="row">
-                                <div class="col-md-6">
-                                    <div class="row">
-                                        <div class="col-md-offset-11 col-md-4">
-                                            <button type="submit" class="btn green">提 交</button>
-                                        </div>
-                                    </div>
+                                <div class="col-md-offset-6">
+                                    <button type="submit" class="btn green">提 交</button>
                                 </div>
-                                <div class="col-md-6"> </div>
                             </div>
                         </div>
                     </form>

+ 2 - 2
resources/views/admin/editArticle.blade.php

@@ -66,8 +66,8 @@
                             </div>
                             <div class="form-actions">
                                 <div class="row">
-                                    <div class="col-md-offset-5 col-md-5">
-                                        <button type="submit" class="btn green"> <i class="fa fa-check"></i> 提 交</button>
+                                    <div class="col-md-offset-6">
+                                        <button type="submit" class="btn green">提 交</button>
                                     </div>
                                 </div>
                             </div>

+ 2 - 2
resources/views/admin/editGroup.blade.php

@@ -51,8 +51,8 @@
                             </div>
                             <div class="form-actions">
                                 <div class="row">
-                                    <div class="col-md-offset-3 col-md-9">
-                                        <button type="submit" class="btn green"> <i class="fa fa-check"></i> 提 交</button>
+                                    <div class="col-md-offset-3">
+                                        <button type="submit" class="btn green"> 提 交</button>
                                     </div>
                                 </div>
                             </div>

+ 2 - 7
resources/views/admin/editNode.blade.php

@@ -251,14 +251,9 @@
                                 </div>
                                 <div class="form-actions">
                                     <div class="row">
-                                        <div class="col-md-6">
-                                            <div class="row">
-                                                <div class="col-md-offset-11 col-md-4">
-                                                    <button type="submit" class="btn green">提 交</button>
-                                                </div>
-                                            </div>
+                                        <div class="col-md-offset-6">
+                                            <button type="submit" class="btn green">提 交</button>
                                         </div>
-                                        <div class="col-md-6"> </div>
                                     </div>
                                 </div>
                             </form>

+ 2 - 4
resources/views/admin/editUser.blade.php

@@ -302,10 +302,8 @@
                         </div>
                         <div class="form-actions">
                             <div class="row">
-                                <div class="row">
-                                    <div class="col-md-offset-6 col-md-4">
-                                        <button type="submit" class="btn green">提 交</button>
-                                    </div>
+                                <div class="col-md-offset-6">
+                                    <button type="submit" class="btn green">提 交</button>
                                 </div>
                             </div>
                         </div>

+ 85 - 5
resources/views/admin/system.blade.php

@@ -40,6 +40,9 @@
                                         <li>
                                             <a href="#tab_7" data-toggle="tab"> 充值二维码设置 </a>
                                         </li>
+                                        <li>
+                                            <a href="#tab_8" data-toggle="tab"> PayPal接口设置 </a>
+                                        </li>
                                     </ul>
                                 </div>
                                 <div class="portlet-body">
@@ -533,9 +536,6 @@
                                                                     </div>
                                                                 </div>
                                                             </div>
-                                                            <div class="col-md-6"></div>
-                                                        </div>
-                                                        <div class="form-group">
                                                             <div class="col-md-6">
                                                                 <label class="control-label col-md-3">支付宝</label>
                                                                 <div class="col-md-9">
@@ -559,13 +559,12 @@
                                                                     </div>
                                                                 </div>
                                                             </div>
-                                                            <div class="col-md-6"></div>
                                                         </div>
                                                     </div>
                                                 </div>
                                                 <div class="form-actions">
                                                     <div class="row">
-                                                        <div class="col-md-offset-2 col-md-9">
+                                                        <div class="col-md-offset-6">
                                                             <input type="hidden" name="_token" value="{{csrf_token()}}" />
                                                             <button type="submit" class="btn green">提 交</button>
                                                         </div>
@@ -573,6 +572,46 @@
                                                 </div>
                                             </form>
                                         </div>
+                                        <div class="tab-pane" id="tab_8">
+                                            <form action="#" method="post" class="form-horizontal">
+                                                <div class="portlet-body">
+                                                    <div class="form-group">
+                                                        <div class="col-md-6">
+                                                            <label for="paypal_status" class="col-md-3 control-label">本功能</label>
+                                                            <div class="col-md-9">
+                                                                <input type="checkbox" class="make-switch" @if($paypal_status) checked @endif id="paypal_status" data-on-color="success" data-off-color="danger" data-on-text="启用" data-off-text="关闭">
+                                                                <span class="help-block"> 启用前请先去PayPal申请ClientID和ClientSecret </span>
+                                                            </div>
+                                                        </div>
+                                                        <div class="col-md-6"></div>
+                                                    </div>
+                                                    <div class="form-group">
+                                                        <div class="col-md-6">
+                                                            <label for="paypal_client_id" class="col-md-3 control-label">ClientID</label>
+                                                            <div class="col-md-9">
+                                                                <div class="input-group">
+                                                                    <input class="form-control" type="text" name="paypal_client_id" value="{{$paypal_client_id}}" id="paypal_client_id" />
+                                                                    <span class="input-group-btn">
+                                                                        <button class="btn btn-success" type="button" onclick="setPaypalClientID()">修改</button>
+                                                                    </span>
+                                                                </div>
+                                                            </div>
+                                                        </div>
+                                                        <div class="col-md-6">
+                                                            <label for="paypal_client_secret" class="col-md-3 control-label">ClientSecret</label>
+                                                            <div class="col-md-9">
+                                                                <div class="input-group">
+                                                                    <input class="form-control" type="text" name="paypal_client_secret" value="{{$paypal_client_secret}}" id="paypal_client_secret" />
+                                                                    <span class="input-group-btn">
+                                                                    <button class="btn btn-success" type="button" onclick="setPaypalClientSecret()">修改</button>
+                                                                </span>
+                                                                </div>
+                                                            </div>
+                                                        </div>
+                                                    </div>
+                                                </div>
+                                            </form>
+                                        </div>
                                     </div>
                                 </div>
                             </div>
@@ -847,6 +886,21 @@
             }
         });
 
+        // 启用、禁用PayPal支付接口
+        $('#paypal_status').on({
+            'switchChange.bootstrapSwitch': function(event, state) {
+                var paypal_status = state ? 1 : 0;
+
+                $.post("{{url('admin/setConfig')}}", {_token:'{{csrf_token()}}', name:'paypal_status', value:paypal_status}, function (ret) {
+                    layer.msg(ret.message, {time:1000}, function() {
+                        if (ret.status == 'fail') {
+                            window.location.reload();
+                        }
+                    });
+                });
+            }
+        });
+
         // 流量异常阈值
         function setTrafficBanValue() {
             var traffic_ban_value = $("#traffic_ban_value").val();
@@ -912,6 +966,32 @@
             });
         }
 
+        // 设置PayPal的ClientID
+        function setPaypalClientID() {
+            var paypal_client_id = $("#paypal_client_id").val();
+
+            $.post("{{url('admin/setConfig')}}", {_token:'{{csrf_token()}}', name:'paypal_client_id', value:paypal_client_id}, function (ret) {
+                layer.msg(ret.message, {time:1000}, function() {
+                    if (ret.status == 'fail') {
+                        window.location.reload();
+                    }
+                });
+            });
+        }
+
+        // 设置PayPal的ClientSecret
+        function setPaypalClientSecret() {
+            var paypal_client_secret = $("#paypal_client_secret").val();
+
+            $.post("{{url('admin/setConfig')}}", {_token:'{{csrf_token()}}', name:'paypal_client_secret', value:paypal_client_secret}, function (ret) {
+                layer.msg(ret.message, {time:1000}, function() {
+                    if (ret.status == 'fail') {
+                        window.location.reload();
+                    }
+                });
+            });
+        }
+
         // 设置最小积分
         $("#min_rand_score").change(function () {
             var min_rand_score = $(this).val();

+ 1 - 0
resources/views/user/referral.blade.php

@@ -83,6 +83,7 @@
                                                 @else
                                                     <span class="label label-sm label-info">未提现</span>
                                                 @endif
+                                            </td>
                                             <td> {{$referralLog->created_at}} </td>
                                         </tr>
                                     @endforeach

+ 3 - 1
routes/web.php

@@ -106,5 +106,7 @@ Route::group(['middleware' => ['user']], function() {
 });
 
 //Route::group(['middleware' => ['user']], function() {
-    Route::any('payment/create', 'PaymentController@create');
+    Route::any('payment/create', 'PaymentController@create'); // 创建支付
+    Route::any('payment/execute', 'PaymentController@execute'); // 用户确认执行支付
+    Route::any('payment/cancel', 'PaymentController@cancel'); // 用户取消支付
 //});

+ 3 - 0
sql/db.sql

@@ -295,6 +295,9 @@ INSERT INTO `config` VALUES ('39', 'is_server_chan', 0);
 INSERT INTO `config` VALUES ('40', 'server_chan_key', '');
 INSERT INTO `config` VALUES ('41', 'is_subscribe_ban', 1);
 INSERT INTO `config` VALUES ('42', 'subscribe_ban_times', 20);
+INSERT INTO `config` VALUES ('43', 'paypal_status', 0);
+INSERT INTO `config` VALUES ('44', 'paypal_client_id', '');
+INSERT INTO `config` VALUES ('45', 'paypal_client_secret', '');
 
 
 -- ----------------------------

+ 3 - 0
sql/update/20171220.sql

@@ -1,5 +1,8 @@
 INSERT INTO `config` VALUES ('41', 'is_subscribe_ban', 1);
 INSERT INTO `config` VALUES ('42', 'subscribe_ban_times', 20);
+INSERT INTO `config` VALUES ('43', 'paypal_status', 0);
+INSERT INTO `config` VALUES ('44', 'paypal_client_id', '');
+INSERT INTO `config` VALUES ('45', 'paypal_client_secret', '');
 
 
 ALTER TABLE `user_subscribe` ADD COLUMN `ban_time` int(11) NOT NULL DEFAULT '0' COMMENT '封禁时间' AFTER `status`;