PHP_支付宝境外支付接口

文档地址:https://global.alipay.com/service/app_cn/1

1.配置文件,本地生成公钥私钥对,把本地的公钥提交给支付宝,换取支付宝公钥,私钥保留本地


2.拼接参数字段,调用签名方法进行签名,拼接完整支付链接接口

order_model = D("Common/Order");
    }

    // 积分主页
    public function index() {
        $return = array();
        $oid = sp_checkparam("oid", true, 'int', "缺少订单号");
        $info = $this->order_model
        ->where("id='{$oid}'")
        ->find();
        
        if (!$info) {
            sp_error("获取失败");
        }
        $prolist = sp_projson($info['projson']);
        
        $array_query = array();
        $array_query['service'] = "\"mobile.securitypay.pay\"";
        $array_query['partner'] = "\"2088721528654455\"";
        $array_query['_input_charset'] = "\"utf-8\"";
        $array_query['notify_url'] = "\"http://".$_SERVER['HTTP_HOST']."/zfb/notify_url.php\"";
        $array_query['out_trade_no'] = "\"".$info['sn']."\"";
        $array_query['subject'] = "\"".$prolist[0]['product_name']."\"";
        $array_query['payment_type'] = "\"1\"";
        $array_query['seller_id'] = "\"[email protected]\"";
        $array_query['total_fee'] = "\"".$info['total']."\"";
        $array_query['currency'] = "\"AUD\"";
        $array_query['body'] = "\"".$prolist[0]['product_name']."\"";
        $array_query['forex_biz'] = "\"FP\"";
        $array_query['it_b_pay'] = "\"30m\"";
        
        $url = "http://aus.palmtrends.com/zfb/signatures_url.php";
        $sign = sp_file_get_contents_safe($url,$array_query,'POST');
        sp_api($sign);
    }
}

3.支付链接拼接


4.签名方法rsa

/**
 * RSA签名
 * @param $data 待签名数据
 * @param $private_key 商户私钥字符串
 * return 签名结果
 */
function rsaSign($data, $private_key) {
    //以下为了初始化私钥,保证在您填写私钥时不管是带格式还是不带格式都可以通过验证。
    //$private_key=str_replace("-----BEGIN RSA PRIVATE KEY-----","",$private_key);
    //$private_key=str_replace("-----END RSA PRIVATE KEY-----","",$private_key);
    //$private_key=str_replace("\n","",$private_key);
    //$private_key="-----BEGIN RSA PRIVATE KEY-----".PHP_EOL .wordwrap($private_key, 64, "\n", true). PHP_EOL."-----END RSA PRIVATE KEY-----";
    
    $res=openssl_get_privatekey($private_key);
    if($res)
    {
        openssl_sign($data, $sign,$res);
    }
    else {
        echo "您的私钥格式不正确!"."
"."The format of your private_key is incorrect!"; exit(); } openssl_free_key($res); //base64编码 $sign = base64_encode($sign); return $sign; }

5.回调函数验证签名,处理数据

getResponse($_POST['notify_id'])) {//判断成功之后使用getResponse方法判断是否是支付宝发来的异步通知。
    
    
    if ($alipayNotify->getSignVeryfy($_POST, $_POST['sign'])) {//使用支付宝公钥验签
        //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
        //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
        //商户订单号
        $out_trade_no = $_POST['out_trade_no'];

        //支付宝交易号
        $trade_no = $_POST['trade_no'];

        //交易状态
        $trade_status = $_POST['trade_status'];

        if ($_POST['trade_status'] == 'TRADE_FINISHED') {
            
            //判断该笔订单是否在商户网站中已经做过处理
            //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
            //如果有做过处理,不执行商户的业务程序
            //注意:
            //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
            //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
            $time = time();
            $sql = "update cmf_order set payway=1,zfb_trade_no='{$trade_no}',status=1,paytime='{$time}' where sn='{$out_trade_no}'";
            $res = mysql_query($sql,$conn);
            
            $has = "select id from cmf_order_zfb where out_trade_no='{$_POST['out_trade_no']}'";
            $r = mysql_query($has,$conn);
            $has_res = mysql_fetch_array($r);
            if (!$has_res) {
                //插入记录表
                $ins = array();
                $ins['notify_type'] = $_POST['notify_type'];
                $ins['trade_no'] = $_POST['trade_no'];
                $ins['total_fee'] = $_POST['total_fee'];
                $ins['out_trade_no'] = $_POST['out_trade_no'];
                $ins['currency'] = $_POST['currency'];
                $ins['sign_type'] = $_POST['sign_type'];
                $ins['addtime'] = time();
                $ins['notify_time'] = $_POST['notify_time'];
                $sql_ins = "insert into cmf_order_zfb (notify_type,trade_no,total_fee,out_trade_no,currency,sign_type,addtime,notify_time) values('{$ins['notify_type']}','{$ins['trade_no']}','{$ins['total_fee']}','{$ins['out_trade_no']}','{$ins['currency']}','{$ins['sign_type']}','{$ins['addtime']}','{$ins['notify_time']}')";
                mysql_query($sql_ins,$conn);
            }
        } else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
            //判断该笔订单是否在商户网站中已经做过处理
            //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
            //如果有做过处理,不执行商户的业务程序
            //注意:
            //付款完成后,支付宝系统发送该交易状态通知
            //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
            
            $time = time();
            $sql = "update cmf_order set payway=1,zfb_trade_no='{$trade_no}',status=1,paytime='{$time}' where sn='{$out_trade_no}'";
            $res = mysql_query($sql,$conn);
            
            $has = "select id from cmf_order_zfb where out_trade_no='{$_POST['out_trade_no']}'";
            $r = mysql_query($has,$conn);
            $has_res = mysql_fetch_array($r);
            if (!$has_res) {
                //插入记录表
                $ins = array();
                $ins['notify_type'] = $_POST['notify_type'];
                $ins['trade_no'] = $_POST['trade_no'];
                $ins['total_fee'] = $_POST['total_fee'];
                $ins['out_trade_no'] = $_POST['out_trade_no'];
                $ins['currency'] = $_POST['currency'];
                $ins['sign_type'] = $_POST['sign_type'];
                $ins['addtime'] = time();
                $ins['notify_time'] = $_POST['notify_time'];
                $sql_ins = "insert into cmf_order_zfb (notify_type,trade_no,total_fee,out_trade_no,currency,sign_type,addtime,notify_time) values('{$ins['notify_type']}','{$ins['trade_no']}','{$ins['total_fee']}','{$ins['out_trade_no']}','{$ins['currency']}','{$ins['sign_type']}','{$ins['addtime']}','{$ins['notify_time']}')";
                mysql_query($sql_ins,$conn);
            }
        }
        //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
        echo "success";  //请不要修改或删除
    } else { //验证签名失败
        echo "sign fail";
    }
} else { //验证是否来自支付宝的通知失败
    echo "response fail";
}
?>

6.验签函数

/**
     * 获取返回时的签名验证结果
     * @param $para_temp 通知返回来的参数数组
     * @param $sign 返回的签名结果
     * @return 签名验证结果
     */
    function getSignVeryfy($para_temp, $sign) {
        //除去待签名参数数组中的空值和签名参数
        $para_filter = paraFilter($para_temp);

        //对待签名参数数组排序
        $para_sort = argSort($para_filter);

        //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
        $prestr = createLinkstring($para_sort);

        $isSgin = false;
        switch (strtoupper(trim($this->alipay_config['sign_type']))) {
            case "RSA" :
                $isSgin = rsaVerify($prestr, trim($this->alipay_config['alipay_public_key']), $sign);
                break;
            default :
                $isSgin = false;
        }
        return $isSgin;
}

你可能感兴趣的:(PHP_支付宝境外支付接口)