1. 程式人生 > >ThinkPHP5.0 實現 app支付寶支付功能

ThinkPHP5.0 實現 app支付寶支付功能

napi security rsa 賬號 sdk n) success format 修改

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支付寶支付功能