当前位置:   article > 正文

PHP 网页支付支付宝支付接口对接_php网站对接支付宝接口

php网站对接支付宝接口

PHP 网页支付支付宝支付接口对接大法

总个小结 : 目前大多数常用接口都比较完善,只要参数传的没毛病,基本对接没啥问题,排排小坑,跑起来就行。下面讲下个人开发步骤(全程本人开发 无中间商赚差价)
开发前准备

在这里插入图片描述
在这里插入图片描述

  • (真实环境)
    在这里插入图片描述
    在这里插入图片描述
  • 进入 应用列表 签约
    在这里插入图片描述
    在这里插入图片描述
  • 然后获取 APPID 以及 公钥 等配置信息 https://openhome.alipay.com/platform/keyManage.htm
    在这里插入图片描述
  • 下载公钥生成器
    在这里插入图片描述
    在这里插入图片描述
  • 打开之后有这个东西
    在这里插入图片描述
    在这里插入图片描述
  • 这个公钥就放在账户中心上面就是你的应用公钥,密钥在生成上面的文件夹里。 然后把它们写进代码就OK了!
  • (沙箱测试)
  • 蚂蚁金服开放平台 注册账号 (有帐号直接登录)
  • 进入 我的开放平台
    在这里插入图片描述
  • 添加一个 沙箱应用
  • 从里面获取 这些…
    在这里插入图片描述
  • 按步骤获取信息 不知道咋整的先放放 下载sdk 看看里面需要啥 要啥整啥
  • 开始下载 正经网址 https://docs.open.alipay.com/270/106291/
    在这里插入图片描述
  • 下载解压之后大概长这样
    在这里插入图片描述

差不多就开始撸代码!

在这里插入图片描述

  • 这个文件里的demo基本可以满足我们去支付的逻辑
    在这里插入图片描述
  • 我自己写了个公共函数 所以就复制过来改一改
  • 写个配置项的函数
	/**
     * 支付宝支付配置参数
     * @return array
     */
    function pay_ali_ini()
    {
     	// 获取网站域名(可写死)
        $http_ = Request::instance()->domain();
        return array(
            //应用ID,您的APPID。
            'app_id' => "您的APPID",

            //商户私钥
            'merchant_private_key' => "你的商户私钥",

            //异步通知地址
            'notify_url' => $http_ . "/异步通知地址",

            //同步跳转
            'return_url' => $http_ . "/同步跳转",

            //编码格式
            'charset' => "UTF-8",

            //签名方式
            'sign_type'=>"RSA2",

            //版本
            'apiVersion' => '1.0',

            //支付宝网关 (沙箱网关 真实环境要更换 https://openapi.alipay.com/gateway.do)
            'gatewayUrl' => "https://openapi.alipaydev.com/gateway.do",

            //支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
            'alipay_public_key' => "你的支付宝公钥",

            'format' => 'json',
        );
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 然后就写个调用的方法 (参考 pagepay.php)
  • 在这里插入图片描述
  • 注意传参
	//商户订单号,商户网站订单系统中唯一订单号,必填
    $out_trade_no = trim($_POST['WIDout_trade_no']);

    //订单名称,必填
    $subject = trim($_POST['WIDsubject']);

    //付款金额,必填
    $total_amount = trim($_POST['WIDtotal_amount']);

    //商品描述,可空
    $body = trim($_POST['WIDbody']);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述

  • 准备好之后就可以运行了 (瞬间笑了)
  • 小坑两个(手动标红)
  • 坑1 你会在好多地方发现这个函数
    在这里插入图片描述
  • 然后就可以为所欲为测试啦~~~

回调地址 (同步?异步?)

  • 这个问题困扰了我许久…
  • 结论 : 同步地址里面就写个简单的判断 ,仅前端提示展示跳转即可 不可作为实际支付依据进行逻辑处理
  • 异步地址用来处理逻辑 可参考这两个文件
    在这里插入图片描述
  • 个人回调处理
// Alipay 同步跳转url
    public function alipayReturnUrl()
    {
        $arr = $_GET;
        $config = pay_ali_ini();
        require_once $_SERVER['DOCUMENT_ROOT']. '/../api/alipay/pagepay/service/AlipayTradeService.php';
        $alipaySevice = new \AlipayTradeService($config);
        $result = $alipaySevice->check($arr);
        // 获取跳转地址
        $url = session('pay_url_back');
        session('pay_url_back', null);
        if ($result){
            $this->success('支付验证成功!', $url);
        }else {
            //验证失败
            $this->error('支付验证失败!', $url);
        }
    }

	// Alipay 异步跳转url
    public function alipayNotifyUrl()
    {
        $arr = $_POST;
        $config = pay_ali_ini();
        require_once $_SERVER['DOCUMENT_ROOT']. '/../api/alipay/pagepay/service/AlipayTradeService.php';
        $alipaySevice = new \AlipayTradeService($config);
        $alipaySevice->writeLog(var_export($_POST,true));
        $result = $alipaySevice->check($arr);
        if($result) {//验证成功
            //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表

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

                //判断该笔订单是否在商户网站中已经做过处理
                $is_have = Db::name('order_pay')->field('id')->where('order_no', $arr['out_trade_no'])->find();
                if ($is_have){return false;}
                //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                // 启动事务
                Db::startTrans();
                try{
                    $insert_data = [
                        'create_time' => time(),
                        'out_trade_no' => $arr['out_trade_no'],
                        'gmt_create' => $arr['gmt_create'],
                        'gmt_payment' => $arr['gmt_payment'],
                        'subject' => $arr['subject'],
                        'buyer_id' => $arr['buyer_id'],
                        'body' => isset($arr['body'])?$arr['body']:'',
                        'total_amount' => $arr['total_amount'],
                        'receipt_amount' => $arr['receipt_amount'],
                        'fund_bill_list' => $arr['fund_bill_list'],
                        'auth_app_id' => $arr['auth_app_id'],
                        'point_amount' => $arr['point_amount'],
                        'buyer_pay_amount' => $arr['buyer_pay_amount'],
                        'seller_id' => $arr['seller_id'],
                        'trade_status' => $arr['trade_status'],
                    ];
                    $insert_id = Db::name('alipay')->insertGetId($insert_data);
                    Db::name('order_pay')->insert(['db_name'=>'alipay', 'order_no' => $arr['out_trade_no'], 'd_id' => $insert_id, 'pay_type' => 'alipay']);

                    // 查询是否在 cmf_goods_order 表中
                    $is_have_order = Db::name('goods_order')->field('order_id')->where('order_no',  $arr['out_trade_no'])->find();
                    if ( $is_have_order ){
                        // 修改订单状态
                        $goods_order_data = [
                            'pay_status' => 2,
                            'modify_time' => time(),
                            'pay_time' => strtotime($arr['gmt_payment']),
                            'order_status' => 3,
                        ];
                        //添加任务进度状态
                        $progress_remark = '订单已支付';
                        $task_progress = [
                            'order_id' => $is_have_order['order_id'],
                            'create_time' => time(),
                            'modify_time' => time(),
                            'progress_remark' => $progress_remark
                        ];
                        Db::name('task_progress')->insert($task_progress);

                        Db::name('goods_order')->where('order_id', $is_have_order['order_id'])->update($goods_order_data);
                    }

                    $this->doNotify($arr['out_trade_no']);

                    // 提交事务
                    Db::commit();
                } catch (\Exception $e) {
                    // 回滚事务
                    Db::rollback();
                    return false;
                }
                //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
                //如果有做过处理,不执行商户的业务程序
            }

            echo "success";	//请不要修改或删除
        }else {
            //验证失败
            echo "fail";
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102

有问题找阿里客服 - _ -

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号