laravel5.5 支付接口 —— 支付宝

2018-11-08 08:13:27   Laravel

  支付接口   支付宝   支付  

laravel5.5 支付 —— 支付宝

配置

商家账号服务申请很麻烦, 为了快速测试 可以用 沙箱测试版app, 不过目前 只支持 安卓手机

测试的服务,也要实名认证和身份扩展后才可以,也就填写一些个人信息,很简单,这里不做详细介绍

蚂蚁金服开放平台

蚂蚁金服沙箱测试版

说明


private_key 私钥

private_key 是商家应用私钥,获取方法说明,我是下载 Mac版的(RSA签名工具下载地址),生成秘钥的格式应该选 PKCS1(非JAVA使用) ,但我这里一直生成失败,不知道 是不是因为黑苹果的原因T_T,所以这里我是这样处理的:

1.秘钥格式 先选,PKCS8(JAVA适用),点击生成秘钥

2.复制 商户应用私钥,点击标签栏的格式装换, 粘贴,点击 转PKCS1(非JAVA使用)私钥,生成内容则为 下方配置中private_key的值

image
image

ali_public_key 公钥

千万要注意 ali_public_key不是RSA签名工具 生成的公钥,而是 支付宝后台应用中的 RSA2(SHA256)密钥支付宝公钥

获取方法:

1.RSA签名验签工具格式转换中 点击生成公钥文件 复制内容

image

2.进入后台,设置RSA2(SHS256)秘钥应用公钥,粘贴上刚才复制的内容

image

image

3.保存成功后, 点击查看支付宝公钥, 就能获取到支付宝公钥了

image

image

秘钥调试工具


配置文件

config 目录下新建 alipay.php 文件 配置以下内容

  1. <?php
  2. return [
  3. 'pay' => [
  4. // APPID
  5. 'app_id' => '************',
  6. // 支付宝 支付成功后 主动通知商户服务器地址 注意 是post请求
  7. 'notify_url' => 'http://192.168.0.110:9555/api/home/ali_pay_ntify',
  8. // 支付宝 支付成功后 回调页面 get
  9. 'return_url' => 'http://192.168.0.110:9528/#/pay_success',
  10. // 公钥(注意是支付宝的公钥,不是商家应用公钥)
  11. 'ali_public_key' => '********',
  12. // 加密方式: **RSA2** 私钥 商家应用私钥
  13. 'private_key' => '********',
  14. 'log' => [ // optional
  15. 'file' => '../storage/logs/alipay.log',
  16. 'level' => 'info', // 建议生产环境等级调整为 info,开发环境为 debug
  17. 'type' => 'single', // optional, 可选 daily.
  18. 'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
  19. ],
  20. 'http' => [
  21. 'timeout' => 5.0,
  22. 'connect_timeout' => 5.0,
  23. // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
  24. ],
  25. 'mode' => 'dev', // optional,设置此参数,将进入沙箱模式
  26. ]
  27. ];

支付组件

  1. composer require yansongda/pay

二维码生成器

  1. composer require simplesoftwareio/simple-qrcode

控制器

本例 中只简单介绍常用的,手机网站支付、app支付、扫码支付、退款,更多功能请参考 官方文档

  1. use Yansongda\Pay\Pay;
  2. use App\Services\OrderService;
  3. use SimpleSoftwareIO\QrCode\Facades\QrCode;
  4. class AliPayController extends Controller
  5. {
  6. // 手机网页支付接口
  7. public function aliPay(Request $request)
  8. {
  9. $aliPayOrder = [
  10. 'out_trade_no' => time(),
  11. 'total_amount' => $order->total_amount, // 支付金额
  12. 'subject' => $request->subject ?? '支付宝手机网页支付' // 备注
  13. ];
  14. $config = config('alipay.pay');
  15. $config['return_url'] = $config['return_url'].'?id='.$request->id;
  16. $config['notify_url'] = $config['notify_url'].'?id='.$request->id;
  17. return Pay::alipay($config)->wap($aliPayOrder);
  18. }
  19. // app支付接口
  20. public function aliPayApp(Request $request)
  21. {
  22. $aliPayOrder = [
  23. 'out_trade_no' => time(),
  24. 'total_amount' => $order->total_amount, // 支付金额
  25. 'subject' => $request->subject ?? '默认' // 备注
  26. ];
  27. $config = config('alipay.pay');
  28. $config['return_url'] = $config['return_url'].'?id='.$request->id;
  29. return Pay::alipay($config)->app($aliPayOrder);
  30. }
  31. // 支付宝扫码 支付
  32. public function aliPayScan(Request $request)
  33. {
  34. $aliPayOrder = [
  35. 'out_trade_no' => time(),
  36. 'total_amount' => $order->total_amount, // 支付金额
  37. 'subject' => $request->subject ?? '扫码支付' // 备注
  38. ];
  39. $config = config('alipay.pay');
  40. $config['return_url'] = $config['return_url'].'?order_guid='.$request->order_guid;
  41. $scan = Pay::alipay($config)->scan($aliPayOrder);
  42. if(empty($scan->code) || $scan->code !== '10000') return false;
  43. $url = $scan->code.'?order_guid='.$request->order_guid;
  44. // 生成二维码
  45. return QrCode::encoding('UTF-8')->size(300)->generate($url);
  46. }
  47. // 支付成功后 支付宝服务通知本项目服务器
  48. // post 请求
  49. // 这里只是大概写一下逻辑,具体的安全防护 自己再去做限制
  50. public function aliPayNtify(Request $request, OrderService $orderService)
  51. {
  52. $order = Order::find($request->id);
  53. // 更新自己项目 订单状态
  54. if(!empty($order)) $orderService->payOrder($order);
  55. }
  56. // 支付宝退款
  57. public function aliPayRefund(Request $request)
  58. {
  59. try {
  60. $payOrder = [
  61. 'out_trade_no' => $order->out_trade_no, // 商家订单号
  62. 'refund_amount' => $order->total_amount, // 退款金额 不得超过该订单总金额
  63. 'out_request_no' => Common::getUuid() // 同一笔交易多次退款标识(部分退款标识)
  64. ];
  65. $config = config('alipay.pay');
  66. // 返回状态码 code 10000 成功
  67. $result = Pay::alipay($config)->refund($payOrder);
  68. if (empty($result->code) || $result->code !== '10000') throw new \Exception('请求支付宝退款接口失败');
  69. // 订单改为 已退款状态
  70. // ~~自己商城的订单状态修改逻辑
  71. } catch (\Exception $exception) {
  72. \Log::error($exception->getMessage());
  73. return false;
  74. }
  75. }
  76. }

参考文章地址

https://github.com/yansongda/pay/

https://yansongda.gitbooks.io/pay/

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

感谢你的支持,我会继续努力!
扫码打赏,建议金额1-10元