Laravel支付寶開發(fā)

首先找個簡單好用的輪子 比如這個https://github.com/latrell/Alipay
這個輪子有一個地方有毒趁窃,就是只有支付盆佣,沒有退款之類的接口隶糕!我公司比較屌尚揣,付錢了就沒退款這一說,我就用了摆出!不過我主要講訂單生成這塊

首先創(chuàng)建一個中間件 php artisan make:middleware IsMobile

這個中間件主要功能是判斷請求進來的是手機還是電腦端 調(diào)用方式
$payType = $isMobile? 'alipay.wap' : 'alipay.web';

<?php

namespace App\Http\Middleware;

use Closure;

class IsMobile
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $isMobile = $this->isMobile();
        $request['isMobile'] = $isMobile;
        return $next($request);
    }


    //判斷是否是移動端訪問
    public function isMobile()
    {
        // 如果有HTTP_X_WAP_PROFILE則一定是移動設備
        if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])) {
            return TRUE;
        }
        // 如果via信息含有wap則一定是移動設備,部分服務商會屏蔽該信息
        if (isset ($_SERVER['HTTP_VIA'])) {
            return stristr($_SERVER['HTTP_VIA'], "wap") ? TRUE : FALSE;// 找不到為flase,否則為TRUE
        }
        // 判斷手機發(fā)送的客戶端標志,兼容性有待提高
        if (isset ($_SERVER['HTTP_USER_AGENT'])) {
            $clientkeywords = array(
                'mobile',
                'nokia',
                'sony',
                'ericsson',
                'mot',
                'samsung',
                'htc',
                'sgh',
                'lg',
                'sharp',
                'sie-',
                'philips',
                'panasonic',
                'alcatel',
                'lenovo',
                'iphone',
                'ipod',
                'blackberry',
                'meizu',
                'android',
                'netfront',
                'symbian',
                'ucweb',
                'windowsce',
                'palm',
                'operamini',
                'operamobi',
                'openwave',
                'nexusone',
                'cldc',
                'midp',
                'wap'
            );
            // 從HTTP_USER_AGENT中查找手機瀏覽器的關鍵字
            if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
                return TRUE;
            }
        }
        if (isset ($_SERVER['HTTP_ACCEPT'])) { // 協(xié)議法朗徊,因為有可能不準確,放到最后判斷
            // 如果只支持wml并且不支持html那一定是移動設備
            // 如果支持wml和html但是wml在html之前則是移動設備
            if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== FALSE) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === FALSE || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
                return TRUE;
            }
        }
        return FALSE;
    }
}

接下來創(chuàng)建本地訂單

主要是訂單ID這塊偎漫,想了很多方法爷恳,什么時間戳啊+用戶ID之類的啊,但是你都不能100%排除有一定幾率訂單號重復吧象踊,如果并發(fā)量非常非常大的時候更恐怖温亲,然后就有個大佬告訴我先生成訂單號放在另外一張數(shù)據(jù)表中棚壁,每次用的時候拿一個,同時鎖表栈虚!這個ider真的是666

/**
     * 批量生成訂單id袖外,必須在php-cli下執(zhí)行
     *
     * 訂單號范圍:
     * => 11000001 - 99999999
     * =>
     *
     * @param $s
     * @param $e
     */
    public function makeTmpOrderIds($s = 1, $e = 2)
    {
        $total = $e - $s;
        $pageSize = 30000;
        $page = 1;
        $pageCount = ceil($total / $pageSize);
        $pageArr = [];
        for ($i = $page; $i <= $pageCount; $i++) {
            $pageArr[] = $i;
        }
        shuffle($pageArr);
        foreach ($pageArr as $page) {
            $orderIds = [];
            $start = $s + ($page - 1) * $pageSize;
            $end = $s + $page * $pageSize;
            for ($j = $start; $j <= $end; $j++) {
                $orderIds[] = $j;
            }
            shuffle($orderIds); //隨機
            $this->muitlInsertOrderIds($orderIds);
            sleep(1); //減輕sql壓力
        }
    }

    /**
     * 批量插入訂單id
     *
     * @param $orderIds
     */
    public function muitlInsertOrderIds($orderIds)
    {
        $value_sql = '(?)' . str_repeat(',(?)', (count($orderIds) - 1));
        $sql = "insert ignore into `small`.`small_order_ids` (`order_id`) values {$value_sql}";
        DB::insert($sql, $orderIds);
    }

命令調(diào)用填充數(shù)據(jù)表,生成命令的方式看下文檔就好

Artisan::command('make_order_ids', function () {

    $obj = new \App\Emotion\Services\OrderService();

    //$obj->makeTmpOrderIds(11000001, 99999999);
//    $obj->makeTmpOrderIds(30000000, 40000000);
//    $obj->makeTmpOrderIds(40000000, 50000000);
//    $obj->makeTmpOrderIds(50000000, 60000000);
//    $obj->makeTmpOrderIds(60000000, 60000000);
//    $obj->makeTmpOrderIds(70000000, 80000000);
//    $obj->makeTmpOrderIds(80000000, 90000000);
//    $obj->makeTmpOrderIds(90000000, 100000000);
//    $obj->makeTmpOrderIds(100000000, 110000000);
})->describe('test');

我相信當你110000000用完的時候魂务,你們公司就和淘寶一樣的規(guī)模了
接下來就是創(chuàng)建本地訂單了后調(diào)用支付寶啦曼验。這塊很簡單的直接上代碼,看不明白的留言或者直接加我QQ 1021081996粘姜,下班了鬓照,有機會再改這個文檔,我知道寫的不好相艇!

 $isMobile = $request->input('isMobile');
        $payType = $isMobile? 'alipay.wap' : 'alipay.web';
        $is_test = 1;

        // 創(chuàng)建測評服務本地訂單
        $orderId = $order->makeAliOrder([
            'total_price' => $productInfo['price'],
            'question_id' => $questionId,
            'is_test' => $is_test ? 1 : 0
        ]);
        $orderInfo = AlipayOrder::where('order_id', $orderId)->orderBy('id', 'desc')->first();
        $totalPrice = ceil($productInfo['price']/100);  //問題中按分存的颖杏,所以需要除 100
        $totalPrice = $is_test == 1 ? 0.01 : $totalPrice;

        // 發(fā)起支付寶支付
        $alipay = app($payType);
        $alipay->setOutTradeNo($orderId);//訂單id
        $alipay->setTotalFee($totalPrice);//支付價格
        $alipay->setSubject($productInfo['title']);//支付標題
        $alipay->setBody($productInfo['intro']);//支付詳情

        //$alipay->setQrPayMode('3'); //該設置為可選纯陨,添加該參數(shù)設置坛芽,支持二維碼支付。
        // 跳轉(zhuǎn)到支付頁面翼抠。
        return redirect()->to($alipay->getPayLink());
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咙轩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子阴颖,更是在濱河造成了極大的恐慌活喊,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件量愧,死亡現(xiàn)場離奇詭異钾菊,居然都是意外死亡,警方通過查閱死者的電腦和手機偎肃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門煞烫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人累颂,你說我怎么就攤上這事滞详。” “怎么了紊馏?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵料饥,是天一觀的道長。 經(jīng)常有香客問我朱监,道長岸啡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任赫编,我火速辦了婚禮巡蘸,結(jié)果婚禮上篇裁,老公的妹妹穿的比我還像新娘。我一直安慰自己赡若,他們只是感情好达布,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逾冬,像睡著了一般黍聂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上身腻,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天产还,我揣著相機與錄音,去河邊找鬼嘀趟。 笑死脐区,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的她按。 我是一名探鬼主播牛隅,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼酌泰!你這毒婦竟也來了媒佣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤陵刹,失蹤者是張志新(化名)和其女友劉穎默伍,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衰琐,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡也糊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了羡宙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狸剃。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖辛辨,靈堂內(nèi)的尸體忽然破棺而出捕捂,到底是詐尸還是另有隱情,我是刑警寧澤斗搞,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布指攒,位于F島的核電站,受9級特大地震影響僻焚,放射性物質(zhì)發(fā)生泄漏允悦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一虑啤、第九天 我趴在偏房一處隱蔽的房頂上張望隙弛。 院中可真熱鬧架馋,春花似錦、人聲如沸全闷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽总珠。三九已至屏鳍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間局服,已是汗流浹背钓瞭。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留淫奔,地道東北人山涡。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像唆迁,于是被迫代替她去往敵國和親鸭丛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容