一、安裝
composer require latrell/alipay dev-master
找到 config/app.php
配置文件中岛都,key
為 providers
的數(shù)組质和,在數(shù)組中添加服務(wù)提供者。
'providers' => [
// ...
Latrell\Alipay\AlipayServiceProvider::class,
]
在項(xiàng)目根目錄中運(yùn)行 php artisan vendor:publish
命令室囊,發(fā)布配置文件到你的項(xiàng)目中雕崩。
說(shuō)明
配置文件 config/latrell-alipay.php
為公共配置信息文件, config/latrell-alipay-web.php
為Web版支付寶SDK配置融撞, config/latrell-alipay-mobile.php
為手機(jī)端支付寶SDK配置盼铁。
二、使用
下面給打下一個(gè)支付申請(qǐng)
得小例子:
Web端
public function alipay()
{
$orderId = time();
$orderPrice = 0.01;
$goodsName = '外星人筆記本電腦';
$goodsDescription = '外星人筆記本電腦';
// 創(chuàng)建支付單懦铺。
$alipay = app('alipay.web');
$alipay->setOutTradeNo($orderId);
$alipay->setTotalFee($orderPrice);
$alipay->setSubject($goodsName);
$alipay->setBody($goodsDescription);
// 跳轉(zhuǎn)到支付頁(yè)面捉貌。
return redirect()->to($alipay->getPayLink());
}
手機(jī)端
public function alipay()
{
$orderId = time();
$orderPrice = 0.01;
$goodsName = '外星人筆記本電腦';
$goodsDescription = '外星人筆記本電腦';
// 創(chuàng)建支付單支鸡。
$alipay = app('alipay.mobile');
$alipay->setOutTradeNo($orderId);
$alipay->setTotalFee($orderPrice);
$alipay->setSubject($goodsName);
$alipay->setBody($goodsDescription);
// 返回簽名后的支付參數(shù)給支付寶移動(dòng)端的SDK冬念。
return $alipay->getPayPara();
}
Web端回調(diào)(通知)
/**
* 異步通知
*/
public function webNotify()
{
// 驗(yàn)證請(qǐng)求。
if (! app('alipay.web')->verify()) {
Log::notice('Alipay notify post data verification fail.', [
'data' => Request::instance()->getContent()
]);
return 'fail';
}
// 判斷通知類型牧挣。
switch (Input::get('trade_status')) {
case 'TRADE_SUCCESS':
case 'TRADE_FINISHED':
// TODO: 支付成功急前,取得訂單號(hào)進(jìn)行其它相關(guān)操作。
Log::debug('Alipay notify post data verification success.', [
'out_trade_no' => Input::get('out_trade_no'),
'trade_no' => Input::get('trade_no')
]);
break;
}
return 'success';
}
/**
* 同步通知
*/
public function webReturn()
{
// 驗(yàn)證請(qǐng)求瀑构。
if (! app('alipay.web')->verify()) {
Log::notice('Alipay return query data verification fail.', [
'data' => Request::getQueryString()
]);
return view('alipay.fail');
}
// 判斷通知類型裆针。
switch (Input::get('trade_status')) {
case 'TRADE_SUCCESS':
case 'TRADE_FINISHED':
// TODO: 支付成功,取得訂單號(hào)進(jìn)行其它相關(guān)操作寺晌。
Log::debug('Alipay notify get data verification success.', [
'out_trade_no' => Input::get('out_trade_no'),
'trade_no' => Input::get('trade_no')
]);
break;
}
return view('alipay.success');
}
APP端回調(diào)(通知)
/**
* 支付寶異步通知
*/
public function alipayNotify()
{
// 驗(yàn)證請(qǐng)求世吨。
if (! app('alipay.mobile')->verify()) {
Log::notice('Alipay notify post data verification fail.', [
'data' => Request::instance()->getContent()
]);
return 'fail';
}
// 判斷通知類型。
switch (Input::get('trade_status')) {
case 'TRADE_SUCCESS':
case 'TRADE_FINISHED':
// TODO: 支付成功呻征,取得訂單號(hào)進(jìn)行其它相關(guān)操作耘婚。
Log::debug('Alipay notify get data verification success.', [
'out_trade_no' => Input::get('out_trade_no'),
'trade_no' => Input::get('trade_no')
]);
break;
}
return 'success';
}
TRADESUCCESS狀態(tài)代表了充值成功,也就是說(shuō)錢已經(jīng)進(jìn)了支付寶(擔(dān)保交易)或賣家(即時(shí)到賬)陆赋;這時(shí)候沐祷,這筆交易應(yīng)該還可以進(jìn)行后續(xù)的操作(比如三個(gè)月后交易狀態(tài)自動(dòng)變成TRADEFINISHED),因?yàn)檎P交易還沒有關(guān)閉掉攒岛,也就是說(shuō)一定還有主動(dòng)通知過來(lái)赖临。而TRADEFINISHED代表了這筆訂單徹底完成了,不會(huì)再有任何主動(dòng)通知過來(lái)了
綜上所述灾锯,收到TRADEFINISHED請(qǐng)求后兢榨,這筆訂單就結(jié)束了,支付寶不會(huì)再主動(dòng)請(qǐng)求商戶網(wǎng)站了顺饮;收到TRADESUCCESS請(qǐng)求后吵聪,后續(xù)一定還有至少一條通知記錄,即TRADEFINISHED领突。所以暖璧,在做通知接口時(shí),切記使用判斷訂單狀態(tài)用或的關(guān)系
【原文地址】
Laravel 支付寶SDK在Laravel5的封裝