laravel 微信支付easywechat

张永嘉
2023-12-01

1、引入easy wechat :
composer require “overtrue/laravel-wechat:~4.0”
laravel 5.8以上
composer require “overtrue/laravel-wechat:~5.0”

2、发布生成配置文件
php artisan vendor:publish --provider=“Overtrue\LaravelWeChat\ServiceProvider”

3、配置微信配置文件,在config/wechat.php
把微信支付打开注释,配置app_id,mch_id,key


    /*
     * 微信支付
     */
     'payment' => [
         'default' => [
             'sandbox'            => env('WECHAT_PAYMENT_SANDBOX', false),
             'app_id'             => env('WECHAT_PAYMENT_APPID', 'XXXXX'),
             'mch_id'             => env('WECHAT_PAYMENT_MCH_ID', 'XXXX'),
             'key'                => env('XXXXX'),
             'cert_path'          => env('WECHAT_PAYMENT_CERT_PATH', 'path/to/cert/apiclient_cert.pem'),    // XXX: 绝对路径!!!!
             'key_path'           => env('WECHAT_PAYMENT_KEY_PATH', 'path/to/cert/apiclient_key.pem'),      // XXX: 绝对路径!!!!
             'notify_url'         => 'http://XXXXXXX/wechat/notify',                           // 默认支付结果通知地址
         ],
         // ...
     ],

4、创建路由
//微信支付
Route::get(‘wechat/place/order’,‘Wechat\WechatController@placeOrder’); //生成微信支付订单
Route::post(‘wechat/notify’,‘Wechat\WechatController@notify’); //微信支付回调

5、创建controller

<?php
namespace App\Http\Controllers\Wechat;

use App\Http\Controllers\Controller;
use EasyWeChat\Factory;


class WechatController extends Controller
{
    // 请求微信接口的公用配置, 所以单独提出来
    private function payment()
    {
        $config = [
            // 必要配置, 这些都是之前在 .env 里配置好的
            'app_id' => config('wechat.payment.default.app_id'),
            'mch_id' => config('wechat.payment.default.mch_id'),
            'key' => config('wechat.payment.default.key'),   // API 密钥
            'notify_url' => config('wechat.payment.default.notify_url'),   // 通知地址
        ];
        // 这个就是 easywechat 封装的了, 一行代码搞定, 照着写就行了
        //var_dump($config);die;
        $app = Factory::payment($config);

        return $app;
    }

    /***
     * @author lifang
     * @info 订单支付
     */
    public function placeOrder()
    {
        $sOrderSn = orderSn();

        $app = $this->payment();

        //订单金额是要查询出来的,所以这里要处理订单金额,测试暂时使用1fen
        $nPrice = 1;

        $total_fee = env('APP_DEBUG') ? 1 : $nPrice;

        //第一次验签
        $result = $app->order->unify([
            'trade_type' => 'MWEB', // 原生支付即扫码支付,商户根据微信支付协议格式生成的二维码,用户通过微信“扫一扫”扫描二维码后即进入付款确认界面,输入密码即完成支付。
            'body' => '订单支付', // 这个就是会展示在用户手机上巨款界面的一句话, 随便写的
            'out_trade_no' => $sOrderSn,
            'total_fee' => $total_fee,
            'spbill_create_ip' => request()->ip(), // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址
            'notify_url' => config('wechat.payment.default.notify_url'),
//            'sign'             => config('wechat.payment.default.key'),
            'nonce_str' => 'sdas12',
//            'openid'           => '123'
        ]);
        

        //第二次验签
        if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {
            $result = $app->jssdk->appConfig($result['prepay_id']);//第二次签名
            return [
                'code' => 'success',
                'msg' => $result
            ];
        } else {
//              Log::error('微信支付签名失败:'.var_export($result,1));
            return false;
        }
    }

    /**
     * 微信测评支付回调方法,修改订单状态
     * @return mixed
     */
    public function notify()
    {
        $payment = EasyWeChat::payment();
        $response = $payment->handlePaidNotify(function ($message, $fail) {
            if ($message['return_code'] === 'SUCCESS' && $message['result_code'] === 'SUCCESS') {
//                \Log::debug($message);
                //业务逻辑
//                PcOrder::where('out_trade_no', $message['out_trade_no'])->update(['status' => 1, 'pay_time' => time()]);//更改订单状态
                //支付后,微信会在此处返回支付状态,就是$message,回调里面打印不出来,可通过写入日志里面查看,支付成功后更改订单状态。当然你也可以进行其他操作。
                return true;
            } else {
//                \Log::debug('我不买了');
                return $fail('失败');
            }
        });
        return $response;
    }


    // 实例化 easyweachat 类
    protected function app()
    {
        //$url = get_domain();
        $config = [
            'app_id' => config('wechat.payment.default.app_id'),
            'secret' => config('wechat.payment.default.mch_id'),
            //'token' => 'TestToken',
            'response_type' => 'array',

            'oauth' => [
//                'scopes' => ['snsapi_userinfo'],
                'scopes' => ['snsapi_login'],
                'callback' => 'http://39.106.113.193:8081' . '/api/login/oauth?pid=' . 123,
            ],

        ];

        $wechat_app = Factory::officialAccount($config);

        return $wechat_app;

    }

}

这里需要说一下,网页支付是不需要open_id的,如果需要根据实际情况去请求open_id,trade_type这个参数是支付类型,关注一下,多看看微信的官方文档https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1 看清楚参数,以免在使用中镐头发。

6、请求成功
我这里因为商户长时间没有支付和收款被微信禁用了,申请恢复支付功能了,所以返回的还在审核中,一般情况下是没有问题的。在业务逻辑中加上你的业务流程就可以了。

 类似资料: