分享自用支付宝支付类

分享自用支付宝支付类

云青
2019-11-04 / 0 评论 / 904 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年01月17日,已超过271天没有更新,若内容或图片失效,请留言反馈。

分享自用的支付宝支付类

目前只封装了 订单查询以及app支付

更多的支付 后期会集成

异步主要商户订单号查询 并确定金额是否与数据库中一致以及判断该商户订单号是否处理过(谨记)

个人觉得验签并不重要 有订单查询以及数据库订单验证就行了

过多的就不介绍了 源码有注释

    <?php
    /**
     * @author anderyly
     * @email admin@aaayun.cc
     * @link https://blog.aaayun.cc/
     * @copyright Copyright (c) 2019
     */
    
    class AliPay
    {
        // 应用ID
        public $appId;
    
        // 私钥
        public $privateKey;
    
        // 公钥
        public $publicKey;
    
        // 异步地址
        public $notify_url;
    
        // 同步地址
        public $return_url;
    
        //返回数据格式
        public $format = "json";
    
        //版本
        public $version = "1.0";
    
        // 编码
        public $charset = "UTF-8";
    
        //签名类型
        public $signType = "RSA2";
    
        // 配置
        public $config;
    
        // 网关
        public $gatewayUrl = "https://openapi.alipay.com/gateway.do";
    
        public function __construct($appid, $privateKey, $publicKey, $notify_url, $return_url)
        {
            $this->appId = $appid;
            $this->privateKey = $privateKey;
            $this->publicKey = $publicKey;
            $this->notify_url = $notify_url;
            $this->return_url = $return_url;
    
            $this->config = [
                'alipay_sdk' => 'alipay-sdk-php-20180705',
                'app_id' => $this->appId,
                'notify_url' => $this->notify_url,
                'sign_type' => $this->signType,
                'charset' => $this->charset,
                'timestamp' => date('Y-m-d H:i:s', time()),
                'version' => $this->version
            ];
        }
    
        /**
         * app支付
         * @param $out_trade_no 商户订单号
         * @param $total_amount 金额
         * @param $subject 标题
         * @return arrray
         */
        public function app($out_trade_no, $total_amount, $subject)
        {
            $method = 'alipay.trade.app.pay';
            $config = $this->config;
            $config['method'] = $method;
    
            $biz = [
                'total_amount' => $total_amount,
                'product_code' => 'QUICK_MSECURITY_PAY',
                'subject' => $subject,
                'out_trade_no' => $out_trade_no
            ];
    
            $arr = [
                'subject' => $biz['subject'],
                'out_trade_no' => $out_trade_no,
                'total_amount' => $biz['total_amount'],
                'appid' => $this->appId,
                'notify_url' => $this->notify_url,
                'sign_type' => $this->signType
            ];
    
            $biz_content = json_encode($biz, JSON_UNESCAPED_UNICODE);
    
            $config['biz_content'] = $biz_content;
            ksort($config);
            $config['sign'] = $this->sign($config);
    
            $params_url = '';
            foreach ($config as $k => $v) {
                if (!empty($v)) {
                    $params_url .= $k . '=' . urlencode($v) . '&';
                }
            }
    
            $params_url = rtrim($params_url, '&');
            $arr['sign'] = $params_url;
            return $arr;
        }
    
        /**
         * 订单查询
         * @param $out_trade_no 
         * @param $total_amount 
         * @return bool|arrray
         */
        public function orderQuery($out_trade_no, $total_amount = '')
        {
            $method = 'alipay.trade.query';
            $config = $this->config;
            $config['method'] = $method;
            unset($config['notify_url']);
    
            $biz = [
                'out_trade_no' => $out_trade_no
            ];
    
            $biz_content = json_encode($biz, JSON_UNESCAPED_UNICODE);
    
            $config['biz_content'] = $biz_content;
            ksort($config);
            $config['sign'] = $this->sign($config);
    
            $res = $this->curl($config);
    
            $res = json_decode($res, true);
            $res = $res['alipay_trade_query_response'];
    
            if ($res['code'] == 10000 and $res['msg'] == 'Success' and $res['trade_status'] == 'TRADE_SUCCESS') {
                if (empty($total_amount)) {
                    return $res;
                } else {
                    if ($res['total_amount'] == $total_amount) {
                        return $res['trade_no'];
                    } else {
                        return false;
                    }
                }
            } else {
                return false;
            }
    
    
        }
    
    
        /**
         * curl请求
         * @param $data
         * @return bool|int|mixed|string
         */
        private function curl($data)
        {
            @header("Content-type: text/html;charset=gb2312");
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($ch, CURLOPT_SSLVERSION, 1);
            curl_setopt($ch, CURLOPT_URL, $this->gatewayUrl);
            if (is_array($data)) {
                curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
            } elseif (is_string($data)) {
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            }
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_POST, true);
            $content = curl_exec($ch);
            curl_close($ch);
            return $content;
        }
    
        /**
         * 签名
         * @param $data
         * @return bool|string
         */
        private function sign($params)
        {
            $stringToBeSigned = "";
            $i = 0;
            
            foreach ($params as $k => $v) {
                if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) {
                    if ($i == 0) {
                        $stringToBeSigned .= "$k" . "=" . "$v";
                    } else {
                        $stringToBeSigned .= "&" . "$k" . "=" . "$v";
                    }
                    $i++;
                }
            }
            unset ($k, $v);
    
            // 私钥处理
            $res = "-----BEGIN RSA PRIVATE KEY-----" . PHP_EOL . wordwrap($this->privateKey, 64, PHP_EOL, true) . PHP_EOL . "-----END RSA PRIVATE KEY-----";
            ($res) or die('您使用的私钥格式错误,请检查RSA私钥配置');
    
            openssl_sign($stringToBeSigned, $sign, $res, OPENSSL_ALGO_SHA256);
    
            $key = base64_encode($sign);
    
            return $key;
    
        }
    
        private function checkEmpty($value)
        {
            if (!isset($value))
                return true;
            if ($value === null)
                return true;
            if (trim($value) === "")
                return true;
            return false;
        }
    
    }
0

评论 (0)

取消
Title - Artist
0:00