TP5 整合微信扫码支付

作者: 泥豆芽儿MT | 来源:发表于2017-08-21 18:05 被阅读4627次

    摘要

    • 为了便于微信开发,此处在ThinkPHP5.0 框架下整合了微信扫码支付的功能,测试需要外网项目部署.
    • 对于TP3的集成,可参考之前写的文章 ThinkPHP 框架下微信支付

    功能开发

    微信支付SDK整理移植

    • 一般会进行原生开发,那么就可以直接下载开发文档中的PHP-SDK,此处的代码进行了整理。
    • 需要将 ..\application\extend 目录下的 wxpay 对应移植到自己的项目目录中.

    配置 WxPayConfig

    • 定位到 ..\application\extend\wxpay\WxPayConfig.php 文件,配置微信支付的四个重要数据.
    • 注意:NOTIFY_URL 要写绝对路径
     /**
         * 微信公众号信息配置
         *
         * 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
         * @var string
         */
    

    生成二维码 url

    • 以参考项目为例,在 ..\application\index\controller\Wxpay.php 中添加了index()方法,用于业务处理(例如获取post/get请求数据,并进行商品信息的获取等)以及调用微信接口生成二维码.
    • 得到的qrCode_url 需要赋值到前端页面<img>标签的url
    • 注意外网可访问的要求.
     public function index()
        {
            //TODO 进行业务处理
            //TODO 生成二维码
            $product_id = time()+1;
            $notify = new NativePay();
            $input = new WxPayUnifiedOrder();
            $input->setBody("product_name");
            $input->setAttach("xxx");
            //$input->setOutTradeNo(WxPayConfig::MCHID.date("YmdHis"));
            $input->setOutTradeNo($product_id);
            $input->setTotalFee("1");//以分为单位
            $input->setTimeStart(date("YmdHis"));
            $input->setTimeExpire(date("YmdHis", time() + 600));
            $input->setGoodsTag("test");
    
            $input->setNotifyUrl(wxPayConfig::NOTIFY_URL);
            $input->setTradeType("NATIVE");
            //$product_id 为商品自定义id 可用作订单ID
            $input->setProductId($product_id);
            $result = $notify->getPayUrl($input);
            if (empty($result['code_url'])){
                $qrCode_url = '';
            }else{
                $qrCode_url = $result["code_url"];
            }
    
            return $this->fetch('',[
                'qrCode_url' => $qrCode_url,
            ]);
    }
    

    回调函数的编辑

    • 以参考项目为例,对应于NOTIFY_URL 的设置,本人在 ..\application\index\controller\Wxpay.php 中添加了notify()方法。
    • 用于异步接收微信支付后的逻辑处理
    • file_put_contents('/tmp/2.txt',$wxData,FILE_APPEND); 代码是为了将微信支付的反馈信息写入本地文件,便于分析处理.
    /**
         * 微信支付 回调逻辑处理
         * @return string
         */
    public function notify(){
            $wxData = file_get_contents("php://input");
            //file_put_contents('/tmp/2.txt',$wxData,FILE_APPEND);
            try{
                $resultObj = new WxPayResults();
                $wxData = $resultObj->Init($wxData);
            }catch (\Exception $e){
                $resultObj ->setData('return_code','FAIL');
                $resultObj ->setData('return_msg',$e->getMessage());
                return $resultObj->toXml();
            }
    
            if ($wxData['return_code']==='FAIL'||
                $wxData['return_code']!== 'SUCCESS'){
                $resultObj ->setData('return_code','FAIL');
                $resultObj ->setData('return_msg','error');
                return $resultObj->toXml();
            }
            //TODO 根据订单号 out_trade_no 来查询订单数据
            $out_trade_no = $wxData['out_trade_no'];
            //此处为举例
            $order = model('order')->get(['out_trade_no' => $out_trade_no]);
    
            if (!$order || $order->pay_status == 1){
                    $resultObj ->setData('return_code','SUCCESS');
                    $resultObj ->setData('return_msg','OK');
                    return $resultObj->toXml();
            }
            //TODO 数据更新 业务逻辑处理 $order
        }
    

    附录

    相关文章

      网友评论

        本文标题:TP5 整合微信扫码支付

        本文链接:https://www.haomeiwen.com/subject/tbecdxtx.html