Laravel-pay 最優雅的微信支付

sea-robbers發表於2019-07-14

前後端分離微信支付

為了解決相關問題看了許多部落格文章這裡是記錄解決問題和方法,文章有不對的地方給予建議哦
安裝和配置就不一一介紹了請參照文件,話不多直接上程式碼你懂得。

參考連結

<?php
namespace App\Http\Controllers;
use SimpleSoftwareIO\QrCode\BaconQrCodeGenerator;
use Yansongda\Pay\Exceptions\GatewayException;
use Yansongda\Pay\Log;
use Yansongda\Pay\Pay;
class PayController extends Controller
{
  protected $order = [
            'out_trade_no' => time(), // 只能是數字、大小寫字母_-|* 且在同一個商戶號下唯一 要求32字元
            'body'         => '訂單支付',
            'total_fee'    => '1',  // 訂單總金額,單位為分,詳見支付金額
        ];

    /**
     * 掃碼支付
     *
     * @return mixed
     */
    public function weixinScanPay()
    {
        //  對支付異常捕獲和支付日誌記錄
        try {
            $pay = Pay::wechat(config('pay.wechat'))->scan($order);
            $res = (new BaconQrCodeGenerator)
                ->format('svg')
                ->size(200)->errorCorrection("L")
                ->generate($pay['code_url']);
            return $res;
        } catch (GatewayException $e) {
            Log::info('二維碼出錯:' . $e->getMessage());
        }

    }

    /**
     * H5支付訂單下單處理
     * @return string
     */
    public function H5Pay()
    {
       // TODO:訂單處理
        $order = $this->order;
        try {
            $wap = Pay::wechat(config('pay.wechat'))->wap($order);
            // 回撥地址支付完成頁面  config('pay.wechat.pay_success')地址需要與前端約定
            $mweb_url = $wap->getTargetUrl() . '&redirect_url=' . config('pay.wechat.pay_success');
            $set_wap = Pay::wechat(config('pay.wechat'))->wap($order)->setTargetUrl($mweb_url);
            return $set_wap->getContent();// html內容進行跳轉
        } catch (GatewayException $e) {
            Log::info(date("H:i:s") . " 訂單{order['out_trade_no']}");
            if (strpos($e->getMessage(), 'OK該訂單已支付') === false) {
                // 不是已支付訂單
                //  $e->getMessage();
            } else {
              // 訂單已支付訊息;
            }

        }

    }

    /**
     * 獲取 wx js api pay 資訊
     *
     * @param Api $api
     * @return mixed
     */
    public function Pay()
    {
       // 業務處理
        $order = $this->order
        try {
            return Pay::wechat(config('pay.wechat'))->mp($order);
        } catch (GatewayException $e) {
            Log::info(date("H:i:s") . " 訂單{order['out_trade_no']}");
            if (strpos($e->getMessage(), 'OK該訂單已支付') === false) {
                // 不是已支付訂單
            } else {
            // 訂單已支付
            }
        }
    }
    /**
     * 支付回撥 
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function notify()
    {
        try {

            Log::info('微信支付回撥開始<================================支付中');

            $pay = Pay::wechat(config('pay.wechat'));

            $data = $pay->verify(); // 驗籤

            Log::debug('支付回撥引數', $data->all());

            $outTradeNo = $data->out_trade_no;
            Log::info('訂單編號====' . $outTradeNo);
           // 業務處理
        } catch (GatewayException $e) {

            Log::error('微信回撥錯誤', [$e->getMessage()]);

        }

        Log::info('微信支付回撥結束================================>支付已完成');、
        }
    }
}

laravel -pay 本地開發測試注意客戶端IP地址獲取

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章