微信扫码模式二

/**
 * 微信扫码支付 ---模式二
 * @param $order_number 订单编号
 * @param $money        订单金额(单位:元)
 * @param $notify_url   异步通知地址
 * @return mixed   返回预支付url
 */
function wxpay($order_number,$money,$notify_url){
  Vendor('Wxpay.example.WxPay#NativePay');
  Vendor('Wxpay.lib.WxPay#Api');
  Vendor('Wxpay.lib.WxPay#Data');
  Vendor('Wxpay.lib.WxPay#Config');
  Vendor('Wxpay.lib.WxPay#Exception');
  $notify = new \NativePay();
  $input = new \WxPayUnifiedOrder();
  $input->SetBody('订单号:'.$order_number);    //描述
  //$input->SetAttach("$test");  //设置附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
  $input->SetOut_trade_no($order_number);   //订单号
  $input->SetTotal_fee($money*100);       //以分单位传入,只能传整数
  $input->SetTime_start(date("YmdHis"));
  $input->SetTime_expire(date("YmdHis", time() + 60));
  //$input->SetGoods_tag("test");
  $input->SetNotify_url($notify_url);
  $input->SetTrade_type("NATIVE");
  $input->SetProduct_id("123456789");  //此id为二维码中包含的商品ID,商户自行定义
  $result = $notify->GetPayUrl($input);
  $url = $result["code_url"];
  return $url;
}

//①将返回的预支付url分配到前端模板
//②通过img标签请求生成二维码<img id="weixinImageURL" src="{:U('Pay/code')}?url={$url}">

//生成二维码
public function code(){
  $url = I('url');
  Vendor('Wxpay.example.phpqrcode.phpqrcode');
  \QRcode::png("$url");
}

//③前端通过定时任务不断请求后台查询微信支付状态,根据返回状态做相应操作
$(function () {
    var myInt = setInterval(function () {
            check()
        },1000);
    function check() {
        var out_trade_no = $('.out_trade_no').val();
        $.ajax({
            type:'post',
            url:"{:U('Pay/orderquery')}",
            data:{'out_trade_no':out_trade_no},
            success:function (e) {
                if(e == 1){
                    clearInterval(myInt);
                    alert('订单支付成功,点击确认按钮跳转到订单页');
                    window.location.href="{:U('Index/shop_order')}"
                }else{
                    return false;
                }
            }
        })
    }
})


//查询微信支付状态
public function orderquery(){
  ini_set('date.timezone','Asia/Shanghai');
  error_reporting(E_ERROR);
  Vendor('Wxpay.lib.WxPay#Api');
  Vendor('Wxpay.lib.WxPay#Data');
  Vendor('Wxpay.lib.WxPay#Config');
  Vendor('Wxpay.example.log');

  //初始化日志
  $logHandler= new \CLogFileHandler("./logs/".date('Y-m-d').'.log');
  $log = \Log::Init($logHandler, 15);

  if(isset($_REQUEST["out_trade_no"]) && $_REQUEST["out_trade_no"] != ""){
    $out_trade_no = $_REQUEST["out_trade_no"];
    $input = new \WxPayOrderQuery();
    $input->SetOut_trade_no($out_trade_no);
    $rult = \WxPayApi::orderQuery($input);

    if($rult['trade_state'] == 'SUCCESS'){
      //支付成功

    }elseif ($rult['trade_state'] == 'NOTPAY'){
      //未支付

    }elseif ($rult['trade_state'] == 'CLOSED'){
      //已关闭

    }elseif ($rult['trade_state'] == 'USERPAYING'){
      //用户支付中

    }elseif ($rult['trade_state'] == 'PAYERROR'){
      //支付失败

    }
  }
}


//支付成功后回调,查看微信返回数据可以通过file_put_contents()来查看
    public function notify(){
        $xml = $GLOBALS['HTTP_RAW_POST_DATA']; //返回的xml
        $xmlObj=simplexml_load_string($xml,'SimplexmlElement',LIBXML_NOCDATA);
        $xmlArr=json_decode(json_encode($xmlObj),true);
        $out_trade_no=$xmlArr['out_trade_no']; //订单号
        $total_fee=$xmlArr['total_fee']/100; //回调回来的xml文件中金额是以分为单位的
        $result_code=$xmlArr['result_code']; //状态
        if($result_code=='SUCCESS'){ //数据库操作
              //通过订单号查询订单状态

          if($status['order_status'] != 1){ //没做处理
            //判断订单总额是否一致
            if($status['count_price'] == $total_fee){
              //修改订单状态

              //增加商品销量

              echo 'SUCCESS'; //返回成功给微信端
            }
          }
        }else{ //失败
          echo 'FAIL';
          exit;
        }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值