微信對支付寶的連接屏蔽了,javascript
https://mapi.alipay.com/gateway.do?_input_charset=utf-8¬ify_url=http%3A%2F%2Fzhudianbao.yunlutong.com%2Findex.php%3Fg%3DPay%26m%3DAlipay%26a%3Dnotify_url&out_trade_no=2016061410473300007521&partner=2088421211906705&payment_type=1&return_url=http%3A%2F%2Fzhudianbao.yunlutong.com%2Findex.php%3Fg%3DPay%26m%3DAlipay%26a%3Dreturn_url&seller_id=2088421211906705&service=alipay.wap.create.direct.pay.by.user&show_url=%E5%8A%A9%E5%BA%97%E5%AE%9D%E7%9A%84%E5%95%86%E5%93%81%E8%AE%A2%E5%8D%95&subject=%E5%8A%A9%E5%BA%97%E5%AE%9D%E7%9A%84%E5%95%86%E5%93%81%E8%AE%A2%E5%8D%95&total_fee=0.01&sign=4d9d7f1c4ab82f4a80edd38b5e9c8d74&sign_type=MD5
這種地址,直接沒法訪問。php
原有代碼css
//創建請求 $alipaySubmit = new AlipaySubmit($alipay_config); $html_text = $alipaySubmit->buildRequestForm($parameter,"get", "確認"); echo $html_text;
咱們來看看buildRequestForm方法中的內容,html
/** * 創建請求,以表單HTML形式構造(默認) * @param $para_temp 請求參數數組 * @param $method 提交方式。兩個值可選:post、get * @param $button_name 確認按鈕顯示文字 * @return 提交表單HTML文本 */ function buildRequestForm($para_temp, $method, $button_name) { //待請求參數數組 $para = $this->buildRequestPara($para_temp); $sHtml = "<form id='alipaysubmit' name='alipaysubmit' action='".$this->alipay_gateway_new."_input_charset=".trim(strtolower($this->alipay_config['input_charset']))."' method='".$method."'>"; while (list ($key, $val) = each ($para)) { $sHtml.= "<input type='hidden' name='".$key."' value='".$val."'/>"; } //submit按鈕控件請不要含有name屬性 $sHtml = $sHtml."<input type='submit' value='".$button_name."' style='display:none;'></form>"; $sHtml = $sHtml."<script>document.forms['alipaysubmit'].submit();</script>"; return $sHtml; }
它會自動生成一個表單提交,提交到https://mapi.alipay.com/gateway.do這個頁面去處理,這個時候,微信就屏蔽掉了。java
//創建請求 $alipaySubmit = new AlipaySubmit($alipay_config); $html_text = $alipaySubmit->getHtml($parameter); $content = '<iframe src="'.$html_text.'" name="iframepage" id="iframepage" scrolling="no" frameborder="0"></iframe>'; $this->assign('content',$content); $this->display();
/** * 獲取地址,用於微信中iframe嵌入使用 */ function getHtml($para_temp) { $para = $this->buildRequestPara($para_temp); $init=''; while (list ($key, $val) = each ($para)) { $init.="&".$key."=".urlencode($val); } $init=$this->alipay_gateway_new."_input_charset=".trim(strtolower($this->alipay_config['input_charset'])).$init; return $init; }
這裏的urlencode很重要,能夠對內容進行一些url處理。還有就是buildRequestPara方法,會自動生成簽名,簽名很重要,否則沒法完成支付寶支付流程。jquery
/** * 生成要請求給支付寶的參數數組 * @param $para_temp 請求前的參數數組 * @return 要請求的參數數組 */ function buildRequestPara($para_temp) { //除去待簽名參數數組中的空值和簽名參數 $para_filter = paraFilter($para_temp); //對待簽名參數數組排序 $para_sort = argSort($para_filter); //生成簽名結果 $mysign = $this->buildRequestMysign($para_sort); //簽名結果與簽名方式加入請求提交參數組中 $para_sort['sign'] = $mysign; $para_sort['sign_type'] = strtoupper(trim($this->alipay_config['sign_type'])); return $para_sort; }
生成簽名para_temp中的參數一個都不能少,web
//構造要請求的參數數組,無需改動 $parameter = array( "service" => $alipay_config['service'], "partner" => $alipay_config['partner'], "seller_id" => $alipay_config['seller_id'], "payment_type" => $alipay_config['payment_type'], "notify_url" => C('site_url').U('Pay/Alipay/notify_url'), "return_url" => C('site_url').U('Pay/Alipay/return_url'), "_input_charset" => trim(strtolower($alipay_config['input_charset'])), "out_trade_no" => $out_trade_no, "subject" => $subject, "total_fee" => $total_fee, "show_url" => $show_url, "body" => $body, //其餘業務參數根據在線開發文檔,添加參數.文檔地址:https://d oc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.2Z6TSk&treeId=60&articleId=103693&docType=1 //如"參數名"=> "參數值" 注:上一個參數末尾須要「,」逗號。 );
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Cache-Control" content="no-Cache" /> <meta http-equiv="Cache-Control" content="max-age=0" /> <meta name="viewport" content="width=device-width,inital-scale=1.0,maximum-scale=1.0,user-scalable=no;"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <meta name="format-detection" content="telephone=no"> <link href="/Public/css/bootstrap.min.css" rel="stylesheet" type="text/css"> <script src="/Public/js/jquery-1.10.2.min.js" type="text/javascript"></script> <title>支付寶支付</title> </head> <style> .scroll-wrapper{ position: fixed; right: 0; bottom: 0; left: 0; top: 0; -webkit-overflow-scrolling: touch; overflow-y: scroll; } .scroll-wrapper iframe { height: 100%; width: 100%; } </style> <body> <div class="scroll-wrapper"> {sh:$content} </div> </body> </html>
有這個頁面,可以更好的處理iframe的自適應效果。bootstrap
總結:
調試過程當中遇到一些問題,
1.iframe顯示效果,不能很好的自適應,經過上面的css很好的解決了。api
2.如何使用iframe。一開始不太懂,其實iframe中的src就是一個鏈接,把微信的屏蔽鏈接放上去就能夠了。數組
3.老是報簽名錯誤,在getHtml的參數中加上urlencode處理好了url地址。
4.支付成功後,頁面跳轉不出iframe,有待優化!基本ok了。
經過js實現跳出iframe。一般支付成功後會轉到訂單列表頁,能夠根據你的實際狀況,到相應的頁面添加下面的js代碼。很神奇。親測可用。
// 跳出iframe // if(top.location!=self.location) // { // top.location="{sh::U('Store/Order/orders')}"; // } if(top.location!=self.location) { top.location=self.location; }
完美了!
PS:這個已經失效了,疼訊人員已經破解了