Apple 2017年1月1号起要求Appstore 上线的应用都必须使用 https 加密请求协议,在二月份又改为建议 从 http 升级为 https 协议,此为背景。

公司做的APP同时在App Store和安卓应用市场上了线。应要求,我们也将协议升级为https。由于自制https证书不能用于支付宝请求协议,故从阿里云购买的证书服务。升级为https之后碰到了诸多问题。

1.支付宝微信支付成功却收不到notify回调的情况。

支付notify_url 要求回调时 url 不得带任何参数,如果请求为 https 证书必须由认证机构发放,自制证书无效。

微信要求必须为80端口,那么回调请求就应该为http请求。

项目由nginx加tomcat搭建,部署在ECS Linux 上面。那么支付请求如下

1)APP发起支付请求——>

2)支付宝确认签名,如果正确则支付成功——>

3)支付宝给notify_url 发异步通知——>

4)服务器收到异步通知,确认订单状态,结束此次支付请求。

第一步是APP发起请求调用支付宝的接口然后支付宝确认签名验证成功后划款。

问题出在第三步,支付宝给请求支付时预先配好的notify_url 发送异步通知时出现了问题,服务器没有收到异步通知。ngnix 和 tomcat 日志均未显示 支付宝的异步通知请求。在这里可能出现收不到回调的情况有这几种可能:

1》请求协议的问题(http,https)有可能是证书配置出现问题,但是浏览器访问网站都加上了绿色的安全锁,这一点可以排除

2》服务器防火墙配置问题,ESC 的防火墙(iptables)是在阿里云的控制台配置的,在安全组规则公网配置里面,这个默认配置就可以了,不用做改动。

3》nginx 配置问题,nginx做代理服务器请求没有正确转发至后台。这一点我觉得可能性最大。有可能是配置问题导致支付宝回调失败。

首先验证一下配置好证书之后网站是否能够通过 https 校验

这里推荐一个强 https 校验网站,比浏览器校验更加严格

https://www.ssllabs.com/ssltest/

这是阿里建议的ssl配置证书

 # HTTPS server
# server {
# listen 443;
# server_name localhost;
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# ssl_prefer_server_ciphers on;
# location / {
#
#
#}
#}

可以看到此配置只配置了 443 端口监听,443 端口为 https 的默认请求端口。这样的话微信支付回调肯定就收不到了。于是我将配置改为

# HTTPS server
# #server {
# listen 80;
# listen 443 ssl;
# server_name localhost; # ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols TLSv1.1 TLSv1.2;
# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# ssl_prefer_server_ciphers on;
# location / {
#
#
#}
#}

如上,这样nginx 就可以同时支持 http 和 https 请求了。保证微信可以正常支付,但是支付宝还是不行。

项目服务器支持两个项目的线上运营,nginx 采用的虚拟主机配置。也就是说同一台服务器共用https的证书。这个需要开启nginx 的sni服务。查看状态进入nginx安装目录下输入命令:

sbin/nginx -V

nginx version: nginx/1.6.2
  built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC)
  TLS SNI support enabled
  configure arguments: --prefix=/usr/local/webserver/nginx --with-openssl=/usr/local/openssl/openssl-1.0.1g/ --with-http_stub_status_module --with-htt p_ssl_module --with-pcre=/usr/local/tools/pcre/ --add-module=/usr/local/tools/packages/echo-nginx-module-0.60/

可以看到

TLS SNI support enabled

已经开启。如果没有开启,将 nginx 加入 openssl 重新 make && make install 。

然后这个时候在测试支付,微信可以正常支付并受到回调了。这样APP微信支付和公众号支付两条路就走通了。

剩下支付宝支付还是没有收到回调。于是我把支付宝回调调整为http请求在nginx中过滤,如果为 notify请求则重写为 http://notify_url,将项目打包到测试环境测试,果然成功了。剩下的就是将项目打包正式版本,更新了。

这次升级主要是 nginx 的证书配置和 http 和 https 的限制。遇到这样网络请求的问题,将请求全过程的从头到尾的过程多想几遍,再按照请求的流程一步一步排查问题。缩小问题的范围,问题就慢慢浮现出水面了。

从 http 升级到 https 过程中遇到的一些问题的更多相关文章

  1. 【Unity】近期整理Unity4.x 项目升级Unity5.0 过程中出现的各种常见问题,与大家共享。

    近期整理Unity4.x 项目升级Unity5.0 过程中出现的各种常见问题,与大家共享. 1:Unity4.x 项目中3D模型其材质丢失,成为"白模"?       解决方式:手 ...

  2. 网站如何从http升级成https

    基本概念: HTTP: 是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准,用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少. HT ...

  3. Confluence 6 在升级过程中查看合并日志

    为了监控升级的过程,你应该查看 application log 日志中的输出. 通常日志经常将会显示多个日志实例,这个实例是定义在日志的 INFO 级别的,通常格式如下: WikiToXhtmlMig ...

  4. VMware虚拟机升级过程中遇到的一点问题

    在将VWware由9.0升级到10.0的过程中,出现如下图的错误:        failed to create the requested registry key Key:Installer e ...

  5. android recovery升级过程中掉电处理

    一般在升级过程,都会提示用户,请勿断电,不管是android的STB,TV还是PHONE,或者是其他的终端设备,升级过程,基本上都可以看到“正在升级,请勿断电”,然后有个进度条,显示升级的进度. 但是 ...

  6. Windows Server 2012升级R2过程中意外关闭恢复原系统方法

    2012升级R2过程中强制关闭了计算机,导致再次启动后蓝屏提示"BAD_SYSTEM_CONFIG_INFO".用2012安装盘进入尝试修复失败(安全模式什么的都不用想),进入命令 ...

  7. WDCP从php5.2升级到5.3的办法,以及升级过程中iconv错误的处理

    从wdcp官方论坛我们可以找到一个询问升级的帖子,然后管理员在回复中也提供了升级方法: cd /tmp wget -c http://dl.wdlinux.cn:5180/soft/php-5.3.1 ...

  8. 解决https 请求过程中SSL问题

    最近一个项目中用到了https的请求,在实际调用过程中发现之前的http方法不支持https,调用一直报错. 查询了一下,添加几行代码解决问题. public string HttpPost(stri ...

  9. office web apps安装部署,配置https,负载均衡(七)配置过程中遇到的问题详细解答

    该篇文章,是这个系列文章的最后一篇文章,该篇文章将详细解答owa在安装过程中常见的问题. 如果您没有搭建好office web apps,您可以查看前面的一系列文章,查看具体步骤: office we ...

随机推荐

  1. Docker学习计划

    刚开始学习Docker的时候,找资料在网上看到最多的是Docker的好处.比如: 1.Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多 2.Docker 对系统资源的利用率很高, ...

  2. ajax 页面请求后,jsp页面定位

    如下图所示.A,B两区域为不动区域,既不随着滚动条的滚动而移动.C区域为异步加载内容区域, 在C区域中,点击查询按钮,需要异步加载查询 结果.但是查询结果会很长,这样子,就需要向下滑动滚动条,用户体验 ...

  3. debugger 调试的一些经验

    1. 如果没有firebug , 可以用firebug-lite.js 内嵌的调试方式. 2. console.log 不是所有浏览器都支持console.log 在IE或者没有调试窗口的浏览器中,c ...

  4. ajax 跨域了 cors

    <?php /** * Author: humanhuang * Date: 13-12-17 */ header('Access-Control-Allow-Origin:*'); heade ...

  5. 3. 托管对象模型的迁移(Core Data 应用程序实践指南)

    本章介绍如何添加模型版本及模型映射,演示几种迁移技术,供在升级模型时使用. 3.1. 修改托管对象模型 3.2. 添加模型版本 3.3. 轻量级迁移方式 3.4. 默认的迁移方式 3.5. 通过迁移管 ...

  6. EntityFramework 简单入个门

    任何一个和数据相关的系统里,数据持久化都是一个不容忽视的问题. 一直以来,Java 平台出了很多 NB 的 ORM 框架,Hibernate.MyBatis等等..NET 平台上,ORM 框架这一块一 ...

  7. HDU5477(模拟)

    A Sweet Journey Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  8. Intellij IDEA 建立文件夹目录问题

    问题: NEW一个package常出现文件夹层次问题 解决: 1.选中当前文件夹(要在该文件夹下添加): 2.右击此处: 3.添加即可. 链接:http://stackoverflow.com/que ...

  9. [C#]为微软ASP.NET官方教学视频增加字幕

    前言 Microsoft Virtual Academy提供了学习ASP.NET的大量视频材料.(注1) 由于视频服务器位于海外,国内浏览速度并不理想,幸好官方提供了视频的下载地址以及英文字幕文件. ...

  10. Tomcat使用常见问题

    1,启动服务器,闪退问题 原因:tomcat软件是用java语言开发的,软件启动时,会默认到系统环境变量中查找一个名叫JAVA_HOME的变量.这个变量的作用是找到tomcat启动所需的JVM.   ...