在开发支付宝H5支付的时候,遇到了一个很尴尬的问题,无法唤起支付宝APP问题分析:当前浏览器不在支付宝配置的白名单内

市场上的浏览器太多,总有用户会使用不一样的浏览器,就UC浏览器来说,不同版本也有出现不能唤醒支付宝APP来进行支付的时候。如何解决成了我当下的问题。

H5支付唤醒APP,本质上就是通过访问相关协议来达成的。支付宝支付的唤醒协议是 :alipays://platformapi/startApp?appId=20000125&orderSuffix=h5_route_token%3D%xxxxxxxxxxxxxxxxxxxxxxxxxx%22%26is_h5_route%3D%22true%22#Intent;scheme=alipays;package=com.eg.android.AlipayGphone;end

通过多次测试 ,orderSuffix字段的值是动态的

仔细可以发现,orderSuffix字段是urlencode的数据,urldecode后是h5_route_token="RZ42o1v1IQCySIL2FmkTUHzXDylwtFmobilecashierRZ42"&is_h5_route="true"

我的思路是通过访问 alipay.trade.wap.pay(手机网站支付接口) 获取H5支付宝的唤醒页面,然后通过正则表达式获取到orderSuffix字段的内容来拼接唤醒的url,通过iframe加载url来唤醒支付宝APP来实现支付。

  • 首先对获取的url进行处理,使之符合支付宝的正常请求

// 原接口url
// $result = 'https://openapi.alipay.com/gateway.do?alipay_sdk=alipay-sdk-php-20161101&app_id=2021001165675388&biz_content={"productCode":"QUICK_WAP_PAY","body":"游戏商品","subject":"支付宝在线支付","out_trade_no":"27847720200826155042","total_amount":"0.01","timeout_express":"1m"}&charset=UTF-8&format=json&method=alipay.trade.wap.pay&notify_url=http://www.game256.com.cn/payapi/paydemo/Notify.html&return_url=http://www.game256.com.cn/payapi/index/paysuccess.html&sign_type=RSA2&timestamp=2020-08-27 14:07:59&version=1.0&sign=jE4iZWsqrMkI2PW2sK7jMqlJjslzsibSZQ6lewlQreS8WPRGroZ35GPHvk9Vi18NSFms8ilI9JFB6VpNfQgn6LCXIzW4TuUq1vJ5EPM%2FkOt2iK1B15531VMDX4Cy7UZWWeXAhdC9d%2FawFulnZxbu3fT9K5slY%2BJhPInad0nsSFkj%2FY0%2FG02AEXatu7cdtOGbLoanwiXP8R1oCGK6mdTE95h%2BEPDILsrYXlhU83XIcqHzrCse4svbfWTfMhEfpKj3I8ZfcVrPANWvWUWCTrLaS48%2BcE5ww7K59NiqQ3i%2BZN2cszLhCCPUmMH%2FYeme7Gx2dgl701Acuk9l8cj2V%2BDlYg%3D%3D';// 目标接口url
// $result = 'https://openapi.alipay.com/gateway.do?alipay_sdk=alipay-sdk-php-20161101&app_id=2021001165675388&biz_content={%22productCode%22:%22QUICK_WAP_PAY%22,%22body%22:%22%E6%B8%B8%E6%88%8F%E5%95%86%E5%93%81%22,%22subject%22:%22%E6%94%AF%E4%BB%98%E5%AE%9D%E5%9C%A8%E7%BA%BF%E6%94%AF%E4%BB%98%22,%22out_trade_no%22:%2227847720200826155042%22,%22total_amount%22:%220.01%22,%22timeout_express%22:%221m%22}&charset=UTF-8&format=json&method=alipay.trade.wap.pay&notify_url=http://www.game256.com.cn/payapi/paydemo/Notify.html&return_url=http://www.game256.com.cn/payapi/index/paysuccess.html&sign_type=RSA2&timestamp=2020-08-27%2014:07:59&version=1.0&sign=jE4iZWsqrMkI2PW2sK7jMqlJjslzsibSZQ6lewlQreS8WPRGroZ35GPHvk9Vi18NSFms8ilI9JFB6VpNfQgn6LCXIzW4TuUq1vJ5EPM%2FkOt2iK1B15531VMDX4Cy7UZWWeXAhdC9d%2FawFulnZxbu3fT9K5slY%2BJhPInad0nsSFkj%2FY0%2FG02AEXatu7cdtOGbLoanwiXP8R1oCGK6mdTE95h%2BEPDILsrYXlhU83XIcqHzrCse4svbfWTfMhEfpKj3I8ZfcVrPANWvWUWCTrLaS48%2BcE5ww7K59NiqQ3i%2BZN2cszLhCCPUmMH%2FYeme7Gx2dgl701Acuk9l8cj2V%2BDlYg%3D%3D';
            $params_str = str_replace('https://openapi.alipay.com/gateway.do?', '', $result);parse_str($params_str, $arr);// $arr['biz_content'] = $arr['biz_content'];// $arr = http_build_query($arr);$params = [];$entities = array('%7B','%3A','%2C','%7D','%2F','+',);$replacements = array('{',':',',','}','/','%20',);foreach($arr as $key => $val) {if(in_array($key, ['biz_content', 'timestamp', 'sign'])) {$val = str_replace($entities, $replacements, urlencode($val));}if($key == 'sign') {$val = str_replace('/', '%2F', $val);}$params[] = $key.'='.$val;}$path = '/gateway.do?'.join('&', $params);$result= 'https://openapi.alipay.com'.$path;
  • 进行curl请求,这里请求的时候需要注意三个问题,1:支付宝特殊的请求头,2:是302跳转,3:是https加密数据的获取

            $result= 'https://openapi.alipay.com'.$path;// dump($result);// $path = '/gateway.do?alipay_sdk=alipay-sdk-php-20161101&app_id=2021001165675388&biz_content={%22productCode%22:%22QUICK_WAP_PAY%22,%22body%22:%22%E6%B8%B8%E6%88%8F%E5%95%86%E5%93%81%22,%22subject%22:%22%E6%94%AF%E4%BB%98%E5%AE%9D%E5%9C%A8%E7%BA%BF%E6%94%AF%E4%BB%98%22,%22out_trade_no%22:%2227847720200826155042%22,%22total_amount%22:%220.01%22,%22timeout_express%22:%221m%22}&charset=UTF-8&format=json&method=alipay.trade.wap.pay&notify_url=http://www.game256.com.cn/payapi/paydemo/Notify.html&return_url=http://www.game256.com.cn/payapi/index/paysuccess.html&sign_type=RSA2&timestamp=2020-08-27%2011:52:06&version=1.0&sign=fX60K9esyL0IRIuwCr7ecQSYvaBdihGa%2BbDtfA8PnBBnIHKyoln4ojCpnWL6W8YbCKbsFylcUCs302261JSfMgtg1RcIPZ4tgnGKkWdgDUTRx4s4smX5UsgMtkRuigcytA4cwzZ0UnERozF0BwC5AXwMhIkDqTxOUO%2BznfvODdCt6fjTCr5zjzJwAmfwcrf3wZIlATUDQBW8HHue9TTMRucAmapn5QhtRovKIb4F1i2wvttG4qvFSG6PZalyDEGgweDYUdEpobYYEjNbaXglAM2Bk8zOuYvNMfHBtRjNEjfLhE1%2Fzo1RJ1MjQagFwWghqHcebdyAcyMN2N%2FM%2BygqIQ%3D%3D';// dump($path);die;$cookie = '';// $cookie = 'ALIPAYJSESSIONID=GZ00KyPQiHFziO5OfaaavPp9p7AgvXsuperapiGZ00; awid=RZ42E27N4bI1nV6rTI4aWHDqaBwsejmobileclientgwRZ42; ctoken=pJaVM8Rj2r64glGJ; JSESSIONID=0D9A8FED7AC720067FC963498A75404D; spanner=uB7iE1BtqE6wK+oapYREsseb1+G8O+INXt2T4qEYgj0=; zone=RZ42B';$header = ['authority: openapi.alipay.com','method: GET','path: '.$path,'scheme: https','accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','accept-encoding: gzip, deflate, br','accept-language: zh-CN,zh;q=0.9','cookie: '.$cookie,'sec-fetch-dest: document','sec-fetch-mode: navigate','sec-fetch-site: none','sec-fetch-user: ?1','upgrade-insecure-requests: 1','user-agent: Mozilla/5.0 (Linux; Android 6.0.1; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36',];// dump($header);// $url = 'http://auto.jrj.com.cn/';$url = $result;$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER, 0);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//若给定url自动跳转到新的url,有了下面参数可自动获取新url内容:302跳转curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);//设置cURL允许执行的最长秒数。// curl_setopt($ch, CURLOPT_TIMEOUT, 10);// curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0');curl_setopt($ch, CURLOPT_HTTPHEADER, $header);//设置获取的信息以文件流的形式返回,而不是直接输出。curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);// 解释gzip内容curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');$content = curl_exec($ch);//获取请求返回码,请求成功返回200$code = curl_getinfo($ch,CURLINFO_HTTP_CODE);// echo $code . "\n\n";//获取一个cURL连接资源句柄的信息。(is_h5_route=\"true\")//$headers 中包含跳转的url路径 $headers = curl_getinfo($ch);$content = $this->strToUtf8($content);preg_match('/{"requestType"(.*)is_h5_route=\D\Dtrue\D\D\D}/', $content, $matches);// var_dump($isMatched, $matches);// dump('alipay://alipayclient/?'.urlencode($matches[0]));$params = json_decode($matches[0]);// dump($params);die;$o['android'] = urlencode($params->dataString);// dump($o);$alipay_url = 'alipays://platformapi/startApp?appId=20000125&orderSuffix=' . $o['android'] .'#Intent;scheme=alipays;package=com.eg.android.AlipayGphone;end';

目前就实现了安卓的唤醒协议生成和拼接,IOS的后面更新

支付宝H5支付实现 绕过浏览器白名单相关推荐

  1. h5支付不能打开支付宝 ios_iOS 解决微信h5支付,支付宝h5支付无法直接返回APP的问题...

    由于公司的业务需要,为了节省申请开通微信支付的时间和人力,公司决定使用微信h5支付.这样即节省了时间,同时以后所有的APP都能使用h5支付,既方便又快捷. 但是真正做的时候问题来了,当你支付成功之后或 ...

  2. ios支付宝支付失败不回调_iOS支付宝H5支付无法返回APP解决方案

    本文只讨论你已经成功实现客户端->支付宝支付流程,仅仅是支付完成后无法返回自己的APP的问题. 如果你的支付流程是客户端->Safari->支付宝不在本文讨论范围之类. iOS支付宝 ...

  3. iOS 拦截支付宝H5支付,完成掉起支付宝APP支付,回到自己APP,完整流程

    先说一下这个想法的来源,然后有相关需求的朋友也可以这样来操作 公司产品用到了支付宝支付,但是避免上架审核问题(不能接入支付宝SDK,害怕检测),采用了支付宝的H5支付,作为产品的支付渠道:APP内部, ...

  4. C# ASP.NET MVC 微信和支付宝H5支付开发及Demo

    微信和支付宝H5支付 最近开发任务遇到了一个要在手机浏览器里面调起微信和支付宝去支付的开发需求,以前都是做的扫码支付或者JSAPI都是在软件内部支付的,没遇到过在自己浏览器内唤醒微信或者支付宝的支付这 ...

  5. c# .net core 微信、支付宝H5支付链接获取,支付回调方法,退款方法小计

    支付链接获取 //隐藏代码:获取一个订单model实体,并判断此订单是否发起过支付链接吊起,如发起过且链接没过期,则直接返回支付链接(仅限微信)if (//隐藏代码:判断是否为待付款){switch ...

  6. 新版开运网运势测算网站源码 支持微信/支付宝H5支付 支持分销代理 可封装APP

    源码介绍 我在外面花钱购买的某站VIP资源,就是那种搬砖站,买来没时间调试发给大家看看吧,喜欢的就下去玩玩! 支持微信/支付宝H5和电脑端扫码支付.手机端可以调起微信/支付宝应用支付 支持后台设置价格 ...

  7. tp5 集成支付宝h5支付接口

    tp5 集成支付宝h5支付接口 前台支付的时候调取后台接口 function alipay(order_sn){$.ajax({url: '接口地址',type: "GET",da ...

  8. 利用抖音Cookie充值接口提取支付链接,调起原生微信h5支付宝h5支付

    最近开始搞一些个人支付通道的开发,方便个人不用和第三方平台签约就能收款,省去很多流程手续的成本. 然后翻了一下网上并没有太多现成的技术教程,只能自己研究着搞了. 这次要分享的是利用抖音的充值接口,去分 ...

  9. 微信h5支付和公众号支付、支付宝h5支付

    1.微信h5支付: 首先是支付参数的构建,这个需要通过后台进行组装,后台会跟微信进行数据的交互,而你所需要做的是拿到返回的数据,然后传递给微信的JSSDK,由微信的JSSDK进行后续操作,比如说先跳转 ...

最新文章

  1. cad打印样式ctb丢失_CAD制图软件中如何设置CAD打印样式表(CTB)?
  2. 企业项目学习准备阶段——Rhel6.5版本无图形虚拟机封装过程及相关配置
  3. 在3D世界中创建不同的相机模式——检查对象是否可见
  4. 把虚拟系统接入网络 虚拟系统工作模式
  5. pandas fillna_Pandas极简教程——数据清洗
  6. 数据结构与算法 | 队列
  7. 小米用户画像_腾讯企鹅智库发布手机品牌用户画像:华为一二线城市用户少于小米...
  8. 【转载】单片机应用系统断电时的数据保护方法
  9. 【MySQL】MySQL 8 新特性
  10. 内容分发网络CDN(互联网技术)
  11. mysqladmin命令详解
  12. php if变量满足数组,在php中使用if()查看数组中的日期是否等于变量中存储的日期...
  13. 黑马程序员 Python学习笔记之变量
  14. 什么是垃圾回收(转)
  15. 免费的中医处方系统软件
  16. python 循环十次_python循环10次怎么写
  17. linaro 网站资源
  18. 京东/淘宝的手机销售榜(前4名 -- 手机品牌 --手机型号*3 --手机分辨率 -- 手机操作系统 --安卓版本号)
  19. 考研计算机软件与理论院校排名,计算机软件与理论专业考研院校排名
  20. 父类与子类的执行顺序

热门文章

  1. Kernel pwn 入门 (3)
  2. Postman的安装使用及填坑心得
  3. Java、JSP校园二手商品交易平台的设计与实现
  4. 项目管理--项目干系人与组织
  5. 如何用python画金字塔形状_用Python画小猪佩奇,落叶树和动漫人物
  6. 【Social listening实操】作为一个合格的“增长黑客”,你还得重视外部数据的分析!
  7. 一次北京,又一次开始:走在行云流水间
  8. 计算机网络教学的交互性,浅谈交互式计算机网络课程教学平台构建.doc
  9. CentOS7下安装hdf5r包
  10. 什么是ERP认证,LED灯具ERP认证申请流程?照明产品新ErP指令(EU)2019-2020