iT邦幫忙

2

Laravel 串接綠界API 遇到的問題(急!!但沒有20點QQ

最近小弟在學習用Laravel在架電商
參考了許多平台還是選用綠界
但是在引用時遇到了一個神秘的問題
希望有大大可以幫忙解決
先附上環境:
PHP 7.1.3
Laravel 5.8

資料夾配置
https://ithelp.ithome.com.tw/upload/images/20190724/201085790y73MRT361.png

我在app/Http/Controllers/下建立了一個TestController
也有記得在route/web.php內寫
Route::post('/api/test/buy','TestController@buy');

而在TestController 內
底下有個測試用的buy function
如下圖
https://ithelp.ithome.com.tw/upload/images/20190724/20108579sF7ZBdrA9M.png
但是在我POST他之後他出了以下錯誤QQ
https://ithelp.ithome.com.tw/upload/images/20190724/20108579egTYVQWG9e.png
找了蠻多方法但都沒辦法解決
拜託各位路過的大大幫忙解惑謝謝!

淺水員 iT邦研究生 3 級 ‧ 2019-07-25 15:26:01 檢舉
可以貼 buy 那段程式碼嗎?我想測試看看。
---------
後續補充:可以不用貼了,應該是要手動調整。我本來是想說 classmap 應該能用,但是這個SDK還是得手動調整。
了解... XD 感恩大大 小弟我努力看看
2
giulian
iT邦新手 4 級 ‧ 2019-07-25 02:35:43
最佳解答

試試這個方式
在composer.json中找到autoload這一段

"autoload": {
        "classmap": [
            "database/seeds",
            "database/factories",
            "app/ECPaySDK"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },

然後執行composer dump-autoload

原本的include那段刪掉,要用時前面多一個斜線,應該就可以用了
$obj=new \ECPay_AllInOne();

看更多先前的回應...收起先前的回應...

報告大大,感謝您的回覆,剛剛試過了還是沒有辦法QQ
Ps.我有乖乖下composer dump-autoload ><
https://ithelp.ithome.com.tw/upload/images/20190725/20108579jiQGDfLBnd.png

https://ithelp.ithome.com.tw/upload/images/20190725/20108579x8BLyYQekD.png

附上錯誤圖https://ithelp.ithome.com.tw/upload/images/20190725/2010857968h5CARAwB.png

我有嘗試過把
$obj= new \ECPay_AllInOne();
改成
$obj= new \ECPaySDK\ECPay_AllInOne();
但也無效,跑出的錯誤是

https://ithelp.ithome.com.tw/upload/images/20190725/20108579yRhsV5mMZW.png

而我把報錯的
$obj->Send['ChoosePayment']=ECPay_PaymentMethod::ALL ;
改成
$obj->Send['ChoosePayment']=\ECPaySDK\ECPay_PaymentMethod::ALL ;
跑出的錯誤
https://ithelp.ithome.com.tw/upload/images/20190725/20108579PavyrchgDT.png

以邏輯來說我覺得我後面自己這樣寫基本上就錯了
但還是病急亂投醫QQ

giulian iT邦新手 4 級 ‧ 2019-07-25 18:13:45 檢舉

有幾個地方漏了
ECPay_PaymentMethod這個要先在最前面用use
https://ithelp.ithome.com.tw/upload/images/20190725/201150270on2c5X04o.png

下面是直接用ECpay提供的範例做的測試
ChoosePayment那邊記得要改
https://ithelp.ithome.com.tw/upload/images/20190725/20115027AXerBx7k0U.png

這是我測試的結果
https://ithelp.ithome.com.tw/upload/images/20190725/201150272SlsrSFg98.png

giulian iT邦新手 4 級 ‧ 2019-07-25 18:43:29 檢舉

補充,你的composer dump-autoload 跑完後
到vendor\composer\autoload_classmap
看看ECpay有沒有被寫入到裡面
像這樣https://ithelp.ithome.com.tw/upload/images/20190725/20115027uHpaPkkQ6f.png

報告大大,你說的方法我有試過
在vendor裡面我也確定有寫入 但是還是報錯
想請問大大的laravel 版本是多少?我的是5.8
程式碼如下
https://ithelp.ithome.com.tw/upload/images/20190725/20108579OAAvL7DsOU.png

https://ithelp.ithome.com.tw/upload/images/20190725/20108579uObRzf6Sct.png

結果QQ

https://ithelp.ithome.com.tw/upload/images/20190725/20108579oPYAEvkkK2.png

謝謝大大百忙之中幫忙我這個小廢柴解惑QQ
感激不盡

淺水員 iT邦研究生 3 級 ‧ 2019-07-26 02:26:17 檢舉

下面關於 namespace 的範例可以參考一下

<?php
namespace MyTest;

class Test3
{
    public static function create($className)
    {
        //這類似原本SDK 649~650行的寫法
        //如果有 namespace 這邊就會出錯
        return new $className();
    }
    
    public static function createNS($className)
    {
        //這種需要加上 namespace
        $className='MyTest\\'.$className;
        return new $className();
    }
    
    public static function createTest4()
    {
        //比較一下比較常見的寫法
        //這邊不用加 namespace
        return new Test4();
    }
}

class Test4
{
    public function __construct()
    {
        echo 'Test4';
    }
}

Test3::createNS('Test4'); // Ok
Test3::createTest4(); // Ok
Test3::create('Test4'); // Error
giulian iT邦新手 4 級 ‧ 2019-07-26 03:03:22 檢舉

剛試了一下5.8確實會有這個問題
最前面引用的部分
改成

use ECPay_PaymentMethod as ECPayMethod;
use ECPay_AllInOne as ECPay;

原本$obj= new \ECPayAllInOne();改成

   $obj=new ECPay();

ECPayMethod這邊不動

嗚嗚我可以了大大!!
真的真的非常的感謝您!
透過這個更了解namespace 的概念
萬分感謝 如果有機會來台中可以找我 請你吃飯QQ

0
海綿寶寶
iT邦大神 1 級 ‧ 2019-07-24 22:27:06

找了蠻多方法

要不
找找Class 'App\Http\Controllers\ECPay_AllInOne' not found的原因先

看更多先前的回應...收起先前的回應...

報告大大 我有用過在php sdk 上面下過namespace 並在Controller 用Use App\ECPaySDK\ECPay_AllInOne
然後接下來他錯誤越來越多...

我發現他好像要每個Class 都引入
對於這個我也爬過文 但都找不到有用的方法
後來才選擇使用include
結果還是失敗QQ

fillano iT邦超人 1 級 ‧ 2019-07-25 09:11:16 檢舉

感謝大大我試試看!

0
小魚
iT邦大師 1 級 ‧ 2019-07-25 08:22:42

你是不是沒有use ?
在Laravel應該是用use不是用include.

看更多先前的回應...收起先前的回應...

報告大大,我有用過use 但還是無法QQ...

小魚 iT邦大師 1 級 ‧ 2019-07-25 13:52:50 檢舉

EcPay的檔案是你寫的嗎?
怎麼寫的?

或是可以參考fillano大大給的那篇,
引用檔案的方式,
我是還沒試過這種方式,
Laravel我也是新手.

fillano iT邦超人 1 級 ‧ 2019-07-25 14:07:36 檢舉

https://github.com/ECPay/ECPayAIO_PHP/tree/master/AioSDK

看起來他的SDK不符合psr-4 auto-loader標準啦,這部份要處理一下。首先要把不同的類別拆成跟類別名稱一樣的php檔。

小魚 iT邦大師 1 級 ‧ 2019-07-25 15:12:52 檢舉

把不同的類別拆成跟類別名稱一樣的php檔。

我目前都是這樣做的,
不過聽說有其他方式可以解決,
只是看起來比較麻煩,
因為時程上的關係沒時間研究,
直接照Laravel預設的方式最快.

感謝大大們提供的資訊 我真覺得自己像個蔡逼八,我會再看一下psr-4-autoloader標準的資訊的,現代php框架真的博大精深QQ

0

我記得ecpay給的sdk都要做一下調整才能直接給框架使用。
要不然很容易會有路徑的運行問題存在。

感謝大大!

0
f107110126
iT邦新手 5 級 ‧ 2021-03-05 09:38:30

突然發現,似乎是兩個月前 ecpay 釋出 composer 版本了
https://github.com/ECPay/SDK_PHP.git

我要發表回答

立即登入回答