破解微信中屏蔽支付宝支付的方法,亲测可用

2016-06-20

最新更新:此方法已被微信彻底屏蔽,不可使用。

我们开发了WordPress WooCommerce支付宝全平台版插件,用户反映在微信中无法使用,众所周知,这是支付宝和微信支付竞争的关系,相互屏蔽对方,但是这不该由用户来买单啊,广大WordPress插件用户也有非常强的意愿,让微信中支持支付宝支付,经过研究,我们临时找到了解决方案,希望微信支付不要屏蔽。

这样的支付宝链接都是屏蔽的

https://mapi.alipay.com/gateway.do?_input_charset

但是可以通过iframe避开屏蔽。

//建立请求
$alipaySubmit = new AlipaySubmit($alipay_config);

$html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");

echo $html_text;

我们来看看buildRequestForm方法中的内容,

/**
     * 建立请求,以表单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 = "
alipay_gateway_new.”_input_charset=”.trim(strtolower($this->alipay_config['input_charset'])).”‘ method=’”.$method.”‘>”; while (list ($key, $val) = each ($para)) { $sHtml.= ““; } //submit按钮控件请不要含有name属性 $sHtml = $sHtml.”
";

        $sHtml = $sHtml." return $sHtml; }

它会自动生成一个表单提交,提交到https://mapi.alipay.com/gateway.do这个页面去处理,这个时候,微信就屏蔽掉了。

改造

//建立请求
$alipaySubmit = new AlipaySubmit($alipay_config);
$html_text = $alipaySubmit->getHtml($parameter);
$content = '<iframe id="iframepage" src="'.$html_text.'" name="iframepage" width="300" height="150" frameborder="0" scrolling="no"></iframe>'; $this->assign('content',$content); $this->display();

这里的核心就是getHtml中的内容,这个方法是新加的,它可以拼接出支付宝调用支付的地址及所需要的各种参数。

/**

     * 获取地址,用于微信中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方法,会自动生成签名,签名很重要,不然无法完成支付宝支付流程。

/**
     * 生成要请求给支付宝的参数数组
     * @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中的参数一个都不能少,

                //构造要请求的参数数组,无需改动
        $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
        //如"参数名"=> "参数值"   注:上一个参数末尾需要“,”逗号。

        );

为了让页面好看一些,我没有直接echo输出,而是写了一个页面,pay.html

{sh:$content}

有这个页面,能够更好的处理iframe的自适应效果。

总结:
调试过程中遇到一些问题,
1.iframe显示效果,不能很好的自适应,通过上面的css很好的解决了。

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;
}
立即打赏      分享
【立即加 QQ:6347007 咨询微信定制开发/支付接口开发】

今天就开启您的项目

联系我们开始您的项目。我们如同您一样兴奋不已。

联系我们