php微信中调起支付宝支付宝,微信端调起支付宝支付

本文介绍了在微信屏蔽支付宝链接后,通过iframe和自定义getHtml方法绕过限制,实现支付宝支付的过程,包括签名生成、参数处理和页面适配。重点在于如何使用urlencode处理URL和适应iframe的技巧。
摘要由CSDN通过智能技术生成

/*********************************/

文章转自:http://www.cnblogs.com/jiqing9006/p/5584268.html

/*********************************/

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

微信对支付宝的链接屏蔽了,

https://mapi.alipay.com/gateway.do?_input_charset=utf-8&notify_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

这种地址,直接无法访问。

1.通过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 = "

";

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 = '';

$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;

}

完美了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值