>  기사  >  php教程  >  支付宝+银联统一支付功能实现

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

WBOY
WBOY원래의
2016-06-07 11:40:541612검색

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

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

2015-8-14更新:很久没上这里了,发现好多消息说想要模板,我这里发出来。
PayAction:<?php <br /> class PayAction extends Action{<br>     //支付跳转<br>     function do_pay(){<br>         //构造参数<br>         $payment = array(<br>             'money'=>12,<br>             'deal_name'=>'充值',<br>             //支付银行,对应银行ID我在后面贴出来<br>             'bank_id'=>'',<br>             'notice_sn'=>'20140920123456',<br>         );<br>         echo D('Payment')->get_payment_code($payment);<br>     }<br>     <br>     //支付结果同步回调<br>     function response(){<br>         $request = $_GET;<br>         unset($request['_URL_']);<br>         $pay_res = D('Payment')->notify($request);<br> <br>         if($pay_res['status']){<br>             //支付成功业务逻辑<br>         }else{<br>             $this->error('支付失败');<br>         }<br>     }<br>     <br>     //支付结果异步回调<br>     function notify(){<br>         $request = $_POST;<br>         $pay_res = D('Payment')->notify($request);<br> <br>         if($pay_res['status']){<br>             //支付成功业务逻辑<br>             echo 'success';<br>         }else{<br>             echo 'fail';<br>         }<br>     }<br> }<br> <br> //银行ID<br> $bank_id = array(<br>     'ICBCB2C'    =>    '中国工商银行',<br>     'CMB'        =>    '招商银行',<br>     'CCB'        =>    '中国建设银行',<br>     'ABC'        =>    '中国农业银行',<br>     'SPDB'        =>    '上海浦东发展银行',<br>     'SDB'        =>    '深圳发展银行',<br>     'CIB'        =>    '兴业银行',<br>     'BJBANK'    =>    '北京银行',<br>     'CEBBANK'    =>    '中国光大银行',<br>     'CMBC'        =>    '中国民生银行',<br>     'CITIC'        =>    '中信银行',<br>     'GDB'        =>    '广东发展银行',<br>     'SPABANK'    =>    '平安银行',<br>     'BOCB2C'    =>    '中国银行',<br>     'COMM'        =>    '交通银行',<br>         'ALIPAY'    =>    '支付宝',<br> );<br> <br> ?>出现调试错误一般是参数传错了
1、配置model里面的config,model里其他东西根本不用看
2、构造请求参数$payment
money、deal_name和订单号notice_sn是你随便给的,bank_id在页面用 radio传过来的其值是我给的那些银行ID,比如工行就是ICBCB2C
支付宝+银联统一支付功能实现

PaymentModel:<?php <br /> <br> class PaymentModel extends Model{<br>     private $config;<br>     function _initialize(){<br>         $this->config = array(<br>             'alipay_partner'=>C('ALIPAY_PARTNER'),<br>             'alipay_account'=>C('ALIPAY_ACCOUNT'),<br>             'alipay_key'=>C('ALIPAY_KEY'),<br>             'return_url' => 'http://'.HOST_NAME.U('Pay/response'),<br>             'notify_url' => 'http://'.HOST_NAME.U('Pay/notify'),<br>         );<br>     }<br>     function get_payment_code($form){<br>         $link = $form['bank_id'] == 'ALIPAY' ? $this->alipay_link($form) : $this->bank_link($form);<br>         return $link;<br>     }<br>     // 银联接连<br>     function bank_link($form){<br>         $payment_notice = array(<br>             'money'=>$form['money'],<br>             'deal_name'=>$form['order_name'],<br>             'bank_id'=>$form['bank_id'],<br>             'notice_sn'=>$form['order_sn'],<br>         );<br>         $money = round($payment_notice['money'],2);<br>         $payment_info = $this->config;<br> <br>         $subject = $payment_notice['deal_name'];<br>         <br>         $data_return_url = $payment_info['return_url'];<br>         $data_notify_url = $payment_info['notify_url'];<br> <br>         $service = 'create_direct_pay_by_user';<br>         /* 银行类型 */<br>         $bank_type = $payment_notice['bank_id'];<br>         <br>         $parameter = array(<br>             'service'           => $service,<br>             'partner'           => $payment_info['alipay_partner'],<br>             //'partner'           => ALIPAY_ID,<br>             '_input_charset'    => 'utf-8',<br>             'notify_url'        => $data_notify_url,<br>             'return_url'        => $data_return_url,<br>             /* 业务参数 */<br>             'subject'           => $subject,<br>             'out_trade_no'      => $payment_notice['notice_sn'], <br>             'price'             => $money,<br>             'quantity'          => 1,<br>             'payment_type'      => 1,<br>             /* 物流参数 */<br>             'logistics_type'    => 'EXPRESS',<br>             'logistics_fee'     => 0,<br>             'logistics_payment' => 'BUYER_PAY_AFTER_RECEIVE',<br>             'extend_param'    => 'changjianghu',<br>             /* 买卖双方信息 */<br>             'seller_email'      => $payment_info['alipay_account'],<br>             'defaultbank'    =>    $bank_type,<br>             'payment'    =>    'bankPay'<br>         );<br> <br>         $parameter = $this->argSort($parameter);<br> <br>         $param = '';<br>         $sign  = '';<br> <br>         foreach ($parameter AS $key => $val){<br>             $param .= "$key=" .urlencode($val). "&";<br>             $sign  .= "$key=$val&";<br>         }<br> <br>         $param = substr($param, 0, -1);<br>         $sign  = substr($sign, 0, -1). $payment_info['alipay_key'];<br>         $sign_md5 = md5($sign);<br> <br>         <br>         $payLinks = '<form>正在连接支付接口...</form>';<br>         $payLinks.='<script>document.getElementById("jumplink").submit();</script>';<br> <br>         return $payLinks;<br>     }<br>     // 支付宝链接<br>     function alipay_link($form){<br>         $payment_notice = array(<br>             'money'=>$form['money'],<br>             'deal_name'=>$form['order_name'],<br>             'bank_id'=>$form['bank_id'],<br>             'notice_sn'=>$form['order_sn'],<br>         );<br>         $money = round($payment_notice['money'],2);<br>         $payment_info = $this->config;<br> <br>         $subject = $payment_notice['deal_name'];<br>         <br>         $data_return_url = $payment_info['return_url'];<br>         $data_notify_url = $payment_info['notify_url'];<br>         <br>         $parameter = array(<br>             'service'           => 'create_direct_pay_by_user',<br>             'partner'           => $payment_info['alipay_partner'],<br>             //'partner'           => ALIPAY_ID,<br>             '_input_charset'    => 'utf-8',<br>             'notify_url'        => $data_notify_url,<br>             'return_url'        => $data_return_url,<br>             /* 业务参数 */<br>             'subject'           => $subject,<br>             'out_trade_no'      => $payment_notice['notice_sn'], <br>             'price'             => $money,<br>             'quantity'          => 1,<br>             'payment_type'      => 1,<br>             /* 物流参数 */<br>             'logistics_type'    => 'EXPRESS',<br>             'logistics_fee'     => 0,<br>             'logistics_payment' => 'BUYER_PAY_AFTER_RECEIVE',<br>             'extend_param'        => 'changjianghu',<br>             /* 买卖双方信息 */<br>             'seller_email'      => $payment_info['alipay_account']<br>         );<br>         // print_r($parameter);exit;<br>         $parameter = $this->argSort($parameter);<br> <br>         $param = '';<br>         $sign  = '';<br> <br>         foreach ($parameter AS $key => $val)<br>         {<br>             $param .= "$key=" .urlencode($val). "&";<br>             $sign  .= "$key=$val&";<br>         }<br> <br>         $param = substr($param, 0, -1);<br>         $sign  = substr($sign, 0, -1). $payment_info['alipay_key'];<br>         $sign_md5 = md5($sign);<br> <br>         <br>         $payLinks = '<form>正在连接支付接口...</form>';<br>         $payLinks.='<script>document.getElementById("jumplink").submit();</script>';<br>         <br>         return $payLinks;<br>     }<br> <br> /*结果*/<br>     function notify($request){<br>         $return_res = array(<br>             'info'=>'',<br>             'status'=>false,<br>         );<br>         $payment = $this->config;<br>         <br>         $request = $this->argSort($request);<br> <br>         /* 检查数字签名是否正确 */<br>         $isSign = $this->getSignVeryfy($request);<br>         if (!$isSign){//签名验证失败<br>             $return_res['info'] = '签名验证失败';<br>             return $return_res;<br>         }<br> <br>         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'){<br>             <br>             $return_res['status'] = true;<br>             <br>         }<br>         return $return_res;<br>     }<br> <br>     // 获取返回时的签名验证结果<br>     function getSignVeryfy($para_temp) {<br>         //除去待签名参数数组中的空值和签名参数<br>         $para_filter = $this->paraFilter($para_temp);<br>         //对待签名参数数组排序<br>         $para_sort = $this->argSort($para_filter);<br>         //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串<br>         $prestr = $this->createLinkstring($para_sort);<br>         <br>         $isSgin = false;<br>         $isSgin = $this->md5Verify($prestr, $para_temp['sign'], $this->config['alipay_key']);<br>         return $isSgin;<br>     }<br>     // 验证签名<br>     function md5Verify($prestr, $sign, $key) {<br>         $prestr = $prestr . $key;<br>         $mysgin = md5($prestr);<br> <br>         if($mysgin == $sign) {<br>             return true;<br>         }<br>         else {<br>             return false;<br>         }<br>     }<br>     // 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串<br>     function createLinkstring($para) {<br>         $arg  = "";<br>         while (list ($key, $val) = each ($para)) {<br>             $arg.=$key."=".$val."&";<br>         }<br>         //去掉最后一个&字符<br>         $arg = substr($arg,0,count($arg)-2);<br>         <br>         //如果存在转义字符,那么去掉转义<br>         if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}<br>         <br>         return $arg;<br>     }<br>     // 除去数组中的空值和签名参数<br>     function paraFilter($para) {<br>         $para_filter = array();<br>         while (list ($key, $val) = each ($para)) {<br>             if($key == "sign" || $key == "sign_type" || $val == "")continue;<br>             else    $para_filter[$key] = $para[$key];<br>         }<br>         return $para_filter;<br>     }<br>     // 对数组排序<br>     function argSort($para) {<br>         ksort($para);<br>         reset($para);<br>         return $para;<br>     }<br>     <br> }<br> <br> ?>HTML模板:nbsp;html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><br> <br> <br> <meta> <br> <meta> <br> <meta> <br> <title>预购一个梦想 - 唱江湖音乐众筹网</title> <br> <meta> <br> <meta> <br> <link> <br> <link> <br> <link> <br> <script></script><br> <br> <br> <br>     <br> <div> <br>     <div> <br>         <div> <br>                             <div> <br>                                 <img alt="支付宝+银联统一支付功能实现" ><br> <map><br>     <area> <br>     <area> <br>     <area> <br>     <area> <br> </map>            </div> <br> <br>         </div> <br>         <ul> <br>                                     <li> <br>                         <span><br>                         <a>首页</a><br>                         </span>        <br>                     </li> <br>                                     <li> <br>                         <span><br>                         <a>音乐众筹</a><br>                         </span>        <br>                     </li> <br>                                     <li> <br>                         <span><br>                         <a>秒杀</a><br>                         </span>        <br>                     </li> <br>                                     <li> <br>                         <span><br>                         <a>帮助中心</a><br>                         </span>        <br>                     </li> <br>                                 <li> <br>                     <span><br>                             <a>发起众筹</a><br>                     </span><br>                      <span><br>                             <a>发起秒杀</a><br>                     </span><br>                 </li> <br>         </ul> <br>         <div> <br>             <div>    <br>                     <a>消息</a>  |  <br>     <a>Badri</a>  |          <br>     <a>登出</a><br>     <br>     <br>     <div> <br>         <div> <br>             <span><a>关注动态</a></span><br>             <span><a>查看评论</a></span><br>             <span><a>查看私信</a></span><br>             <span><a>查看通知</a></span><br> <br>         </div> <br>     </div> <br>     <div> <br>         <div> <br>             <span><a>我的主页</a></span><br>             <span><a>项目管理</a></span><br>             <span><a>发起项目</a></span><br>             <span><a>秒杀管理</a></span><br>             <span><a>发起秒杀</a></span><br>             <span><a>个人设置</a></span><br> <br>         </div> <br>     </div> <br>     <br>             </div>            <br>             <form> <br>             <div> <br>             <input><br>             <input><br>             <input>                <br>             </div> <br>             </form>    <br>             <br>     <br>             <br>         </div> <br>         <br>         <br> <br>         <br>     </div>        <br> </div> <br> <br> <link> <br> <script></script><br> <div></div> <br> <br> <div> <br>     <div> <br>         <div> <br>             专为音乐人设计的便携式监听音箱iLoud            <div> <br>                 <font><br>                 支持金额  ¥1990.00            <br>                         <br>                 邮费:¥15.00<br>                                 </font><br>                 应付总额 <span>¥2002.00</span> 元    <br>             </div> <br>         </div> <br>         <br>         <div></div> <br>         <br>         <div></div> <br>         <br>         <div> <br>             <br>             <form>                                    <br>                 <br>                                     <div> <br>                         <div></div> <br>                         <label>使用余额支付:</label><br>                         <input><br>                         <label>可用余额:¥82,800.00</label><br>                         <input><br>                         <input><br>                         <div></div> <br>                     </div> <br>                                         <br>                 <div> <style>.alibank_types{float:left; display:block; background:url(http://zc.changjianghu.com/system/payment/AlipayBank/banklogo.gif); font-size:0px; width:150px; height:10px; text-align:left; padding:15px 0px;}.bk_typeCMB{background-position:15px -444px; }.bk_typeICBCB2C{background-position:15px -404px; }.bk_typeCCB{background-position:15px -84px; }.bk_typeABC{background-position:15px -44px; }.bk_typeSPDB{background-position:15px -364px; }.bk_typeSDB{background-position:15px -324px; }.bk_typeCIB{background-position:15px -484px; }.bk_typeBJBANK{background-position:15px -610px; }.bk_typeCEBBANK{background-position:15px -124px; }.bk_typeCMBC{background-position:15px -164px; }.bk_typeCITIC{background-position:15px -284px; }.bk_typeGDB{background-position:15px -244px; }.bk_typeSPABANK{background-position:15px -903px; }.bk_typeBOCB2C{background-position:15px -939px; }.bk_typeCOMM{background-position:15px -204px; }.bk_typeICBCBTB{background-position:15px -782px; }.bk_typePSBC-DEBIT{background-position:15px -524px; }</style> <script>function set_bank(bank_id){$("input[name=&#039;bank_id&#039;]").val(bank_id);}</script><label><input></label><label><input></label><label><input></label><label><input></label><label><input></label><label><input></label><label><input></label><label><input></label><label><input></label><label><input></label><label><input></label><label><input></label><label><input></label><label><input></label><label><input></label><input><div></div> </div> <div> <div> <input> 支付宝即时到帐支付:</div> <div><img alt="支付宝+银联统一支付功能实现" ></div> <div></div> <div></div> </div>                <br>                 <div></div> <br>                 <div> <br>                     <div> <br>                         <div> <br>                             <span>确定,去付款</span><br>                         </div> <br>                     </div>                <br>                     <input>    <br>                     <input>    <br>                     <input><br>                     <input>    <br>                     <input>                    <br>                     <div></div> <br>                 </div> <br>                 <br>             </form> <br>             <br>         </div> <!--left--><br>         <div> <br>                 <br>                 <div> <br>                     <div> <br>                     <img alt="支付宝+银联统一支付功能实现" ><br>                     <div></div> <br>                     <a>专为音乐人设计的便携式监听音箱iLoud</a><br>                     <div></div> <br>                     <a>百音堂</a><br> <br>                     </div> <br>                     <div> <br>                         <div></div> <br>                     </div> <br>                     <div> <br>                         <div> <br>                             <span></span><br>                         </div> <br>                         <div></div> <br>                         <div> <span>90%</span><span>剩余</span> </div> <br>                         <div> <span><font>9</font>份</span><span>剩余份数</span> </div> <br>                         <div> <span><font>1990</font>元</span><span>价格</span> </div> <br>                 <br>                         <div></div> <br>                     </div> <br>                 </div> <br>                 <br>                 <br>                 <br>             </div> <br>         <br>         <div></div> <br>         <br>     </div> <br> </div> <br> <div></div> <br> <br> <div></div> <br> <div> <br>     <div> <br>         <div> <br>             <dl> <br>                 <h3>来自唱江湖的信息:</h3> <br>                 <dd><!-- --></dd> <br> </dl> </div> </div> </div>

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.