123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- <?php
- namespace App\Services;
- use BsPaySdk\core\BsPay;
- use BsPaySdk\request\V2TradePaymentJspayRequest;
- use BsPaySdk\request\V2TradePaymentScanpayRequest;
- use BsPaySdk\request\V2TradePaymentWappayRequest;
- use BsPaySdk\request\V2TradePaymentPayscanpayRequest;
- use BsPaySdk\request\V2TradePaymentQueryRequest;
- use BsPaySdk\request\V2TradePaymentRefundRequest;
- use Illuminate\Support\Facades\Log;
- class PaymentService
- {
- public function __construct()
- {
- // 初始化SDK
- $config = array(
- 'app_id' => config('dgpay.app_id'),
- 'app_secret' => config('dgpay.app_secret'),
- 'merchant_no' => config('dgpay.merchant_no'),
- 'notify_url' => config('dgpay.notify_url'),
- 'return_url' => config('dgpay.return_url'),
- 'is_sandbox' => config('dgpay.is_sandbox'),
- 'gateway' => config('dgpay.is_sandbox') ? config('dgpay.sandbox_gateway') : config('dgpay.gateway'),
- );
- BsPay::init($config);
- }
- /**
- * 创建支付订单
- *
- * @param string $orderNo 商户订单号
- * @param float $amount 支付金额
- * @param string $subject 商品标题
- * @param string $payType 支付方式:ALIPAY_H5/WECHAT_H5等
- * @return array
- */
- public function createOrder(string $orderNo, float $amount, string $subject, string $payType): array
- {
- try {
- $request = match ($payType) {
- 'ALIPAY_H5', 'WECHAT_H5' => new V2TradePaymentWappayRequest(),
- 'ALIPAY_JSAPI', 'WECHAT_JSAPI' => new V2TradePaymentJspayRequest(),
- 'ALIPAY_NATIVE', 'WECHAT_NATIVE' => new V2TradePaymentScanpayRequest(),
- default => throw new \InvalidArgumentException('Unsupported pay type: ' . $payType),
- };
- $request->setOutOrderNo($orderNo);
- $request->setTransAmt($amount);
- $request->setGoodsDesc($subject);
- $request->setPayType($payType);
- $response = BsPay::request($request);
- if ($response->isSuccess()) {
- return [
- 'success' => true,
- 'data' => $response->getData()
- ];
- }
- return [
- 'success' => false,
- 'message' => $response->getMsg()
- ];
- } catch (\Exception $e) {
- Log::error('DgPay create order error: ' . $e->getMessage());
- return [
- 'success' => false,
- 'message' => $e->getMessage()
- ];
- }
- }
- /**
- * 查询订单
- *
- * @param string $orderNo 商户订单号
- * @return array
- */
- public function queryOrder(string $orderNo): array
- {
- try {
- $request = new V2TradePaymentQueryRequest();
- $request->setOutOrderNo($orderNo);
- $response = BsPay::request($request);
- if ($response->isSuccess()) {
- return [
- 'success' => true,
- 'data' => $response->getData()
- ];
- }
- return [
- 'success' => false,
- 'message' => $response->getMsg()
- ];
- } catch (\Exception $e) {
- Log::error('DgPay query order error: ' . $e->getMessage());
- return [
- 'success' => false,
- 'message' => $e->getMessage()
- ];
- }
- }
- /**
- * 退款
- *
- * @param string $orderNo 商户订单号
- * @param string $refundNo 退款单号
- * @param float $amount 退款金额
- * @return array
- */
- public function refund(string $orderNo, string $refundNo, float $amount): array
- {
- try {
- $request = new V2TradePaymentRefundRequest();
- $request->setOutOrderNo($orderNo);
- $request->setOutRefundNo($refundNo);
- $request->setRefundAmt($amount);
- $response = BsPay::request($request);
- if ($response->isSuccess()) {
- return [
- 'success' => true,
- 'data' => $response->getData()
- ];
- }
- return [
- 'success' => false,
- 'message' => $response->getMsg()
- ];
- } catch (\Exception $e) {
- Log::error('DgPay refund error: ' . $e->getMessage());
- return [
- 'success' => false,
- 'message' => $e->getMessage()
- ];
- }
- }
- /**
- * 验证签名
- *
- * @param array $data
- * @return bool
- */
- public function verifySign(array $data): bool
- {
- try {
- return BsPay::verifySign($data);
- } catch (\Exception $e) {
- Log::error('DgPay verify sign error: ' . $e->getMessage());
- return false;
- }
- }
- }
|