ThinkPHP5.0 实现 app支付宝支付功能

Posted 码农编程进阶笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThinkPHP5.0 实现 app支付宝支付功能相关的知识,希望对你有一定的参考价值。

https://mp.weixin.qq.com/s/EbfOmEGN93QAnrZOKVP0Vg

先来个效果图

 

做这个支付宝支付我总共用到了三个控制器:

1:支付宝支付控制器。

2:支付宝支付配置参数控制器。

3:支付宝回调地址控制器。

 

首先创建个支付宝支付的控制器,是由上个页面选择好支付方式之后确认支付后需要经过的控制器(这里选择的是支付宝支付),代码 如下:

<?php
namespace app\\mobile\\controller;
use app\\mobile\\model\\Goods;
use app\\mobile\\model\\OrderGoods;
use think\\Controller;

class Pay extends Controller
{
    public function pay_order()
    {
        $res = new OrderGoods();
        //获取订单号
        $where[\'id\'] = input(\'post.order_sn\');
        $reoderSn = input(\'post.order_sn\');
        //查询订单信息
        $order_info = $res->where($where)->find();
        //获取支付方式
        $pay_type = input(\'post.pay_type\');//微信支付 或者支付宝支付
        //获取支付金额
        $money = input(\'post.totle_sum\');
        //判断支付方式
        switch ($pay_type) {
            case \'ali\';//如果支付方式为支付宝支付

                //更新支付方式为支付宝
                $type[\'pay_type\'] = \'ali\';
                $res->where($where)->update($type);

                //实例化alipay类
                $ali = new Alipay(); 

                //异步回调地址
                $url = \'XXXXXXXXXXXXXXXXXX/Callback/aliPayBack\';

                $array = $ali->alipay(\'商品名称\', $money,$reoderSn,  $url);

                if ($array) {
                    return $array;
                } else {
                    echo json_encode(array(\'status\' => 0, \'msg\' => \'对不起请检查相关参数!@\'));
                }
                break;
            case \'wx\';

                break;
        }
    }
}

然后又创建了一个Alipay控制器,写支付宝配置参数,代码如下:

class AliPay extends Controller
{

    protected $appId = \'\';//支付宝AppId
    protected $rsaPrivateKey = \'\';//支付宝私钥
    protected $aliPayRsaPublicKey = \'\';//支付宝公钥
    private $seller = \'\';

    /*
     * 支付宝支付
     */
    public function aliPay($body, $total_amount, $product_code, $notify_url)
    {
        /**
         * 调用支付宝接口。
         */
        /*import(\'.Alipay.aop.AopClient\', \'\', \'.php\');
        import(\'.Alipay.aop.request.AlipayTradeAppPayRequest\', \'\', \'.php\');*/
        Loader::import(\'Alipay\\aop\\AopClient\', EXTEND_PATH);
        Loader::import(\'Alipay\\aop\\request\\AlipayTradeAppPayRequest\', EXTEND_PATH);

        $aop = new \\AopClient();

        $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
        $aop->appId = $this->appId;
        $aop->rsaPrivateKey = $this->rsaPrivateKey;
        $aop->format = "json";
        $aop->charset = "UTF-8";
        $aop->signType = "RSA2";
        $aop->alipayrsaPublicKey = $this->aliPayRsaPublicKey;
        $request = new \\AlipayTradeAppPayRequest();
        $arr[\'body\'] = $body;
        $arr[\'subject\'] = $body;
        $arr[\'out_trade_no\'] = $product_code;
        $arr[\'timeout_express\'] = \'30m\';
        $arr[\'total_amount\'] = floatval($total_amount);
        $arr[\'product_code\'] = \'QUICK_MSECURITY_PAY\';

        $json = json_encode($arr);
        $request->setNotifyUrl($notify_url);
        $request->setBizContent($json);

        $response = $aop->sdkExecute($request);
        return $response;

    }


    function createLinkstring($para)
    {
        $arg = "";
        while (list ($key, $val) = each($para)) {
            $arg .= $key . "=" . $val . "&";
        }
        //去掉最后一个&字符
        $arg = substr($arg, 0, count($arg) - 2);

        //如果存在转义字符,那么去掉转义
        if (get_magic_quotes_gpc()) {
            $arg = stripslashes($arg);
        }

        return $arg;
    }


    function argSort($para)
    {
        ksort($para);
        reset($para);
        return $para;
    }
}

 

Alipay支付demo我放在extend目录下了,用这种方法来实现支付宝支付的话,上面的那个支付宝配置参数控制器的内容除了支付宝Appid,支付宝公钥,私钥,收款人账号,其他的照搬下来就行了,现在已经写了两个控制器了,接下来还有一个异步回调地址。

<?php
namespace app\\mobile\\controller;
use app\\mobile\\model\\OrderGoods;
use app\\mobile\\model\\IntegralRecord;
use app\\admin\\model\\SystemSettings;
use app\\mobile\\model\\Members;
use think\\Controller;
use think\\Request;
use think\\Db;

class Callback extends Controller
{
    /*
     * 支付宝支付回调修改订单状态
     */
    public function aliPayBack()
    {

        if ($_POST[\'trade_status\'] == \'TRADE_SUCCESS\') {//如果支付成功
            //===============修改订单状态===========================//
            $order = new OrderGoods();//实例化
            $orderSn = $_POST[\'out_trade_no\'];//获取订单号
                $where[\'order_sn\'] = $orderSn;
                $data1[\'type\'] = 2;
            $order->where($where)->update($data1);//修改订单状态
            echo \'success\';
            exit;
        }
    }
}

OK现在代码写完了。执行支付宝支付订单的时候先进入支付宝Pay控制器接收POST传递的三个参数,订单号,金额,支付方式。接收到之后写商品名称,商品描述,回调地址等 然后实例化Alipay类调用这个类里面的aliPay方法进行支付,调用结果返回一个签名,把这个签名反馈给app端进行支付,支付成功后执行异步回调,修改订单状态

以上是关于ThinkPHP5.0 实现 app支付宝支付功能的主要内容,如果未能解决你的问题,请参考以下文章

php实现支付宝APP支付功能与源码

支付宝剪贴板开启有啥用

支付宝APP支付(基于Java实现支付宝APP支付)

APP能实现H5支付吗

iOS Scheme以及微信、支付宝等第三方功能的实现

支付宝APP支付(基于Java实现支付宝APP支付)