• omnipay支付--支付宝支付


      最近负责的项目事关支付宝APP支付 也踩了一些坑   这边记录下

    以下代码基于laravel框架下:

    生成APP支付参数:

        $gateway = $this->getGateway();
    
            $request = $gateway->purchase();
            $request->setBizContent([
                'subject'      => '',//产品描述
                'out_trade_no' => '',//本地订单号
                'total_amount' => '',//支付金额 这里无需处理分位问题
                'product_code' => 'QUICK_MSECURITY_PAY',//销售产品码,商家和支付宝签约的产品码,为固定值
            ]);
    
            //发送请求
            $response = $request->send();
    
            //获取支付路径
            $orderString = $response->getOrderString();
            /*
               *这里获取的参数 传给app前端由它去调用支付
            */

    回调处理:

    官方文档是这样写的:

    $request = $gateway->completePurchase();
    $request->setParams($request);
    
    /**
     * @var LegacyCompletePurchaseResponse $response
     */
    try {
        $response = $request->send();
        
        if($response->isPaid()){
            /**
             * Payment is successful
             */
            die('success'); //The response should be 'success' only
        }else{
            /**
             * Payment is not successful
             */
            die('fail');
        }
    } catch (Exception $e) {
        /**
         * Payment is not successful
         */
        die('fail');
    }

    然而我这样写后  一直导致回调过来无法执行相应代码  看了下日志  一直报函数错误  说setParams参数有问题   无奈到处百度  最后是在composer包里查看测试示例  查看到这样写法:

    $response = $gateway->completePurchase(['params' => $request])->send();

    这样改正以后 再不会报语法问题了  回调也成功同步了 

    顺带说一下,这里的isPaid方法里面的代码是这样的:

    if (array_get($this->data, 'trade_status')) {
                if (array_get($this->data, 'trade_status') == 'TRADE_SUCCESS') {
                    return true;
                } elseif (array_get($this->data, 'trade_status') == 'TRADE_FINISHED') {
                    return true;
                } else {
                    return false;
                }
            } elseif (array_get($this->data, 'code') == '10000') {
                return true;
            } else {
                return false;
            }

    说明它已经验证了支付状态  所以可以以此判断是否支付成功.

    查询:

    $options = [
                    'out_trade_no' => $data['order_no']
                ];//用本地订单号查询
    
    $options = [
                    'trade_no' => $data['trade_no']
                ];//支付宝订单号查询
    
    //查询订单
    $request = $gateway->query();
            $request->setBizContent($options);
    
            $response = $request->send();
            //查询成功获取返回信息数据
            if($response->isSuccessful()) {
                return $response->getAlipayResponse();
            } else {
                return FALSE;
            }

    这一段在github说明里是不存在的,是在testsAopF2FGatewayTest类下testQuery方法才看到是这样用的 醉了...

    每次调用都是要创建相应的gateway(网关) 的,这里封装成公用方法 创建网关的时候会指定支付方式。目前只做了App支付这一种 后续做其他的支付方式再记录吧

  • 相关阅读:
    centos7上安装memcached以及PHP安装memcached扩展(二)
    centos7上安装memcached以及PHP安装memcached扩展(一)
    centos7上安装redis以及PHP安装redis扩展(二)
    centos7上安装redis以及PHP安装redis扩展(一)
    Redis Desktop Manager无法连接虚拟机中启动的redis服务问题排查步骤
    CentOS 7设置开机启动服务,添加自定义系统服务
    delphi 选择文件夹目录保存
    mysql drop database ERROR 2013
    delphi 在别的方法 调用keypress事件
    delphi Inc Dec用法
  • 原文地址:https://www.cnblogs.com/tudou1223/p/9758762.html
Copyright © 2020-2023  润新知