美文网首页
PHP微信支付(laravel,TP等通用)

PHP微信支付(laravel,TP等通用)

作者: 余温1224 | 来源:发表于2020-02-25 15:30 被阅读0次

1.在 大白象下载wechat包

  composer require "overtrue/laravel-wechat:~3.0" -vvv (考虑运行环境,下个低点得版本,通用)

2.生成配置文件

php artisan vendor:publish --provider="Overtrue\LaravelWechat\ServiceProvider"

3.修改配置文件 config/wechat.php

<?php

use  EasyWeChat\Foundation\Application;

  return [

      ...

      /*

        * 账号基本信息,请从微信公众平台/开放平台获取

        */

      'app_id'  => env('WECHAT_APPID', '你的微信公众号id'),        // AppID应用id

      'secret'  => env('WECHAT_SECRET', 'your-app-secret'),    // AppSecret

      'token'  => env('WECHAT_TOKEN', 'your-token'),          // Token

      'aes_key' => env('WECHAT_AES_KEY', ''),                    // EncodingAESKey

........

      /*

        * 微信支付的配置

        */

        'payment' => [

            'merchant_id'        => env('WECHAT_PAYMENT_MERCHANT_ID', 'your-mch-id'),//微信相关的支付账号 =》商户账号

            'key'                => env('WECHAT_PAYMENT_KEY', 'key-for-signature'),//微信相关的支付密码=》支付密钥

            //'cert_path'          => env('WECHAT_PAYMENT_CERT_PATH', 'path/to/your/cert.pem'), // XXX: 绝对路径!!!!

            //'key_path'          => env('WECHAT_PAYMENT_KEY_PATH', 'path/to/your/key'),      // XXX: 绝对路径!!!!

            // 'device_info'    => env('WECHAT_PAYMENT_DEVICE_INFO', ''),

            // 'sub_app_id'      => env('WECHAT_PAYMENT_SUB_APP_ID', ''),

            // 'sub_merchant_id' => env('WECHAT_PAYMENT_SUB_MERCHANT_ID', ''),

            // ...

        ],

      ...

      /**

        * Guzzle 全局设置

        * 这个是为了那个证书的调用但是有没有的原因 也就是 添加guzzle配置关闭SSL认证

        * 更多请参考: http://docs.guzzlephp.org/en/latest/request-options.html

        */

      'guzzle' => [

          'timeout' => 3.0, // 超时时间(秒)

          'verify' => false, // 关掉 SSL 认证

      ],

  ];

4.需要下载一个二维码生成器我们还是在大白象

composer require "endroid/qrcode:~2.5" -vvv

easywechat参考文档:https://www.easywechat.com/docs/3.x/overview

二维码参考文档:https://github.com/endroid/qr-code/tree/2.x

public function wxPay()

    {

//订单ID

        $id = \request()->get("id");

//把订单找出来

        $orderModel = Order::find($id);

        //0.配置

        $options = config("wechat");

        //dd($options);

        $app = new Application($options);

        $payment = $app->payment;

        //1.生成订单

        $attributes = [

            'trade_type' => 'NATIVE', // JSAPI,NATIVE,APP...

           //JSAPI 公众号支付 NATIVE 扫码支付 APP APP支付

            'body' => '名字',

            'detail' => '详情',

            'out_trade_no' => $orderModel->order_code,

            'total_fee' => $orderModel->total * 100, // 单位:分

            'notify_url' => 'http://www.XXX.com', // 支付结果通知网址,如果不设置则会使用配置里的默认地址

            // 'openid'          => '当前用户的 openid', // trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识,

            // ...

        ];

        $order = new \EasyWeChat\Payment\Order($attributes);

        //2. 统计下单

        $result = $payment->prepare($order);

        if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS') {

            //2.1 拿到预支付链接

            $codeUrl = $result->code_url;

            $qrCode = new QrCode($codeUrl);

            $qrCode->setSize(250);//大小

// Set advanced options

            $qrCode

                ->setMargin(10)//外边框

                ->setEncoding('UTF-8')//编码

                ->setErrorCorrectionLevel(ErrorCorrectionLevel::HIGH)//容错级别

                ->setForegroundColor(['r' => 0, 'g' => 0, 'b' => 0])//码颜色

                ->setBackgroundColor(['r' => 255, 'g' => 255, 'b' => 255])//背景色

                ->setLabel('微信扫码支付', 16, public_path("font/msyh.ttf"), LabelAlignment::CENTER)

                ->setLogoPath(public_path("images/logo.png"))//LOGO设置图片

                ->setLogoWidth(100);//LOGO大小

// Directly output the QR code

            header('Content-Type: ' . $qrCode->getContentType());//响应类型

            exit($qrCode->writeString());

        } else {

            return $result;

        }

    }

5.异步通知

public function ok()

    {

        //0.配置

        $options = config("wechat");

        $app = new Application($options);

        //1.回调

        $response = $app->payment->handleNotify(function ($notify, $successful) {

            // 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单

          // $order = 查询订单($notify->out_trade_no);

            $order=Order::where("order_code",$notify->out_trade_no)->first();

            if (!$order) { // 如果订单不存在

                return 'Order not exist.'; // 告诉微信,我已经处理完了,订单没找到,别再通知我了

            }

            // 如果订单存在

            // 检查订单是否已经更新过支付状态

            if ($order->status==1) { // 假设订单字段“支付时间”不为空代表已经支付

                return true; // 已经支付成功了就不再更新了

            }

            // 用户是否支付成功

            if ($successful) {

                // 不是已经支付状态则修改为已经支付状态

                //$order->paid_at = time(); // 更新支付时间为当前时间

                $order->status = 1;

            }

            $order->save(); // 保存订单

            return true; // 返回处理完成

        });

        return $response;

    }

6.返回状态

public function status()

    {

        $id = \request()->get("id");

        $order = Order::find($id);

        return $order;

***:

      如果在线上linux里面生成是没有问题的,但是如果是在window10本地测试你的用户不是admin就要注意权限的问题

,很有可能会出一个bug,The directory "C:\Window" is not writable 

解决方案:

在该项目的

vendor\overtrue\wechat\src\Foundation\Application.php找(registerBase()这个方法)

强行修改一下返回的文件缓存就可以了

return new FilesystemCache(storage_path("app/public"));

ps:到线上可根据自己注释或者改回去

相关文章

网友评论

      本文标题:PHP微信支付(laravel,TP等通用)

      本文链接:https://www.haomeiwen.com/subject/eimxfqtx.html