layout: post

支付宝支付php开发小技巧

subtitle: 支付宝支付php开发小技巧 date: 2020-10-13 author: BY header-img: img/post-bg-kuaidi.jpg catalog: true tags: - php - 支付宝支付

支付宝支付php开发小技巧

  • 使用官方的sdk文件,以下是h5支付举例,文件基本上就是官方给的文件,然后某几个文件加一下命名空间即可

    /**
     * 支付宝h5支付页面值符串数据
     * 文档: https://opendocs.alipay.com/open/203/105285 alipay.trade.wap.pay
     * @return string 表单页面数据,请直接访问这个地址即可
     */
    public function h5_pay($product_info = [])
    {
        if (empty($product_info['trade_sn'])) {
            return false;
        }
        if (empty($product_info['total_fee'])) {
            return false;
        }
        // 商户订单号,商户网站订单系统中唯一订单号,必填
        $out_trade_no = $product_info['trade_sn'];
        // 订单名称,必填
        $subject = '支付';
        // 付款金额,必填
        $total_amount = $product_info['total_fee'];
        // 商品描述,可空
        if (empty($product_info['name'])) {
            $product_info['name'] = '支付';
        }
        $body = $product_info['name'];
        // 超时时间
        $timeout_express = "1m";
        $payRequestBuilder = new \app\pay\library\lib\AlipayTradeWapPayContentBuilder();
        $payRequestBuilder->setBody($body);
        $payRequestBuilder->setSubject($subject);
        $payRequestBuilder->setOutTradeNo($out_trade_no);
        $payRequestBuilder->setTotalAmount($total_amount);
        $payRequestBuilder->setTimeExpress($timeout_express);
        $result = false;
        try {
            $payResponse = new \app\pay\library\services\AlipayTradeService($this->h5config);
            $result = $payResponse->wapPay($payRequestBuilder, $this->h5config['return_url'], $this->h5config['notify_url']);
        } catch (\Exception $e) {
            return false;
        }
        return $result;
    }
  • 这里是h5的异步验签

    /**
     * 支付宝h5异步通知验证
     *
     * @return string 返回给支付宝服务器的值符串
     * @copyright 雪毅网络官方团队
     * @author lxx
     */
    public function h5_pay_notify_url()
    {
        try {
            $arr = $_POST;
            $result = false;
            // 这个是官方sdk的services文件夹文件,这里只增加了命名空间
            $alipaySevice = new \app\pay\library\services\AlipayTradeService($this->h5config);
            db('error')->insert(['content' => 'h5_pay_notify_url data: ' . var_export($arr, true)]);
            // ! 注意这里是一个小技巧,不然的化校验一直会失败(app支付也是一样的小技巧)
            if (isset($arr['fund_bill_list'])) {
                $arr['fund_bill_list'] = stripslashes($arr['fund_bill_list']); // 注意这里的是必须的,检测到php把这个字段增加了转义支付导致验证签名失败
            }
            $result = $alipaySevice->check($arr);
            if (!empty($result)) {
                // 校验签名成功
                # 校验支付
                $receive_data = $arr;
                $return_data['trade_sn'] = $receive_data['out_trade_no'];
                $return_data['total_fee'] = $receive_data['total_amount'];
                $return_data['buyer_email'] = isset($receive_data['buyer_email']) ? $receive_data['buyer_email'] : '';
                switch ($receive_data['trade_status']) {
                    case 'WAIT_BUYER_PAY':
                        $return_data['order_status'] = 1;
                        break;
                    case 'WAIT_SELLER_SEND_GOODS':
                        $return_data['order_status'] = 2;
                        break;
                    case 'WAIT_BUYER_CONFIRM_GOODS':
                        $return_data['order_status'] = 3;
                        break;
                    case 'TRADE_CLOSED':
                        $return_data['order_status'] = 4;
                        break;
                    case 'TRADE_FINISHED':
                        $return_data['order_status'] = 0;
                        break;
                    case 'TRADE_SUCCESS':
                        $return_data['order_status'] = 0;
                        break;
                    default:
                        $return_data['order_status'] = 5;
                }
                $this->pay_success($return_data);
                echo "success";
            } else {
                // 校验签名失败
                db('error')->insert(['content' => 'h5_pay_notify_url check sign fail ' . var_export($arr, true)]);
                echo "fail";
            }
            die();
        } catch (\Exception $e) {
            $_err['code'] = $e->getCode();
            $_err['file'] = $e->getFile();
            $_err['line'] = $e->getLine();
            $_err['msg'] = $e->getMessage();
            $_err['trace'] = $e->getTrace();
            db('error')->insert(['content' => 'h5_pay_notify_url Exception:' . var_export($_POST, true) . var_export($_err, true)]);
            echo "fail";
            die();
        }
    }