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支付这一种 后续做其他的支付方式再记录吧

原文地址:https://www.cnblogs.com/tudou1223/p/9758762.html