123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- <?php
- // +----------------------------------------------------------------------
- // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
- // +----------------------------------------------------------------------
- // | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
- // +----------------------------------------------------------------------
- // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
- // +----------------------------------------------------------------------
- // | Author: CRMEB Team <admin@crmeb.com>
- // +----------------------------------------------------------------------
- namespace crmeb\services\pay\storage;
- use crmeb\exceptions\AdminException;
- use crmeb\services\pay\BasePay;
- use crmeb\exceptions\PayException;
- use crmeb\services\pay\PayInterface;
- use crmeb\services\app\MiniProgramService;
- use crmeb\services\app\WechatService;
- use crmeb\services\SystemConfigService;
- use EasyWeChat\Payment\API;
- use EasyWeChat\Payment\Order;
- use EasyWeChat\Support\Collection;
- use Psr\Http\Message\ResponseInterface;
- /**
- * 微信支付
- * Class WechatPay
- * @package crmeb\services\pay\storage
- */
- class WechatPay extends BasePay implements PayInterface
- {
- protected function initialize(array $config)
- {
- // TODO: Implement initialize() method.
- }
- /**
- * 创建订单进行支付
- * @param string $orderId
- * @param string $totalFee
- * @param string $attach
- * @param string $body
- * @param string $detail
- * @param array $options
- * @return array|mixed|string
- */
- public function create(string $orderId, string $totalFee, string $attach, string $body, string $detail, array $options = [])
- {
- $this->authSetPayType();
- switch ($this->payType) {
- case Order::NATIVE:
- return WechatService::nativePay(null, $orderId, $totalFee, $attach, $body, $detail);
- case Order::APP:
- return WechatService::appPay($options['openid'], $orderId, $totalFee, $attach, $body, $detail);
- case Order::JSAPI:
- if (empty($options['openid'])) {
- throw new PayException('缺少openid');
- }
- if (request()->isRoutine()) {
- // 获取配置 判断是否为新支付
- if ($options['pay_new_weixin_open']) {
- return MiniProgramService::newJsPay($options['openid'], $orderId, $totalFee, $attach, $body, $detail, $options);
- }
- return MiniProgramService::jsPay($options['openid'], $orderId, $totalFee, $attach, $body, $detail);
- }
- return WechatService::jsPay($options['openid'], $orderId, $totalFee, $attach, $body, $detail);
- case 'h5':
- return WechatService::paymentPrepare(null, $orderId, $totalFee, $attach, $body, $detail, 'MWEB');
- default:
- throw new PayException('微信支付:支付类型错误');
- }
- }
- /**
- * 支付到零钱
- * @param string $openid
- * @param string $orderId
- * @param string $amount
- * @param array $options
- * @return bool|mixed
- */
- public function merchantPay(string $openid, string $orderId, string $amount, array $options = [])
- {
- return WechatService::merchantPay($openid, $orderId, $amount, $options['desc'] ?? '');
- }
- /**
- * 退款
- * @param string $outTradeNo
- * @param array $opt
- * @return Collection|mixed|ResponseInterface
- */
- public function refund(string $outTradeNo, array $opt = [])
- {
- if (!isset($opt['pay_price'])) throw new PayException(400730);
- $totalFee = floatval(bcmul($opt['pay_price'], 100, 0));
- $refundFee = isset($opt['refund_price']) ? floatval(bcmul($opt['refund_price'], 100, 0)) : null;
- $refundReason = $opt['desc'] ?? '';
- $refundNo = $opt['refund_id'] ?? $outTradeNo;
- $opUserId = $opt['op_user_id'] ?? null;
- $type = $opt['type'] ?? 'out_trade_no';
- /**
- * 仅针对老资金流商户使用
- * REFUND_SOURCE_UNSETTLED_FUNDS---未结算资金退款(默认使用未结算资金退款)
- * REFUND_SOURCE_RECHARGE_FUNDS---可用余额退款
- */
- $refundAccount = $opt['refund_account'] ?? 'REFUND_SOURCE_UNSETTLED_FUNDS';
- if (isset($opt['wechat'])) {
- $result = WechatService::refund($outTradeNo, $refundNo, $totalFee, $refundFee, $opUserId, $refundReason, $type, $refundAccount);
- } else {
- if ($opt['pay_new_weixin_open']) {
- $result = MiniProgramService::miniRefund($outTradeNo, $totalFee, $refundFee, $opt);
- } else {
- $result = MiniProgramService::refund($outTradeNo, $refundNo, $totalFee, $refundFee, $opUserId, $refundReason, $type, $refundAccount);
- }
- }
- if (!empty($opt['pay_new_weixin_open'])) {
- if ($result['errcode'] != 0) throw new AdminException($result['errmsg']);
- } else {
- if (isset($result['return_code']) && $result['return_code'] != 'SUCCESS') throw new AdminException($result['return_msg']);
- if (isset($result['result_code']) && $result['result_code'] != 'SUCCESS') throw new AdminException($result['err_code_des']);
- if (isset($result['status']) && $result['status'] != 'SUCCESS') throw new AdminException($result['status']);
- }
- }
- /**
- * 查询退款订单
- * @param string $outTradeNo
- * @param string $outRequestNo
- * @param array $other
- * @return Collection|mixed|ResponseInterface
- */
- public function queryRefund(string $outTradeNo, string $outRequestNo, array $other = [])
- {
- return WechatService::queryRefund($outTradeNo, $other['type'] ?? API::OUT_TRADE_NO);
- }
- /**
- * 异步回调
- * @return mixed|\Symfony\Component\HttpFoundation\Response
- * @throws \EasyWeChat\Core\Exceptions\FaultException
- */
- public function handleNotify()
- {
- return WechatService::handleNotify();
- }
- }
|