上一篇寫了支付寶支付,而後這段時間我又把微信支付給接上了,做爲萌新的我仍是頗有成就感的,哈哈~~好了,該寫正事了。php
首先到微信的官方平臺註冊應用https://pay.weixin.qq.com/index.php/core/info(我這個我咱們產品經理註冊的,具體步驟就不說了啊,慢慢搗鼓吧)html
註冊完應用有一個APPID和一個API密鑰(需設置),主要是這兩個;laravel
composer require "overtrue/laravel-wechat:~4.0" 小程序
這個步驟安裝查看他的官方文檔https://www.easywechat.com/api
記得生成wechat.php配置文件,裏面的回調地址notify_url你本身設置就行了,不須要像支付寶那樣去官網設置的。緩存
1 <?php 2 3 /* 4 * This file is part of the overtrue/laravel-wechat. 5 * 6 * (c) overtrue <i@overtrue.me> 7 * 8 * This source file is subject to the MIT license that is bundled 9 * with this source code in the file LICENSE. 10 */ 11 12 return [ 13 'secret' => env('WECHAT_SECRET', ''), 14 /* 15 * 默認配置,將會合併到各模塊中 16 */ 17 'defaults' => [ 18 /* 19 * 指定 API 調用返回結果的類型:array(default)/collection/object/raw/自定義類名 20 */ 21 'response_type' => 'array', 22 23 /* 24 * 使用 Laravel 的緩存系統 25 */ 26 'use_laravel_cache' => true, 27 28 /* 29 * 日誌配置 30 * 31 * level: 日誌級別,可選爲: 32 * debug/info/notice/warning/error/critical/alert/emergency 33 * file:日誌文件位置(絕對路徑!!!),要求可寫權限 34 */ 35 'log' => [ 36 'level' => env('WECHAT_LOG_LEVEL', 'debug'), 37 'file' => env('WECHAT_LOG_FILE', storage_path('logs/wechat.log')), 38 ], 39 ], 40 41 /* 42 * 路由配置 43 */ 44 'route' => [ 45 /* 46 * 開放平臺第三方平臺路由配置 47 */ 48 // 'open_platform' => [ 49 // 'uri' => 'serve', 50 // 'action' => Overtrue\LaravelWeChat\Controllers\OpenPlatformController::class, 51 // 'attributes' => [ 52 // 'prefix' => 'open-platform', 53 // 'middleware' => null, 54 // ], 55 // ], 56 ], 57 58 /* 59 * 公衆號 60 */ 61 'official_account' => [ 62 'default' => [ 63 'app_id' => env('WECHAT_OFFICIAL_ACCOUNT_APPID', 'your-app-id'), // AppID 64 'secret' => env('WECHAT_OFFICIAL_ACCOUNT_SECRET', 'your-app-secret'), // AppSecret 65 'token' => env('WECHAT_OFFICIAL_ACCOUNT_TOKEN', 'your-token'), // Token 66 'aes_key' => env('WECHAT_OFFICIAL_ACCOUNT_AES_KEY', ''), // EncodingAESKey 67 68 /* 69 * OAuth 配置 70 * 71 * scopes:公衆平臺(snsapi_userinfo / snsapi_base),開放平臺:snsapi_login 72 * callback:OAuth受權完成後的回調頁地址(若是使用中間件,則隨便填寫。。。) 73 */ 74 // 'oauth' => [ 75 // 'scopes' => array_map('trim', explode(',', env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_SCOPES', 'snsapi_userinfo'))), 76 // 'callback' => env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_CALLBACK', '/examples/oauth_callback.php'), 77 // ], 78 ], 79 ], 80 81 /* 82 * 開放平臺第三方平臺 83 */ 84 // 'open_platform' => [ 85 // 'default' => [ 86 // 'app_id' => env('WECHAT_OPEN_PLATFORM_APPID', ''), 87 // 'secret' => env('WECHAT_OPEN_PLATFORM_SECRET', '7795af6a2da27474b025b2cbfe83ad51'), 88 // 'token' => env('WECHAT_OPEN_PLATFORM_TOKEN', ''), 89 // 'aes_key' => env('WECHAT_OPEN_PLATFORM_AES_KEY', ''), 90 // ], 91 // ], 92 93 /* 94 * 小程序 95 */ 96 // 'mini_program' => [ 97 // 'default' => [ 98 // 'app_id' => env('WECHAT_MINI_PROGRAM_APPID', ''), 99 // 'secret' => env('WECHAT_MINI_PROGRAM_SECRET', ''), 100 // 'token' => env('WECHAT_MINI_PROGRAM_TOKEN', ''), 101 // 'aes_key' => env('WECHAT_MINI_PROGRAM_AES_KEY', ''), 102 // ], 103 // ], 104 105 /* 106 * 微信支付 107 */ 108 'payment' => [ 109 'default' => [ 110 'sandbox' => env('WECHAT_PAYMENT_SANDBOX', false), 111 'app_id' => env('WECHAT_PAYMENT_APPID', ''), 112 'mch_id' => env('WECHAT_PAYMENT_MCH_ID', ''), 113 'key' => env('WECHAT_PAYMENT_KEY', ''), 114 'cert_path' => env('WECHAT_PAYMENT_CERT_PATH', 'path/to/cert/apiclient_cert.pem'), // XXX: 絕對路徑!!!! 115 'key_path' => env('WECHAT_PAYMENT_KEY_PATH', 'path/to/cert/apiclient_key.pem'), // XXX: 絕對路徑!!!! 116 'notify_url' => 'http://test.com/payments/wechat-notify', // 默認支付結果通知地址 117 ], 118 // ... 119 ], 120 121 /* 122 * 企業微信 123 */ 124 // 'work' => [ 125 // 'default' => [ 126 // 'corp_id' => 'xxxxxxxxxxxxxxxxx', 127 /// 'agent_id' => 100020, 128 // 'secret' => env('WECHAT_WORK_AGENT_CONTACTS_SECRET', ''), 129 // //... 130 // ], 131 // ], 132 ];
先生成實例,我是先參考的easyWeChat的方法,服務器
1 use EasyWeChat\Factory; 2 3 $config = [ 4 // 必要配置 5 'app_id' => 'xxxx', 6 'mch_id' => 'your-mch-id', 7 'key' => 'key-for-signature', // API 密鑰 8 9 // 如需使用敏感接口(如退款、發送紅包等)須要配置 API 證書路徑(登陸商戶平臺下載 API 證書) 10 'cert_path' => 'path/to/your/cert.pem', // XXX: 絕對路徑!!!! 11 'key_path' => 'path/to/your/key', // XXX: 絕對路徑!!!! 12 13 'notify_url' => '默認的訂單回調地址', // 你也能夠在下單時單獨設置來想覆蓋它 14 ]; 15 16 $app = Factory::payment($config);
而後生成訂單微信
1 $result = $app->order->unify([ 2 'body' => '騰訊充值中心-QQ會員充值', 3 'out_trade_no' => '20150806125346', 4 'total_fee' => 88, 5 'spbill_create_ip' => '123.12.12.123', // 可選,如不傳該參數,SDK 將會自動獲取相應 IP 地址 6 'notify_url' => 'https://pay.weixin.qq.com/wxpay/pay.action', // 支付結果通知網址,若是不設置則會使用配置裏的默認地址 7 'trade_type' => 'JSAPI', 8 'openid' => 'oUpF8uMuAJO_M2pxb1Q9zNjWeS6o', 9 ]);
結果一直報錯,緣由還沒查明,app
後來我換了個實例化的方法composer
1 $app = app('wechat.payment');
而後就正常了。
上面的result返回相似
1 [ 2 "return_code" => "SUCCESS" 3 "return_msg" => "OK" 4 "appid" => "wx24b673e63c158b89" 5 "mch_id" => "1502479801" 6 "nonce_str" => "721IkW6I2rokEEgz" 7 "sign" => "D85AACC9B51BD59E4011F36042BA362D" 8 "result_code" => "SUCCESS" 9 "prepay_id" => "wx10145943342718f4169407463160082537" 10 "trade_type" => "APP" 11 ]
這些信息返回給APP仍是不行的,由於須要二次簽名!!!我就是忘記二次簽名了,結果APP一直報簽名錯誤,找了半天的緣由,結果是少了一次簽名。
1 if( $result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS'){ 2 $result = $app->jssdk->appConfig($result['prepay_id']);//第二次簽名 3 return [ 4 'code' => 'success', 5 'msg' => $result 6 ]; 7 }else{ 8 Log::error('微信支付簽名失敗:'.var_export($result,1)); 9 return false; 10 }
再去調用方法再籤一次就行了。這樣把$result裏面的信息返回給APP就能夠了!
再APP完成支付後,微信服務器會發送一個post請求,請求地址爲你未知文件中填寫的notify_url
1 Route::any('payments/wechat-notify', 'WeChatController@paySuccess');
必定要是any,由於微信服務器先get請求一次數據,而後會再post請求一次
而後處理回調
1 public function paySuccess(){ 2 3 $app = app('wechat.payment'); 4 $response = $app->handlePaidNotify(function ($message, $fail) { //處理訂單等,你的業務邏輯 54 return true; 55 } 56 // 或者錯誤消息 57 $fail('Order not exists.'); 58 }); 59 60 return $response; 61 }
$message的數據相似
這樣完整的微信支付就完成了!