0

0

支付宝+银联统一支付功能实现

php中文网

php中文网

发布时间:2016-06-07 11:40:54

|

1784人浏览过

|

来源于php中文网

原创

这个model将支付宝和银行支付统一到一起,摆脱了对SDK的依赖,我尽量封在了这一个model里面,可根据自己项目需求修改。

应一些朋友要求,我把发起支付以及支付回调部分也放上来,我去掉了一些内容只留下了流程。

2015-8-14更新:很久没上这里了,发现好多消息说想要模板,我这里发出来。
PayAction: class PayAction extends Action{
    //支付跳转
    function do_pay(){
        //构造参数
        $payment = array(
            'money'=>12,
            'deal_name'=>'充值',
            //支付银行,对应银行ID我在后面贴出来
            'bank_id'=>'',
            'notice_sn'=>'20140920123456',
        );
        echo D('Payment')->get_payment_code($payment);
    }
    
    //支付结果同步回调
    function response(){
        $request = $_GET;
        unset($request['_URL_']);
        $pay_res = D('Payment')->notify($request);

        if($pay_res['status']){
            //支付成功业务逻辑
        }else{
            $this->error('支付失败');
        }
    }
    
    //支付结果异步回调
    function notify(){
        $request = $_POST;
        $pay_res = D('Payment')->notify($request);

        if($pay_res['status']){
            //支付成功业务逻辑
            echo 'success';
        }else{
            echo 'fail';
        }
    }
}

//银行ID
$bank_id = array(
    'ICBCB2C'    =>    '中国工商银行',
    'CMB'        =>    '招商银行',
    'CCB'        =>    '中国建设银行',
    'ABC'        =>    '中国农业银行',
    'SPDB'        =>    '上海浦东发展银行',
    'SDB'        =>    '深圳发展银行',
    'CIB'        =>    '兴业银行',
    'BJBANK'    =>    '北京银行',
    'CEBBANK'    =>    '中国光大银行',
    'CMBC'        =>    '中国民生银行',
    'CITIC'        =>    '中信银行',
    'GDB'        =>    '广东发展银行',
    'SPABANK'    =>    '平安银行',
    'BOCB2C'    =>    '中国银行',
    'COMM'        =>    '交通银行',
        'ALIPAY'    =>    '支付宝',
);

?>
出现调试错误一般是参数传错了
1、配置model里面的config,model里其他东西根本不用看
2、构造请求参数$payment
money、deal_name和订单号notice_sn是你随便给的,bank_id在页面用 radio传过来的其值是我给的那些银行ID,比如工行就是ICBCB2C
支付宝+银联统一支付功能实现

PaymentModel:
class PaymentModel extends Model{
    private $config;
    function _initialize(){
        $this->config = array(
            'alipay_partner'=>C('ALIPAY_PARTNER'),
            'alipay_account'=>C('ALIPAY_ACCOUNT'),
            'alipay_key'=>C('ALIPAY_KEY'),
            'return_url' => 'http://'.HOST_NAME.U('Pay/response'),
            'notify_url' => 'http://'.HOST_NAME.U('Pay/notify'),
        );
    }
    function get_payment_code($form){
        $link = $form['bank_id'] == 'ALIPAY' ? $this->alipay_link($form) : $this->bank_link($form);
        return $link;
    }
    // 银联接连
    function bank_link($form){
        $payment_notice = array(
            'money'=>$form['money'],
            'deal_name'=>$form['order_name'],
            'bank_id'=>$form['bank_id'],
            'notice_sn'=>$form['order_sn'],
        );
        $money = round($payment_notice['money'],2);
        $payment_info = $this->config;

        $subject = $payment_notice['deal_name'];
        
        $data_return_url = $payment_info['return_url'];
        $data_notify_url = $payment_info['notify_url'];

        $service = 'create_direct_pay_by_user';
        /* 银行类型 */
        $bank_type = $payment_notice['bank_id'];
        
        $parameter = array(
            'service'           => $service,
            'partner'           => $payment_info['alipay_partner'],
            //'partner'           => ALIPAY_ID,
            '_input_charset'    => 'utf-8',
            'notify_url'        => $data_notify_url,
            'return_url'        => $data_return_url,
            /* 业务参数 */
            'subject'           => $subject,
            'out_trade_no'      => $payment_notice['notice_sn'], 
            'price'             => $money,
            'quantity'          => 1,
            'payment_type'      => 1,
            /* 物流参数 */
            'logistics_type'    => 'EXPRESS',
            'logistics_fee'     => 0,
            'logistics_payment' => 'BUYER_PAY_AFTER_RECEIVE',
            'extend_param'    => 'changjianghu',
            /* 买卖双方信息 */
            'seller_email'      => $payment_info['alipay_account'],
            'defaultbank'    =>    $bank_type,
            'payment'    =>    'bankPay'
        );

        $parameter = $this->argSort($parameter);

        $param = '';
        $sign  = '';

        foreach ($parameter AS $key => $val){
            $param .= "$key=" .urlencode($val). "&";
            $sign  .= "$key=$val&";
        }

        $param = substr($param, 0, -1);
        $sign  = substr($sign, 0, -1). $payment_info['alipay_key'];
        $sign_md5 = md5($sign);

        
        $payLinks = '

正在连接支付接口...';
        $payLinks.='';

        return $payLinks;
    }
    // 支付宝链接
    function alipay_link($form){
        $payment_notice = array(
            'money'=>$form['money'],
            'deal_name'=>$form['order_name'],
            'bank_id'=>$form['bank_id'],
            'notice_sn'=>$form['order_sn'],
        );
        $money = round($payment_notice['money'],2);
        $payment_info = $this->config;

        $subject = $payment_notice['deal_name'];
        
        $data_return_url = $payment_info['return_url'];
        $data_notify_url = $payment_info['notify_url'];
        
        $parameter = array(
            'service'           => 'create_direct_pay_by_user',
            'partner'           => $payment_info['alipay_partner'],
            //'partner'           => ALIPAY_ID,
            '_input_charset'    => 'utf-8',
            'notify_url'        => $data_notify_url,
            'return_url'        => $data_return_url,
            /* 业务参数 */
            'subject'           => $subject,
            'out_trade_no'      => $payment_notice['notice_sn'], 
            'price'             => $money,
            'quantity'          => 1,
            'payment_type'      => 1,
            /* 物流参数 */
            'logistics_type'    => 'EXPRESS',
            'logistics_fee'     => 0,
            'logistics_payment' => 'BUYER_PAY_AFTER_RECEIVE',
            'extend_param'        => 'changjianghu',
            /* 买卖双方信息 */
            'seller_email'      => $payment_info['alipay_account']
        );
        // print_r($parameter);exit;
        $parameter = $this->argSort($parameter);

        $param = '';
        $sign  = '';

        foreach ($parameter AS $key => $val)
        {
            $param .= "$key=" .urlencode($val). "&";
            $sign  .= "$key=$val&";
        }

        $param = substr($param, 0, -1);
        $sign  = substr($sign, 0, -1). $payment_info['alipay_key'];
        $sign_md5 = md5($sign);

        
        $payLinks = '
正在连接支付接口...
';
        $payLinks.='';
        
        return $payLinks;
    }

/*结果*/
    function notify($request){
        $return_res = array(
            'info'=>'',
            'status'=>false,
        );
        $payment = $this->config;
        
        $request = $this->argSort($request);

        /* 检查数字签名是否正确 */
        $isSign = $this->getSignVeryfy($request);
        if (!$isSign){//签名验证失败
            $return_res['info'] = '签名验证失败';
            return $return_res;
        }

        if ($request['trade_status'] == 'TRADE_SUCCESS' || $request['trade_status'] == 'TRADE_FINISHED' || $request['trade_status'] == 'WAIT_SELLER_SEND_GOODS' || $request['trade_status'] == 'WAIT_BUYER_CONFIRM_GOODS'){
            
            $return_res['status'] = true;
            
        }
        return $return_res;
    }

    // 获取返回时的签名验证结果
    function getSignVeryfy($para_temp) {
        //除去待签名参数数组中的空值和签名参数
        $para_filter = $this->paraFilter($para_temp);
        //对待签名参数数组排序
        $para_sort = $this->argSort($para_filter);
        //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
        $prestr = $this->createLinkstring($para_sort);
        
        $isSgin = false;
        $isSgin = $this->md5Verify($prestr, $para_temp['sign'], $this->config['alipay_key']);
        return $isSgin;
    }
    // 验证签名
    function md5Verify($prestr, $sign, $key) {
        $prestr = $prestr . $key;
        $mysgin = md5($prestr);

        if($mysgin == $sign) {
            return true;
        }
        else {
            return false;
        }
    }
    // 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
    function createLinkstring($para) {
        $arg  = "";
        while (list ($key, $val) = each ($para)) {
            $arg.=$key."=".$val."&";
        }
        //去掉最后一个&字符
        $arg = substr($arg,0,count($arg)-2);
        
        //如果存在转义字符,那么去掉转义
        if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
        
        return $arg;
    }
    // 除去数组中的空值和签名参数
    function paraFilter($para) {
        $para_filter = array();
        while (list ($key, $val) = each ($para)) {
            if($key == "sign" || $key == "sign_type" || $val == "")continue;
            else    $para_filter[$key] = $para[$key];
        }
        return $para_filter;
    }
    // 对数组排序
    function argSort($para) {
        ksort($para);
        reset($para);
        return $para;
    }
    
}

?>
HTML模板:nbsp;html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">





预购一个梦想 - 唱江湖音乐众筹网









    

    

        

                            

                                支付宝+银联统一支付功能实现

    
    
    
    
            


        

        

                                        

  •                         
                            首页
                            
            
                        

  •                                     

  •                         
                            音乐众筹
                            
            
                        

  •                                     

  •                         
                            秒杀
                            
            
                        

  •                                     

  •                         
                            帮助中心
                            
            
                        

  •                                 

  •                     
                                发起众筹
                        

                         
                                发起秒杀
                        

                    

  •         

        

            
    
                    消息  |  
    Badri  |          
    登出
    
    
    

        

            关注动态
            查看评论
            查看私信
            查看通知

        

    

    

        

            我的主页
            项目管理
            发起项目
            秒杀管理
            发起秒杀
            个人设置

        

    

    
            
            
            

            

            
            
                            
            

            
    
            
    
            
        

        
        

        
    
        







    

        

            专为音乐人设计的便携式监听音箱iLoud            

                
                支持金额  ¥1990.00            
                        
                邮费:¥15.00
                                

                应付总额 ¥2002.00 元    
            

        

        
        

        
        

        
        

            
            
                                    
                
                                    

                        

                        
                        
                        
                        
                        
                        

                    

                                        
                
 支付宝即时到帐支付:
支付宝+银联统一支付功能实现
                
                

                

                    

                        

                            确定,去付款
                        

                    
                
                        
                        
                    
                        
                                        
                    

                

                
            

            
        

        

                
                

                    

                    支付宝+银联统一支付功能实现
                    

                    专为音乐人设计的便携式监听音箱iLoud
                    

                    百音堂

                    

                    

                        

                    

                    

                        

                            
                        

                        

                        
90%剩余

                        
9剩余份数

                        
1990价格

                
                        

                    

                

                
                
                
            

        
        

        
    






    

        

            

                

来自唱江湖的信息:


                

支付宝
支付宝

支付宝,全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付服务,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

65

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

43

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

35

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

41

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

204

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

9

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

8

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

3

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.3万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 2.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号