laravel5.7的微信(Alipay )与支付宝(WeChat )支付

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Wild_sir/article/details/100100020

laravel5.7的微信(Alipay )与支付宝(WeChat )支付

先composer一下包(两个,第一个做支付宝的第二个做微信的不要问我问啥,我就想这样)

composer require yansongda/laravel-pay
overtrue/laravel-wechat

点击这里你会看到第一个包
点击这里你会看到第二个包

配置文件:

php artisan vendor:publish --provider="Yansongda\LaravelPay\PayServiceProvider" --tag=laravel-pay

然后呢你config文件夹里面配置(pay.php)

<?php

return [
    //旧版支付宝接口配置(临时新增)
    'temp_alipay' => [
        // 支付宝分配的 APPID
        'app_id'           => '***',

        //合作身份者id,以2088开头的16位纯数字
        'partner_id'       => '***',

        //卖家支付宝帐户
        'seller_id'        => '****',

        //安全检验码,以数字和字母组成的32位字符
        'key'              => '****',

        //异步通知连接
        'notify_url'       => '******,

        //同步返回地址
        'return_url'       => '',

        //商户私钥文件地址,绝对路径
        'private_key_path' => storage_path('alipay/rsa_private_key.pem'),

        //阿里公钥文件地址,绝对路径
        'public_key_path'  => storage_path('alipay/rsa_public_key.pem'),
    ],
    //新版支付宝接口配置
    'alipay'      => [
        // 支付宝分配的 APPID
        'app_id'         => env('ALI_APP_ID', ''),

        // 支付宝异步通知地址
        'notify_url'     => env('ALI_PAY_NOTIFY_URL', ''),

        // 支付成功后同步通知地址
        'return_url'     => env('ALI_PAY_RETURN_URL', ''),

        // 阿里公共密钥,验证签名时使用
        'ali_public_key' => env('ALI_PUBLIC_KEY', ''),

        // 自己的私钥,签名时使用
        'private_key'    => env('ALI_PRIVATE_KEY', ''),

        // optional,默认 warning;日志路径为:sys_get_temp_dir().'/logs/yansongda.pay.log'
        'log'            => [
            'file' => storage_path('logs/pay/alipay.log'),
            //  'level' => 'debug'
            'type' => 'daily', // optional, 可选 daily.
            //  'max_file' => 30,
        ],

        // optional,设置此参数,将进入沙箱模式
        // 'mode' => 'dev',
    ],
];

然后在config(wechat.php)

/*
     * 微信支付
     */
    'payment'          => [
        'default' => [
            'sandbox'    => env('WECHAT_PAYMENT_SANDBOX', false),
            'app_id'     => env('WECHAT_PAYMENT_APPID', '...'),
            'mch_id'     => env('WECHAT_PAYMENT_MCH_ID', '....'),
            'key'        => env('WECHAT_PAYMENT_KEY', '...'),
            'cert_path'  => storage_path('wxpay/apiclient_cert.pem'),
            // XXX: 绝对路径!!!!
            'key_path'   => storage_path('wxpay/apiclient_key.pem'),
            // XXX: 绝对路径!!!!
            'notify_url' => env('WECHAT_PAYMENT_NOTIFY_URL', '.....'),
            // 默认支付结果通知地址
        ],
        // ...
    ],

根据上面的常量这时候需要配置.env的文件 对应是啥上面都有(自己查)

#微信支付相关配置
WECHAT_PAYMENT_SANDBOX=
WECHAT_PAYMENT_APPID=
WECHAT_PAYMENT_MCH_ID=
WECHAT_PAYMENT_KEY=
WECHAT_PAYMENT_NOTIFY_URL=


#支付相关 
#alipay 配置
ALI_APP_ID=
ALI_PUBLIC_KEY=
ALI_PRIVATE_KEY=
ALI_PAY_RETURN_URL=
ALI_PAY_NOTIFY_URL=


然后呢就是还是代码上线(啦啦啦)
Controller:

 public function payInit(PayInitRequest $request, Order $order)
    {

        $user = Auth::guard(self::GUARD_TYPE)->user();
		//这就是一个判断(可以没有)
        $checkAbilityResult = $this->orderService->checkPayInitAbility($user, $order->id, $order->extra->phone);
        if (!$checkAbilityResult['status']) {
            return $this->failed($checkAbilityResult['message']);
        }

        if ($order->applet_user_id != $user->getAuthIdentifier()) {
            return $this->failed('非法订单');
        }
        if ($order->pay_status == Order::PAY_STATUS_PAYED) {
            return $this->failed('该订单已支付');
        }
        if ($order->status == Order::STATUS_OFF) {
            return $this->failed('该订单已关闭,请重新下单');
        }

        if ($order->pay_fee <= 0) {
            return $this->failed('订单异常,请联系客服');
        }
       //到这结束(下面的是有用的) 

        $pay_type = $request->post('pay_type');
        if (!in_array($pay_type, Order::PAY_TYPES)) {
            return $this->failed('请选择正确的支付方式');
        }

        $initResult = $this->orderService->payInit($user, $order, $pay_type);

        if (!$initResult['status']) {
            return $this->failed($initResult['message']);
        }

        $result = [
            'pre_pay' => $initResult['data']
        ];
        return $this->success($result);
    }

Service:

<?php

use App\Libs\Alipay\WapSdk;
use App\Modules\Applet\Order\Services\Interfaces\OrderInterface;
use App\Services\BaseService;
use App\Modules\Api\Oss\Services\Interfaces\AliOssInterface;
use App\Services\Traits\OrderHandleTrait;
use Illuminate\Support\Facades\DB;
use EasyWeChat;
use Log;
use Pay;
use Yansongda\Pay\Gateways\Alipay;
use Exception;

class OrderService extends BaseService implements OrderInterface
{

    use OrderHandleTrait;

    /**
     * @var EasyWeChat\Payment\Application
     */
    protected $wxPayment;

    /**
     * @var Alipay
     */
    protected $aliPay;

  

    /**
     * OrderService constructor.
     *
     */
    public function __construct()
    {
        $this->wxPayment = EasyWeChat::payment();

        $this->aliPay = Pay::alipay();

    }

    /**
     * 支付初始化
     *
     * @param AppletUser $user
     * @param Order      $order
     * @param string     $pay_type
     *
     * @return array|mixed
     */
    public function payInit($user, $order, $pay_type)
    {

        switch ($pay_type) {
            case Order::PAY_TYPE_ALI:(支付宝)
			(列子)
//                $options = [
//                    'out_trade_no' => $order->order_sn,
//                    'total_amount' => $order->pay_fee * 0.01,
//                    'subject'      => $order->name,
//                    'http_method'  => 'GET'
//                ];

//                $result = $this->aliPay->wap($options);
//                return $result->getContent();

                $wap = new WapSdk(config('pay.temp_alipay'));

                $pay_url = $wap->setOutTradeNo($order->order_sn)
                    ->setTotalFee($order->pay_fee * 0.01)
                    ->setSubject($order->name)
                    ->setBody($order->name)
                    ->setAppPay('Y')
                    ->setExterInvokeIp(request()->ip())
                    ->getPayLink();

                $data = [
                    'pay_url' => $pay_url
                ];

                break;
            case Order::PAY_TYPE_WECHAT: (微信)
            (列子)
				  // $unifyResult:
                //{
                //    "return_code": "SUCCESS",
                //    "return_msg": "OK",
                //    "appid": "wx2421b1c4390ec4sb",
                //    "mch_id": "10000100",
                //    "nonce_str": "IITRi8Iabbblz1J",
                //    "openid": "oUpF8uMuAJO_M2pxb1Q9zNjWeSs6o",
                //    "sign": "7921E432F65EB8ED0CE9755F0E86D72F2",
                //    "result_code": "SUCCESS",
                //    "prepay_id": "wx201411102639507cbf6ffd8b0779950874",
                //    "trade_type": "JSAPI"
                //}
                try {
                    $unifyResult = $this->wxPayment->order->unify([
                        'body'         => $order->name,
                        'out_trade_no' => $order->order_sn,
                        'total_fee'    => $order->pay_fee,
                        'trade_type'   => 'JSAPI',
                        'openid'       => $user->openid,
                    ]);
                } catch (Exception $e) {
                    return $this->baseFailed('获取支付配置失败');
                }

                if ($unifyResult['return_code'] != 'SUCCESS') {
                    return $this->baseFailed('获取微信支付配置失败:通信失败');
                }

                if ($unifyResult['result_code'] != 'SUCCESS') {
                    Log::error('订单:' . $order->order_sn . ' 用户获取微信支付配置失败。err_code:' . $unifyResult['err_code'] . ' err_code_des: ' . $unifyResult['err_code_des']);

                    return $this->baseFailed('获取微信支付配置失败');
                }

                $prepayId = $unifyResult['prepay_id'];
                $data     = $this->wxPayment->jssdk->bridgeConfig($prepayId, false);

                break;

            default:
                return $this->baseFailed('未知的支付方式');
        }

        $old_status_fmt = $order->statusFormat();
        try {
            $order->status = Order::STATUS_WAITE_PAY;
            $order->save();
        } catch (Exception $e) {
            return $this->baseFailed('获取支付配置失败');
        }

        $this->orderHandleLog($user, $order, $old_status_fmt, '学员拉起支付');

        return $this->baseSucceed($data);
    }

}

退款

Service:

se App\Services\Traits\OrderHandleTrait;
use EasyWeChat;
use Yansongda\LaravelPay\Facades\Pay;
use Yansongda\Pay\Gateways\Alipay;
use Exception;

 use OrderHandleTrait;

    /**
     * @var EasyWeChat\Payment\Application
     */
    protected $wxPayment;

    /**
     * @var Alipay
     */
    protected $aliPayment;

    /**
     * PayNotifyService constructor.
     */
    public function __construct()
    {
        $this->wxPayment = EasyWeChat::payment();

        $this->aliPayment = Pay::alipay();
    }
/**
     * 退款业务
   
     *
     * @param             $user
     * @param OrderRefund $refund
     *
     * @return bool|string
     * @throws Exception
     */
    public function refund($user, $refund)
    {
        if (!$refund->order) {
            return false;
        }

        if (!in_array($refund->order->status, [
            Order::STATUS_REFUND_APPLY_BEFORE_AUDIT,
            Order::STATUS_REFUND_APPLY_WITH_AUDIT_FAILURE,
            Order::STATUS_REFUND_AFTER_AUDIT,
            Order::STATUS_REFUND_AFTER_STUDY
        ])) {
            return false;
        }

        if (!in_array($refund->status, [OrderRefund::STATUS_WAITE, OrderRefund::STATUS_HANDLE])
            || $refund->student_confirm != OrderRefund::CONFIRMED
            || $refund->school_confirm != OrderRefund::CONFIRMED) {
            return false;
        }

        $result = false;

        if ($refund->refund_money > 0) {

            switch ($refund->order->pay_type) {
                case Order::PAY_TYPE_ALI:
//                $result = $this->aliRefund($refund->order->order_sn, $refund->refund_sn, $refund->order->pay_fee,
//                    $refund->refund_money);
                    $result = $this->tempAliRefund($refund->order->order_sn, $refund->refund_sn, $refund->refund_money);

                    break;
                case Order::PAY_TYPE_WECHAT:

                    //一年前的订单无法退款
                    if ($refund->order->paid_at->getTimestamp() < strtotime('-1 year')) {
                        throw new Exception('交易时间超过一年的订单无法提交微信退款');
                    }

                    $result = $this->wxRefund($refund->order->order_sn, $refund->refund_sn, $refund->order->pay_fee,
                        $refund->refund_money);
                    break;
            }
        } else {
            $result = '';
        }

        if ($result === false) {
            return false;
        }

        return $result;
    }

    /**
     * 微信退款
     *
     * @param string $order_sn
     * @param string $refund_sn
     * @param int    $payed_fee
     * @param int    $refund_fee
     *
     * @return bool|string
     */
    private function wxRefund($order_sn, $refund_sn, $payed_fee, $refund_fee)
    {

        try {
            $result = $this->wxPayment->refund->byOutTradeNumber($order_sn, $refund_sn, $payed_fee, $refund_fee, [
                'refund_desc' => '学员报名订单退款',
            ]);

            if ($result['return_code'] !== 'SUCCESS') {
                return false;
            }

            if (array_get($result, 'result_code') !== 'SUCCESS') {
                return false;
            }

            return $result['refund_id'];
        } catch (Exception $e) {
            return false;
        }

    }

    /**
     * 新版本支付宝退款
     *
     * @param $order_sn
     * @param $refund_fee
     *
     * @return bool
     */
    private function aliRefund($order_sn, $refund_fee)
    {

        $params = [
            'out_trade_no'  => $order_sn,
            'refund_amount' => $refund_fee * 0.01,
        ];

        try {
            $result = $this->aliPayment->refund($params);

            if ($result->trade_status != 'TRADE_SUCCESS') {
                return false;
            }

            return true;
        } catch (Exception $e) {
            return false;
        }
    }

    /**
     * 旧版支付宝退款
     *
     * @param string $order_sn
     * @param string $refund_sn
     * @param int    $refund_fee
     *
     * @return bool
     */
    private function tempAliRefund($order_sn, $refund_sn, $refund_fee)
    {

        $refund = new RefundSdk(config('pay.temp_alipay'));

        try {
            $refund_result = $refund->refund($order_sn, $refund_fee * 0.01, $refund_sn, '学员报名订单退款');

            if (!$refund_result) {
                return false;
            }

            return $refund_result['trade_no'];
        } catch (Exception $e) {
            return false;
        }
    }

剩下的你就调用就完事了

猜你喜欢

转载自blog.csdn.net/Wild_sir/article/details/100100020
今日推荐