精华内容
参与话题
问答
  • 搭建PHP开发环境(Apache+PHP+MySQL)

    万次阅读 多人点赞 2018-06-25 10:25:32
    简介:总结在Windows环境搭建PHP开发环境(Apache+PHP+MySQL) 安装Apache 1、下载Apache,地址:http://www.apachelounge.com/download/,如下图: 2、解压压缩包,最好放到磁盘根目录,不然配置时容易报路径...

    简介:总结在Windows环境搭建PHP开发环境(Apache+PHP+MySQL)

    安装Apache

    1、下载Apache,地址:http://www.apachelounge.com/download/,如下图:
    这里写图片描述
    2、解压压缩包,最好放到磁盘根目录,不然配置时容易报路径错误,我这里改了文件夹名,方便以后配置,如下图:
    这里写图片描述

    安装PHP

    1、下载PHP压缩包,地址:https://windows.php.net/download ,我下载的是PHP7.0 Thread Safe 版本,如下图:
    这里写图片描述
    2、解压压缩包,我解压后如下:
    这里写图片描述

    安装MySQL

    1、我安装的MySQL55版本,这里不介绍MySQL的安装方式,大家可以自己去网上搜
    2、MySQL官方下载地址:https://dev.mysql.com/downloads/installer/
    3、MySQL默认安装目录如下:
    这里写图片描述

    配置MySQL

    1、打卡环境变量页面
    具体操作如下:我的电脑-右键-属性-高级系统设置-环境变量
    2、新建MYSQL_HOME变量,值为MySQL的安装路径,如下图:
    这里写图片描述
    3、编辑path系统变量,将%MYSQL_HOME%\bin添加到path变量最后面
    4、启动MySQL,命令行输入:start mysqld,如下图:
    这里写图片描述

    配置PHP

    1、打开PHP的安装目录将php.ini-development先复制一份,然后把php.ini-development改为php.ini保存
    2、打开php.ini修改配置,查找; extension_dir = “ext” ,改为extension_dir = “ext的目录” ,比如 extension_dir = “D:\软件\php7\ext”,如下图:
    这里写图片描述
    3、打开几个常用的扩展,例如:查到extension=php_mysqli.dll,去掉前面的分号。打开下图中的这几个库:
    这里写图片描述

    配置Apache

    1、打开Apache的安装目录,找到conf文件夹下的httpd.conf文件并打开
    2、找到“Define SRVROOT”这一项,将后面引号内的值改为Apache的安装目录,如下图:
    这里写图片描述
    3、文件的末尾添加对PHP的支持及PHP的安装路径,如下图:
    这里写图片描述
    代码如下:

    # php7 support
    LoadModule php7_module "D:/软件/php7/php7apache2_4.dll"
    AddType application/x-httpd-php .php .html .htm
    
    # configure the path to php.ini
    PHPIniDir "D:/软件/php7"

    启动Apache服务

    1、设置环境变量
    右键我的电脑,属性->高级,找到最下面的环境变量按钮,选中当前用户的PATH变量,编辑新建以下条目:
    D:\Apache24\bin
    D:\软件\php7
    D:\软件\php7\ext
    2、安装apache服务
    以管理员身份打开命令行,执行httpd.exe -k install
    3、启动服务
    找到apache的安装目录下的bin文件夹,双击ApacheMonitor.exe,双击之后apache就开启了。
    可以在任务栏选择下图图标,右键打开Apache Service Monitor窗口,进行Apache服务的管理
    这里写图片描述
    4、此时在浏览器地址栏输入localhost,回车后就会出现apache的界面,如下图:
    这里写图片描述
    5、接下来在 Apache安装目录/htdocs的目录下新建一个phpinfo.php文件,内容为:

    <?php
    phpinfo();
    ?>

    保存后,在浏览器输入127.0.0.1/phpinfo.php,回车,出现关于PHP的版本信息,如下图:
    这里写图片描述

    至此php环境搭建完成,可以将php文件放入htdocs文件夹中运行了

    踩到的坑

    1、浏览器输入对应PHP地址后,无法解析php
    解决:在命令行输入httpd -t,可以查看是不是Apache的启动问题,如下图:
    这里写图片描述
    可以看到,报错信息是说找不到PHP安装目录下的php7apache2_4.dll文件,通过网上查后我下载的PHP版本不对,应该下载Thread safe 版本。

    展开全文
  • 那目前MAC下php开发都用哪些工具呢?可能对于php初学者不知道该用哪些或者哪些mac版的php开发工具比较好?php中文网特为PHP开发者推荐几款最好用,最流行的php开发工具!php中文网的同学们可以免费下载使用!   ...

    目前使用MAC ios系统的php开发者越来越多。那目前MAC下php开发都用哪些工具呢?可能对于php初学者不知道该用哪些或者哪些mac版的php开发工具比较好?php中文网特为PHP开发者推荐几款最好用,最流行的php开发工具!php中文网的同学们可以免费下载使用!

     

    13.jpg

    一.MAC版代码编辑器

    在代码编辑器、文本编辑器领域,有着不少的「神器」级的产品,如历史悠久的 VIM、Emacs 以及如今当红的 SublimeText。另外还有 VS Code、EditPlus、NotePad++、UltraEdit 等一大堆流行的利器,可谓百家争鸣。以下是php中文网总结的MAC版php开发工具代码编辑器的排名

    1.SublimeText3 Mac版

    工具简介:

    Sublime Text(Mac版)是一款流行的代码编辑器。Sublime Text 具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

    2.Atom编辑器 MAC版

    工具简介:

    Atom 代码编辑器支持 Windows、Mac、Linux 三大桌面平台,完全免费,并且已经在 GitHub 上开放了全部的源代码。php中文网特将此优秀编辑器Atom搜集过来提供下载!在经过一段长时间的迭代开发和不断改进后,Atom 终于从早期的测试版达到了 1.0 正式版了!相比之前的版本,在性能和稳定性方面都有着显著的改善。

    3.PhpStorm 10.0.1 Mac版

    工具简介:

    phpstorm免费版是目前网络上最为流行的php开发软件。phpstorm免费版能全面的提升用户php代码编写的效率,并且提供能代码补全、快速导航、即时错误检查等等功能,大大的节省php代码编写时间,phpstorm 2016.2版全新的软件界面,全面的提升所有编写功能,希望大家能够喜欢,下载使用。

    4.ZendStudio 13.5.1 Mac版

    工具简介:

    本软件为Zend Studio Mac苹果版。Zend Studio是一个屡获大奖的专业PHP集成开发环境,具备功能强大的专业编辑工具和调试工具,支持PHP语法加亮显示,支持语法自动填充功能,支持书签功能,支持语法自动缩排和代码复制功能,内置一个强大的PHP代码调试工具,支持本地和远程两种调试模式,支持多种高级调试功能。

    5.Dreamweaver Mac版

    工具简介:

    本软件为Dreamweaver Mac苹果版。2015 版 Dreamweaver CC 专注于快速响应设计、代码编辑功能的改进、在设备上进行网页预览以及从 Photoshop 复合中批量提取具有多种分辨率的 Web 优化图像。与 Bootstrap 框架的集成可帮助您构建移动优先、快速响应的网站。视觉媒体查询通过让您在各种断点处对您的设计进行可视化和修改,进一步完善了快速响应网页设计的体验

    二.mac php开发环境搭建

    1.MAMP Pro for Mac 3.5

    工具简介:

    过这款软件能够一键快速安装 Apache、Nginx、MySQL、PHP、Postfix 等服务器软件,简单方便,节省大量下载和安装配置的时间,并且可以集中管理和调整运行环境,支持PHP多版本切换、Imagemagick图形处理工具、动态DNS、虚拟服务器、phpMyAdmin等等工具,还支持一键安装WordPress, Joomla, Drupal等开源应用,非常的强大,是Mac程序员开发必备的一款软件!

    2.SQLPro for Mysql 1.0.13

    工具简介:

    SQLPro for MySQL是一款Mac上优秀的MySQL客户端,方便和快速的连接到MySQL数据库,图形界面,支持多种主题,代码高亮,语句查询等!

    3.NavicatPremium Mac版

    工具简介:

    NavicatPremium是最优秀的数据库图形化管理客户端,支持MySQL、SQL Server、SQLite、Oracle 和 PostgreSQL 等数据库,支持数据库建模,正向和反向工程,数据同步等功能,而Premium版本是包含了Navicat所有功能的最强大版本,是首选的数据库客户端工具!

    三.其它用到的MACphp开发工具

    1.Yummy FTP MAC版

    工具简介:

    Yummy FTP 是一款Mac上优秀的FTP文件传输工具,支持FTP / FTPS/ SFTP协议,简单易用,传输速度很快,支持目录同步、计划任务、带宽限制等等高级功能,相比免费的FileZilla有这个软件独特的优点!

    2.Parallels Desktop 12

    工具简介:

    Parallels Desktop 12.1.3 for Mac 一款Mac上最优秀的虚拟机软件!在Parallels Desktop 12中,新增对macOS Sierra新系统的支持,以及全新的一键式工具、由 Acronis 提供支持的为期一年的 500 GB 免费在新存储容量等,支持 Windows 10、Windows 8、Windows 7、Linux、Android等,最强大的虚拟机之一!

    展开全文
  • PHP开发APP微信支付接口

    万次阅读 2019-09-03 22:49:53
    PHP开发APP微信支付接口 转载 : 这段时间在给一个iOS应用程序开发一个微信支付接口,之前并没有接触过微信支付,翻阅了一上午的微信开发文档,对其流程做了大致的了解后,便开始着手该接口程序的编写。 编写的...

     

    PHP开发APP微信支付接口

    转载 :

    这段时间在给一个iOS应用程序开发一个微信支付接口,之前并没有接触过微信支付,翻阅了一上午的微信开发文档,对其流程做了大致的了解后,便开始着手该接口程序的编写。 编写的过程中也遇到了各种各样的问题,各方查找资料,终于完成了该接口的开发。想到以后小伙伴们肯能会用的到,因此,我将整个接口的开发流程分享给大家。

    【准备工作】

    在准备着手开发之前呢,我建议大家先去查阅一下微信的 APP支付开发者文档 ,对微信支付开发的流程有一个系统的了解。

    我这里为大家准备了一张交互时序图,以便大家随时查看:

    APP支付时序图

    商户系统和微信支付系统主要交互说明:

    1. 用户在商户APP中选择商品,提交订单,选择微信支付。
    2. 商户后台收到用户支付单,调用微信支付统一下单接口。参见 【统一下单API】
    3. 统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay
    4. 商户APP调起微信支付。api参见本章节 【app端开发步骤说明】
    5. 商户后台接收支付通知。api参见 【支付结果通知API】
    6. 商户后台查询支付结果。api参见 【查询订单API】

    【着手开发】

    由于我们是做服务端,因此我们更关注服务端数据的处理,因此,跳过第一步。不过我们还是要先来模拟一些订单数据:

    点击步骤2中的统一下单API的链接,我们可以看到我们请求接口时需要向其传输的一些参数,包括应用ID、商户号、设备号等等,我们只需向其传输必填项即可,选填数据可以根据自己的实际需求来决定。

    商品信息数据

    appid 和 mch_id 分别去到微信开放平台和微信商户平台中获取,nonce_str (随机字符串) 很随意了,不长于32位就好。

    
    /**
     * 生成随机数并返回
     */
    private function getNonceStr() {
        $code = "";
        for ($i=0; $i > 10; $i++) { 
            $code .= mt_rand(1000);        //获取随机数
        }
        $nonceStrTemp = md5($code);
        $nonce_str = mb_substr($nonceStrTemp, 5,37);      //MD5加密后截取32位字符
        return $nonce_str;
    }

    notify_url(通知地址)是接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。例如:'https://pay.weixin.qq.com/wxpay/pay.action'

    接下来是微信支付中最为关键的步骤之一:签名,微信支付整个流程下来一共要经过三次签名。

    签名算法

    上图所示的是微信签名的算法说明,特别要注意图上我所标识出来的关键点。根据微信官方的签名算法,我编写了下面的方法:

    
    /**
     * 获取参数签名;
     * @param  Array  要传递的参数数组
     * @return String 通过计算得到的签名;
     */
    private function getSign($params) {
        ksort($params);        //将参数数组按照参数名ASCII码从小到大排序
        foreach ($params as $key => $item) {
            if (!empty($item)) {         //剔除参数值为空的参数
                $newArr[] = $key.'='.$item;     // 整合新的参数数组
            }
        }
        $stringA = implode("&", $newArr);         //使用 & 符号连接参数
        $stringSignTemp = $stringA."&key=".$this->key;        //拼接key
                                             // key是在商户平台API安全里自己设置的
        $stringSignTemp = MD5($stringSignTemp);       //将字符串进行MD5加密
        $sign = strtoupper($stringSignTemp);      //将所有字符转换为大写
        return $sign;
    }

    注意:key的值长度不能超过32位。

    这里,我们最好编写一个类文件来包含这些方法,比如上面我们获取签名的方法会重复调用很多次,写在类方法里能减少耦合,并且方便多次调用。

    那么我编写了一个微信支付的类文件(我会在文章的最末尾将源码提供给大家参考),该类在实例化的同时会初始化一些固定数据,例如appid 、 mch_id 等

    
    /**
     * 构造函数,初始化成员变量
     * @param  String $appid  商户的应用ID
     * @param  Int $mch_id 商户编号
     * @param String $key 秘钥
     */
    // 将构造函数设置为私有,禁止用户实例化该类
    private function __construct($appid, $mch_id, $key) {
        if (is_string($appid) && is_string($mch_id)) {
            $this->appid = $appid;
            $this->mch_id = $mch_id;
            $this->key = $key;
        }
    }
    
    /**
     * 获取微信支付类实例
     * 该类使用单例模式
     * @return WeEncryption         本类实例
     */
    public static function getInstance() {
        if(self::$instance == null) {
            self::$instance = new Self(APPID, MCHID, APP_KEY);
        }
        return self::$instance;
    }

    再调用 WeEncryption::setNotifyUrl($url) 方法来设置异步通知回调地址:

    
    /**
     * 设置通知地址
     * @param  String $url 通知地址;
     */
    public function setNotifyUrl($url) {
        if (is_string($url)) {
            $this->notify_url = $url;
        }
    }

    直到现在,我们所有需要向统一下单接口传输的数据已经全部准备完毕了,接下来就该向微信请求数据了。

    首先我们先将要发送的数据拼装成xml格式:

    /**
     * 拼装请求的数据
     * @return  String 拼装完成的数据
     */
    private function setSendData($data) {
        $this->sTpl = "<xml>
                            <appid><![CDATA[%s]]></appid>
                            <body><![CDATA[%s]]></body>
                            <mch_id><![CDATA[%s]]></mch_id>
                            <nonce_str><![CDATA[%s]]></nonce_str>
                            <notify_url><![CDATA[%s]]></notify_url>
                            <out_trade_no><![CDATA[%s]]></out_trade_no>
                            <spbill_create_ip><![CDATA[%s]]></spbill_create_ip>
                            <total_fee><![CDATA[%d]]></total_fee>
                            <trade_type><![CDATA[%s]]></trade_type>
                            <sign><![CDATA[%s]]></sign>
                        </xml>";                          //xml数据模板
    
        $nonce_str = $this->getNonceStr();        //调用随机字符串生成方法获取随机字符串
    
        $data['appid'] = $this->appid;
        $data['mch_id'] = $this->mch_id;
        $data['nonce_str'] = $nonce_str;
        $data['notify_url'] = $this->notify_url;
        $data['trade_type'] = $this->trade_type;      //将参与签名的数据保存到数组
        // 注意:以上几个参数是追加到$data中的,$data中应该同时包含开发文档中要求必填的剔除sign以外的所有数据
        $sign = $this->getSign($data);        //获取签名
    
        $data = sprintf($this->sTpl, $this->appid, $data['body'], $this->mch_id, $nonce_str, $this->notify_url, $data['out_trade_no'], $data['spbill_create_ip'], $data['total_fee'], $this->trade_type, $sign);
        //生成xml数据格式
        return $data;
    }

    特别注意:

    • xml数据要使用<![CDATA[]]>注释包裹

    到此,我们的准备工作已经完毕,可以开始向统一下单接口发起请求了:

    
    /**
     * 发送下单请求;
     * @param  Curl   $curl 请求资源句柄
     * @return mixed       请求返回数据
     */
    public function sendRequest(Curl $curl, $data) {
        $data = $this->setSendData($data);            //获取要发送的数据
        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
        $curl->setUrl($url);          //设置请求地址
        $content = $curl->execute(true, 'POST', $data);       //执行该请求
        return $content;      //返回请求到的数据
    }

    以上示例代码中包含了一个Curl类,是一个数据请求工具类,不了解的小伙伴可以百度查一下。该工具主要是帮助我们发送请求用的,稍后我会在文章的最后将该类文件的源码跟微信支付类一起展示给大家。

    我们在客户端代码中实例化该工具类,调用 WeEncryption::sendRequest(Curl $curl, $data) 方法请求下单接口:

    
    $curl = new Curl();                //实例化传输类;
    $xml_data = $encpt->sendRequest($curl, $data);        //发送请求

    我们已经向下单接口发送请求,如果请求成功,微信会向我们返回一些数据:

    返回数据

    好的,此时我们开始第三步 —— 二次签名。

    我们重点关注一下返回数据中的 prepay_id,该参数是微信生成的预支付回话标识,用于后续接口调用中使用,该值有效期为2小时。

    在第三步中我们得知:

    • 统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。
    • 参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。

    上一步我们向微信发送请求后,我们将返回的数据保存到了变量$xml_data中,接下来,我们根据上一步微信返回的数据判断上一次的请求是否成功:

    
    $postObj = $encpt->xmlToObject($xml_data);            //解析返回数据
    
    if ($postObj === false) {
        echo 'FAIL';
        exit;             // 如果解析的结果为false,终止程序
    }
    
    if ($postObj->return_code == 'FAIL') {
        echo $postObj->return_msg;            // 如果微信返回错误码为FAIL,则代表请求失败,返回失败信息;
    } else {
        //如果上一次请求成功,那么我们将返回的数据重新拼装,进行第二次签名
        $resignData = array(
            'appid'    =>    $postObj->appid,
            'partnerId'    =>    $postObj->mch_id,
            'prepayId'    =>    $postObj->prepay_id,
            'nonceStr'    =>    $postObj->nonce_str,
            'timeStamp'    =>    time(),
            'package'    =>    'Sign=WXPay'
            );
        //二次签名;
        $sign = $encpt->getClientPay($resignData);
        echo $sign;
    }

    上述代码中,我们先调用了 WeEncryption::xmlToObject($xml_data) 方法解析返回数据:

    
    /**
     * 解析xml文档,转化为对象
     * @author 栗荣发 2016-09-20
     * @param  String $xmlStr xml文档
     * @return Object         返回Obj对象
     */
    public function xmlToObject($xmlStr) {
        if (!is_string($xmlStr) || empty($xmlStr)) {
            return false;
        }
        // 由于解析xml的时候,即使被解析的变量为空,依然不会报错,会返回一个空的对象,所以,我们这里做了处理,当被解析的变量不是字符串,或者该变量为空,直接返回false
        $postObj = simplexml_load_string($xmlStr, 'SimpleXMLElement', LIBXML_NOCDATA);
        $postObj = json_decode(json_encode($postObj));
        //将xml数据转换成对象返回
        return $postObj;
    }

    如果返回数据无误,接着将重新参与签名的数据拼装好,进行二次签名,在这里我需要提醒一下大家:

    • package的值为Sign=WXPay不变
    • 时间戳使用time()获取就好
    • mch_id 即为 partnerId
    • 其他数据可以使用微信返回的数据,也可以自己写
    • 最重要的一点,看下图:

    注意事项

    图中微信说参与签名的字段包含这些,我圈起来的变量是大小写结合的,但实际上,二次签名的时候所有的变量都是小写的,否则会提示签名错误(这一点坑了我好久)。

    最后调用 WeEncryption::getClientPay($data) 重新生成签名

    
    /**
     * 获取客户端支付信息
     * @author 栗荣发 2016-09-18
     * @param  Array $data 参与签名的信息数组
     * @return String       签名字符串
     */
    public function getClientPay($data) {
        $sign = $this->getSign($data);        // 生成签名并返回
        return $sign;
    }

    将重新生成的签名传输给 APP 客户端。
    返回的时候,要将sign,appId,partnerId,prepayId,nonceStr,timeStamp,package 这七个值一起返回个 APP 客户端。

    【验签】

    完成前面我们讲解的过程之后,APP客户端已经可以调起微信的支付界面进行支付了,但是整个过程还没有完成。为了用户资金的安全起见,防止数据被篡改,我们要对微信返回过来的数据进行验证。

    还记得我们上一次向微信发送请求的时候,我们填写了一个 notify_url 的参数吗?当APP客户端请求支付成功后,微信会发起一个并行操作:

    1. 向APP客户端返回支付状态
    2. 向商户后台服务器返回支付结果

    我们先来获取一下微信向商户后台服务器返回的结果:

    
    /**
     * 接收支付结果通知参数
     * @return Object 返回结果对象;
     */
    public function getNotifyData() {
        $postXml = $GLOBALS["HTTP_RAW_POST_DATA"];    // 接受通知参数;
        if (empty($postXml)) {
            return false;
        }
        $postObj = $this->xmlToObject($postXml);      // 调用解析方法,将xml数据解析成对象
        if ($postObj === false) {
            return false;
        }
        if (!empty($postObj->return_code)) {
            if ($postObj->return_code == 'FAIL') {
                return false;
            }
        }
        return $postObj;          // 返回结果对象;
    }

    然后我们在客户端代码中接收一下:

    
    $obj = $encpt->getNotifyData();     // 接收数据对象

    然后重新拼装数据准备第三次签名:

    
    if ($obj) {
        $data = array(
            'appid'                =>    $obj->appid,
            'mch_id'            =>    $obj->mch_id,
            'nonce_str'            =>    $obj->nonce_str,
            'result_code'        =>    $obj->result_code,
            'openid'            =>    $obj->openid,
            'trade_type'        =>    $obj->trade_type,
            'bank_type'            =>    $obj->bank_type,
            'total_fee'            =>    $obj->total_fee,
            'cash_fee'            =>    $obj->cash_fee,
            'transaction_id'    =>    $obj->transaction_id,
            'out_trade_no'        =>    $obj->out_trade_no,
            'time_end'            =>    $obj->time_end
            );
                    // 拼装数据进行第三次签名
        $sign = $encpt->getSign($data);        // 获取签名
    
        /** 将签名得到的sign值和微信传过来的sign值进行比对,如果一致,则证明数据是微信返回的。 */
        if ($sign == $obj->sign) {
            $reply = "<xml>
                        <return_code><![CDATA[SUCCESS]]></return_code>
                        <return_msg><![CDATA[OK]]></return_msg>
                    </xml>";
            echo $reply;      // 向微信后台返回结果。
            exit;
        }
    }

    你以为到这里整个流程就结束了?看起来是可以了,支付已经完成了,而且我们也已经向微信发送了成功消息,还有什么要做的吗?

    答案是肯定的,接下来APP客户端还会我们发起请求查询实际结果。

    试想:如果遇到突发情况,我们的服务器没有接收到来自微信的通知消息,那我们没有返回给微信任何消息,结果是失败的,但是APP客户端却收到了微信返回的支付成功的通知,遇见这种情况我们该怎么办?

    因此,当支付流程结束后,我们的APP客户端依然要向我们发起一个请求,查询实际的订单状态,此时我们需要客户端将订单号传递给我们,然后我们使用订单号,继续向微信发起请求:

    
    /**
     * 查询订单状态
     * @param  Curl   $curl         工具类
     * @param  string $out_trade_no 订单号
     * @return xml               订单查询结果
     */
    public function queryOrder(Curl $curl, $out_trade_no) {
        $nonce_str = $this->getNonceStr();
        $data = array(
            'appid'        =>    $this->appid,
            'mch_id'    =>    $this->mch_id,
            'out_trade_no'    =>    $out_trade_no,
            'nonce_str'            =>    $nonce_str
            );
        $sign = $this->getSign($data);
        $xml_data = '<xml>
                       <appid>%s</appid>
                       <mch_id>%s</mch_id>
                       <nonce_str>%s</nonce_str>
                       <out_trade_no>%s</out_trade_no>
                       <sign>%s</sign>
                    </xml>';
        $xml_data = sprintf($xml_data, $this->appid, $this->mch_id, $nonce_str, $out_trade_no, $sign);
        $url = "https://api.mch.weixin.qq.com/pay/orderquery";
        $curl->setUrl($url);
        $content = $curl->execute(true, 'POST', $xml_data);
        return $content;
    }

    获取到查询结果后,我们可以根据微信的返回值来判断实际的支付结果。
    在这一步,我们也可以在确保成功后,将订单的信息保存到数据库。

    【结束】

    至此,整个支付流程已经结束了,希望可以对大家有所帮助,有什么问题可以在下方留言。

    展开全文
  • EOS区块链PHP开发

    千次阅读 2018-12-06 09:14:42
    EosTool的目的是消除使用PHP开发EOS区块链应用的痛苦,例如: 通过Nodeos和Keosd的RPC接口调用其功能 离线生成EOS格式的私钥和公钥 使用本地私钥生成符合EOS要求的交易签名 将交易对象序列化为Nodeos要求的packed_...

    1. 开发包概述

    EosTool的目的是消除使用PHP开发EOS区块链应用的痛苦,例如:

    • 通过Nodeos和Keosd的RPC接口调用其功能
    • 离线生成EOS格式的私钥和公钥
    • 使用本地私钥生成符合EOS要求的交易签名
    • 将交易对象序列化为Nodeos要求的packed_trx格式

    可以认为EosTool是PHP版本的eosjs,利用它可以完整地实现EOS官方客户端Cleos的功能, 也可以很方便地在PHP应用中增加对EOS区块链的支持能力,极大地提高开发效率。

    有兴趣的朋友也可以直接访问这里下载:EOS区块链PHP开发包

    EosTool运行在**Php 7.1+**环境下,当前版本1.0.0,主要代码文件清单如下:

    代码文件 说明
    eostool/src/client/NodeClient.php 节点软件nodeos的rpc接口封装类
    eostool/src/client/WalletClient.php 钱包软件keosd的rpc接口封装类
    eostool/src/client/RpcOutput.php RPC返回结果封装类
    eostool/src/Crypto/PrivateKey.php EOS私钥类
    eostool/src/Crypto/PublicKey.php EOS公钥类
    eostool/src/Crypto/Signature.php EOS签名类
    eostool/src/Serializer/AbiType.php EOS的ABI类型封装类
    eostool/src/Serializer/AbiTypeFactory.php ABI类型工厂类
    eostool/src/Serializer/SerialBuffer.php 序列化缓冲区实现类
    eostool/src/Serializer/Serializer.php 序列化器实现类
    eostool/src/Signer/Signer.php 签名器接口
    eostool/src/Signer/KeosdSigner.php Keosd签名器实现类
    eostool/src/Signer/LocalSigner.php 本地离线签名器实现接口
    eostool/src/Contract.php 合约类
    eostool/src/EosTool.php 开发包入口类
    eostool/tests 单元测试用例目录
    eostool/phpunit.xml 单元测试配置文件
    eostool/vendor 第三方依赖包
    eostool/composer.json composer配置文件

    2. 访问节点服务器

    使用NodeClient类访问nodeos的rpc接口。例如,下面的代码访问本机运行的 Nodeos节点的chain插件的get_info接口:

    use EosTool\Client\NodeClient;
    
    $nc = new NodeClient();
    $ret = $nc->chain->getInfo();
    if($ret->hasError()) throw new Exception($ret->getError());
    $info = $ret->getResult();
    
    

    2.1 RPC调用分组

    Nodeos采用了插件化架构,不同的插件的API也归入不同的分组,EosTool采用了保持一致的 命名方法,根据api即可推断出NodeClient的调用方法:API分组对应于NodeClient的一个同名 属性,API则对应与No的Client的分组同名属性下的一个经过camelCase转化的方法。例如:

    插件 API分组 RPC API NodeClient方法
    chain_api_plugin chain get_info $nc->chain->getInfo()
    history_api_plugin history get_transaction $nc->history->getTransaction()
    net_api_plugin net status $nc->net->status()
    producer_api_plugin producer get_runtime_options $nc->producer->getRunTimeOptions()
    dbsize_api_plugin dbsize get $nc->dbsize->get()

    RPC API的官方文档:https://developers.eos.io/eosio-nodeos/reference

    2.2 RPC调用参数

    对于Nodeos而言,有些调用需要传入额外的参数,例如chain插件的get_block接口, 使用EosTool进行调用时,将参数组织为一个关联数组即可,示例代码如下:

    $payload = [  'block_num_or_id' => 1 ];
    $ret = $nc->chain->getBlock($payload);
    
    

    2.3 RPC调用返回值

    所有RPC调用的返回结果都是一个RpcOutput实例,调用其hasError()方法可以 判断是否调用出错,进一步可以利用getError()方法获取错误信息。

    RPC调用的响应则可以通过getResult()方法获取,它是一个由原始的JSON结果 转化出的StdClass对象,因此可以方便的提取属性信息,例如:

    echo 'chain id' . $info->chain_id . PHP_EOL;
    
    

    2.4 访问主网/测试网节点

    在创建NodeClient实例时,可以传入额外的参数执行来制定要访问的EOS主网或测试网节点。 例如,使用下面的代码访问某个主网节点:

    $nc = new NodeClient(['base_uri' => 'https://api.eosnewyork.io:443/v1/']);
    
    

    或者访问jungle测试网的某个节点:

    $nc = new NodeClient(['base_uri' => 'https://jungle.eosio.cr:443/v1/']);
    
    

    3、访问钱包服务器

    新版的Keosd已经不提供RPC API文档,这可能意味着它在EOS软件栈中已经开始滑向边缘地位。 不过可以在这个地址访问老版的文档:https://developers.eos.io/eosio-nodeos/v1.1.0/reference

    使用WalletClient类访问Keosd的rpc接口。例如,下面的代码访问本机运行的 Keosd的list_wallets接口:

    use EosTool\Client\WalletClient;
    
    $wc = new WalletClient();
    $ret = $wc->listWallets();
    if($ret->hasError()) throw new Exception($ret->getError());
    $wallets = $ret->getResult();
    
    

    由于Keosd的API不再分组,因此RPC对应的方法直接挂在WalletClient对象上,这是一个不同之处。 与NodeClient一样的是,WalletClient的调用返回结果也是一个RpcOutput对象。

    1.4版的Keosd默认使用UNIX套接字而不是HTTP提供RPC接口,这可能是考虑到绝大多数情况下 Keosd都运行在本机,使用IPC会更安全一些。因此这也是WalletClient的默认实例化选项, 在绝大多数情况下,不需要传入额外的参数来实例化WalletClient。

    4. 私钥与公钥

    EOS的密钥算法类似于比特币,但做了一些调整,定义了自己的格式。

    使用PrivateKey类的静态方法new()生成随机私钥。例如:

    use EosTool\Crypto\PrivateKey;
    
    $prv = PrivateKey::new();
    echo $prv->toEos() . PHP_EOL; //类似:5Hu6nxM6s6UQ3nYkr1s1GKA17zPqpceUuWxH3JBwK8ZorMSRqGi
    
    

    toEos()方法用来将私钥对象转换为EOS的自定义格式。

    4.1 公钥推导

    从私钥可以推导出公钥,例如:

    $pub = $prv->getPublicKey();
    echo $pub->toEos() . PHP_EOL; //类似:EOS6wQ6t3n148GfzLzgxq7cC8ARDKxeaB3hQXdXn7oZYdwEyAXiSv
    
    

    同样,使用toEos()方法将公钥转换为EOS的自定义格式。

    4.2 导入EOS私钥

    可以将一个EOS格式的私钥转化为EosTool的PrivateKey对象,例如,下面的 代码将指定的EOS私钥导入,并显示其对应的EOS公钥:

    $prv = PrivateKey::fromEos('5Hu6nxM6s6UQ3nYkr1s1GKA17zPqpceUuWxH3JBwK8ZorMSRqGi');
    echo $prv->getPublicKey()->toEos() . PHP_EOL;
    
    

    4.3 权威签名

    PrivateKey的sign()方法支持普通签名和EOS节点要求的权威签名。例如下面的代码返回一个 普通签名:

    $hex = '1234567890abcdef...';
    $signature = $prv->sign($hex);
    
    

    传入额外的参数来获得指定数据的权威签名:

    $hex = '1234567890abcdef...';
    $signature = $prv->sign($hex,true);
    
    

    5. 序列化

    EOS要求交易在提交节点push_transaction之前先进行序列化,这也是在PHP中操作EOS交易 绕不过去的一个环节。

    在EosTool中,使用Serializer类进行序列化操作。例如,下面的代码将一个EOS转账交易 序列化为可以提交给EOS节点旳16进制码流格式:

    use EosTool\Serializer\Serializer;
    
    $abi = json_decode(file_get_contents('transaction.abi'),true);
    $serializer = Serializer::fromAbi($abi);  
    
    $tx = [
      'expiration'=>'2018-12-04T17:00:00',
      'ref_block_num' => 2878,
      'ref_block_prefix' => 29012031,
      'max_net_usage_words' => 0,
      'max_cpu_usage_ms' => 0,
      'delay_sec' => 0,
      'context_free_actions' => [],
      'actions' => [[
        'account' => 'eosio.token',
        'name' => 'transfer',
        'authorization' => [[
          'actor' => 'eosio',
          'permission' => 'active'
        ]],
        'data' => '1122334455667788990011223344556677.....889900'
      ]],
      'transaction_extensions' => []
    ];
    $hex = $serializer->serialize('transaction',$tx);
    echo  'serialized tx => ' .  $hex . PHP_EOL;
    
    

    Serializer的静态方法fromAbi()用来根据一个指定的abi构造序列化器实例,然后 利用实例的serialize()方法对指定类型的数据进行序列化操作,得到16进制码流。

    6. 签名

    EosTool提供了两种进行交易签名的方法:利用Keosd进行签名,或者使用本地私钥进行签名。

    使用KeosdSigner类来利用钱包服务器完成签名。例如:

    use EosTool\Signer\KeosdSigner;
    
    $signer = new KeosdSigner();
    $signatures = $signer->sign($tx,$pubKeys,$chainId);
    
    

    利用LocalSigner类,则可以避免使用keosd,直接利用离线私钥签名。例如:

    use EosTool\Signer\LocalSigner;
    
    $prvKeys = ['5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3'];
    $signer = new LocalSigner($prvKeys);
    $signatures = $signer->sign($tx,$pubKeys,$chainId);
    
    

    7. 交易提交

    一个交易数据,需要经过规范化、序列化、签名、打包一系列操作,才可以提交给 Nodeos节点广播出去。EosTool类提供了transact()方法来隔离这些繁琐的操作。

    例如,下面的代码使用NodeClient和LocalSigner创建一个EosTool实例,然后提交 一个交易:

    use EosTool\Client\NodeClient;
    use EosTool\Signer\LocalSigner;
    use EosTool\EosTool;
    
    $nc = new NodeClient();
    $signer = new LocalSigner(['5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3']);
    $tool = new EosTool($nc,$signer);
    
    $tx = [
      'actions' => [[
        'account' => 'eosio.token',
        'name' => 'transfer',
        'authorization' => [[
          'actor' => 'eosio',
          'permission' => 'active'
        ]],
        'data' => [
          'from' => 'eosio',
          'to' => 'tommy',
          'quantity' => '200.0000 EOS',
          'memo' => 'take care'
        ]
      ]]
    ];
    $ret = $tool->transact($tx);
    echo $ret->getResult()->transaction_id . PHP_EOL;
    
    

    可以很方便地将签名器改为KeosdSigner,例如:

    $nc = new NodeClient();
    $signer = new KeosdSigner();
    $tool = new EosTool($nc,$signer);
    
    

    8. 调用单个合约动作

    使用EosTool的pushAction()方法调用单个合约动作。例如,下面的代码调用tommy 账户托管合约的hi()方法:

    $tool = new EosTool(new NodeClient(),new KeosdSigner());
    $ret = $tool->pushAction('tommy','hi',['user'=>'tommy']);
    
    

    9. 部署合约

    使用EosTool的setContract()方法部署合约,例如:

    $tool = new EosTool(new NodeClient(),new KeosdSigner());
    
    $account = 'tommy';
    $abi = file_get_contents('hello.abi');
    $wasm = file_get_contents('hello.wasm');
    $ret = $tool->setContract($account,$abi,$wasm);
    

    有兴趣的朋友可以去这里下载:EOS区块链PHP开发包

    展开全文
  • 在Windows系统下如何搭建PHP开发环境? 为了快速进入编程状态,顺利地完成第一个PHP程序,我们选择使用PHP集成环境包。 什么是PHP集成环境包?类似的软件又有哪些呢? 要回答这个问题,我们需要知道开发PHP程序...
  • 几款PHP开发工具

    千次阅读 2017-07-31 16:23:27
    1.PHP开发工具 PHPDesigner (-php程序和WEB开发的最好编辑器和PHP IDE。快速,省时,强大。稳定!phpDesigner不仅是一个功能强大,速度超快的PHP IDE和PHP编辑器) 2. PHP源文件加密工具 PHP Screw [推荐] ...
  • php开发环境搭设

    千次阅读 2017-03-01 10:25:12
    php开发环境搭设需要安装下列三个软件:apache , php , mysqlapache1.下载绿色版的apache,解压 D:\Softwave\Dp\Apache 2.管理员身份cmd,cd到你的D:\Softwave\Dp\Apache\bin目录 3.执行httpd -k install 服务成功...
  • 会员免费看,...微信h5支付开发是子恒老师《子恒说微信开发》视频教程的第17部。详细讲解了微信H5支付开发,内容包含开通H5支付,实现微信h5支付,订单查询,关闭订单等等。欢迎反馈,微信号:QQ68183131
  • PHP开发框架比较

    千次阅读 2014-03-11 23:32:20
    PHP开发框架比较 Laravel 是一个简单优雅的 PHP WEB 开发框架,将你从意大利面条式的代码中解放出来。通过简单、优雅、表达式语法开发出很棒的 WEB应用! 但是通过使用我们发现Laravel在开发效率和运行效率上都...
  • win 10 PHP开发环境配置

    千次阅读 2017-12-08 23:19:15
    Windows10系统PHP开发环境配置
  • Laravel PHP 开发环境配置

    万次阅读 2015-12-08 10:51:23
    Laravel是一个PHP开发框架,用Laravel框架开发的网站需要运行于有PHP+数据库+web服务器的操作系统上。一般要求PHP版本5.4+,MySQL5.1+。本文选择PHP+MySQL数据库+Apache web服务器。在Windows下可以下载并安装最新版...
  • PHP开发API接口的实例代码

    万次阅读 2018-07-25 20:38:11
    php开发api接口的实例网址:http://wk.yl1001.com/doc_8771381808343778_all.htm     分享一例php实现API接口的代码,实现用户的注册、登录、查询用户信息的功能,是学习PHP API开发的不错实例,有兴趣的朋友...
  • 引言: 一个清楚的目标定位...  的 PHPer 因为学习到一半而没有明确的方向而最终放弃或搁浅。 手头收藏一些好的常用类或方法,能提高我们的开发的速度。...讲解开发流程 多人开发" title="如何用PHP开发一个完整的
  • PHP开发工具

    千次阅读 2009-09-27 20:35:00
    这里说的PHP开发工具,指的是IDE工具。像Editplus、Notepad++、UltralEdit等工具都是很好的开发工具,特别是对于初学者来说,但是这里就不再谈这些了。我们看一看常用的IDE开发工具,我个人理解如果要是自己学习、...
  • Eclipse for PHP+Wampserver搭建PHP开发环境

    千次阅读 2018-07-13 16:46:07
    由于项目需求,需要用PHP建立个简单查询系统,没想到在搭建PHP开发环境时,就非常抓狂,经过网上博客教学等,在此为搭建环境写个总结。 软件 Eclipse 下载链接:http://www.eclipse.org/downloads/ jdk下载...
  • Centos 7 PHP开发环境搭建

    千次阅读 2016-05-26 17:52:08
    Centos 7 PHP开发环境搭建
  • Intellij IDEA配置PHP开发环境

    万次阅读 2017-06-07 19:55:12
    Intellij IDEA是一款非常强大的编译器,能很好地支持Java HTML CSS等。...环境: ...步骤: 1、配置好PHP开发环境,包括PHP语言与Apache服务器,参考链接(博主跟着来了一遍,没问题): http://www.cnblogs.
  • ubuntu 16.04 php 开发环境搭建

    千次阅读 2016-05-01 14:25:41
    ubuntu 16.04 php开发环境搭建
  • VSCode WEB、PHP开发必备插件一览表
  • 最好用的9个php开发工具推荐

    万次阅读 2018-04-18 10:06:36
    对于PHP开发者,在互联网上有很多可用的开发工具,但对于初学者不知道哪个php开发工具比较好,找到一个合适的PHP开发工具是很难的,需要花费很多的时间精力。所以,今天php中文网就为初学者推荐几个2017年最好用的9...
  • php开发之Composer包

    万次阅读 2019-07-26 22:17:50
    应用 ... firebase/php-jwt 日期时间 nesbot/carbon 地理位置 mjaschen/phpgeo 随机数 paragonie/random_compat excel phpoffice/phpspreadsheet (文档) word phpof...
  • CentOS编译安装PHP开发环境

    千次阅读 2016-08-24 16:57:05
    CentOS编译安装PHP开发环境 最近在安装服务器开发环境, 踩了不少坑, 这里总结下来. yum安装虽然简单, 却不灵活, 版本也比较老旧不合符设计中的选型, 因此只使用yum安装一些依赖库, 目标软件采用编译安装. ...
  • 使用php开发移动APP接口

    千次阅读 2016-10-04 18:28:50
    开发移动APP使用源生态php开发速度最快,现在我这里演示一下如何使用php开发一个移动APP接口,在这里我不考虑过多的数据安全问题。这里只使用了pdo连接操作数据库,只做了一个预处理的,防止SQL驻入的,今天我...
  • win10 php开发环境搭建

    千次阅读 2016-08-23 12:48:50
    win10 php开发环境搭建1.安装php 下载并解压php7到d:\php7http://windows.php.net/download#php-7.0 选择合适的版本下载2.安装Apache下载并解压Apache 到 d:\Apache24 (注意,只能解压到磁盘根目录下)...
  • 微信公众平台PHP开发

    万次阅读 热门讨论 2013-07-11 11:36:30
    微信公众平台PHP开发 2013.05.19 10:28CATEGORY:PHPVIEWS:2346COMMENTS:29 最近在做微信公众平台开发,一口气写了二十几个功能,挺有意思的~     今天来分享一下开发经验~ 微信公众平台提供的接口很简单,...
  • 整理一些PHP开发安全问题

    千次阅读 2015-07-06 08:19:36
    整理一些PHP开发安全问题  php给了开发者极大的灵活性,但是这也为安全问题带来了潜在的隐患,近期需要总结一下以往的问题,在这里借翻译一篇文章同时加上自己开发的一些感触总结一下。 简介  当开发一个互联网...
  • 顺丰BSP接口PHP开发注意事项

    千次阅读 2016-07-08 12:09:39
    顺丰BSP接口PHP开发注意事项
  •  这篇文章主要介绍使用PHP开发接口,数据实现RSA加密解密后使用,实例分析了PHP自定义RSA类实现加密与解密的技巧,非常具有实用价值,需要的朋友可以参考下。 简单介绍RSA:  RSA加密算法是最常
  • PHP开发Web服务

    千次阅读 2008-09-15 07:38:00
    PHP开发Web服务WSO2 WSF/PHP(WSO2 Web Services Framework/PHP,WSO2 Web服务框架) 是一个PHP扩展,允许用来创建和使用Web服务。它支持SOAP1.1、SOAP1.2、MTOM、Web服务寻址、Web服务安全,也支持REST风格的调用。...

空空如也

1 2 3 4 5 ... 20
收藏数 97,488
精华内容 38,995
关键字:

php开发