php 支付宝沙箱支付

如果是个人测试时只需要更改alipay/config.php内的商户私钥,同步跳转,app_id,支付宝网关和支付宝公钥。

注:public下加入第三方文件

更改alipay/aop/AopClient.php 的第413行为:

foreach ($para_temp as $key => $val)

跳转支付

/**
     * pbcrol1848@sandbox.com
     * 支付
     * @throws Exception
     */
    public function pay()
    {
        //订单号、支付方式
        $order_number = \request()->post('order_number');
        $pay_type = \request()->post('pay_type','ali');
        try {
            if (!is_numeric($order_number)){
                throw new Exception('支付失败');
            }
            //查询订单信息
            $order_info = \app\home\model\Order::where('order_sn',$order_number)->find()->toArray();
            if ($order_info['order_status'] == 1){
                throw new Exception('订单已支付');
            }
            if (time() - strtotime($order_info['create_time']) > 9000){
                throw new Exception('订单超时,请重新下单');
            }
            //判断支付方式
            switch($pay_type){
                case 'alipay':
                    require_once './alipay/pagepay/service/AlipayTradeService.php';
                    require_once './alipay/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php';
                    require_once "./alipay/config.php";
                    //商户订单号,商户网站订单系统中唯一订单号,必填
                    $out_trade_no = $order_info['order_sn'];
                    //订单名称,必填
                    $subject = '品优购电商下单';
                    //付款金额,必填
                    $total_amount = $order_info['goods_price'];
                    //商品描述,可空
                    $body = '品优购购买商品';

                    //构造参数
                    $payRequestBuilder = new \AlipayTradePagePayContentBuilder();
                    $payRequestBuilder->setBody($body);
                    $payRequestBuilder->setSubject($subject);
                    $payRequestBuilder->setTotalAmount($total_amount);
                    $payRequestBuilder->setOutTradeNo($out_trade_no);
                    $aop = new \AlipayTradeService($config);

                    /**
                     * pagePay 电脑网站支付请求
                     * @param $builder 业务参数,使用buildmodel中的对象生成。
                     * @param $return_url 同步跳转地址,公网可以访问
                     * @param $notify_url 异步通知地址,公网可以访问
                     * @return $response 支付宝返回的信息
                     */
                    $response = $aop->pagePay($payRequestBuilder,$config['return_url'],$config['notify_url']);
                    //输出表单
                    var_dump($response);
                case 'wechat':
                    //微信支付
                    break;
                default:
                    break;
            }
        }catch (Exception $exception){
            throw new Exception($exception->getMessage());
        }
    }

支付宝同步回调

/**
     * 同步回调
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\View\View|\think\response\View
     * @throws \Exception
     */
    public function callback()
    {
        require_once './alipay/pagepay/service/AlipayTradeService.php';
        require_once './alipay/config.php';
//        $config = config('pay.pay_config.ali');
        $arr=$_GET;
        $alipaySevice = new \AlipayTradeService($config);
        $result = $alipaySevice->check($arr);
        /* 实际验证过程建议商户添加以下校验。
        1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
        2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
        3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
        4、验证app_id是否为该商户本身。
        */
        if($result) {//验证成功
            //2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
            $total_price = $_GET['total_amount'];
//            dd($total_price);
            return view('order/paysuccess',['total_price'=>$total_price]);
        }
        else {
            //验证失败
            return view('order/payfail');
        }
    }
/**
 * 异步回调
 * @return string|void
 * @throws \think\db\exception\DataNotFoundException
 * @throws \think\db\exception\DbException
 * @throws \think\db\exception\ModelNotFoundException
 */
public function alinotify()
{
    $params = \request()->post();
    //判断商品是否处理过
    $order_status = \app\home\model\Order::find($params['out_trade_no']);
    if ($order_status['order_status'] > 0){
        return '订单已处理过';
    }
    Db::name('pay_log')->insert([
        'order_sn' => $params['out_trade_no'],
        'json' => json_encode($params),
        'create_time' => time(),
    ]);
    $result = true;
    /* 实际验证过程建议商户添加以下校验。
    1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
    2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
    3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
    4、验证app_id是否为该商户本身。
    */
    if($result) {

        if($_POST['trade_status'] == 'TRADE_FINISHED') {

            //判断该笔订单是否在商户网站中已经做过处理
            //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
            //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
            //如果有做过处理,不执行商户的业务程序

            //注意:
            //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
        }
        else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
            //判断该笔订单是否在商户网站中已经做过处理
            //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
            //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
            //如果有做过处理,不执行商户的业务程序
            //注意:
            //付款完成后,支付宝系统发送该交易状态通知
            \app\home\model\Order::where('id',$params['out_trade_no'])->update([
                'order_status' => 1,
                'pay_time' => time()
            ]);
        }
        echo "success";    //请不要修改或删除
    }else {
        //验证失败
        echo "fail";
    }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!