PaymentService.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <?php
  2. namespace App\Services;
  3. use BsPaySdk\core\BsPay;
  4. use BsPaySdk\request\V2TradePaymentJspayRequest;
  5. use BsPaySdk\request\V2TradePaymentScanpayRequest;
  6. use BsPaySdk\request\V2TradePaymentWappayRequest;
  7. use BsPaySdk\request\V2TradePaymentPayscanpayRequest;
  8. use BsPaySdk\request\V2TradePaymentQueryRequest;
  9. use BsPaySdk\request\V2TradePaymentRefundRequest;
  10. use Illuminate\Support\Facades\Log;
  11. class PaymentService
  12. {
  13. public function __construct()
  14. {
  15. // 初始化SDK
  16. $config = array(
  17. 'app_id' => config('dgpay.app_id'),
  18. 'app_secret' => config('dgpay.app_secret'),
  19. 'merchant_no' => config('dgpay.merchant_no'),
  20. 'notify_url' => config('dgpay.notify_url'),
  21. 'return_url' => config('dgpay.return_url'),
  22. 'is_sandbox' => config('dgpay.is_sandbox'),
  23. 'gateway' => config('dgpay.is_sandbox') ? config('dgpay.sandbox_gateway') : config('dgpay.gateway'),
  24. );
  25. BsPay::init($config);
  26. }
  27. /**
  28. * 创建支付订单
  29. *
  30. * @param string $orderNo 商户订单号
  31. * @param float $amount 支付金额
  32. * @param string $subject 商品标题
  33. * @param string $payType 支付方式:ALIPAY_H5/WECHAT_H5等
  34. * @return array
  35. */
  36. public function createOrder(string $orderNo, float $amount, string $subject, string $payType): array
  37. {
  38. try {
  39. $request = match ($payType) {
  40. 'ALIPAY_H5', 'WECHAT_H5' => new V2TradePaymentWappayRequest(),
  41. 'ALIPAY_JSAPI', 'WECHAT_JSAPI' => new V2TradePaymentJspayRequest(),
  42. 'ALIPAY_NATIVE', 'WECHAT_NATIVE' => new V2TradePaymentScanpayRequest(),
  43. default => throw new \InvalidArgumentException('Unsupported pay type: ' . $payType),
  44. };
  45. $request->setOutOrderNo($orderNo);
  46. $request->setTransAmt($amount);
  47. $request->setGoodsDesc($subject);
  48. $request->setPayType($payType);
  49. $response = BsPay::request($request);
  50. if ($response->isSuccess()) {
  51. return [
  52. 'success' => true,
  53. 'data' => $response->getData()
  54. ];
  55. }
  56. return [
  57. 'success' => false,
  58. 'message' => $response->getMsg()
  59. ];
  60. } catch (\Exception $e) {
  61. Log::error('DgPay create order error: ' . $e->getMessage());
  62. return [
  63. 'success' => false,
  64. 'message' => $e->getMessage()
  65. ];
  66. }
  67. }
  68. /**
  69. * 查询订单
  70. *
  71. * @param string $orderNo 商户订单号
  72. * @return array
  73. */
  74. public function queryOrder(string $orderNo): array
  75. {
  76. try {
  77. $request = new V2TradePaymentQueryRequest();
  78. $request->setOutOrderNo($orderNo);
  79. $response = BsPay::request($request);
  80. if ($response->isSuccess()) {
  81. return [
  82. 'success' => true,
  83. 'data' => $response->getData()
  84. ];
  85. }
  86. return [
  87. 'success' => false,
  88. 'message' => $response->getMsg()
  89. ];
  90. } catch (\Exception $e) {
  91. Log::error('DgPay query order error: ' . $e->getMessage());
  92. return [
  93. 'success' => false,
  94. 'message' => $e->getMessage()
  95. ];
  96. }
  97. }
  98. /**
  99. * 退款
  100. *
  101. * @param string $orderNo 商户订单号
  102. * @param string $refundNo 退款单号
  103. * @param float $amount 退款金额
  104. * @return array
  105. */
  106. public function refund(string $orderNo, string $refundNo, float $amount): array
  107. {
  108. try {
  109. $request = new V2TradePaymentRefundRequest();
  110. $request->setOutOrderNo($orderNo);
  111. $request->setOutRefundNo($refundNo);
  112. $request->setRefundAmt($amount);
  113. $response = BsPay::request($request);
  114. if ($response->isSuccess()) {
  115. return [
  116. 'success' => true,
  117. 'data' => $response->getData()
  118. ];
  119. }
  120. return [
  121. 'success' => false,
  122. 'message' => $response->getMsg()
  123. ];
  124. } catch (\Exception $e) {
  125. Log::error('DgPay refund error: ' . $e->getMessage());
  126. return [
  127. 'success' => false,
  128. 'message' => $e->getMessage()
  129. ];
  130. }
  131. }
  132. /**
  133. * 验证签名
  134. *
  135. * @param array $data
  136. * @return bool
  137. */
  138. public function verifySign(array $data): bool
  139. {
  140. try {
  141. return BsPay::verifySign($data);
  142. } catch (\Exception $e) {
  143. Log::error('DgPay verify sign error: ' . $e->getMessage());
  144. return false;
  145. }
  146. }
  147. }