overtrue/laravel-wechat 4.0 laravel 微信支付、微信回调、微信查询

姬国安
2023-12-01

网上现有许多laravel的微信支付都是以前的版本,我就把新的捋一遍啊。

composer中配置的是

"overtrue/laravel-wechat": "^4.0",

基础配置不说了,网上都有,说一下使用吧。

jssdk:

    public function getJssdk(Request $request)
    {
        $app = new Application(get_weixin_config());
        $app->jssdk->setUrl($request->url);
        return $this->ok($app->jssdk->buildConfig(['chooseImage','onMenuShareAppMessage', 'onMenuShareQQ', 'showMenuItems', 'hideAllNonBaseMenuItem'], false, false, false));
    }

简略写法,一些参数有的不需要的自己选择。

 

1.微信支付:

public function pay($body, $detail, $out_trade_no, $total_fee, $productId , $trade_type , $openid='')
    {
        $app = new Application(get_weixin_config());
        //创建订单
        $attributes = [
            'trade_type' => $trade_type, // JSAPI,NATIVE,APP...
            'body' => $body,
            'detail' => $detail,
            'out_trade_no' => $out_trade_no,
            'total_fee' => $total_fee, // 单位:分
            'notify_url' => url('pay/wxpay_notify'),
            'product_id' => $productId,
            'openid' => $openid, // trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识,
        ];
        $result = $app->order->unify($attributes);
        if( $result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS'){
            if ($trade_type == 'JSAPI'){
                $config = $app->jssdk->bridgeConfig($result['prepay_id'], false); // 生成支付 JS 配置
                return $config;
            }
            return $result;
        }else{
            Log::error('微信支付签名失败:'.var_export($result,1));
            return false;
        }
    }

微信支付我是把jaspi和native写在一起了,注意jssdk需要传openid,拿到paepay_id后还要再做操作。

2.微信回调

public function wxpay_notify(Request $request)
    {
        $app = Factory::payment(get_weixin_config());
        $response = $app->handlePaidNotify(function ($notify, $fail) {
            $out_trade_no = $notify['out_trade_no']; // 商户订单号
            $trade_no = $notify['transaction_id'];  // 微信支付订单号
            $order = 我先在数据库里查询了自己的订单信息
            if (empty($order)) {
                return true; // 告诉微信,我已经处理完了,订单没找到,别再通知我了
            }
            if ($notify['return_code'] === 'SUCCESS') { // return_code 表示通信状态,不代表支付状态
                // 用户是否支付成功
                if (array_get($notify, 'result_code') === 'SUCCESS') {
                  //加入自己支付完成后该做的事
                }
            } else {
                return $fail('通信失败,请稍后再通知我');
            }
            return true;
        });
        return $response;
    }

3.微信查询,PC上扫码支付成功后不会主动跳转,只能自己写个js查询啦。

public function wxpay_query(Request $request)
    {
        $app = Factory::payment(get_weixin_config());
        $response = $app->order->queryByOutTradeNumber($request->order_no);
        if ($response['return_code'] == 'SUCCESS' && $response['result_code'] == 'SUCCESS') {
            if ($response['trade_state'] == 'SUCCESS') {
                //如果需要加入后续支付成功步骤的话自己加
                return $this->ok();
            }else {
                return $this->fail();
            }
        }else {
            return $this->fail();
        }
    }

原创文章,转发请注明出处。

 类似资料: