EPay.php 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. 'sign_type' => 'MD5'
  34. ];
  35. $data['sign'] = $this->sign($this->prepareSign($data));
  36. $client = new Client(['timeout' => 5]);
  37. $request = $client->get(self::$systemConfig['epay_url'].'/submit.php');
  38. $result = json_decode($request->getBody(), true);
  39. if($request->getStatusCode() != 200){
  40. return Response::json(['status' => 'fail', 'message' => '网关处理失败!']);
  41. }
  42. if(!$result){
  43. return Response::json(['status' => 'fail', 'message' => '支付处理失败!']);
  44. }
  45. Payment::whereId($payment->id)->update(['qr_code' => 1, 'url' => $result['pay_url']]);
  46. return Response::json(['status' => 'success', 'data' => $payment->trade_no, 'message' => '创建订单成功!']);
  47. }
  48. // 签名字符串
  49. private function sign($data): string {
  50. unset($data['sign'], $data['sign_type']);
  51. array_filter($data);
  52. ksort($data);
  53. reset($data);
  54. return md5(urldecode(http_build_query($data).self::$systemConfig['epay_key']));
  55. }
  56. public function notify(Request $request): void {
  57. if($this->verify($request->except('method'), $request->input('sign'))
  58. && $request->input('trade_status') == 'TRADE_SUCCESS'){
  59. $this->postPayment($request->input('out_trade_no'), 'EPay');
  60. die('SUCCESS');
  61. }
  62. die('FAIL');
  63. }
  64. // 验证签名
  65. private function verify($data, $signature): bool {
  66. return $this->sign($data) === $signature;
  67. }
  68. public function queryInfo(): JsonResponse {
  69. $request = self::$client->get('api.php', [
  70. 'query' => [
  71. 'act' => 'query',
  72. 'pid' => self::$systemConfig['epay_mch_id'],
  73. 'key' => self::$systemConfig['epay_key']
  74. ]
  75. ]);
  76. if($request->getStatusCode() == 200){
  77. return Response::json(['status' => 'success', 'data' => json_decode($request->getBody(), true)]);
  78. }
  79. return Response::json(['status' => 'fail', 'message' => '获取失败!请检查配置信息']);
  80. }
  81. }