°

tp5集成微信支付详细流程-童攀

2019年课程规划及价格说明


PHP实战视频教程大全

集成支付并不是一件多难的事情,难的是支付流程,本文就当做我们一件有了一个完整支付流程的网站,只剩下集成微信支付了。

第一步:集成微信支付首先得有公众账号

还没有的自己去申请一下:https://mp.weixin.qq.com/cgi-bin/loginpage?t=wxm2-login&lang=zh_CN

注意该账号需要是服务号,并且你还要有正规的公司资质才能继续申请开通微信支付功能

第二部:为该服务号申请开通微信支付http://www.tongpankt.com/2447

开通微信账号需要有正规的公司资质,登录微信公众平台后,找到微信支付,找到申请开通,根据提示上传资料,然后等待审核。

第三步:下载微信支付sdk 地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

因为我们用的是世界上最好的编程语言,所选择php版本下载

微信支付

 

下载后解压压缩包,得到如下文件夹:

童攀微信支付

 

比较重要的文件夹有两个lib和example,其中lib是微信支付的核心文件夹,而example则是像我们演示了微信各种类型的支付集成demo,很有参考价值

第四步:将微信支付核心文件引入到tp5项目中

说说引入外部文件到tp5的几种方法吧,第一种就是可以放到根目录的vendor文件夹中,通常通过composer下载的会放到这里。第二种放到跟路径的extend文件夹中,当然你不能直接就把lib核心文件复制到里面,最好要建一个文件夹,比如wxpay,不过放到extend里面要改命名空间,虽然简单但是还是把一些新手难住了,所以我们要用第三种方法,直接在根目录创建一个文件夹,然后把lib放进去。

因为我的项目要集成的不止一种支付方式,所以我在跟路径这样创建了文件夹:pay->wxpay->lib

创建了文件夹,并且把微信的支付集成文件放了进去怎么引入到项目当中呢?比如你是在index模块下order.php控制器中的orderpay()方法中引入微信支付,方法有两种。

第一种:使用相对路径的方式引入。

代码如下:

[php]

$wxpayApi=’../../../wxpay/lib/WxPay.Api.php’;//引入

include($wxpayApi);

[/php]

第二种:也是推荐的方式,使用定义路径常量的方法引入

首先你要去index.php入口文件定义一个常量

[php]

define(‘PAY_PATH’, __DIR__.’/pay/’); //支付路径

[/php]

然后一如代码就可以这样想,虽然道理一样但是感觉第一种不是很灵活

[php]</pre>
<pre>$wxpayApi=PAY_PATH.’wxpay/lib/WxPay.Api.php’;//引入
include($wxpayApi);</pre>
<pre>
[/php]

给出完整集成代码

[php]
public function orderpay(){
        $orderId=input(‘orderid’);//订单id
        $orders=db(‘order’)->find($orderId);//订单信息
        $outTradeNo=$orders[‘out_trade_no’];//创建订单表的时候注意要有这样一个生成唯一订单号的字段,并且不能太短,不然会报错的
        //商品名称
        $ordergoods=db(‘ordergoods’)->where(array(‘order_id’=>$orderId))->find();
        $goodsName=$ordergoods[‘goods_name’];
        $wxpayApi=PAY_PATH.’wxpay/lib/WxPay.Api.php’;//引入
        include($wxpayApi);
        $input = new \WxPayUnifiedOrder();
        $input->SetBody($goodsName);
        $input->SetAttach($goodsName);
        $input->SetOut_trade_no($outTradeNo);//订单号
        $totalPrice=($totalPrice*100);
        $input->SetTotal_fee($totalPrice);//总额 int  单位 分
        // $input->SetTime_start(date("YmdHis"));
        // $input->SetTime_expire(date("YmdHis", time() + 600));//失效时间
        // $input->SetGoods_tag("test");
        $input->SetNotify_url("http://www.****.com/index.php/index/Order/notify");
        $input->SetTrade_type("NATIVE");
        $input->SetProduct_id($orderId);//商品id
        $result = \WxPayApi::unifiedOrder($input);
        $url = ‘http://qr.liantu.com/api.php?text=’.$result["code_url"];//连图网接口http://www.tongpankt.com/2447
        $this->assign([
        ‘out_trade_no’=>$outTradeNo,
        ‘goodsName’=>cut_str($goodsName,24),
        ‘totalPrice’=>($totalPrice/100),
‘url’=>$url,
        ]);
        return view();
    }
[/php]

上面的这一段代码看函数名称我们也能看出来这个函数是用来实现集成微信支付的,也就是下单成功后要跳转到这个方法的,同时还要把刚刚下的单的id或者是订单号out_trade_no传递到本方法,都可以,因为他们两个都是唯一的,通过这两个中的任何一个我们都可以在订单表查询到我们下单的相关信息。

集成微信支付的时候踩到这样一个坑,就是微信需要的商户订单号不能是id,如果是id虽然有唯一性,但是长度太短了,会报错,无法生成支付所需要的url地址进而报错,所以我们才会设计另外一个字段 out_trade_no生成一个长点的唯一的随机数,这里我是这样做的:

[php]
$order[‘out_trade_no’]=rand(1,99999).time();
[/php]

这样下单的时候就有一个较长的随机数写入订单表。

再有一点要说的是我这边生成二维码的时候并不是通过本地生成的,而是通过第三方接口实现的,我要做的只是把微信支付的时候生成的code_url链接到网址后面就可以了,这样生成速度快又不占用自己的服务器资源。就是上面代码的这一段:

[php]
$url = ‘http://qr.liantu.com/api.php?text=’.$result["code_url"];//连图网接口http://www.tongpankt.com/2447
[/php]

把生成的$url分配到模板中后就可以在图片标签里面显示 <img id=”ewm” src=”{$url}” style=”width:60%;”>,拿出手机微信扫码即可支付。

当然能够正常支付并不是微信支付的终点,因为我们还要执行回调
当我们支付成功之后微信会向我们指定的回调方法发送请求,这个请求的路径我们已经在上面的代码块中指定

[php]
$input->SetNotify_url("http://www.****.com/index.php/index/Order/notify");
[/php]

具体回调方法如下:

[php]
    //微信回调
    public function notify()
    {
        $data=$GLOBALS[‘HTTP_RAW_POST_DATA’];
        $result=xmlToArray($data);
        $outTradeTo = $result[‘out_trade_no’];
        if($result[‘return_code’] == ‘FAIL’){
            $failResult="
                <xml>
                    <return_code><![CDATA[FAIL]]></return_code>
                    <return_msg><![CDATA[OK]]></return_msg>
                </xml>
            ";
            echo $failResult;
            exit;
        }else{
            if($result[‘result_code’] == ‘FAIL’){

            }else{
                 db(‘order’)->where(array(‘out_trade_no’=>$outTradeTo))->update([‘pay_status’=>1]);
            }
        }

        $failResult="
                <xml>
                    <return_code><![CDATA[FAIL]]></return_code>
                    <return_msg><![CDATA[OK]]></return_msg>
                </xml>
            ";
            echo $failResult;
            exit;

    }
[/php]

回调方法的目的就接到微信的通知后告诉微信我们知道处理结果了。

再有最后一步就是支付成功或者失败的时候,我们要动态的提示给扫码的用户,这个一般的做法就是ajax异步访问,查询微信订单,但是我在做这个的时候总是才坑,所以就自己写了一个方法,ajax怎么异步访问我想没有必要贴出代码了吧,我们已经做过太多次,
如果你不知道可以在评论去留言我发给你,我们贴出我自己改的查询订单状态的代码:童攀课堂

[php]
    //查询订单
    public function orderQuery(){
        $out_trade_no=input(‘out_trade_no’);
        $orders=db(‘order’)->where(array(‘out_trade_no’=>$out_trade_no))->find();
        if($orders[‘pay_status’]==1){
            return ‘SUCCESS’;
        }else{
            return ‘ERROR’;
        }
    }
[/php]

ajax得到返回的结果为success就提示支付成功,error就提示失败。至此就完成了微信支付。

打赏
  喜欢