thinkphp5.0之微信扫码支付开发及回调处理

微信开发 3888浏览 评论

说到微信支付接口开发估计大多数小伙伴儿都已经尝试开发过了,这次给大家带来一篇使用thinkphp5.0开发的微信扫码支付。

准备工作:

    下载微信SDK放到thinkphp5.0中extend目录下,这个目录本身是提供第三方类库,因此我们将SDK 解压放到这个目录!微信获取appid,key,下载证书之类的东西就不赘述了,看下文档步奏就知道了!

删除部分没有用的文件:

    我们这里只是开发扫码支付,因此一些不必要的文件我们将他删除,这里我就不列出来了,自己看下就知道了!

修改配置文件/lib/wxPay.config.php,将商户信息改为你自己的!

image.png

修改各个文件中引入文件的方式 Wxpay.data.php,Wxpay.Api.php,Wxpay.nativePay.php,notify.php总之用到的类库要互相引入文件的都需要改成我们tp5.0的引入方式!   


    image.png

编写统一下单方法:

public function wxPay(){
    ini_set('date.timezone','Asia/Shanghai');
    //引入需要的类,这里如果需要做得精细一点最好改下文件名称使之符合psr规范
    Loader::import('Wxpay/lib/WxPay#Api',EXTEND_PATH);
    Loader::import('Wxpay/example/WxPay#NativePay',EXTEND_PATH);
    Loader::import('Wxpay/example/log',EXTEND_PATH);
    
    
    $http = 'http://'.$_SERVER['HTTP_HOST'];
    $notify = new \NativePay();
    $input = new \WxPayUnifiedOrder();
    $input->SetBody('test');
    $input->SetAttach('test');
    $input->SetOut_trade_no(date('YmdHis').rand(1000,9999)); //设置订单编号
    $input->SetTotal_fee("1");//支付金额
    $input->SetTime_start(date("YmdHis"));
    $input->SetTime_expire(date("YmdHis", time() + 600));
    $input->SetGoods_tag("test");
    $notify_url = $http."/home/index/wxPayNotify.html";
    $input->SetNotify_url($notify_url );//设置回调
    $input->SetTrade_type("NATIVE");
    $input->SetProduct_id("123456789");//设置产品ID编号
    $result = $notify->GetPayUrl($input);
    $url2 = $result["code_url"];
    return view('wxPay',[
        'url2' => $url2 //返回模板,和url生成二维码
    ]);
    
}

前端页面显示生成二维码:

<div style="margin-left: 10px;color:#556B2F;font-size:30px;font-weight: bolder;">扫码支付测试页</div><br/>
<img alt="扫码支付" src="http://paysdk.weixin.qq.com/example/qrcode.php?data=<?php echo urlencode($url2);?>" style="width:150px;height:150px;"/>

扫码支付成功

支付成功回调:主要用到example目录下的notify.php类我们需要改下编写回调方法也就是我们上面统一下单需要访问的方法

public function wxPayNotify(){
    Loader::import('Wxpay/example/notify',EXTEND_PATH);//引入notify类
    $notify = new \PayNotifyCallBack();
    $notify->Handle(false); //调用方法
}

这里需要说明一点的是,如果我们需要记录回调日志,那么要稍微改下文件目录路径,如下图,以及引入文件的方式,当然了记录日志是我认为是必须的,方便调试!

image.png

 改了这里貌似回调就完毕了,具体的还需要大家在实际操作过程中碰到问题解决问题了。

回调成功如何处理本地商户订单状态?

    有很多小伙伴儿在做了回调之后不知道在什么地方处理自己的业务逻辑,我想说的是,不知道在哪里处理的小伙伴一定没有看懂程序,那么就让我们在下面来研究研究,

    $notify = new \PayNotifyCallBack();
    $notify->Handle(false); //调用方法

handle方法中有一段

$result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg);

静态调用了WxpayApi 类中的notify方法,并传递了几个参数进去,那么我们看下notify方法究竟是什么?

//获取通知的数据,其实这里就是获取回调返回的数据
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
//如果返回成功则验证签名
try {
   $result = WxPayResults::Init($xml);
} catch (WxPayException $e){
   $msg = $e->errorMessage();
   return false;
}

return call_user_func($callback, $result);

有这样一个函数,把第一个参数作为回调函数调用

call_user_func()

那么我们将会调用wxPay.notify.php类中的NotifyCallBack方法,而这个方法又会调用NotifyProcess()方法,这个方法又会调用Queryorder()方法,那么我们只需要在    Queryorder()方法中处理商户即可!

public function Queryorder($transaction_id)
{
   $input = new WxPayOrderQuery();
   $input->SetTransaction_id($transaction_id);
   $result = WxPayApi::orderQuery($input);
   Log::DEBUG("start 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;
}

微信支付有点坑的地方是,我们扫码支付完成,就一直停留在这个二维码页面,对用户体验非常的糟糕,那么我们处理商户订单完成之后跳转到成功页面!

一般情况下我们可以使用query中的定时器ajax轮询查询订单状态们如果本地商户订单状态被修改,那么就直接跳转到成业页面!

本文连接:http://www.phpbloger.com/article/30.html 文章都为原创,转载请注明出处!

相关文章