美文网首页
Laravel支付宝开发

Laravel支付宝开发

作者: 分你一半美好 | 来源:发表于2017-11-30 20:13 被阅读0次

    首先找个简单好用的轮子 比如这个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());
    

    相关文章

      网友评论

          本文标题:Laravel支付宝开发

          本文链接:https://www.haomeiwen.com/subject/fkrbbxtx.html