laravel 微信公众号支付-----yansongda/laravel-pay

皮自明
2023-12-01

git地址: http://packagist.p2hp.com/packages/yansongda/laravel-pay

具体使用说明请传送至 https://github.com/yansongda/pay

快速实现微信公众号支付功能 :https://www.jianshu.com/p/9c322b1a5274

运行环境

  • php >= 7.0
  • composer
  • laravel || lumen >= 5.1
安装:
$ composer require yansongda/laravel-pay

配置文件:

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

lumen用户请手动复制

随后,请在 config 文件夹中完善配置信息。

.env 文件里面配置

// alipay 配置
ALI_APP_ID=
ALI_PUBLIC_KEY=
ALI_PRIVATE_KEY=

// wechat 配置
WECHAT_APP_ID=
WECHAT_MINIAPP_ID=
WECHAT_APPID=
WECHAT_MCH_ID=
WECHAT_KEY=

使用方法:

微信配置文件: config/pay.php

return [
    'wechat' => [
        // 公众号 APPID
        'app_id' => '',

        // 小程序 APPID
        'miniapp_id' => env('WECHAT_MINIAPP_ID', ''),

        // APP 引用的 appid
        'appid' => env('WECHAT_APPID', ''),

        // 微信支付分配的微信商户号
        'mch_id' => '',

        // 微信支付异步通知地址
        'notify_url' => '',

        // 微信支付签名秘钥
        'key' => '',

        // 客户端证书路径,退款、红包等需要用到。请填写绝对路径,linux 请确保权限问题。pem 格式。
        'cert_client' => public_path('cert/apiclient_cert.pem'),

        // 客户端秘钥路径,退款、红包等需要用到。请填写绝对路径,linux 请确保权限问题。pem 格式。
        'cert_key' => public_path('cert/apiclient_key.pem'),

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

后台文件

payController.php

   /*
     * 微信支付 唤起支付
     * @return response
     */
    public function wechatPay(Request $request)
    {
        $orderId = $request->input('order_id');
        if (!$orderId) {
            abort(404);
        }
        $userId = auth()->guard('home')->user()->id;
        $openid = auth()->guard('home')->user()->openid;
        $data = Order::where([
            'user_id' => $userId,
            'id' => $orderId,
            'status' => 1,
            'pay_status' => 1
        ])->first();
        if ($data) {
            $order = [
                'out_trade_no' => $data['order_num'],
                'body' => 'subject-测试',
                'total_fee' => '1',
                'openid' => $openid,
            ];
            $config = config('pay.wechat');
            $config['notify_url'] = config('app.url') . '/wechat/pay/notify';
            $config['return_url'] = config('app.url') . '/wechat/pay/return';
            $result = Pay::wechat($config)->mp($order);
            $resData = [   //返回信息给前台 ,前台调起来微信支付
                'timeStamp' => $result->timeStamp,
                'nonceStr' => $result->nonceStr,
                'packageStr' => $result->package,
                'signType' => $result->signType,
                'paySign' => $result->paySign,
            ];
            $data = [
                'code' => self::RESPONSE_CODE_SUCCESS,
                'msg' => '获取成功',
                'data' => $resData,
            ];
            return response()->json($data);
        }
        return response()->json([
            'code' => self::RESPONSE_CODE_ERROR,
            'msg' => '获取失败'
        ]);
    }

   前台文件:

 <!--jquery-->
    <script src="/js/jquery.min.js" type="text/javascript" charset="utf-8"></script>
    <!--微信的JSSDK-->
    <script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
    <script>
        $(function() {
            <!--通过config接口注入权限验证配置-->
            wx.config({
                debug: true, // 开启调试模式
                appId: '${configMap.appId}', // 公众号的唯一标识
                timestamp: '${configMap.timestamp}', // 生成签名的时间戳
                nonceStr: '${configMap.nonceStr}', // 生成签名的随机串
                signature: '${configMap.signature}',// 签名
                jsApiList: ['chooseWXPay'] // 填入需要使用的JS接口列表,这里是先声明我们要用到支付的JS接口
            });

            <!-- config验证成功后会调用ready中的代码 -->
            wx.ready(function(){
                //点击马上付款按钮
                $("#payBtn").click(function(){
                    //弹出支付窗口
                    wx.chooseWXPay({
                        timestamp: '${payMap.timeStamp}', // 支付签名时间戳,
                        nonceStr: '${payMap.nonceStr}', // 支付签名随机串,不长于 32 位
                        package: '${payMap.packageStr}', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=xxxx)
                        signType: '${payMap.signType}', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
                        paySign: '${payMap.paySign}', // 支付签名
                        success: function (res) {
                            // 支付成功后的回调函数
                            alert("支付成功!");
                        }
                    });
                })
            });
        });
    </script>

   /*
     * 微信支付异步通知
     * @return string|\Symfony\Component\HttpFoundation\Response
     */
    public function wechatNotify()
    {
        error_reporting(0);
        $config = config('pay.wechat');
        $pay = Pay::wechat($config);
        $data = $pay->verify(); // 是的,验签就这么简单
        \Log::info('wechat notify');
        \Log::info($data);
        if (!$data) {
            return '';
        }
        $orderSn = $data->out_trade_no;
        $transactionId = $data->transaction_id;
        //$orderSn = "2019080852999750";
        //$transactionId=time();
        $this->changeOrderStatus($orderSn, $transactionId);
        return $pay->success();
    }

//=======================================================================

微信退款管理:

新建控制器
use Yansongda\Pay\Pay;

退款方法

public function returnOrder(){
    $config = config('pay.wechat');
    $result = Pay::wechat($config)->refund([
           'out_trade_no' => $orderData->order_num, // 之前的订单流水号
           'total_fee' => 1,   //原订单金额,单位分
           'refund_fee' => 1,  // 要退款的订单金额,单位分
           'out_refund_no' =>Utils::getOrderNum(), // 退款订单号
           'notify_url' =>  config('app.url') . '/wechat/praise/notify' //

    /*
     * 微信退款地址
     * @return string|\Symfony\Component\HttpFoundation\Response
     */
    public function wechatRefundNotify()
    {
        error_reporting(0);
        $config = config('pay.wechat');
        $pay = Pay::wechat($config);
        $data = $pay->verify(null, true); // 是的,验签就这么简单
        \Log::info('refund notify');
        \Log::info($data);
        if (!$data) {
            return '';
        }
        $orderData = Order::where('order_num', $data['out_trade_no'])->first();
        if ($data['return_code'] === 'SUCCESS') {
            if ($orderData) {
                if (($orderData->pay_status == 2) && ($orderData->status == 4)) {
                    $orderData->update([
                        'pay_status' => 3,
                        'status' => 5,
                        'refund_status' => 2
                    ]);
                }
            }
        }
        return $pay->success();
    }
     ]);
}

larval 微信支付及退款到此结束

 类似资料: