热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微信无法连接支付服务器,App接入微信H5支付常见错误及原因

在App上接入微信H5支付一般都会遇到一些错误。本文讨论了这些错误的解决方案和背后的原因,希望能让读者能少踩些坑。错误可以分为两类:一是H5支付域名设置

在App上接入微信H5支付一般都会遇到一些错误。本文讨论了这些错误的解决方案和背后的原因,希望能让读者能少踩些坑。

错误可以分为两类:一是H5支付域名设置错误,二是URL Scheme跳转App错误。

第一类,H5支付域名设置错误

此类错误一般发生在安卓机器上(网上有人说iOS也遇到类似错误),在微信官方文档里有对这类现象的详细描述。

一般情况下,检查下面两点就能排除这类错误:

登录商户号对应的商户平台—“产品中心”—“开发配置”,查看设置的H5支付域名是否包含商家发起支付的网页所在的域名。

在商家发起支付的网页,在发起支付的时候,浏览器会重定向到一个微信的页面(页面地址类似于:https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20161110163838f231619da20804912345&package=1037687096),这个页面会校验权限和安全性,我们暂且把它叫做微信校验页面。

为了校验发起支付的域名是否合法,在请求微信校验页面的HTTP请求里,头部(HTTP Header)需要有“Referer”这个字段。了解HTTP的同学可能知道,Referer字段会告诉服务器请求的原始资源的URI。也就是说,Referer会告诉腾讯的服务器,是谁在请求微信校验页面。所以Referer的值应该是商家发起支付的页面的域名。

通常情况下,浏览器或者WebView会为我们自动加上Referer,但是在安卓的自定义WebView中,无法自动加上Referer。需要在WebView中手动设置Referer,如:

Map extraHeaders = new HashMap();

extraHeaders.put("Referer", "商户申请H5时提交的授权域名"

第二类,URL Scheme跳转错误

1、无法跳转到微信App

在完成了上述校验后,浏览器或者WebView会被重定向到一个URL Scheme(类似于:weixin://wap/pay?prepayid%3Dwx261541599457545c6f11d41a1106566432&package=1888940394&noncestr=1564126923&sign=1ba23428a32b17d5d03cf032b283379f)。

对于安卓或者iOS的浏览器来说,这种URL Scheme一般可以成功跳转。但是对于安卓自定义WebView和iOS的WKWebView来说,无法使用URL Scheme跳转。

1)安卓自定义WebView

往往我们的app中使用自定义的WebView,会设置很多参数,经测试发现如果为WebView设置了WebViewClient,如下:

webView.setWebViewClient(new WebViewClient() {

// some logic

}

那么就不能唤起微信支付了,errorCode返回-10,提示“不支持该协议”。我们需要手动调起微信:

@Override

public boolean shouldOverrideUrlLoading(WebView view, String url) {

// 如下方案可在非微信内部WebView的H5页面中调出微信支付

if (url.startsWith("weixin://")) {

Intent intent = new Intent();

intent.setAction(Intent.ACTION_VIEW);

intent.setData(Uri.parse(url));

startActivity(intent);

return true;

}

return super.shouldOverrideUrlLoading(view, url);

}

2) iOS UIWebView

如果iOS端使用的是UIWebView,是可以支持URL Scheme的。但是自iOS 9之后,URL Scheme必须在Info.plist中列为白名单才有效。

打开Info.plist,增加“LSApplicationQueriesSchemes”一行,类型设置为Array,并在这个数组中加入一个条目:“weixin”。

5c76e95863a2

image

3)iOS WKWebView

WKWebView不支持URL Scheme,或者叫默认不支持URL Scheme,需要我们手动调起微信。参考解决方法:

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {

NSURL *url = navigationAction.request.URL;

NSString *urlString = (url) ? url.absoluteString : @"";

if ([urlString containsString:@"weixin://"]) {

[[UIApplication sharedApplication] openURL:url];

decisionHandler(WKNavigationActionPolicyCancel);

}

}

如果你使用UIApplication的openURL方法打开URL Scheme,你就不需要在Info.plist中把对应的URL Scheme列为白名单。

因为,UIApplication的canOpenURL会查询Info.plist中LSApplicationQueriesSchemes中的Scheme,如果没有对应的Scheme就返回NO。而当你使用UIApplication的openURL方法打开一个URL Scheme的时候,并不会调用canOpenURL。

2、支付完成后无法从微信App跳转回到我们的App

在调用微信支付的时候,微信允许你设置一个回调URL。在iOS上,支付完成后,微信会调起手机上的Safari浏览器加载这个回调URL。

这个回调URL的逻辑我们无法改变,但是我们可以在回调URL指向的HTML页面里,判断是否是iOS Safari浏览器。如果是Safari,就可以调用我们App自己的URL Scheme。

我们可以在Info.plist里增加一个URL Types:

5c76e95863a2

image

然后在回调页面里合适的时机调用window.location = "testappdemo",注意"testappdemo"是你在Info.plist里设置的URL Scheme。

这样Safari就会调起你的App。但是在调起你的App之前,会询问用户“是否在xxx里打开”

5c76e95863a2

image

总结

不论iOS还是安卓,在浏览器中完成微信H5支付一般是没有问题的,这也是微信H5支付设计的应用场景。

不论在iOS还是安卓App上,接入微信H5支付都可能遇到各种各样的问题,所以微信官方文档提醒:

H5支付不建议在APP端使用,如需要在APP中使用微信支付,请接APP支付



推荐阅读
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 应用链时代,详解 Avalanche 与 Cosmos 的差异 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 本指南详细介绍了在Linux环境中高效连接MySQL数据库的方法。用户可以通过安装并使用`mysql`客户端工具来实现本地连接,具体命令为:`mysql -u 用户名 -p 密码 -h 主机`。例如,使用管理员账户连接本地MySQL服务器的命令为:`mysql -u root -p pass`。此外,还提供了多种配置优化建议,以确保连接过程更加稳定和高效。 ... [详细]
  • 如何在服务器上配置SSL证书
    SSL证书是用于验证互联网上身份的一种数字凭证,通过启用HTTPS协议,确保用户与服务器之间的通信安全。本文将详细介绍如何在API和服务器上配置SSL证书,以提升网站的安全性和可信度。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
author-avatar
泡沫茱_617
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有