1.composer加载laravel微信支付第三方文件
composer require "overtrue/laravel-wechat:~4.0"
composer require simplesoftwareio/simple-qrcode 1.3.* //composer生成二维码文件
2.改config\app.php文件
'providers' => [
// ...
Overtrue\LaravelWeChat\ServiceProvider::class,
],
'aliases' => [
// ...
'EasyWeChat' => Overtrue\LaravelWeChat\Facade::class,
],
在 config/app.php 注册 ServiceProvider 和 Facade (Laravel 5.5 无需手动注册)
3.写微信支付控制器
<?php namespace App\Http\Api; use App\Model\Order; use App\Model\OrderGoods; use EasyWeChat\Factory; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Redirect; use SimpleSoftwareIO\QrCode\Facades\QrCode; class WeChatController extends Controller { // private function get() { $config = [ 'app_id' => 'your app_id', 'mch_id' => 'your mch_id', 'key' => 'your key', // 'token' => 'TestToken', //'response_type' => 'array', //'notify_url' => '', // 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书) //'cert_path' => 'path/to/your/cert.pem', // XXX: 绝对路径!!!! //'key_path' => 'path/to/your/key', // XXX: 绝对路径!!!! 'log' => [ 'level' => 'debug', 'permission' => 0777, 'file' => base_path().'\wechat.log', ], ]; //$app = app('wechat.payment'); $app = Factory::payment($config); return $app; } public function code(Request $request) { $app = $this->get(); //dd(unserialize(file_get_contents(base_path().'\massage.txt'))); // $order = Order::find($request->order_id); //dd($app->order->queryByOutTradeNumber($order->sn)); $result = $app->order->unify([ 'body' => '购买产品', 'out_trade_no' => 's545a64',//$order->sn, // 'total_fee' => $order->total_price*100, 'total_fee' => 0.01*100, //'spbill_create_ip' => '127.0.0.1', // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址 'notify_url' => 'http://9a58e240.ngrok.io/api/success', // 支付结果通知网址,如果不设置则会使用配置里的默认地址 //'notify_url' => 'http://www.yzyp.com/api/success', // 支付结果通知网址,如果不设置则会使用配置里的默认地址 'trade_type' => 'NATIVE', // 请对应换成你的支付方式对应的值类型 'product_id' => 'wx4706a9fcbbca10f2', //'openid' => 'oUpF8uMuAJO_M2pxb1Q9zNjWeS6o', ]); if($result['result_code'] === 'FAIL'){ return [ 'code'=>0, 'message'=>$result['err_code_des'], ]; } if($result['return_code'] === 'SUCCESS' && $result['result_code'] === 'SUCCESS'){ $re = QrCode::format('svg')->size(100)->errorCorrection("L")->generate($result['code_url']); return $re; } } public function success() { $app = $this->get(); $response = $app->handlePaidNotify(function($message, $fail) use($app){ //判断订单状态 $order = Order::where('sn',$message['out_trade_no'])->first(); if(!$order || $order->status ==1){ return true; } //判断用户支付状态 if ($message['return_code'] === 'SUCCESS') { // 用户是否支付成功 if ($message['result_code'] === 'SUCCESS') { //修改订单状态 $order->update([ 'status' => 1, ]); } } else { return $fail('通信失败,请稍后再通知我'); } return true; ; }); return $response; } public function test() { $message = unserialize(file_get_contents(base_path().'\massage.txt')); file_put_contents(storage_path().'\logs\WeChat.txt',serialize($message).PHP_EOL,FILE_APPEND); } }
4.调用code接口
PS:错误一
GuzzleHttp \ Exception \ RequestException
cURL error 60: SSL certificate problem: unable to get local issuer certificate (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)
回答:这是由于是在本地测试,不是安全路径,所以需要添加文件cacert.pem到WWW同级目录,
例:如果使用的是phpstudy,则目录为phpStudy\PHPTutorial\cacert.pem
在php.ini中任意位置添加 curl.cainfo = "D:\phpStudy\PHPTutorial\cacert.pem"
重启phpStudy,访问code接口,扫码完成支付