php微信扫码支付
一 概述
扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。前几天公司需要做了一下扫码支付 分享一下
首先需要准备的东西
微信给的 appid, mchtd(商户号) ,key ,appsecret
下载微信的sdk
配置 appid mchtd key 和 appsecret
新建文件 barcodepay.php //命名方式 根据自己的习惯
引入 lib/WxPay.Api.php example/WxPay.NativePay.php /example/log.php
我把这个做成了一个函数 这样方便引用 如果大神有不同的看法可以告知我哦
function barcodepay($body,$attch,$fee,$tag,$url,$proid){ $nofity = new NativePay(); $input = new WxPayUnifiedOrder(); $input->SetBody($body); $input->SetAttach($attch); $input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis")); $input->SetTotal_fee($fee); $input->SetTime_start(date("YmdHis")); $input->SetTime_expire(date("YmdHis", time() + 600)); $input->SetGoods_tag($tag); $input->SetNotify_url($url); $input->SetTrade_type("NATIVE"); $input->SetProduct_id($proid); $result = $nofity->GetPayUrl($input); $pay_img_url = $result['code_url']; $pay_url_img = 'http://paysdk.weixin.qq.com/example/qrcode.php?data='.urlencode($pay_img_url); return $pay_url_img; }
此处的
$body 是收款标题如
$attch 附加数据
$fee 是多少钱此处需注意 微信是按分计算的 付款一分就是 1
$tag 标记
$url 支付成功后通知地址
$proid 商品订单号
还可以加上别的东西 详情请看https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1微信api列表
这样调用的时候直接调用barcodepay这个函数就可以
调用barcodepay();会返回一个地址
可以用ajax的方式写入图片路径 也可以用 <img src="<?php echo barcodepay ?>">
现在扫码即可付款了 支付成功是第一步 支付成功了二维码页面也不会有任何显示的 因为腾讯服务器是异步发送给你的通知
现在就需要编写回调函数了
我的方法如下
打开exmaple/notify.php
代码如下
<?php ini_set('date.timezone','Asia/Shanghai'); error_reporting(E_ERROR); require_once "../lib/WxPay.Api.php"; require_once '../lib/WxPay.Notify.php'; require_once 'log.php'; //初始化日志 $logHandler= new CLogFileHandler("../logs/".date('Y-m-d').'.log'); $log = Log::Init($logHandler, 15); class PayNotifyCallBack extends WxPayNotify { //查询订单 public function Queryorder($transaction_id) { $input = new WxPayOrderQuery(); $input->SetTransaction_id($transaction_id); $result = WxPayApi::orderQuery($input); Log::DEBUG("query:" . json_encode($result)); if(array_key_exists("return_code", $result) && array_key_exists("result_code", $result) && $result["return_code"] == "SUCCESS" && $result["result_code"] == "SUCCESS") { return true; } return false; } //重写回调处理函数 public function NotifyProcess($data, &$msg) { Log::DEBUG("call back:" . json_encode($data)); $notfiyOutput = array(); if(!array_key_exists("transaction_id", $data)){ $msg = "输入参数不正确"; return false; } //查询订单,判断订单真实性 if(!$this->Queryorder($data["transaction_id"])){ $msg = "订单查询失败"; return false; } //<strong>在这里编写需要的操作 比如 改变支付状态为支付成功</strong> return true; } } Log::DEBUG("begin notify"); $notify = new PayNotifyCallBack(); $notify->Handle(false);
之后在页面编写ajax 三秒查询一次 每三秒执行一次在这里我就省略了 实际情况是需要的
function ajaxstatus(){ $.ajax({ type:'get', url:'你的接口地址', data:{'查询数据的条件'}, dataType:'json', success:function(data){ if(data.data.success == 3){ //此处可以进行成功操作 //延时三秒 setTimeout("location.href='支付成功的跳转页面'",3000); } } }) }
关于支付成功后ajax请求的php接口在这里就不写了
到这里微信扫码支付就结束了
需要注意的是
文件引入路径 和文件与文件直接的路径问题
解决方法 修改路径即可
服务器时间与本地时间 或者是 这个php系统设定的时间 如果不相符会出现
time_expire时间过短,刷卡至少1分钟,其他5分钟
解决方法 检查修改时间
以上程序本人亲测可以运行
有问题可以留言我哦 或者对上面有不同的看法也可以留言哦
有时间会写一下微信h5支付(wap)和微信刷卡支付