最近负责的项目事关支付宝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支付这一种 后续做其他的支付方式再记录吧