美文网首页php知识总结
支付宝支付、退款

支付宝支付、退款

作者: 响呼雷 | 来源:发表于2020-04-26 15:17 被阅读0次
<?php

namespace alipay;

//APP支付

use think\Loader;

class Alipay
{
    protected $gatewayUrl = "https://openapi.alipay.com/gateway.do";

    protected $appId = "";

    protected $rsaPrivateKey = "";

    public $alipayrsaPublicKey = "";

    protected $format = "json";

    protected $charset = "UTF-8";

    protected $signType = "RSA2";

    public function __construct()
    {
        Loader::import('alipay.aop.AopClient');
        Loader::import('alipay.aop.request.AlipayTradeAppPayRequest');
        Loader::import('alipay.aop.request.AlipayTradeRefundRequest');
    }

    /**
     * APP-支付
     * @param array $param
     * $param['body']           对一笔交易的具体描述信息
     * $param['subject']        商品的标题/交易标题/订单标题/订单关键字等
     * $param['total_amount']   订单总金额,单位为元,精确到小数点后两位
     * $param['out_trade_no']   商户网站唯一订单号
     * @return string
     */
    public function pay(array $param)
    {
        $aop = new \AopClient();
        $aop->gatewayUrl = $this->gatewayUrl;
        $aop->appId = $this->appId;
        $aop->rsaPrivateKey = $this->rsaPrivateKey;
        $aop->alipayrsaPublicKey = $this->alipayrsaPublicKey;
        $aop->format = $this->format;
        $aop->charset = $this->charset;
        $aop->signType = $this->signType;
        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
        $request = new \AlipayTradeAppPayRequest();
        //SDK已经封装掉了公共参数,这里只需要传入业务参数
        $data = [
            "body" => $param['body'],
            "subject" => $param['subject'],
            "timeout_express" => "30m",
            "total_amount" => $param['total_amount'],
            "out_trade_no" => $param['out_trade_no']
        ];
        $request->setNotifyUrl('http://'.$_SERVER['HTTP_HOST'].'/user/Allot/appNotifys');
        $request->setBizContent(json_encode($data));
        //这里和普通的接口调用不同,使用的是sdkExecute
        $result = $aop->sdkExecute($request);
        //htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题
        //就是orderString 可以直接给客户端请求,无需再做处理。
        return $result;
    }

    /**
     * APP-退款
     * @param $out_trade_no     订单支付时传入的商户订单号,不能和 trade_no同时为空
     * @param $refund_amount    订单支付总金额
     * @param $trade_no         支付宝交易号
     * @return bool|mixed|\SimpleXMLElement
     * @throws \Exception
     */
    public function refund($out_trade_no, $refund_amount, $trade_no = "")
    {
        $aop = new \AopClient();
        $aop->gatewayUrl = $this->gatewayUrl;
        $aop->appId = $this->appId;
        $aop->rsaPrivateKey = $this->rsaPrivateKey;
        $aop->alipayrsaPublicKey = $this->alipayrsaPublicKey;
        $aop->apiVersion = '1.0';
        $aop->postCharset = $this->charset;
        $aop->format = $this->format;
        $aop->signType = $this->signType;
        $request = new \AlipayTradeRefundRequest();
        $data = [
            'out_trade_no' => $out_trade_no,
            'trade_no' => $trade_no,
            'refund_amount' => $refund_amount,
        ];
        $request->setBizContent(json_encode($data));
        $result = $aop->execute($request);
        $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
        $resultCode = $result->$responseNode->code;
        if (!empty($resultCode) && $resultCode == 10000) {
            $res = [
                'msg'               =>  $result->$responseNode->msg,
                'buyer_logon_id'    =>  $result->$responseNode->buyer_logon_id,     //用户的登录id
                'buyer_user_id'     =>  $result->$responseNode->buyer_user_id,      //买家在支付宝的用户id
                'fund_change'       =>  $result->$responseNode->fund_change,        //本次退款是否发生了资金变化
                'gmt_refund_pay'    =>  $result->$responseNode->gmt_refund_pay,     //退款支付时间
                'out_trade_no'      =>  $result->$responseNode->out_trade_no,       //商户订单号
                'refund_fee'        =>  $result->$responseNode->refund_fee,         //退款总金额
                'send_back_fee'     =>  $result->$responseNode->send_back_fee,      //(文档未找到)
                'trade_no'          =>  $result->$responseNode->trade_no            //支付宝交易号
            ];
            return $res;
        } else {
            return $result;
        }
    }
}

相关文章

  • 支付宝退款

    支付宝退款 支付宝退款可微信退款差不多 只是配置文件和第三方调用不同支付宝没有退款回调通知

  • 支付宝支付开发-退款

    之前写了一篇支付宝支付开发,现在总结一下支付宝退款的开发。总体上来说,支付宝的退款接口分为即时到账批量有密退款接口...

  • 银商支付宝h5支付,以及回调

    银商支付宝h5支付 回调验签 退款 退款查询

  • 黑阈如何支付并确认

    本文包括三个部分: 微信支付及确认 历史支付宝确认 Play 支付及确认 如果支付有误,请参照 退款政策 退款。 ...

  • 支付宝支付、退款

  • 支付宝退款

    问题描述 退款订单号是前一天生成的,第二天退款时提示退款单号错误 问题产生的原因 退款单号不正确,支付宝要求退款单...

  • 支付宝退款全解析

    简单介绍了支付宝退款的请求处理和一些注意事项 0 系列文章 系列一 微信App支付全解析系列二 支付宝App支付全...

  • 支付宝沙箱支付、退款

    本文包括支付宝沙箱支付及退款功能 前期查看相关网页:https://blog.csdn.net/weixin_44...

  • python 连接数据库获取数据进行批量退款

    背景: 测试环境经常下单用微信和支付宝真实支付,在页面一笔笔进行退款太慢,账号多也会有所遗漏,用sql查出需要退款...

  • 黑阈如何退款

    支付以后,1 月内可随时退。退过以后又支付的,不再退。 本文包括以下退款: 支付宝(已超时限) Play 商店 微...

网友评论

    本文标题:支付宝支付、退款

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