微信扫码支付 回调 跳转 带前端 响应代码

微信扫码登录不同的就是 支付成功  只有异步没有,支付成功的跳转。因此我们在支付扫码的时候要一直检测是否支付成功。


微信扫码支付的代码 配置


微信扫码支付 回调 跳转 带前端 响应代码


微信扫码支付 回调 跳转 带前端 响应代码

这几个代码去官方下载就好 


微信配置账号在

微信扫码支付 回调 跳转 带前端 响应代码



别的不用动。下面我们开始请求


前端显示 这个样子的

微信扫码支付 回调 跳转 带前端 响应代码

点击支付 显示效果


微信扫码支付 回调 跳转 带前端 响应代码


前端代码 


<html>
<head>
   <meta charset="utf-8">
   <script type="text/javascript" src="jquery-1.11.3.min.js"></script>
   <title></title>
   <style type="text/css">
      .content{width:80%;margin:200px auto;}
      .hide_box{z-index:999;filter:alpha(opacity=50);background:#666;opacity: 0.5;-moz-opacity: 0.5;left:0;top:0;height:99%;width:100%;position:fixed;display:none;}
      .shang_box{width:340px;height:378px;padding:10px;background-color:#fff;border-radius:10px;position:fixed;z-index:1000;left:50%;top:50%;margin-left:-280px;margin-top:-280px;border:1px dotted #dedede;display:none;}
      .shang_box img{border:none;border-width:0;}
      .dashang{display:block;width:100px;margin:5px auto;height:25px;line-height:25px;padding:10px;background-color:#E74851;color:#fff;text-align:center;text-decoration:none;border-radius:10px;font-weight:bold;font-size:16px;transition: all 0.3s;}
      .dashang:hover{opacity:0.8;padding:15px;font-size:18px;}
      .shang_close{float:right;display:inline-block;}
      .shang_logo{display:block;text-align:center;margin:20px auto;}
      .shang_tit{width: 100%;height: 75px;text-align: center;line-height: 66px;color: #a3a3a3;font-size: 16px;background: url('img/cy-reward-title-bg.jpg');font-family: 'Microsoft YaHei';margin-top: 7px;margin-right:2px;}
      .shang_tit p{color:#a3a3a3;text-align:center;font-size:16px;}
      .shang_payimg{width:185px;padding:10px;border:6px solid #EA5F00;margin:0 auto;border-radius:3px;height:176px;}
      .shang_payimg img{display:block;text-align:center;width:140px;height:140px; }
      .pay_explain{text-align:center;margin:10px auto;font-size:12px;color:#545454;}
      .radiobox{width: 16px;height: 16px;background: url('img/radio2.jpg');display: block;float: left;margin-top: 5px;margin-right: 14px;}
      .checked .radiobox{background:url('img/radio1.jpg');}
      .shang_payselect{text-align:center;margin:0 auto;margin-top:40px;cursor:pointer;height:60px;width:280px;}
      .shang_payselect .pay_item{display:inline-block;margin-right:10px;float:left;}
      .shang_info{clear:both;}
      .shang_info p,.shang_info a{color:#C3C3C3;text-align:center;font-size:12px;text-decoration:none;line-height:2em;}

   </style>
</head>
<body>
<div class="content">
   <p><a href="javascript:void(0)" onClick="show_wx()" class="dashang" title="支付">微信支付</a></p>
   <div class="hide_box"></div>
   <div class="shang_box">
      <a class="shang_close" href="javascript:void(0)" onClick="hide_wx()" title="关闭"><img src="source/plugin/xigua_re/static/close.jpg" alt="取消" /></a>
      <div class="shang_tit">
         <p>微信充值扫码</p>
      </div>
      <div class="shang_payimg">

      </div>
      <div class="shang_payselect">

         <div class="pay_item" id="weipay" style="display: none">
            <span class="radiobox"></span>
            <span class="pay_logo" ><img src="static/wechat.jpg" alt="微信" /><span style="position: absolute;bottom:24px;font-size: 19px; font-weight: 600;">成功</span></span>
         </div>
      </div>

   </div>
</div>
<script type="text/javascript">

   if(typeof jq == 'undefined'){
      var jq = jQuery.noConflict();
   }

   var wechat_checkST1 = null, wechat_checkCount1 = 0;

   function  show_wx(){
      jq.get('act=weixin', function(res) {
//       console.log(res.order_id,res.img);

         var order_id=res.order_id;
//       console.log(order_id);
         if(res.img){
//          console.log(order_id);
            wechat_checkST1 = setInterval(function(){

               check_order(order_id);

            }, 2000);
            jq('.shang_payimg').html(res.img);
         }
      },'json');

      jq(".shang_box").show();
   }

   function hide_wx(){

      clearTimeout(wechat_checkST1);
      jq(".shang_box").hide();
   }

   function check_order(order_id){

      jq.get('check&order_id='+order_id, function(s) {

         if(s=='1'){

            jq("#weipay").show();

            setTimeout(function(){
               hide_wx();
               console.log('支付成功')

            },1200);



         }
      });

   }

</script>
</body>

</html>

act  请求地址是 返回微信的 二维码   就是生成二维码 
后台 act 代码


if($_REQUEST['act']=='weixin'){
    $order_id = C::t('')->get_order_id(
        $fromopenid, $_G['uid'], $touid, $toopenid,
        $price*100,
        $_GET['subject'], $_GET['url'],$_GET['postid'], $_G['cookie']['rewxnickname'], $_G['cookie']['rewxheadimgurl'], 1,1,1);
    if(!$order_id){
        exit('order_id empty!');
    }
    $body = diconv($navtitle, CHARSET, 'UTF-8');
    $body='账号充值';
    $notify = new NativePay();
    $input = new WxPayUnifiedOrder();
    $input->SetBody($body);
    $input->SetAttach($body);
    $input->SetOut_trade_no($order_id);
    $input->SetTotal_fee($price*100);
    $input->SetTime_start(date("YmdHis"));
//    $input->SetTime_expire(date("YmdHis", time() + 3600));
    $input->SetGoods_tag($body);
    $input->SetNotify_url($_G['siteurl']. 'addmoney_notify_wx.php'); //这个是回调很重要
    $input->SetTrade_type("NATIVE");
    $input->SetProduct_id($order_id);
    $result = $notify->GetPayUrl($input);
    $url2 = $result["code_url"];

    if(!$url2){
        $img = diconv($result['return_msg'],'UTF-8',CHARSET );
    }else{
        if(class_exists('QRcode')){
            $qrfile = '/cache/o'.$order_id.'.png';
            QRcode::png($url2, DISCUZ_ROOT.$qrfile, QR_ECLEVEL_L, 3);
            $src = $_G['siteurl'].$qrfile;
        }else{
            $src= 'http://qr.liantu.com/api.php?&w=240&bg=ffffff&fg=333333&text='.urlencode($url2);
        }
        $errorsrc= 'http://qr.liantu.com/api.php?&w=240&bg=ffffff&fg=333333&text='.urlencode($url2);
        $img =  "<img src='$src' onerror=\"this.error=null;this.src='$errorsrc'\" class=\"payqrcode\" /><p class=\"xg1\" style='margin:10px auto!important;'>".lang('plugin/xigua_re', 'sao')."</p>";
    }

   echo json_encode(array('order_id'=>$order_id,'img'=>$img));

    die;

异步回调验证 


addmoney_notify_wx.php


<?php


define('IN_API', true);
define('CURSCRIPT', 'api');
define('DISABLEXSSCHECK', true);

require_once 'class/class_core.php';
$discuz = C::app();
$discuz->init();

$_G['siteurl'] = str_replace('', '',$_G['siteurl'] );
require_once 'common.php';

//ini_set('display_errors', 1);
//error_reporting(E_ALL ^ E_NOTICE);
//$re = WxPayApi::promotion('201602022028434331035', 'ohvWAwxEy3M9CvZB5J4HFDuOk8Nc', 100, 'test');
//$re['return_msg'] = diconv($re['return_msg'],'UTF-8', CHARSET);
//$re['err_code_des'] = diconv($re['err_code_des'],'UTF-8', CHARSET);
//var_dump($re);
//if($re['return_code'] == 'SUCCESS'){

//}else{
//
//}


$notifydata = re_notifycheck();

@file_put_contents('./aaa.text',print_r($_REQUEST,true));

if($notifydata['validator']) {
    
    //这里面 开始写成功之后的业务逻辑 比如 改变订单状态
    $order_id = $notifydata['order_no'];

}
function re_notifycheck() {
    global $_G;

    $msg = '';

    $notify = WxPayApi::notify($msg);

    if(empty($notify)){
        $return = array(
            'return_code'=>'FAIL',
            'return_msg'=>$msg,
        );
        WxPayApi::replyNotify(arr2xml($return));
        exit;
    }

    //checksign
    $sign = $notify['sign'];
    unset($notify['sign']);

    ksort($notify);
    $string = reToUrlParams($notify);
    $string = $string . "&key=".WxPayConfig::KEY;
    $string = md5($string);
    $result = strtoupper($string);
    if($result != $sign){
        $return = array(
            'return_code'=>'FAIL',
            'return_msg'=> 'sign error!',
        );
        WxPayApi::replyNotify(arr2xml($return));
        exit;
    }
    if($notify['result_code'] == 'SUCCESS') {
        return array(
            'validator'    => isset($notify['result_code']) && $notify['result_code'] == 'SUCCESS' ? 1 : 0,
            'order_no'     => $notify['out_trade_no'],
            'trade_no' => isset($notify['transaction_id']) ? $notify['transaction_id'] : '',
            'price'    => $notify['total_fee'],
            'appid' => $notify['appid'],
            'notify'   => arr2xml(array('return_code'=>'SUCCESS')),
            'location' => false,
            'fromopenid' => $notify['openid'],
        );
    }
}


function arr2xml($data){
    $xml = "<xml>";
    foreach ($data as $key=>$val)
    {
        if (is_numeric($val)){
            $xml.="<".$key.">".$val."</".$key.">";
        }else{
            $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
        }
    }
    $xml.="</xml>";
    return $xml;
}

check.php 

检测是否支付成功!

传到前面的是订单号。

拿订单号去 后台验证

<?php

$order_id = $_GET['order_id'];
$order = C::t('a')->fetch_by_order_id($order_id);

$succeed = 0;
if($order && $order['paystatus'] == 1){


   $succeed = 1;
}

echo $succeed;

die;
响应那个一直请求 当验证通过时候 就 跳转 停止请求 支付完成。