微信支付 扫码支付 模式二 完整版和测试代码+后台对账

先说下其中的坑,微信的接口文档和demo,那真叫一个坑,要么文字指向性错误,那么demo代码没法运行,报的错,甚至没有文档可查

先说明一些问题,街上的一些扫码微信的二维码其实一般都是注册的企业微信号,用的是微信转账,企业微信提现需不需要手续费这个目前不知,

第二种就是你买一些东西,商家就会生成一个二维码给你扫,扫出来就是可以直接支付的,有金额的二维码,这个才是微信扫码支付,模式二

其实就是下一个订单然后支付,模式一的固定二维码支付不知道有人成功过吗?我一直运行不成功,返回一直商家数据结构错误

demo代码下载地址:  http://download.csdn.net/detail/zh7314/9593664

http://xxx.com/pay/
 
请记住一定要授权你的页面的上级目录,多一级都不行,我不知道为什么

首先把 pay_testlibWxPay.Config.php 

     * APPID:绑定支付的APPID(必须配置,开户邮件中可查看)
     * 
     * MCHID:商户号(必须配置,开户邮件中可查看)
     * 
     * KEY:商户支付密钥,参考开户邮件设置(必须配置,登录商户平台自行设置)
     * 设置地址:https://pay.weixin.qq.com/index.php/account/api_cert
     * 
     * APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置, 登录公众平台,进入开发者中心可设置),
     * 获取地址:https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=2005451881&lang=zh_CN
这个你去设置的32的那个
* @var string */ const APPID = ''; const MCHID = ''; const KEY = ''; const APPSECRET = '';

微信支付 扫码支付 模式二  完整版和测试代码+后台对账

提交的页面就是 submit.php 接受页面是 getqrcode.php 这个页面就是生产二维码和主动请求订单是否支付成功的

http://xxx.com/pay_test/return.php 这个也是个坑,至今没有接受过任何数据,捕捉了页面接受的所有东西,写入日志就是什么都没有,好奇怪

如果有知道任何接受的兄弟,请联系楼下,发下demo代码看下

submit.php代码 

<html>  
<head>  
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../../public/css/bootstrap-responsive.css" rel="stylesheet">
<link href="../../public/css/bootstrap.css" rel="stylesheet">
<script type="text/javascript" src="../../public/js/bootstrap.js"></script>
<script type="text/javascript" src="../../public/js/jquery.js"></script>
 <style type="text/css">
      .form-signin {
        max- 300px;
        padding: 19px 29px 29px;
        margin: 0 auto 20px;


        -webkit-border-radius: 5px;
           -moz-border-radius: 5px;
                border-radius: 5px;
        -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.05);
           -moz-box-shadow: 0 1px 2px rgba(0,0,0,.05);
                box-shadow: 0 1px 2px rgba(0,0,0,.05);
      }
      .form-signin .form-signin-heading,
      .form-signin .checkbox {
        margin-bottom: 10px;
      }
      .controls input[type="text"]{
        font-size: 15px;
        height: auto;
      }
    
    </style>
    <title>融智金融-微信支付还款</title> 
</head>  
<body>  
<div class="container-fluid">
    <div class="row-fluid">
        <div class="span12">
                        <div class="text-center">
              <img alt="140x140" src="../../public/image/logo.png" />
                        </div>
            <h3 class="text-center">
                融智金融
            </h3>
            <div class="alert">
                 <button type="button" class="close" data-dismiss="alert">×</button>
                <h4>
                    温馨提示!
                </h4> 
                                 <strong>金额填写:</strong> 100元就写100即可<br>
                                 <strong>备注格式:</strong> 营业厅-操作人员-金额
            </div>
                   

                    <form class="form-signin" action="getqrcode.php" method="post">
                        <input type="text" class="input-block-level" placeholder="金额" name="money" >
                        <input type="text" class="input-block-level" placeholder="备注" name="note" >

                     <button class="btn" type="button" >生成二维码</button>
      </form>
        
    </div>
</div>
   </div> 
</body>  
</html>
<script>
$(function() {
     
  $('#form_id').click(function(){
      
      if($('#money').val()==''){
          alert('金额不能为空');
          return;
      }
      if(isNaN($('#money').val())){
          alert("金额必须为数字");
          return;
      }
      if($('#money').val()==0){
          alert('金额不能为0元');
          return;
      }
      
      if($('#money').val()>=0.01){
          $('.form-signin').submit();
      }

      
//      $('.form-signin').unbind("click");
  });
  
});
</script>

getqrcode.php

<?php
ini_set('date.timezone','Asia/Shanghai');


require_once "../lib/WxPay.Api.php";
require_once "WxPay.NativePay.php";
include '../../admin/db.php';

$money = (float)$_POST['money']*100;

$mon = (float)$_POST['money'];
$note = htmlspecialchars(addslashes($_POST['note']));

$SetBody = '微信支付还款';
$SetAttach = '微信扫码还款';
$SetOut_trade_no = date("YmdHis").rand(1,100);;
$SetGoods_tag ='产品';
//数据库生成数据,根据return.php更改数据,订单是否支付成功
    
    $time = time();
//    try{
    $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    $sql = 'INSERT INTO wx_log (log_id,out_trade_no,prepay_id,money,notify_money,time,note,result_code) VALUES (null,:SetOut_trade_no,0,:money,0,:time,:note,0)';

    $stmt = $db->prepare($sql); 
    $stmt->bindParam(':SetOut_trade_no', $SetOut_trade_no);
    $stmt->bindParam(':money',$mon);
    $stmt->bindParam(':time',$time);
    $stmt->bindParam(':note', $note);
    $stmt->execute(); 

//     }catch(PDOException $exception){
//    echo 'PDO Exception Caught.';
//    echo 'Error with the database:<br />';
//    echo 'SQL Query: '.$query;
//
//    echo '<pre>';
//    echo "Error: ".$exception->getMessage()."<br />";
//    echo "Code: ".$exception->getCode()."<br />";
//    echo "File: ".$exception->getFile()."<br />";
//    echo "Line: ".$exception->getLine()."<br />";
//    echo "Trace: ".$exception->getTraceAsString()."<br />";
//    echo '</pre>';
//  }
    

//die;



$notify = new NativePay();
$input = new WxPayUnifiedOrder();
$input->SetBody($SetBody);
$input->SetAttach($SetAttach);
$input->SetOut_trade_no($SetOut_trade_no);
$input->SetTotal_fee($money);
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag($SetGoods_tag);
$input->SetNotify_url("http://pay.xinyzx.com/pay_test/return.php");
$input->SetTrade_type("NATIVE");
$input->SetProduct_id("1");


$result = $notify->GetPayUrl($input);
$url = $result["code_url"];

//include '../phpqrcode.php';
//QRcode::png($url);
?>

<html>  
<head>  
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../../public/css/bootstrap-responsive.css" rel="stylesheet">
<link href="../../public/css/bootstrap.css" rel="stylesheet">
<script type="text/javascript" src="../../public/js/bootstrap.js"></script>
<script type="text/javascript" src="../../public/js/jquery.js"></script>
    <title>融智金融-微信支付还款</title> 
</head>  
<body>  
<div class="container-fluid">
    <div class="row-fluid">
        <div class="span12">
                        <div class="text-center">
             <img  src="http://paysdk.weixin.qq.com/example/qrcode.php?data=<?php echo urlencode($url);?>" style="300px;height:300px;margin-top: 20%"/>
                         <input type="hidden" name="out_trade_no"  />
                        </div>
    </div>
</div>
   </div> 
    <script>
        $(function(){
           setInterval(function(){check()}, 5000);  //5秒查询一次支付是否成功
        })
        function check(){
            var url = "notify_orders.php";
            var out_trade_no = $("#out_trade_no").val();
            var param = {'out_trade_no':out_trade_no};
            $.post(url, param, function(data){
                data = JSON.parse(data);
                if(data['trade_state'] == "SUCCESS"){
//                    alert(JSON.stringify(data));
                    alert("订单支付成功");
                    window.location.href = "submit.php";
                }
            });
        }
    </script>
    
    
</body>  
</html>
notify_orders.php
ini_set('date.timezone','Asia/Shanghai');
error_reporting(E_ERROR);
require_once "../lib/WxPay.Api.php";

//$_POST["out_trade_no"] = '201607291913581075';




//处理客户支付,是否支付成功
if(isset($_POST["out_trade_no"]) && $_POST["out_trade_no"] != ""){
    $out_trade_no = $_POST["out_trade_no"];
    $input = new WxPayOrderQuery();
    $input->SetOut_trade_no($out_trade_no);
//    P(WxPayApi::orderQuery($input));
//    exit();
        
        echo json_encode(WxPayApi::orderQuery($input));
    exit();
}

核心的部分就是这些,还有一个后台对账的其实很简单了,详细的请参看代码