• tp5 快速接入扫码支付


    前提是申请好微信支付,同时配置好key,以及支付回调地址

    1.composer

    composer require yansongda/pay
    

    2.引入

    use YansongdaPayPay; // 引入支付
    

    3.获取支付二维码字符串

    /**
         * @param $order_num
         * @param $price
         * @param string $pinfo
         * @return object
         */
        public function _get_wx_pay_code($order_num,$price,$pinfo = '')
        {
            $order_code_url = Cache::store('redis')->get($order_num);
            if ($order_code_url){
                return $order_code_url;
            }
            $config = [
                'wechat' => [
                    'app_id' => config('wechat.app_id'),
                    'mch_id' => config('wechat.mch_id'),
                    'notify_url' => config('wechat.notice_uri'),
                    'key' => config('wechat.key'),
                    'cert_client' => './apiclient_cert.pem',
                    'cert_key' => './apiclient_key.pem',
                ],
            ];
    
            $config_biz = [
                'out_trade_no' => $order_num,           // 订单号
                'total_fee' => $price,              // 订单金额,**单位:分**
                'body' => $pinfo,                   // 订单描述
                'spbill_create_ip' => Func::get_ip(),       // 调用 API 服务器的 IP
                'product_id' => 'pid',             // 订单商品 ID
            ];
    
            $pay = new Pay($config);
            $code_url = $pay->driver('wechat')->gateway('scan')->pay($config_biz); // 扫码支付,返回支付码
            Cache::store('redis')->set($order_num,$code_url,3600);
            return $code_url;
    }
    

    4.回调出,进行订单处理

    // 微信支付回调
        public function index()
        {
            Clog::setLog('pay_success','wx_pay');
            $str = $GLOBALS['HTTP_RAW_POST_DATA'];
    
            $arr = array();
            $xmlTag = array(
                'appid','bank_type','cash_fee','fee_type','is_subscribe','mch_id',
                'nonce_str','openid','out_trade_no','result_code','return_code','sign',
                'time_end','total_fee','trade_type','transaction_id'
            );
            foreach($xmlTag as $x){
                preg_match_all("/<".$x.">.*</".$x.">/",$str,$temp);
                $arr[$x] = $temp[0][0];
            }
            //去除XML标签并组装数据
            $data = array();
            foreach($arr as $key => &$value) {
                if ($key == 'total_fee'){
                    $temp_a = explode('<'.$key.'>', $value);
                    $last_str = "</".$key.">";
                    $str_len = strlen($last_str);//  该字符串长度;?????????
                    $v = substr($temp_a[1],0,-$str_len);
                    $value = $v;
                }else{
                    $temp_a = explode('<'.$key.'>'.'<![CDATA[', $value);
                    $last_str = "]]</".$key.">";
                    $str_len = strlen($last_str);//  该字符串长度;
                    $v = substr($temp_a[1],0,-$str_len-1);
                    $value = $v;
                }
            }
    
            Clog::setLog(var_export($arr, true),'wx_pay_arr');
    
            $param = $arr;
    
            Clog::setLog($param);
            Clog::setLog($param['appid']);
            Clog::setLog($param['out_trade_no']);
            Clog::setLog($param['return_code']);
    
            if(!$param['out_trade_no']){
                echo "FAIL";
                Clog::setLog('111111');
                Clog::setLog($param['out_trade_no'].' 10001','wx_pay');
                return;
            } else {
                Clog::setLog('22222');
                if ($param['return_code'] == 'SUCCESS') { // 支付成功
                    $order_num = $param['out_trade_no'];
                    $transaction_id = $param['transaction_id'];
    
                    Clog::setLog('33333');
                    // 处理订单状态
                    $order_info = Db::name('order')
                        ->where('order_num',$order_num)
                        ->find();
    
                    if ($order_info['status'] != self::ORDER_CREATE) {
                        Clog::setLog($param['out_trade_no'].' Has Payed','wx_pay');
                        return;
                    }
    
                    $order_data['pay_time'] = time();
                    $order_data['status'] =   self::ORDER_PAY;
                    $order_data['transaction_id'] =   $transaction_id;
    
                    Db::startTrans();
                    $error = 0;
    
                    $r = Db::name('order')
                        ->where('order_num',$order_num)
                        ->data($order_data)
                        ->update();
    
                    if (!$r && $r !==0) {
                        $error ++;
                    }
    
                    // 处理优惠券
                    if ($order_info['user_coupon_id'] > 0) {
                        Clog::setLog('44444');
                        $coupon_data['is_use'] = 1;
                        $coupon_data['update_time'] = time();
                        $r = Db::name('user_coupon')
                            ->where('id',$order_info['user_coupon_id'])
                            ->data($order_data)
                            ->update();
                        if (!$r && $r !==0) {
                            $error ++;
                        }
    
                        $coupon_id = Db::name('user_coupon')
                            ->where('id',$order_info['user_coupon_id'])
                            ->value('coupon_id');
    
                        $r = Db::name('coupon')
                            ->where('id',$coupon_id)
                            ->inc('used_number',1)
                            ->update();
    
                        if (!$r && $r !==0) {
                            $error ++;
                        }
    
                    }
    
    
                    if ($order_info['from'] == 1) { // 购物车
                        // 清空购物车
                        $r = Db::name('shopping_car')
                            ->where('user_id', $order_info['user_id'])
                            ->delete();
    
                        if (!$r && $r !==0) {
                            $error ++;
                        }
                    }
    
                    if ($error == 0) {
                        Db::commit();
                        Clog::setLog($param['out_trade_no'].' 0','wx_pay');
                        echo "SUCCESS";
                        return;
                    } else {
                        Db::rollback();
                        Clog::setLog($param['out_trade_no'].' 10099','wx_pay');
                        return;
                    }
    
                } else {
                    Clog::setLog($param['out_trade_no'].' 10002','wx_pay');
                    return;
                }
            }
        }
    

    5.前端写个定时器,查看订单状态是否变更

    public function check_pay(){
            $order_id = trim($_REQUEST['order_id']);
            $is_pay = Db::name('order')->where(['id' => $order_id,'status' => 2])->find();
            if ($is_pay){
                $this->json->setErr('0',lang('tips_is_pay'));
            } else {
                $this->json->setErr('10023',lang('tips_not_pay'));
            }
            $this->json->Send();
    }
    

    6.支付成功,进行跳转处理。

  • 相关阅读:
    二分查找
    二分排序
    How to use hdu?
    HGOI 20200721
    HGOI 20200720
    HGOI 20190719
    HGOI 20200716
    HGOI 20190714
    LCA 的一些扩展算法
    HGOI 20190711
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/9676148.html
Copyright © 2020-2023  润新知