最近負責的項目事關支付寶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支付這一種 后續做其他的支付方式再記錄吧