微信支付——扫码支付模式二

项目环境:thinkphp商城
在上篇文章,已经调通sdk写引入进来到thinkPHP中
扫码模式支付二相对来说比较简单,没有多少坑,难点就是支付成功的回调页面,写一个ajax请求每隔3秒执行一次查询
1,支付页面控制器做一个判断,是否是wenxin支付方式进来
if( $paytype == "weixin"){   //若付款扫描支付方式是微信进入 不是进入else

            if(!empty($_POST['orderid'])){
               $order_no=safe_replace(I('post.orderid'));

               $info=M("order")->where("tag='$order_no'")->find();
               if(!empty($info)){
                  $money=$info['total_money'];
               } else{
                  $info=M("order")->where("orderid='$order_no'")->find();
                  $money=$info['total_money'];
               }
               $body= C('SITENAME')."订单支付";//商品描述
               $title=C('SITENAME')."订单支付";//设置商品名称
            }
            $money = $money * 100; //微信默认是分为单位,剩100

            //使用统一支付接口
            $input = new \WxPayUnifiedOrder();
            $notify = new \NativePay();

            $input->SetBody("$body");
            $input->SetAttach("$title");
            $input->SetOut_trade_no(\WxPayConfig::MCHID.date("YmdHis"));
            $input->SetTotal_fee($money);
            $input->SetTime_start(date("YmdHis"));
            $input->SetTime_expire(date("YmdHis", time() + 600));
            $input->SetGoods_tag("test");
            $input->SetNotify_url("http://luochao.tunnel.qydev.com/yershopv/index.php/Pay/notify.html");
            $input->SetTrade_type("NATIVE");
            $input->SetProduct_id($_POST['orderid']);
            $result = $notify->GetPayUrl($input);


            $out_trade_no = $input->GetOut_trade_no();

            $url2 = $result["code_url"];

            //获取统一支付接口结果
            $unifiedOrderResult = $result;

            //商户根据实际情况设置相应的处理流程
            if ($unifiedOrderResult["return_code"] == "FAIL")
            {
               //商户自行增加处理流程
               echo "通信出错:".$unifiedOrderResult['return_msg']."<br>";
            }
            elseif($unifiedOrderResult["result_code"] == "FAIL")
            {
               //商户自行增加处理流程
               echo "错误代码:".$unifiedOrderResult['err_code']."<br>";
               echo "错误代码描述:".$unifiedOrderResult['err_code_des']."<br>";
            }
            elseif($unifiedOrderResult["code_url"] != NULL)
            {
               //从统一支付接口获取到code_url
               $code_url = $unifiedOrderResult["code_url"];
               //商户自行增加处理流程
               //......
            }

            $this->assign('orderid',$_POST['orderid']);
            $this->assign('out_trade_no',$out_trade_no);
            $this->assign('code_url',$url2);
            $this->assign('unifiedOrderResult',$unifiedOrderResult);
            $this->display('native_pays');

         }


2,视图页面native_pays显示二维码,3秒调用ajax执行查询是否已经支付,支付完就跳转页面
<script src="__JS__/jquery.min.js"></script>  //

    <div align="center" id="qrcode">
    </div>
    <div align="center">
        <input type="hidden" value="{$out_trade_no}" name="out_trade_no">
        <input type="hidden" value="{$orderid}" name="orderid">
        <p>订单号:{$out_trade_no}</p>
        <p>url2:{$code_url}</p>
    </div>


    <script src="__JS__/qrcode.js"></script>  //生成二维码脚本必须
    <script>
        if(<?php echo $unifiedOrderResult["code_url"] != NULL; ?>)
        {
            var url = "<?php echo $code_url;?>";
            //参数1表示图像大小,取值范围1-10;参数2表示质量,取值范围'L','M','Q','H'
            var qr = qrcode(10, 'M');
            qr.addData(url);
            qr.make();
            var wording=document.createElement('p');
            wording.innerHTML = "扫我,扫我";
            var code=document.createElement('DIV');
            code.innerHTML = qr.createImgTag();
            var element=document.getElementById("qrcode");
            element.appendChild(wording);
            element.appendChild(code);
        }
    </script>
<script>
    $(function(){
        setInterval(function(){check()} , 3000);  //没隔三秒执行一次 ajax
        function check(){
            var out_trade_no = $("input[name=out_trade_no]").val();
            var orderid = $("input[name=orderid]").val();
            var param = {
                'out_trade_no':out_trade_no,
                'orderid':orderid,
            };
            $.ajax({
                type: "post",
                url: '{:U("Pay/orderquery")}',  //请求函数
                async: false,
                data: {'out_trade_no':out_trade_no,'orderid':orderid},
                success: function (data) {
                    if (data == "SUCCESS") {
                        alert("订单支付成功,即将跳转...");
                        window.location.href = '{:U("Home/Pay/over")}';
                    }
                    else {
                        result = false;
                    }
                }
            });
            /***************/

        }

    })
</script>
3,ajax请求方法处理,
传微信的商户订单号:用在查询微信订单接口返回信息
商城生成的订单号,支付成功把此订单号改为已支付状态
/**
 * AJAX方法查询订单号,返回信息处理
 */

public function orderquery($out_trade_no=null, $orderid=null){
   $out_trade_no = $_POST['out_trade_no'];
   $orderid = $_POST['orderid'];

   /****调用微信接口,返回支付后的参数*****/
   if(isset($out_trade_no) && $out_trade_no != ""){
      $out_trade_no = $_REQUEST["out_trade_no"];
      $input = new \WxPayOrderQuery();
      $input->SetOut_trade_no($out_trade_no);
      $result  = \WxPayApi::orderQuery($input);
   }

   /*判断是否支付成功*/
   if ( $result["trade_state"] == "SUCCESS" ){
      /**订单支付成功操作*/
      $money = $result["total_fee"]/100; //获取微信支付金额,给到success

      /*修改订单状态为已支付*/
      $dataa = array('status'=>'1','ispay'=>'2');//订单已经支付,状态为已提交
      $info = M('order')->where(array('tag' => $orderid))->setField($dataa);
      if(!empty($info)){
      } else{
         M('order')->where(array('orderid' => $orderid))->setField($dataa);
      }
      /*支付完后写入到支付表中*/
      M("Pay")->add(array(
            'out_trade_no' => $out_trade_no,
            'money' => $money,
            'status' => 0,
            'create_time' => time(),
            'update_time' => time()
            ));
   }
   $data = $result["trade_state"];
   $this->ajaxReturn($data);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值