EPay.php 2.1 KB

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