thinkphp5 的微信支付整合

下载地址:链接: https://pan.baidu.com/s/1eRUkvtC 密码: eu98

原作者的:链接: https://pan.baidu.com/s/1dFyE4t7 密码: s9a7

下载后直接解压至extend目录下

然后去公共函数库common写一个函数:

//微信支付函数
function wxpay($body,$total_fee,$out_trade_no){
    //传入支付参数
    //$out_trade_no = date('Ymd').time().mt_rand();
    $params = [
        'body' => $body,
        'out_trade_no' => $out_trade_no,
        'total_fee' => $total_fee,
        'product_id' => $out_trade_no,
        'notify_url' => 'http://'.$_SERVER['HTTP_HOST'].'/index/user/notifyPay',
    ];
    $result = \wxpay\NativePay::getPayImage($params,300,300);
    return $result;
}

这个$result返回的是一个封装好的img标签包含处理好的二维码

在这里贴出上面使用的getPayIamge方法

checkParams($params);
        if(empty($params['product_id'])) {
            throw new \WxPayException('商品ID(product_id)商品ID必须');
        }

        // 2.组装参数
        $input = $that->getPostData($params);

        // 3.进行请求
        $tools = new \WxPayNativePay();
        $result = $tools->GetPayUrl($input);

        // 4.进行结果检验
        $that->checkResult($result);

        // 5.返回支付二维码图片
        $url = urlencode($result["code_url"]);
        $payImage = "扫码支付";
        return $payImage;
    }

    // 组装请求参数
    private function getPostData($params)
    {
        $input  = new \WxPayUnifiedOrder();
        $input->SetBody($params['body']);
        $input->SetOut_trade_no($params['out_trade_no']);
        $input->SetTotal_fee($params['total_fee']);
        // $input->SetGoods_tag("test");
        $input->SetNotify_url($params['notify_url']);
        $input->SetTrade_type("NATIVE");
        $input->SetProduct_id($params['product_id']);
        return $input;
    }
}

异步查询控制方法,是利用js'的ajax方法请求

//ajax实时请求微信支付结果
    public function notifypay($out_trade_no)
    {
        $result = \wxpay\Query::exec($out_trade_no);
        if($result['trade_state'] == 'SUCCESS'){
            return 1;
        }else{
            return 0;
        }
    }
在这里依然贴出上面调用的Query方法

SetTransaction_id($query_no);
        } else {
            $input->SetOut_trade_no($query_no);
        }

        // 2.进行请求
        $result = \WxPayApi::orderQuery($input);
        return $result;
    }
}
在这里贴出处理订单的判断及方法

    //如果支付成功,跳转页面,开始处理订单状态
    public function doorder($oid)
    {
        //通过订单号向微信查询改订单状态数据集
        $data = \wxpay\Query::exec($oid);
        if(!array_key_exists("transaction_id", $data)){
            $this->success('不存在的订单号','commend/commendStore');
        }
        //获取该订单号数据
        $order = OrderModel::get(['oid'=>$oid]);

        if(!$order->oid) {
            $this->success('不存在的订单号','commend/commendStore');
        }

         if($order->status == 2){
             $this->success('订单已经被处理过','commend/commendStore');
         }
        //获取订单号中优惠卡的数据
        $card = Card::get($order->card_id);
        //获取平台财务数据
        $m = Finance::get(1);
        //设置分润,earn为平台提成,money为平台剩余商户余额
        $earn = $card->promotion_price * ($m->commission / 100);
        $money = $card->promotion_price - $earn;
        //保持小数点后两位,累加到平台余额
        $m->money = $m->money + round($money,2);
        $m->earn = $m->earn + round($earn,2);
        // 启动事务
        Db::startTrans();
        try{
            //修改订单状态和保存平台财务数据
            OrderModel::where('oid',$oid)->update(['status'=>2]);
            $m->save();
            // 提交事务
            Db::commit();
        } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
            $this->success('订单处理失败,请联系运营方','commend/commendStore');
        }

        $this->success('付款成功','commend/commendStore');

    }

在最后贴出扫描二维码页面的js

    $(function(){
        setInterval(function(){check()} , 10000);  //每隔三秒执行一次 ajax
        function check(){
            var out_trade_no = $('#oid').html();
            $.ajax({
                type: "post",
                url: '{:url("store/order/notifypay")}',  //请求函数
                async: false,
                data: {'out_trade_no':out_trade_no},
                dataType: "json",
                success: function (data) {
                    if (data == 1) {
                        location.href="/store/order/doorder/oid/"+out_trade_no;
                    }else{
                        result = false;
                    }
                }
            });
        }
    })


你可能感兴趣的:(ThinkPHP5)