Laravel支付宝开发

首先找个简单好用的轮子 比如这个https://github.com/latrell/Alipay
这个轮子有一个地方有毒,就是只有支付,没有退款之类的接口!我公司比较屌,付钱了就没退款这一说,我就用了!不过我主要讲订单生成这块

首先创建一个中间件 php artisan make:middleware IsMobile

这个中间件主要功能是判断请求进来的是手机还是电脑端 调用方式
$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
        }
        // 判断手机发送的客户端标志,兼容性有待提高
        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'])) { // 协议法,因为有可能不准确,放到最后判断
            // 如果只支持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;
    }
}

接下来创建本地订单

主要是订单ID这块,想了很多方法,什么时间戳啊+用户ID之类的啊,但是你都不能100%排除有一定几率订单号重复吧,如果并发量非常非常大的时候更恐怖,然后就有个大佬告诉我先生成订单号放在另外一张数据表中,每次用的时候拿一个,同时锁表!这个ider真的是666

/**
     * 批量生成订单id,必须在php-cli下执行
     *
     * 订单号范围:
     * => 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);
    }

命令调用填充数据表,生成命令的方式看下文档就好

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用完的时候,你们公司就和淘宝一样的规模了
接下来就是创建本地订单了后调用支付宝啦。这块很简单的直接上代码,看不明白的留言或者直接加我QQ 1021081996,下班了,有机会再改这个文档,我知道写的不好!

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

        // 创建测评服务本地订单
        $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;

        // 发起支付宝支付
        $alipay = app($payType);
        $alipay->setOutTradeNo($orderId);//订单id
        $alipay->setTotalFee($totalPrice);//支付价格
        $alipay->setSubject($productInfo['title']);//支付标题
        $alipay->setBody($productInfo['intro']);//支付详情

        //$alipay->setQrPayMode('3'); //该设置为可选,添加该参数设置,支持二维码支付。
        // 跳转到支付页面。
        return redirect()->to($alipay->getPayLink());
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容