EPay.php 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <?php
  2. namespace App\Http\Controllers\Gateway;
  3. use App\Models\Payment;
  4. use Auth;
  5. use GuzzleHttp\Client;
  6. use Illuminate\Http\JsonResponse;
  7. use Illuminate\Http\Request;
  8. use Response;
  9. class EPay extends AbstractPayment {
  10. // Todo Debug测试
  11. public function purchase(Request $request): JsonResponse {
  12. $payment = $this->creatNewPayment(Auth::id(), $request->input('oid'), $request->input('amount'));
  13. switch($request->input('type')){
  14. case 2:
  15. $type = 'qqpay';
  16. break;
  17. case 3:
  18. $type = 'wxpay';
  19. break;
  20. case 1:
  21. default:
  22. $type = 'alipay';
  23. break;
  24. }
  25. $data = [
  26. 'pid' => self::$systemConfig['epay_mch_id'],
  27. 'type' => $type,
  28. 'out_trade_no' => $payment->trade_no,
  29. 'notify_url' => (self::$systemConfig['website_callback_url']?: self::$systemConfig['website_url']).'/callback/notify?method=epay',
  30. 'return_url' => self::$systemConfig['website_url'].'/invoices',
  31. 'name' => self::$systemConfig['subject_name']?: self::$systemConfig['website_name'],
  32. 'money' => $payment->amount,
  33. ];
  34. $data['sign'] = $this->sign($this->prepareSign($data));
  35. $client = new Client(['timeout' => 5]);
  36. $request = $client->get(self::$systemConfig['epay_url'].'/submit.php');
  37. $result = json_decode($request->getBody(), true);
  38. if($request->getStatusCode() != 200){
  39. return Response::json(['status' => 'fail', 'message' => '网关处理失败!']);
  40. }
  41. if(!$result){
  42. return Response::json(['status' => 'fail', 'message' => '支付处理失败!']);
  43. }
  44. Payment::whereId($payment->id)->update(['qr_code' => 1, 'url' => $result['pay_url']]);
  45. return Response::json(['status' => 'success', 'data' => $payment->trade_no, 'message' => '创建订单成功!']);
  46. }
  47. // 签名字符串
  48. private function sign($data): string {
  49. return strtolower(md5($data.self::$systemConfig['epay_key']));
  50. }
  51. private function prepareSign($data): string {
  52. ksort($data);
  53. return http_build_query($data);
  54. }
  55. public function notify(Request $request): void {
  56. if(!$this->verify($request->all(), $request->input('sign'))){
  57. die('FAIL');
  58. }
  59. $this->postPayment($request->input('out_trade_no'), 'EPay');
  60. die('SUCCESS');
  61. }
  62. // 验证签名
  63. private function verify($data, $signature): bool {
  64. unset($data['sign']);
  65. return $this->sign($this->prepareSign($data)) === $signature;
  66. }
  67. }