微信支付 扫码支付 模式二 完整版和测试代码+后台对账
先说下其中的坑,微信的接口文档和demo,那真叫一个坑,要么文字指向性错误,那么demo代码没法运行,报的错,甚至没有文档可查
先说明一些问题,街上的一些扫码微信的二维码其实一般都是注册的企业微信号,用的是微信转账,企业微信提现需不需要手续费这个目前不知,
第二种就是你买一些东西,商家就会生成一个二维码给你扫,扫出来就是可以直接支付的,有金额的二维码,这个才是微信扫码支付,模式二
其实就是下一个订单然后支付,模式一的固定二维码支付不知道有人成功过吗?我一直运行不成功,返回一直商家数据结构错误
demo代码下载地址: http://download.****.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(); }
核心的部分就是这些,还有一个后台对账的其实很简单了,详细的请参看代码