微信支付&&二维码生成

首先进入composer官方网站,然后搜索phpqrcode安装包。

composer require aferrandini/phpqrcode

  

我用的是thinkphp框架,所以在用的时候我是使用命名空间的方式(可能是个废话,大家应该都懂)

use app\common\model\User;;
use app\common\model\Order;
use wxpay\database\WxPayResults;
use wxpay\database\WxPayUnifiedOrder;
use wxpay\database\WxPayOrderQuery;
use wxpay\NativePay;
use wxpay\WxPayApi;
use wxpay\WxPayConfig;
use Predis;
use PHPQRCode\QRcode;

  

我在控制器中创建了一个公用的生成二维码的方法,如下:

// 公用二维码生成
    static function setQrcode($url){
        //二维码图片保存路径
        $pathname = date("Ymd",time());
        $pathname = "./public/wxpay/qrcode/" . $pathname;
        if(!is_dir($pathname)) { //若目录不存在则创建之
            mkdir($pathname);
        }
        $qrcode = new QRcode();
        //二维码图片保存路径(若不生成文件则设置为false)
        $filename = $pathname . "/qrcode_" . randOrder() . ".png";
        //二维码容错率,默认L
        $level = "L";
        //二维码图片每个黑点的像素,默认4
        $size = '10';
        //二维码边框的间距,默认2
        $padding = 2;
        //保存二维码图片并显示出来,$filename必须传递文件路径
        $saveandprint = true;
        //生成二维码图片
        $qrcode->png($url,$filename,$level,$size,$padding,$saveandprint);
        //二维码logo
        $logo = "./public/wxpay/images/logo.png";
        $QR = imagecreatefromstring(file_get_contents($filename));
        $logo = imagecreatefromstring(file_get_contents($logo));
        $QR_width = imagesx($QR);
        $QR_height = imagesy($QR);
        $logo_width = imagesx($logo);
        $logo_height = imagesy($logo);
        $logo_qr_width = $QR_width / 5;
        $scale = $logo_width / $logo_qr_width;
        $logo_qr_height = $logo_height / $scale;
        $from_width = ($QR_width - $logo_qr_width) / 2;
        imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
        imagepng($QR,$filename);
        return $filename;
    }
}

  

然后在自己想要调用的地方直接调用这个方法。

protected function initialize(){
        parent::initialize();
        if (!self::islogin()){
            $this->error('您需要登录后在进行操作','user/login');
        }
        $this->Order = new Order();
    }
    public function index(){
        $product_id = (time()+1).createStr(22);
        $notify = new NativePay();
        $input = new WxPayUnifiedOrder();
        $input->setBody("微信支付的东西");
        $input->setAttach("xxx");
        //$input->setOutTradeNo(WxPayConfig::MCHID.date("YmdHis"));
        $input->setOutTradeNo($product_id);
        $input->setTotalFee("1");//以分为单位,一般是要乘100的。
        $input->setTimeStart(date("YmdHis"));
        $input->setTimeExpire(date("YmdHis", time() + 600));
        $input->setGoodsTag("test");
        $input->setNotifyUrl(wxPayConfig::NOTIFY_URL);
        $input->setTradeType("NATIVE");
        //$product_id 为商品自定义id 可用作订单ID
        $input->setProductId($product_id);
        /*
        $data = [
            'order_id'  =>  $input->getOutTradeNo(),
            'uid'   =>  session('uid'),
            'amount'    =>  $input->getTotalFee(),
        ];
        $res = db('order')->insert($data);
        */
        $result = $notify->getPayUrl($input);

        if (empty($result['code_url'])){
            $qrCode_url = '';
        }else{
            $qrCode_url = $this->setQrcode($result['code_url']);
        }
        return $this->fetch('',[
            'qrCode_url' => $qrCode_url,
            'product_id'    =>  $product_id,
        ]);
    }

  这个是结合微信的支付功能的二维码生成器,

下面这段代码是ajax回调支付是否成功的判断,redis在里面的操作以及一个微信支付的回调地址(最后一个暂时没有用)

/**
     * 查看订单的状态
     */
    public function orderstate(){
        error_reporting(E_ERROR);
        ini_set('date.timezone','Asia/Shanghai');
        $transaction_id = $_REQUEST['transaction_id'];
        $out_trade_no = $_REQUEST['out_trade_no'];
        if(request()->param('transaction_id') != null && request()->param('transaction_id') != ""){
            $input = new WxPayOrderQuery();
            $input->setTransactionId($transaction_id);
            if (WxPayApi::orderQuery($input)['trade_state']==='SUCCESS'){
                db('order')->where('order_id',$transaction_id)->update(['ispay'=>'1']);
            }else{
                // 支付失败
                db('order')->where('order_id',$transaction_id)->update(['ispay'=>'2']);
            }
            return json(WxPayApi::orderQuery($input));
        }

        if(request()->param('out_trade_no') != null && request()->param('out_trade_no') != ""){
            $input = new WxPayOrderQuery();
            $input->setOutTradeNo($out_trade_no);
            if (WxPayApi::orderQuery($input)['trade_state']==='SUCCESS'){
                db('order')->where('order_id',$out_trade_no)->update(['ispay'=>'1']);
            }else{
                db('order')->where('order_id',$out_trade_no)->update(['ispay'=>'2']);
            }
            return json(WxPayApi::orderQuery($input));
        }
    }
    /**
     * 微信支付 回调逻辑处理
     * @return string
     */
    public function notify(){
        $wxData = file_get_contents("php://input");
        //file_put_contents('/tmp/2.txt',$wxData,FILE_APPEND);
        try{
            $resultObj = new WxPayResults();
            $wxData = $resultObj->Init($wxData);
        }catch (\Exception $e){
            $resultObj ->setData('return_code','FAIL');
            $resultObj ->setData('return_msg',$e->getMessage());
            return $resultObj->toXml();
        }

        if ($wxData['return_code']==='FAIL'||
            $wxData['return_code']!== 'SUCCESS'){
            $resultObj ->setData('return_code','FAIL');
            $resultObj ->setData('return_msg','error');
            return $resultObj->toXml();
        }
        // TODO 根据订单号 out_trade_no 来查询订单数据
        $out_trade_no = $wxData['out_trade_no'];
        //此处为举例
        $input = new WxPayUnifiedOrder();
        db('order')->where('order_id',$input->getOutTradeNo())->update(['ispay'=>'1']);
        db('order')->where('order_id',$out_trade_no)->update(['ispay'=>'2']);
        $order = db('order')->where(['order_id' => $out_trade_no])->find();

        if (!$order || $order->status == 1){
            $resultObj ->setData('return_code','SUCCESS');
            $resultObj ->setData('return_msg','OK');
            return $resultObj->toXml();
        }
        //TODO 数据更新 业务逻辑处理 $order
    }
    // redis 的操作
    public function myredis(){
        $client =  new Predis\Client([
            'scheme'    =>  'tcp',
            'host'  =>  config('redis.REDIS_HOST'),
            'port'  =>  config('redis.REDIS_PORT'),
            'password'  =>  config('redis.REDIS_AUTH'),
            'database'  =>  1,
        ]);
        $client->set('han','this is my name');
        $client->rpush('mylist',['one']);
        $client->rpush('mylist',['two']);
        $client->rpush('mylist',['three']);
        $client->rpush('mylist',['fore']);
        // 查看mylist中所有的数据
        $valueAll = $client->lrange('mylist','0','-1');
        // 查找第二个push进去的数据
        $value = $client->lindex('mylist','-2');
        dump($valueAll);
    }

  

最主要的前端代码出来了,快夸我无私吧兄弟们。

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Javascript 二维码生成库:QRCode</title>
    <script type="text/javascript" src="__STATIC__/js/jquery-3.3.1.min.js"></script>
    <script type="text/javascript" src="__STATIC__/js/qrcode.min.js"></script>
</head>
<body>
<img id="img" src="/{$qrCode_url}" alt="" width="150px" />
<br />
<div class="onqr">
    <input type="hidden" id="out_trade_no" value="{$product_id}" >
    {:token()}
</div>
<script type="text/javascript">
    // 产看订单状态
    var time = setInterval("check()",3000);    //3秒查询一次是否支付成功
    function check() {
        var url = "{:url('/index/Wxpay/orderstate')}";
        var out_trade_no = $("#out_trade_no").val();
        var param = {'out_trade_no':out_trade_no};
        $.post(url,param,function(data){
            var obj = eval(data);
            if (obj.trade_state == 'SUCCESS') {
                time = window.clearInterval(time);
                $(".onqr").hide();
                // 支付成功把二维码替换成支付成功图标
                $("#img").attr('src','/public/wxpay/images/success.png');
                console.log(obj);
            }else{
                console.log(obj);
            }
        });
    }
</script>
</body>
</html>
posted @ 2019-06-18 09:37  hcfinal  阅读(1700)  评论(1编辑  收藏  举报