最近负责的项目事关支付宝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说明里是不存在的,是在tests\AopF2FGatewayTest类下testQuery方法才看到是这样用的 醉了...
每次调用都是要创建相应的gateway(网关) 的,这里封装成公用方法 创建网关的时候会指定支付方式。目前只做了App支付这一种 后续做其他的支付方式再记录吧