项目作者: cncal

项目描述 :
Alipay (web) for laravel
高级语言: PHP
项目地址: git://github.com/cncal/alipay.git
创建时间: 2017-09-28T03:59:02Z
项目社区:https://github.com/cncal/alipay

开源协议:MIT License

下载


Alipay(web) for laravel

支付宝官方文档
English Document

安装

  • 执行命名:

    1. $ composer require cncal/alipay
  • 如果 Laravel 版本小于5.5:

    • 添加 AlipayServiceProviderconfig/appproviders

      1. Cncal\Alipay\AlipayServiceProvider::class,
    • 添加 Facade 至 config/appaliases

      1. 'Alipay' => Cncal\Alipay\Facades\Alipay::class,
  • 发布资源文件 config/alipay.phpstorage/logs/alipay.log

    1. $ php artisan vendor:publish --provider="Cncal\Alipay\AlipayServiceProvider"

配置

config/alipay.php 中配置支付宝信息:

  1. return [
  2. 'gateway_url' => "https://openapi.alipay.com/gateway.do",
  3. 'app_id' => "",
  4. 'alipay_public_key' => "",
  5. 'merchant_private_key' => "",
  6. 'charset' => "UTF-8",
  7. 'sign_type' => "RSA2",
  8. 'notify_url' => "",
  9. 'return_url' => "",
  10. ];

merchant_private_keymerchant_public_key 可由支付宝开放平台提供的RSA签名验签工具生成。
生成之后在平台配置密钥,即可获取 alipay_public_key。如有问题,请查阅参考文档

  • gateway_url:支付宝网关
  • app_id:创建应用后获取的 app_id
  • alipay_public_key:与 app_id 对应的支付宝公钥,查看地址
  • merchant_private_key:RSA 签名验签工具生成的商家私钥
  • charset:仅支持 GBK 和 UTF-8
  • sign_type:生成商家公钥和私钥的签名方式,目前仅支持 RSA 和 RSA2, 推荐使用 RSA2
  • notify_url:支付成功后的异步通知地址,支付宝用 POST 方式请求该地址,所以确保该地址可以被访问到,尤其当你的网站有认证机制的时候
  • return_url:支付成功后的同步回调地址,尽量不要在该地址后添加任何参数,例如 ?date=***。如果必须这样做,在 Alipay::check 之前 unset 它们

使用

  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use App\Http\Controllers\Controller;
  5. use Alipay;
  6. class AlipayController extends Controller
  7. {
  8. /**
  9. * 支付.
  10. * https://docs.open.alipay.com/api_1/alipay.trade.pay
  11. */
  12. public function pay(Request $request)
  13. {
  14. $this->validate($request, [
  15. // 商户订单号,64个字符以内、可包含字母、数字、下划线;需保证在商户端不重复
  16. 'out_trade_no' => 'required|unique:orders,out_trade_no|max:64|alpha_num',
  17. // 订单标题
  18. 'title' => 'required',
  19. // 订单描述
  20. 'description' => 'nullable',
  21. // 订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
  22. 'total_amount' => 'required|numeric|between:0.01,100000000',
  23. ]);
  24. $data = $request->only(['out_trade_no', 'title', 'description', 'total_amount']);
  25. Alipay::pay($data);
  26. }
  27. /**
  28. * 交易查询
  29. * https://docs.open.alipay.com/api_1/alipay.trade.query
  30. */
  31. public function query(Request $request)
  32. {
  33. $this->validate($request, [
  34. // 订单支付时传入的商户订单号,和支付宝交易号不能同时为空
  35. // trade_no, out_trade_no 如果同时存在优先取 trade_no
  36. 'out_trade_no' => 'required_without:trade_no',
  37. ]);
  38. $data = $request->only(['trade_no', 'out_trade_no']);
  39. $response = Alipay::query($data);
  40. }
  41. /**
  42. * 退款.
  43. * https://docs.open.alipay.com/api_1/alipay.trade.refund
  44. */
  45. public function refund(Request $request)
  46. {
  47. $this->validate($request, [
  48. 'out_trade_no' => 'required_without:trade_no',
  49. // 标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传
  50. 'out_request_no' => 'nullable|max:64',
  51. 'refund_reason' => 'nullable',
  52. // 需要退款的金额,该金额不能大于订单金额,单位为元,支持两位小数
  53. 'refund_amount' => 'required',
  54. ]);
  55. $data = $request->only(['trade_no', 'out_trade_no', 'out_request_no', 'refund_reason', 'refund_amount']);
  56. $response = Alipay::refund($data);
  57. }
  58. /**
  59. * 退款查询.
  60. * https://docs.open.alipay.com/api_1/alipay.trade.fastpay.refund.query
  61. */
  62. public function refundQuery(Request $request)
  63. {
  64. $this->validate($request, [
  65. 'out_trade_no' => 'required_without:trade_no',
  66. // 请求退款接口时,传入的退款请求号,如果在退款请求时未传入,则该值为创建交易时的外部交易号
  67. 'out_request_no' => 'required',
  68. ]);
  69. $data = $request->only(['trade_no', 'out_trade_no', 'out_request_no']);
  70. $response = Alipay::refundQuery($data);
  71. }
  72. /**
  73. * 关闭交易
  74. * https://docs.open.alipay.com/api_1/alipay.trade.close
  75. */
  76. public function close(Request $request)
  77. {
  78. $this->validate($request, [
  79. 'out_trade_no' => 'required_without:trade_no',
  80. ]);
  81. $data = $request->only(['trade_no', 'out_trade_no']);
  82. $response = Alipay::close($data);
  83. }
  84. /**
  85. * 异步通知方法
  86. * https://docs.open.alipay.com/270/105902/
  87. */
  88. public function paidNotify()
  89. {
  90. if (Alipay::check($_POST)) {
  91. // 支付是否成功以异步通知为准,所以可以在此方法中进行一些操作,例如更新订单状态,通知用户支付结果
  92. $out_trade_no = $_POST['out_trade_no'];
  93. $trade_no = $_POST['trade_no'];
  94. $trade_status = $_POST['trade_status'];
  95. if ($_POST['trade_status'] == 'TRADE_FINISHED') {
  96. // 交易已完成,不能退款
  97. } else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
  98. // 支付成功
  99. }
  100. // 不要修改或删除此行
  101. echo "success";
  102. } else {
  103. echo "fail";
  104. }
  105. }
  106. /**
  107. * 同步回调方法
  108. */
  109. public function paidReturn()
  110. {
  111. // 如果配置的同步回调地址有附加参数,例如 `?date=***`,unset 它们 (unset($_GET['data']))
  112. if (Alipay::check($_GET)) {
  113. // 一般地,跳转到支付成功页面
  114. $out_trade_no = $_GET['out_trade_no'];
  115. $trade_no = $_GET['trade_no'];
  116. return view('trade_success');
  117. } else {
  118. echo "fail";
  119. }
  120. }
  121. }
  122. ?>