在thinkphp下支付宝MD5加密方式扫码支付及有密退款

发布于 / 程序员 / 2 条评论

支付宝有两种加密方式,分别为MD5和RSA,MD5加密方式比较简单些,可以用在pc端的扫码支付。

导入sdk

/ThinkPHP/Library/Vendor/Alipay

配置项

/Application/Common/Conf/config.php
//支付参数配置
return array(
    'ALIPAY_CONFIG'          => array(
        'partner'            => '', // partner 从支付宝商户版个人中心获取
        'seller_email'       => '', // email 从支付宝商户版个人中心获取
        'key'                => '', // key 从支付宝商户版个人中心获取
        'sign_type'          => strtoupper(trim('MD5')), // 可选md5和RSA 
        'input_charset'      => 'utf-8', // 编码(固定值不用改)
        'transport'          => 'http', // 协议(固定值不用改)
        'cacert'             => VENDOR_PATH.'Alipay/cacert.pem', //cacert.pem存放的位置 (固定值不用改)
        'notify_url'         => 'http://karnc.com/Api/Alipay/alipay_notify', // 异步接收支付状态通知的链接
        'return_url'         => 'http://karnc.com/Api/Alipay/alipay_return', // 页面跳转 同步通知 页面路径 支付宝处理完请求后,当前页面自 动跳转到商户网站里指定页面的 http 路径。 (扫码支付专用)
        'show_url'           => 'http://karnc.com/User/Order/index', //商品展示网址,收银台页面上,商品展示的超链接。 (扫码支付专用)
        'private_key_path'   => '', //移动端生成的私有key文件存放于服务器的 绝对路径 如果为MD5加密方式;此项可为空 (移动支付专用)
        'public_key_path'    => '', //移动端生成的公共key文件存放于服务器的 绝对路径 如果为MD5加密方式;此项可为空 (移动支付专用)
    ),
);

发起支付demo

 /**
 * 跳向支付宝付款
 * @param  array $order 订单数据 必须包含 out_trade_no(订单号)、price(订单金额)、subject(商品名称标题)
 */
public function alipay($order)
{
    vendor('Alipay.AlipaySubmit', '', '.class.php');
    // 获取配置
    $config = C('ALIPAY_CONFIG');
    $data = array(
        "_input_charset" => $config['input_charset'], // 编码格式
        "logistics_fee" => "0.00", // 物流费用
        "logistics_payment" => "SELLER_PAY", // 物流支付方式SELLER_PAY(卖家承担运费)、BUYER_PAY(买家承担运费)
        "logistics_type" => "EXPRESS", // 物流类型EXPRESS(快递)、POST(平邮)、EMS(EMS)
        "notify_url" => $config['notify_url'], // 异步接收支付状态通知的链接
        "out_trade_no" => $order['out_trade_no'], // 订单号
        "partner" => $config['partner'], // partner 从支付宝商户版个人中心获取
        "payment_type" => "1", // 支付类型对应请求时的 payment_type 参数,原样返回。固定设置为1即可
        "price" => $order['price'], // 订单价格单位为元
        // "price" => 0.01, // // 调价用于测试
        "quantity" => "1", // price、quantity 能代替 total_fee。 即存在 total_fee,就不能存在 price 和 quantity;存在 price、quantity, 就不能存在 total_fee。 (没绕明白;好吧;那无视这个参数即可)
        "receive_address" => '1', // 收货人地址 即时到账方式无视此参数即可
        "receive_mobile" => '1', // 收货人手机号码 即时到账方式无视即可
        "receive_name" => '1', // 收货人姓名 即时到账方式无视即可
        "receive_zip" => '1', // 收货人邮编 即时到账方式无视即可
        "return_url" => $config['return_url'], // 页面跳转 同步通知 页面路径 支付宝处理完请求后,当前页面自 动跳转到商户网站里指定页面的 http 路径。
        "seller_email" => $config['seller_email'], // email 从支付宝商户版个人中心获取
        "service" => "create_direct_pay_by_user", // 接口名称 固定设置为create_direct_pay_by_user
        "show_url" => $config['show_url'], // 商品展示网址,收银台页面上,商品展示的超链接。
        "subject" => $order['subject'] // 商品名称商品的标题/交易标题/订单标 题/订单关键字等
    );
    $alipay = new \AlipaySubmit($config);
    $new = $alipay->buildRequestPara($data);
    $go_pay = $alipay->buildRequestForm($new, 'get', '支付');
    echo $go_pay;
}

同步接收通知

/**
 * return_url接收页面
 */
public function alipay_return()
{
    // 引入支付宝
    vendor('Alipay.AlipayNotify', '', '.class.php');
    $config = $config = C('ALIPAY_CONFIG');
    $notify = new \AlipayNotify($config);
    // 验证支付数据
    $status = $notify->verifyReturn();
    if ($status) {
        // 下面写验证通过的逻辑 比如说更改订单状态等等 $_GET['out_trade_no'] 为订单号;

        $this->success('支付成功', U('User/Order/index'));
    } else {
        $this->success('支付失败', U('User/Order/index'));
    }
}

异步接收通知

/**
 * notify_url接收页面
 */
public function alipay_notify()
{
    // 引入支付宝
    vendor('Alipay.AlipayNotify', '', '.class.php');
    $config = $config = C('ALIPAY_CONFIG');
    $alipayNotify = new \AlipayNotify($config);
    // 验证支付数据
    $verify_result = $alipayNotify->verifyNotify();
    if ($verify_result) {
        echo "success";
        // 下面写验证通过的逻辑 比如说更改订单状态等等 $_POST['out_trade_no'] 为订单号;


    } else {
        echo "fail";
    }
}

注意事项

ILLEGAL_SIGN错误的解放方案

header("Content-type:text/html;charset=utf-8");

以上就是支付宝MD5加密方式扫码支付的简单示例了!下面简单说下支付宝有密即时到账批量退款!

支付宝退款请求

 /**
     * @desc 支付宝退款请求
     * @param $data
     */
    public function alipay_refund($data)
    {
        header("Content-type: text/html; charset=utf-8");
        // 引入支付宝
        vendor('Alipay.AlipaySubmit', '', '.class.php');
        // 获取配置
        $config = C('ALIPAY_CONFIG');
        //构造要请求的参数数组,无需改动
        $parameter = array(
            "notify_url" => 'http://karnc.com/Respose/alipay_respose',//自定义退款异步回调
            "service" => 'refund_fastpay_by_platform_pwd',
            "partner" => $config['partner'],
            "seller_email" => $config['seller_email'],
            "refund_date" => date('Y-m-d H:i:s', time()),
            "batch_no" => $data['batch_no'],//退款批次号 格式为:退款日期(8位)+流水号(3~24位)
            "batch_num" => $data['batch_num'],//总笔数
            "detail_data" => $data['detail_data'],//单笔数据集 交易退款数据集的格式为:原付款支付宝交易号^退款总金额^退款理由
            "_input_charset" => trim(strtolower('utf-8'))
        );
        $alipay = new \AlipaySubmit($config);

        $res = $alipay->buildRequestForm($parameter, 'get', '确认');
        return $res;
    }

退款demo

    public function getAlipayRefund()
    {
        header("Content-type:text/html;charset=utf-8");
        $data['batch_no'] = date('YmdHis') . 'MZ01';

        $arr = array(
            array('transaction_id' => '2018073121001004420502733811', 'refund_fee' => '0.01', 'tips' => '测试退款'),
            array('transaction_id' => '2018073121001004420501231276', 'refund_fee' => '0.01', 'tips' => '测试退款'),
        );

        $str = '';
        foreach ($arr as $k => $v) {
            $str .= $v['transaction_id'] . '^' . $v['refund_fee'] . '^' . $v['tips'] . '#';
        }
        $str = substr($str, 0, -1);

        $data['batch_num'] = count($arr);
        $data['detail_data'] = $str;
        $res = $this->alipay_refund($data);
        echo($res);
    }

退款异步接收通知

//支付宝退款原路回调
    public function alipay_respose()
    {
        // 引入支付宝
        vendor('Alipay.AlipayNotify', '', '.class.php');
        $config = $config = C('ALIPAY_CONFIG');
        $alipayNotify = new \AlipayNotify($config);
        $verify_result = $alipayNotify->verifyNotify();
        if ($verify_result) {
            //批量退款数据中转账成功的笔数
            $success_num = $_POST['success_num'];
            if (intval($success_num) > 0) {
                //多条成功返回成功数据格式:2018073121001004420599346107^0.01^SUCCESS#2018073121001004420501231276^0.01^SUCCESS
                //多条失败数据格式:2018073121001004420599346107^0.01^TRADE_HAS_CLOSED#2018073121001004420501231276^0.01^TRADE_HAS_CLOSED
                $result_details = $_POST['result_details'];
                $resArr = explode('#', $result_details);
                $batch_no = $_POST['batch_no'];//退款批次号
                foreach ($resArr as $k=>$v){
                    $arr=explode('^', $v);
                    if($arr[2] == 'SUCCESS'){
                        //记录日志
                        $f = fopen(ROOT_PATH . '/upload/paylog/alipayrefund.txt',"a+");
                        fwrite($f,$arr[0]."==>".$arr[1]."==>"."$arr[2]"."\r\n");
                        fclose($f);
                        //执行相关操作,退款成功

                    }else{
                        //记录日志
                        $f = fopen(ROOT_PATH . '/upload/paylog/alipayrefund.txt',"a+");
                        fwrite($f,$arr[0]."==>".$arr[1]."==>"."$arr[2]"."\r\n");
                        fclose($f);
                        //退款失败执行相关操作
                    }
                }
            }else{
                $f = fopen(ROOT_PATH . '/upload/paylog/alipayrefund.txt',"a+");
                fwrite($f,"Failed==>".$_POST['result_details']."\r\n");
                fclose($f);
            }
            echo "success"; //告诉支付宝处理成功
        } else {
            //记录日志
            $f = fopen(ROOT_PATH . '/upload/paylog/alipayrefund.txt',"a+");
            fwrite($f,"错误代码==>".$verify_result."\r\n");
            fclose($f);
        }
    }

在这里下载支付宝支付SDK

以上就是在thinkphp下支付宝MD5加密方式扫码支付及有密即时到账批量退款的简单示例!

转载原创文章请注明,转载自: karnc » 在thinkphp下支付宝MD5加密方式扫码支付及有密退款
  1. avatar

    牛逼

    1. avatar
      @糯米团 哈哈,都是去年的笔记了,就是懒,不想更新~~~