壹.導言
本教程是LAMP開發環境下基於larvel5.1LTS的開發實例。
因為現在國內有很多優秀的具有開源精神的php開發者,為了節省時間和維護成本,微信開發采用組件開發,我們不需要反復做輪子。本教程使用overtrue team的easywechat組件開發實現微信的支付功能。
因為這個組件功能太多,所以本博客主要介紹“掃碼支付”的主要流程和思路。
第二,composer安裝
默認情況下,每個人都已經在自己的開發環境中安裝了composer,並且可以進行壹些簡單的操作和安裝命令:
作曲要求“overtrue/laravel-微信:~3.0”
*如果使用laravel-debugbar,請禁用或關閉,否則此模塊無法正常工作!!!*(但是composer提示是否可以關閉x-debug,會影響安裝,可以不去管。)
第三,在laravel中配置
1.註冊ServiceProvider(在config/app.php配置文件中找到帶有關鍵提供者的數組,並將服務提供者添加到數組中):
over true \ LaravelWechat \ service provider::class,
2.(可選)Add * Appearance *在app/config/app.php的別名數組中,add * alias *:
微信' = & gtover true \ LaravelWechat \ service provider::class,
3.創建配置文件(在項目根目錄中運行artisan命令,並將配置文件發布到項目中):
php artisan供應商:發布
此時,配置文件wechat.php將在/config目錄下生成。在裏面輸入妳的微信商家信息。這裏請註意隱私保護。
第四,微信支付蒼蠅
1.配置微信商家信息。的。laravel根目錄下的ENV文件支持以下配置:
微信_APPID
微信_秘密
微信_令牌
微信_AES_KEY
微信_日誌_級別
微信_日誌_文件
微信_ OAUTH _範圍
微信_ OAUTH _回調
微信_支付_商家_ID
微信_支付_鑰匙
微信_支付_證書_路徑
微信_支付_鑰匙_路徑
微信_支付_設備_信息
微信_支付_訂閱_應用程序_ID
微信_支付_訂閱_商家_ID
微信_啟用_模擬
可以在/config/wechat.php中配置相關參數,也可以寫在壹個。ENV文件,然後,微信. php的具體讀取方法如下:
notify _ url ' = & gtEnv ('notify _ URL ','/notify _ URL '),//回調地址
Env()讀取。默認情況下為env文件。如果常量未在。env,返回env()的第二個參數的值。
2.wechat.php文件中應註意的問題
(1).“日誌”數組中是日誌配置。
(2)‘支付’數組是主配置數組,主要配置商戶的信息和證書。
3.(按鍵)創建訂單
(1).引入名稱空間。
使用easy we chat \ Foundation \ Application;
使用EasyWeChat \ Payment \ Order
(2).填寫訂單信息
$attributes = [
' trade _ type ' = & gt' JSAPI ',// JSAPI,本機,應用程序...
body ' = & gtIPad mini 16G白色',
詳細信息' = & gtIPad mini 16G白色',
out _ trade _ no ' = & gt'1217752501201407033233368018',
total _ fee ' = & gt5388,
notify _ url ' = & gt/order-notify ',//支付結果通知網址,如果沒有設置,會使用配置中的默認地址,這裏沒有匹配,因為在中已經配置了。環境。
// ...
];
//創建訂單
$order =新訂單($ attributes);
$ result = $ payment-& gt;準備(訂單);
if($ result-& gt;return_code == '成功' & amp& amp$ result-& gt;result_code == 'SUCCESS ')
{
//生成訂單後的邏輯
\Log::info('生成訂單號...'。$ data-& gt;order _ guid);
//這壹塊以ajax的形式返回到頁面。
//用戶的體驗是點擊確認支付,驗證碼出來就是壹個圖層頁面(沒錯,妳需要壹個有用的圖層js)。
$ajax_data=[
html ' = & gtJSON _ encode(\ QR code::size(250)-& gt;生成($result['code_url']),
out _ trade _ no ' = & gt$ data-& gt;order_guid
價格' = & gt$ data-& gt;價格
];
返回$ ajax _ data
}否則{
return back()-& gt;WithErrors('生成順序時出錯!');
}
動詞 (verb的縮寫)呈現頁面
這裏創建了壹個訂單,需要生成壹個二維碼圖片。請參考這個二維碼圖片組件。
作曲家設置
首先,將QrCode包添加到composer.json文件的require中:
作曲家需要“simplesoftwareio/simple-qrcode”
添加服務提供商
在config/app.php的providers數組中註冊simplesoftwareio \ QR code \ qrcodeserviceprovider::class .
添加別名
最後,註冊'二維碼' = & gtsimplesoftwareio \ QR code \ facades \ QR code::class來別名config/app.php的數組.
Pay.blade.php內容
& ltscript type = " text/JavaScript " src = " { { asset(' vendor/jquery . js ')} } " & gt;& lt/script & gt;
& ltscript type = " text/JavaScript " src = " { { asset(' layer/layer . js ')} } " & gt;& lt/script & gt;
& ltInput class = "微信_ BTN" type = "button" value = "支付確認"/& gt;
{!-這個頁面需要壹些js代碼讓支付功能更加美觀無bug,比如ajax輪詢,點擊支付後btn失敗,放棄支付時關閉炸彈層等。-}
Js內容
$('.微信_ BTN’)。單擊(函數(){
$('.我的訂單guid’)。val(“”);
$('#code ')。val(“”);
//ajax生成二維碼
數據={
_token':$("。令牌”)。val(),// token
錢':$(”。錢”)。val(),//商品價格
}
sendAjax(data,"/order ",function (data) {
//發送二維碼(這裏用漂亮的圖層庫)
layer.open({
類型:1,
標題:'微信支付',
皮膚:' layui-layer-rim ',//帶邊框。
面積:['270px ',' 340px'],//寬度和高度。
內容:“& ltp style = ' color:red;'文本對齊:居中;'& gt付款金額:"+數據['價格']
+"袁
+"'/>& ltdiv id = ' code ' style = ' text-align:center;& gt"+JSON.parse(data['html'])+
“& lt/div & gt;& ltp style = ' text-align:center;'& gt請使用微信掃碼支付
//這裏我把壹個關於炸彈層庫的小js寫進了內容。
});
getInfo();
//這裏寫壹個poll,可以異步查詢訂單是否已經支付,從而進行邏輯處理(比如輪詢支付狀態,成功跳轉到頁面)。提壹下我的想法就行了,輪詢碼也不需要找來貼去。
});
});
第六,回調函數
先放主代碼:
公共函數notifyUrl(請求$request)
{
$app =新應用(config('微信'));
$ response = $ app-& gt;付款-& gt;handleNotify(函數$notify,$successful){
如果($成功){
$order_arr=json_decode($notify,true);
$ order _ guid = $ order _ arr[' out _ trade _ no '];//訂單編號
//回調成功的邏輯
}
});
}
註意
(1).微信通過郵件發送回撥。在路由中定義後,laravel項目中需要排除令牌驗證。我建議VerifyCsrfToken.php在中間件中排除該路由。
受保護的$except = [
//
/pay_success_notify ',
/收件人規則排除路線'
];
(2).*專註!專註!專註!*這裏回調處理可以說是最重要的。如果這裏出了問題,可能會導致用戶支付成功後,微信的*回調沒有進來*,後臺回調的邏輯沒有實現,導致用戶花了錢,什麽也沒買(也就是妳的服務器沒有對付費用戶進行修改支付狀態等數據庫操作)。另壹個後果是,如果微信的參數返回不正確,微信會多次發送回調消息提醒妳支付成功,導致妳的服務器多次接受回調函數。這時候妳也壹般般,沒有在支付成功的邏輯中判斷用戶的支付狀態,導致邏輯用戶充了壹次錢,卻在數據庫中重復了幾次相關的數據庫操作。前者騙了付費用戶,後者騙了妳的公司。如果在這裏不註意,後果只會很嚴重。在涉及錢的地方要小心。
(2)回調路由所指向的方法中,如果妳的成功支付的邏輯運行成功,需要返回true;如果數據庫操作不成功,需要返回false;或者不回,微信會再發壹次回撥消息(post模式)。
七、壹些easywechat官方建議:
這裏有幾點需要註意:
1.handleNotify只接收壹個可調用的參數,通常帶有匿名函數。
2.匿名函數接收兩個參數,它們是:
$notify是壹個EasyWeChat\Support\Collection對象,封裝了通知信息,這裏不再贅述。您可以以對象或數組的形式讀取通知內容,例如,$ notify-& gt;Totalfee或$notify['totalfee']。
參數$successful實際上是判斷用戶是否支付成功(result _ code = =' success ')。
3.這個函數的返回值是告訴微信我是否處理完了。如果妳返回假的或者特定的錯誤信息,微信會在後面繼續再次通知妳,直到妳明確告訴它“我已經處理完了”,在函數中返回真;表示處理完成。
4.handleNotify返回值$Response是壹個響應對象。如果想直接輸出,用$ response->;Send(),在某些幀中不是輸出而是返回:return $response。
5.註意:請將“支付是否成功”與“處理是否完成”分開。他們沒有必然的聯系。
比如微信通知妳支付完成,但是支付失敗(result_code為‘fail’)。妳應該更新妳的訂單為支付失敗,但告訴微信處理完成。
附言
1.在微信的開發中,廣泛使用的是laravel自己的日誌檢錯方法。當var_dump()、echo()、dd()等方法無法檢查錯誤信息時,日誌錯誤檢查可以解決。如何使用laravel的日誌服務將在後面討論。
2.這個項目的開發可以說是組件開發,開發速度快,代碼質量高,維護成本低。微信在這種情況下的發展是壹個縮影。
[原地址] (/)