php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法


Posted in PHP onOctober 12, 2016

本文实例讲述了php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法。分享给大家供大家参考,具体如下:

微信支付api.mch.weixin.qq.com域名解析慢了,导致付款时非常的慢,那么要如何来解决微信支付慢的问题呢,这里就来一起分析一下。

有朋友在阿里云主机实现微信支付逻辑时,发现api.mch.weixin.qq.com的解析实在是太慢了。

因此出现了手动修改/etc/hosts的情况,当然了,哪天微信支付要是换个机房肯定要挂。

我们的机房也有相似的同题,专门记录一下。

代码里用curl来请求微信,经常超时,这时使用wget试验:

[root@01 tmp]# wget api.mch.weixin.qq.com
--2016-06-18 14:51:03-- http://api.mch.weixin.qq.com/
Resolving api.mch.weixin.qq.com...

域名解析很久不出来

测试确认是ipv6问题

给wget加上-4,强制使用ipv4,如果很快,那基本上确定是ipv6惹的祸了。

[root@01 tmp]# wget -4 api.mch.weixin.qq.com
--2016-06-18 17:03:52-- http://api.mch.weixin.qq.com/
Resolving api.mch.weixin.qq.com... 123.151.71.149, 123.151.79.109
Connecting to api.mch.weixin.qq.com|123.151.71.149|:80... connected.

代码分析

专门写个代码来测试ipv6的解析,用到系统函数getaddrinfo:

#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <iostream>
#include <sys/types.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
using namespace std;
int main() {
  struct addrinfo hints,*answer,*curr,*p;
  int error;
  memset(&hints, 0, sizeof hints);
  hints.ai_family = AF_INET6;//AF_UNSPEC; // use AF_INET6 to force IPv6
  hints.ai_socktype = SOCK_STREAM;//SOCK_DGRAM; // SOCK_STREAM
  if ((error = getaddrinfo("api.mch.weixin.qq.com", NULL, &hints, &answer)) != 0) {
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(error));
    return 1;
  } else cout <<"Success with a URL\n";
  char ipstr[16];
  for (curr = answer; curr != NULL; curr = curr->ai_next) {
    inet_ntop(AF_INET,&(((struct sockaddr_in *)(curr->ai_addr))->sin_addr),ipstr, 16);
    printf("%s\n", ipstr);
  }
  freeaddrinfo(answer);
  return 0;
}

包含头文件

netdb.h

函数原型:

int getaddrinfo( const char hostname, const char service, const struct addrinfo *hints, struct addrinfo **result );

参数说明:

hints:可以是一个空指针,也可以是一个指向某个addrinfo结构体的指针,调用者在这个结构中填入关于期望返回的信息类型的暗示。举例来说:如果指定的服务既支持TCP也支持UDP,那么调用者可以把hints结构中的ai_socktype成员设置成SOCK_DGRAM使得返回的仅仅是适用于数据报套接口的信息。而是否ipv6则由ai_family决定。
result:本函数通过result指针参数返回一个指向addrinfo结构体链表的指针。

返回值:0——成功,非0——出错

测试结果:

ai_family为ipv6时,只会寻找ipv6的解析结果,一般域名也没设置。ai_family为AF_UNSPEC时,会先ipv6再ipv4的,而api.mch.weixin.qq.com这个域名的ipv6解析出奇的慢(qq.com却不慢,原因见后)。

解决办法:

如果是curl,c可以强制指定ipv4,使用curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);

其他语言的也参考此法。

深层原因分析

nslookup -query=AAAA api.mch.weixin.qq.com -debug 是找不到解析的(指定的AAAA就是ipv6),然后会发现一个SOA声明和他的上级weixin.qq.com有一个ipv6的CNAME,到了minorshort.weixin.qq.com,而这域名又是没有ipv6的解析的。

目测ipv6找解析时是在这个SOA和CNAME的地方打圈了,微信的同学们是不是考虑让大伙好过一点,把这些个域名的ipv6设置去掉。

dig @ns-tel1.qq.com weixin.qq.com AAAA
weixin.qq.com.    43200  IN  SOA ns-tel1.qq.com. webmaster.qq.com. 1293502040 300 600 86400 300

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
玩转虚拟域名◎+ .
Oct 09 PHP
ubuntu 编译安装php 5.3.3+memcache的方法
Aug 05 PHP
wamp下修改mysql访问密码的解决方法
May 07 PHP
如何使用php绘制在图片上的正余弦曲线
Jun 08 PHP
百度ping方法使用示例 自动ping百度
Jan 26 PHP
PHP程序员基本要求和必备技能
May 09 PHP
Destoon模板制作简明教程
Jun 20 PHP
PHP下载生成的csv文件及问题总结
Aug 06 PHP
php实现支持中文的文件下载功能示例
Aug 30 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 PHP
yii2.0整合阿里云oss的示例代码
Sep 19 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
May 06 PHP
如何使用php等比例缩放图片
Oct 12 #PHP
php与python实现的线程池多线程爬虫功能示例
Oct 12 #PHP
php实现的SSO单点登录系统接入功能示例分析
Oct 12 #PHP
php用户密码加密算法分析【Discuz加密算法】
Oct 12 #PHP
基于php实现的php代码加密解密类完整实例
Oct 12 #PHP
php fseek函数读取大文件两种方法
Oct 12 #PHP
PHP从二维数组得到N层分类树的实现代码
Oct 11 #PHP
You might like
php 生成文字png图片的代码
2011/04/17 PHP
PHPMailer的主要功能特点和简单使用说明
2014/02/17 PHP
php获取指定日期之间的各个周和月的起止时间
2014/11/24 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
2015/03/13 PHP
PHP上传文件参考配置大文件上传
2015/12/16 PHP
简介WordPress中用于获取首页和站点链接的PHP函数
2015/12/17 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
php集成动态口令认证
2016/07/21 PHP
Yii 2.0如何使用页面缓存方法示例
2017/05/23 PHP
uploadify 3.0 详细使用说明
2012/06/18 Javascript
js打造数组转json函数
2015/01/14 Javascript
第九章之路径分页标签与徽章组件
2016/04/25 Javascript
JavaScript获取当前url根目录(路径)
2016/06/17 Javascript
javascript深拷贝(deepClone)详解
2016/08/24 Javascript
JSON 数据格式详解
2017/09/13 Javascript
Vue项目中跨域问题解决方案
2018/06/05 Javascript
vue 使用自定义指令实现表单校验的方法
2018/08/28 Javascript
jQuery操作cookie的示例代码
2019/06/05 jQuery
基于js实现逐步显示文字输出代码实例
2020/04/02 Javascript
Vue的全局过滤器和私有过滤器的实现
2020/04/20 Javascript
react 生命周期实例分析
2020/05/18 Javascript
利用Python绘制数据的瀑布图的教程
2015/04/07 Python
python字典操作实例详解
2017/11/16 Python
python3 中文乱码与默认编码格式设定方法
2018/10/31 Python
解决Djang2.0.1中的reverse导入失败的问题
2019/08/16 Python
Python定时器线程池原理详解
2020/02/26 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
webapp字号大小跟随系统字号大小缩放的示例代码
2018/12/26 HTML / CSS
英国领先的亚洲旅游专家:Wendy Wu Tours
2018/01/21 全球购物
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
学生保证书范文
2014/04/28 职场文书
环境保护建议书
2014/08/26 职场文书
用人单位终止解除劳动合同证明书
2014/10/06 职场文书
社区扶贫帮困工作总结
2015/05/20 职场文书
Redis 彻底禁用RDB持久化操作
2021/07/09 Redis
Python中可变和不可变对象的深入讲解
2021/08/02 Python