php支付宝支付,退款,回调函数

1.支付宝主函数


<?php
 include('alipay/aop/AopClient.php');
 include('alipay/aop/request/AlipayTradeAppPayRequest.php');
 include('alipay/aop/request/AlipayTradeRefundRequest.php');
 //支付宝appid  (应用标识)
 define("ALIPAY_APPID", "");
 //支付宝(支付宝私钥)
 define("PRIVATE_KEY", "");
 //支付宝(支付宝公钥)
 define("PUBLIC_KEY", "");
 class alipay{
    /**
     * 支付宝支付
     */
    public function appAlipay(){
            // 时间戳
            $timeStamp = strval(time());
            $totalFee = 1;
            // 支付结果显示文字
            $serial_number = date("Ymdhis") . mt_rand(10, 99);
            $aop = new \AopClient();
            $bizcontent = json_encode([
                'body'=>"测试",                             //商品名称
                'subject'=>'测试',                          //主题
                'out_trade_no'=> $serial_number,           //此订单号为商户唯一订单号
                'total_amount'=> $totalFee,                //保留两位小数
                'product_code'=>'QUICK_MSECURITY_PAY'
            ]);
          
            //支付宝开始
            $aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
            //实际上线app id需真实的
            $aop->appId = ALIPAY_APPID;
            $aop->rsaPrivateKey = PRIVATE_KEY;
            $aop->format = "json";
            $aop->charset  = "UTF-8";
            $aop->signType = "RSA2";
            $aop->alipayrsaPublicKey = PUBLIC_KEY;
          
            //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
            $request = new \AlipayTradeAppPayRequest();
            //支付宝回调
            $notifyUrl="https://openapi.alipay.com";
            $request->setNotifyUrl($notifyUrl);
            $request->setBizContent($bizcontent);
            //这里和普通的接口调用不同,使用的是sdkExecute
            $response = $aop->sdkExecute($request);
            $this->echoSuccess($response);
            
    }
    
    /**
     * 支付宝支付回调
     *
     */
    public function  alipayNotify() {
        if(!empty($_POST)){
            $serial=$_POST['out_trade_no'];
            $wepay_serial = $_POST['trade_no'];
            if (!empty($wepay_serial)) {
                //这里可以写自己需求
                echo "返回的参数out_trade_no:".$serial;
                echo "返回的参数trade_no:".$wepay_serial;
            }
        }
        echo 'success';
    }
    /**
     * 支付宝退货处理
     * 退货前提是必须支付成功
     * @param type $orderId
     * @return bool
     */
    public function alipayRefund($out_trade_no,$wepay_serial,$totalFee) {
         $aop = new AopClient ();
         $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
         $aop->appId = ALIPAY_APPID;
         $aop->rsaPrivateKey = PRIVATE_KEY;
         $aop->alipayrsaPublicKey=PUBLIC_KEY;
         $aop->apiVersion = '1.0';
         $aop->signType = 'RSA2';
         $aop->postCharset='GBK';
         $aop->format='json';
         $request = new AlipayTradeRefundRequest ();
         $bizcontent = json_encode([
            'out_trade_no'=>$out_trade_no,
            'trade_no'=> $wepay_serial,
            'refund_amount'=> $totalFee,
            'refund_reason'=>'正常退款'
             ]);
         $request->setBizContent($bizcontent);
         $result = $aop->execute($request);
         $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
         $resultCode = $result->$responseNode->code;
         echo $resultCode;
         if(!empty($resultCode)&&$resultCode == 10000){
               echo "退款成功";
           } else {
                echo "退款失败";
           }
        }
    
    /**
     * 输出成功JSON消息
     */
    final public function echoSuccess($msg = 'success') {
        $this->echoMsg(0, $msg);
        exit();
    }
    
    /**
     * 输出JSON消息
     * @param mixed $code
     * @param mixed $msg
     */
    final public function echoMsg($code, $msg = '', $options = JSON_UNESCAPED_UNICODE) {
        return $this->echoJson(array(
                'ret_code' => $code,
                'ret_msg'  => $msg
        ), $options);
    }
    
    /**
     * 输出JSON
     * @param mixed $arr
     */
    final public function echoJson($arr, $options = JSON_UNESCAPED_UNICODE) {
        header('Content-Type: application/json; charset=utf-8');
        if (strpos(PHP_VERSION, '5.3') > -1) {
            // php 5.3-
            echo json_encode($arr);
        } else {
            // php 5.4+
            echo json_encode($arr, $options);
        }
        return true;
    }
    
}


2.调用 生成支付,退款 接口

<?php
include('./alipay.php');

$alipay =new alipay();

$alipay->appAlipay(); //支付函数

$out_trade_no="";     //订单号
$wepay_serial="";     //唯一订单号
$totalFee="0.01";     //退款金额
$alipay->alipayRefund($out_trade_no, $wepay_serial, $totalFee);//退款



百度云下载链接:http://pan.baidu.com/s/1nvICOw5 

 密码:x6tl


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
处理支付宝退款回调PHP 代码可以参考以下示例: ```php <?php // 获取支付宝退款回调数据 $refundData = $_POST; // 验证回调签名 if (!verifySign($refundData)) { exit('fail'); } // 处理退款回调业务逻辑 if ($refundData['trade_status'] == 'SUCCESS') { // 退款成功,更新订单状态等操作 // ... exit('success'); } else { // 退款失败,记录日志等操作 // ... exit('fail'); } /** * 验证回调签名 * * @param array $data 回调数据 * @return bool */ function verifySign($data) { // 获取支付宝公钥 $alipayPublicKey = file_get_contents('https://openapi.alipay.com/gateway.do?service=publicKey&charset=utf-8'); // 创建支付宝公钥对象 $publicKey = openssl_get_publickey($alipayPublicKey); // 处理回调数据,去除 sign、sign_type 参数 unset($data['sign']); unset($data['sign_type']); ksort($data); $queryString = http_build_query($data); // 验证签名 $result = openssl_verify($queryString, base64_decode($data['sign']), $publicKey, OPENSSL_ALGO_SHA256); // 释放公钥资源 openssl_free_key($publicKey); return $result === 1; } ``` 在上述代码中,`verifySign` 函数用于验证回调签名。首先获取支付宝公钥,然后将回调数据按照参数名进行排序,并将 sign、sign_type 参数去除,将剩余参数拼接成字符串。最后使用 OpenSSL 库的 `openssl_verify` 函数进行签名验证,验证通过返回 1,否则返回 0 或 -1。 在处理退款回调业务逻辑时,首先判断退款状态是否为 SUCCESS,如果是则表示退款成功,可以更新订单状态等操作。如果退款状态不是 SUCCESS,则表示退款失败,可以记录日志等操作。最后需要输出 success 或 fail 字符串,表示处理结果,以告知支付宝服务器是否接收到了回调信息。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值