第一步 开发中心>网页&移动应用下支付接入
第二步 创建应用后需添加可支付的方式
第三步 配置公钥与私钥
工具下载地址
Windows :http://p.tb.cn/rmsportal_6680_secret_key_tools_RSA_win.zip
Mac:http://p.tb.cn/rmsportal_6680_secret_key_tools_RSA_macosx.zip
第四步 在创建新应用中把工具刚刚生成的公钥,设置应用公钥(下图已经设置,所以为查看,设置成功会自动出现查看支付宝公钥,同时支付宝公钥是需要在项目config文件需要用到的,千万不要弄错)
第五步 composer require yansongda/laravel-pay 支付组件
第六步 composer require simplesoftwareio/simple-qrcode 二维码生成器
第七步 laravel 配置文件 /config 目录下新建 alipay.php 文件 写入以下内容
<?php return [ 'pay'=>[ 'app_id'=>'',// 支付宝 支付成功后 主动通知商户服务器地址 注意 是post请求。
服务器异步通知页面路径,根据自己项目路径做相应的修改。外网可访问的地址,本地不跳转 'notify_url' => 'http://jinghuajuanke.cn/api/home/ali_pay_ntify', // 支付宝 支付成功后 回调页面 get
//页面跳转同步通知页面路径。 'return_url' => 'http://jinghuajuanke.cn/#/pay_success',
//支付宝公钥 'ali_public_key'=>'', //商家应用私钥 'private_key'=>'', 'log'=>[ 'file'=>'../storage/logs/alipay.log', 'level'=>'info',//建设生产环境下info,开发环境下debug 'type'=>'single',//optional 可选daily 'max_file'=>30 //optional 当type是daily时有效,默认是30天 ], 'http'=>[ 'timeout'=>5.0, 'connect_timeout'=>5.0, ] ] ] ?>
第八步 控制器。
<?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Services\OrderService; use Illuminate\Http\Request; use Yansongda\Pay\Pay; use Yansongda\Pay\Log; use SimpleSoftwareIO\QrCode\Facades\QrCode; use Illuminate\Support\Facades\DB; class AlipaysController extends Controller {// 手机网页支付接口 public function aliPay(Request $request) { $aliPayOrder = [ 'out_trade_no' => time(), 'total_amount' => $order->total_amount, // 支付金额 'subject' => $request->subject ?? '支付宝手机网页支付' // 备注 ]; $config = config('alipay.pay'); $config['return_url'] = $config['return_url'].'?id='.$request->id; $config['notify_url'] = $config['notify_url'].'?id='.$request->id; return Pay::alipay($config)->wap($aliPayOrder); }
// app支付接口 public function aliPayApp(Request $request) { $aliPayOrder = [ 'out_trade_no' => time(), 'total_amount' => $order->total_amount, // 支付金额 'subject' => $request->subject ?? '默认' // 备注 ]; $config = config('alipay.pay'); $config['return_url'] = $config['return_url'].'?id='.$request->id; return Pay::alipay($config)->app($aliPayOrder); }
// 支付宝扫码支付 当面付
public function alipay(Request $req){ $aliPayOrder=[ 'out_trade_no'=>time(), 'total_amount'=>'0.01',//支付金额 'subject'=> $req->subject ?? '扫码支付' //备注 ]; $config=config('alipay.pay'); $config['return_url']=$config['return_url'].'?order_guid='.$req->order_guid; $scan =Pay::alipay($config)->scan($aliPayOrder); if(empty($scan->code) || $scan->code !=='10000' ) return false; $url=$scan->qr_code.'?order_guid='.$req->order_guid; //生成二维码 order_guid是订单编号 subject是显示支付说明 return QrCode::encoding('UTF-8')->size(300)->generate($url); }// 支付成功后 支付宝服务通知本项目服务器 // post 请求 // 这里只是大概写一下逻辑,具体的安全防护 自己再去做限制 public function aliPayNtify(Request $request, OrderService $orderService) { $order = Order::find($request->id); // 更新自己项目 订单状态 if(!empty($order)) $orderService->payOrder($order); } // 支付宝退款 public function aliPayRefund(Request $request) { try { $payOrder = [ 'out_trade_no' => $order->out_trade_no, // 商家订单号 'refund_amount' => $order->total_amount, // 退款金额 不得超过该订单总金额 'out_request_no' => Common::getUuid() // 同一笔交易多次退款标识(部分退款标识) ]; $config = config('alipay.pay'); // 返回状态码 code 10000 成功 $result = Pay::alipay($config)->refund($payOrder); if (empty($result->code) || $result->code !== '10000') throw new \Exception('请求支付宝退款接口失败'); // 订单改为 已退款状态 // ~~自己商城的订单状态修改逻辑 } catch (\Exception $exception) { \Log::error($exception->getMessage()); return false; } }
} ?>
第九步 以前的坑(勿踩)
再停止使用沙箱功能,用正式账号时,请注释掉此配置
注意:
1,当出现这个错误时: