PHP使用支付宝SDK完成支付

最近在写支付 , 遇到了一些支付宝的坑,这里也记录分享一下

首先必须在蚂蚁金服上面有一个应用 , 并且把商户私钥 , 支付宝公钥等都设置好

然后下载支付宝php的SDK , 链接如下
https://docs.open.alipay.com/270/106291/

我用的是TP5框架

这里把SDK下好解压之后放到TP的extend目录下
SDK的位置
首先我们需要在自己的数据库中保存以下内容 :

1.subject       //订单标题
2.total_amount  //需付款金额
3.body          //商品描述, 可空
4.out_trade_no  //订单号, 需自己生成
5.user_id       //这个不用传给支付宝

这里附上我的生成订单号代码

//生成订单号
$osn = date('YmdHis').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);

以上都完成之后 , 就可以使用SDK了
这里我遇到了第一个问题 , 第三方类的引用. 由于支付宝SDK无法使用composer下载 , 导致了整个包里面的
类都没有命名空间 .
引用的时候总是报错文件不存在或类不存在

查阅了许多资料之后 , 终于找到了解决方法 :
使用Loader加载

 Loader::import('alipay.pagepay.service.AlipayTradeService');
 Loader::import('alipay.pagepay.buildermodel.AlipayTradePagePayContentBuilder');

这样的话即使第三方类库没有命名空间 , 也能完美引用

我把SDK之中的pagepay.php 写到了我的class之中

	//以下是简化过后的代码
    public function payment ()
    {
        $data =  $this->request->param();
        $user_id = $this->userInfo['id'];
        
        //生成唯一订单号
        $osn = date('YmdHis').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);

        //保存订单
        $res = Db::name('order')->insert([
           'title'  => $data['subject'],   //订单标题
           'type'   => $data['type'],      //订单类型
           'number' => $osn,              //订单编号
           'money'  => $data['total_amount'],
           'user_id'=> $user_id,
           'create_time'=>time(),
        ]);

        if($res){
            //订单信息保存成功
            Loader::import('alipay.pagepay.service.AlipayTradeService');
            Loader::import('alipay.pagepay.buildermodel.AlipayTradePagePayContentBuilder');

            $payRequestBuilder = new \AlipayTradePagePayContentBuilder();
            $payRequestBuilder->setBody($data['body']);
            $payRequestBuilder->setSubject($data['subject']);
            $payRequestBuilder->setTotalAmount($data['total_amount']);
            $payRequestBuilder->setOutTradeNo($osn);

            $aop = new \AlipayTradeService(config('alipay'));
            /**
             * pagePay 电脑网站支付请求
             * @param $builder 业务参数,使用buildmodel中的对象生成。
             * @param $return_url 同步跳转地址,公网可以访问
             * @param $notify_url 异步通知地址,公网可以访问
             * @return $response 支付宝返回的信息
             */
            $response = $aop->pagePay($payRequestBuilder,config('alipay')['return_url'],config('alipay')['notify_url']);
        }

        echo $osn; //2018070499495653
    }

这里的config函数是我提前就在application目录下的config.php文件中部署好的

//在你application目录下的config文件之后加上支付宝的一些配置信息 
// 之后就可以直接使用config('alipay')调用此数组
//一定要确保这些数据没有任何问题
   'alipay'=>[
            //应用ID,您的APPID。
            'app_id' => "",
            //商户私钥
            'merchant_private_key' => "",
            //异步通知地址
            'notify_url' => "",
            //同步跳转
            'return_url' => "",
            //编码格式
            'charset' => "UTF-8",
            //签名方式
            'sign_type'=>"RSA2",
            //支付宝网关
            'gatewayUrl' => "https://openapi.alipay.com/gateway.do",
            //支付宝公钥
            'alipay_public_key' => "",
    ],

至此 , 调用了pagepay之后 , 就会出现付款界面了
支付宝付款

付款成功 , 接下来是支付宝的支付结果异步通知
此通知是支付宝单方面访问你的接口 , 你需要在此接口之中处理商户的业务逻辑
成功之后返回 “success” 即可

注意 ! 请不要把支付宝的异步请求的接口放在继承了登陆等判断的class之中 , 因为如果加了这些判断 ,
则支付宝无法正常请求我们的接口
此接口必须放在服务器上 ,如果在本地则支付宝服务器无法请求

  /**
     * 支付宝异步回调接口
     */
    public function notify_url ()
    {
        Loader::import('alipay.pagepay.service.AlipayTradeService');
        $arr=$_POST;

        $alipaySevice = new \AlipayTradeService(config('alipay'));
        $alipaySevice->writeLog(var_export($_POST,true));
        $result = $alipaySevice->check($arr); //这一步验签

        if($result) {//验证成功
            //商户订单号
            $out_trade_no = $_POST['out_trade_no'];
            //订单金额
            $total_amount = $_POST['total_amount'];
            //支付宝交易号
            $trade_no = $_POST['trade_no'];
            //交易状态
            $trade_status = $_POST['trade_status'];

            if($_POST['trade_status'] == 'TRADE_FINISHED') {
				//--交易结束执行的业务逻辑--
            }else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
				//--交易支付成功执行的业务逻辑--
            }
            //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
            echo "success";	//请不要修改或删除
        }else {
            //验证失败
            echo "fail";
        }
    }

到这里使用支付宝SDK就结束了
这里还说一下 , 你的服务器必须开启openssl拓展 , 调用check验签 , 必需开启openssl

本人原创 , 转载请注明出处 – 入侵的烟斗猫

发布了19 篇原创文章 · 获赞 6 · 访问量 2542

猜你喜欢

转载自blog.csdn.net/qq_42922085/article/details/96573148